Python 蒂克塔克托最后一期
这是我的代码供参考:Python 蒂克塔克托最后一期,python,Python,这是我的代码供参考: import math def tic_tac_toe(): board1 = [] end = False def choose(): global num num = input("How large do you want the grid? (input the SIDE length)") for a in range(num**2): board1.append(a) def draw(): x =
import math
def tic_tac_toe():
board1 = []
end = False
def choose():
global num
num = input("How large do you want the grid? (input the SIDE length)")
for a in range(num**2):
board1.append(a)
def draw():
x = num
v = 0
for a in range(x):
print
for b in range(x):
print(board1[v]),
v = v + 1
size = num
rows = [tuple(range(i * size, (i + 1) * size)) for i in range(size)]
cols = [tuple(range(i, size ** 2 * 1, size)) for i in range(size)]
diags = [tuple(i * (size + 1) for i in range(size)), tuple(i * (size - 1) for i in range(1, size + 1))]
global howtowin
howtowin = tuple(rows + cols + diags)
def p1():
n = choose_number()
if board1[n] == 'X' or board1[n] == 'O':
print("\nAre you stupid... Try again")
p1()
else:
board1[n] = 'X'
def p2():
n = choose_number()
if board1[n] == 'X' or board1[n] == 'O':
print("\nAre you stupid... Try again")
p2()
else:
board1[n] = 'O'
def choose_number():
while True:
try:
a = int(input())
if a in board1:
return a
else:
print("\nCan you not count to " + str(num**2) + "? Try again")
except ValueError:
print("\nI don't speak French! Try again")
def check_board():
count = 0
for a in howtowin:
if board1[a[0]] == board1[a[1]] == board1[a[2]] == 'X': #check all lengths 3-...
print("\nPlayer 1 Wins!")
print("Congratulations!\n")
return True
if board1[a[0]] == board1[a[1]] == board1[a[2]] == 'O':
print("\nPlayer 2 Wins!")
print("Congratulations!\n")
return True
for a in range(num*num):
if board1[a] == 'X' or board1[a] == 'O':
count += 1
if count == num*num:
print("The game ends in a Tie\n")
return True
choose()
while not end:
draw()
end = check_board()
if end == True:
break
print("\n\nPlayer 1 choose where to place a 'X'")
p1()
print
draw()
end = check_board()
if end == True:
break
print("\n\nPlayer 2 choose where to place a 'O'")
p2()
print
if raw_input("Play again (y/n)\n") == 'y':
print
tic_tac_toe()
else:
print("\nThanks for playing!!!!!!")
tic_tac_toe()
我的问题是检查板();我将其硬编码为边值3。我现在需要它来处理任何边长值。我发现这是一个非常优雅的解决方案,使用
all
和any
:
def is_winning_row(board, size, player):
return any((all(board[i][j]==player for j in range(size))) for i in range(size))
如果board
上的player
有一行中奖,此函数将返回True
,False
else
从这里,您可能会发现如何使用列,然后使用对角线来实现这一点
如果您不想将
size
传递给函数,只需将size
替换为len(board)
(只要board
是正方形就可以了)。使用all
怎么样。比如-if all([board1[a[i]]='X'表示范围内的i(board_size)])
在使用board1
之前,您还没有定义它any(all(cell==player表示行中的单元格)表示行中的行)
@PeterWood也可以工作,但我找不到在列上执行相同操作的方法,我希望解决方案是对称的。但总的来说,你的肯定更好。我明白了,是的,通过使用索引,你可以做得更多、更容易。@PeterWood令人沮丧,因为迭代很好:)