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令人沮丧,因为迭代很好:)