python:如何改进此代码(TicTacToe)?

时间:2018-07-07 17:29:21

标签: python

我刚刚开始学习python,这是TicTacToe游戏的代码。 您能提出任何建议吗?另外,如果在随后的输入中输入了相同的符号(不使用变量),该如何提醒玩家?

pos_matrix=[[' ',' ',' '],[' ',' ',' '],[' ',' ',' ']]
def my_tictactoe(pos,symbol):
    if pos_matrix[pos[0]-1][pos[1]-1]!=' ':
        print('Invalid input')
        exit
    else:
        pos_matrix[pos[0]-1][pos[1]-1]=symbol
    for i in range(0,3):
        print(pos_matrix[i][0]+' | '+pos_matrix[i][1]+' | '+pos_matrix[i][2])
        print('--|---|--')

    if is_win():
        print('GAME OVER. \n Player with symbol {x} wins!'.format(x=pos_matrix[pos[0]-1][pos[1]-1]))
        for i in [0,1,2]:
            pos_matrix[i][0]=pos_matrix[i][1]=pos_matrix[i][2]=' '


def is_win():
    for i in [0,1,2]:
        if pos_matrix[i][0]==pos_matrix[i][1]==pos_matrix[i][2]!=' ':
            return True
        elif pos_matrix[0][i]==pos_matrix[1][i]==pos_matrix[2][i]!=' ':
            return True
    if pos_matrix[0][0]==pos_matrix[1][1]==pos_matrix[2][2]!=' ':
        return True
    elif pos_matrix[0][2]==pos_matrix[1][1]==pos_matrix[2][0]!=' ':
        return True
    else:
        return False


my_tictactoe((1,1),'o')
my_tictactoe((2,2),'x')
my_tictactoe((3,2),'o')
my_tictactoe((1,3),'x')
my_tictactoe((2,1),'o')
my_tictactoe((3,3),'x')
my_tictactoe((3,1),'o')
my_tictactoe((1,2),'x')

1 个答案:

答案 0 :(得分:0)

您可以省略玩家一起输入其符号的操作。 玩家轮流使用,因此您可以前进一个简单的转弯计数器并使用适当的符号:

pos_matrix=[]
player = 'xoxoxoxox'
turn = 0

def initGame():
    global pos_matrix
    global turn
    turn = 0
    pos_matrix=[[' ',' ',' '],[' ',' ',' '],[' ',' ',' ']]

def printGame():
    for i in range(3):
        print("{} | {} | {}".format(*pos_matrix[i])) # decompose into its 3 values
        print('--|---|--')
    print("")


def my_tictactoe(pos):
    global turn
    global player

    if pos_matrix[pos[0]-1][pos[1]-1] != ' ':
        print('Invalid input')
        exit(1) # return fail code
    else:
        pos_matrix[pos[0]-1][pos[1]-1]= player[turn] 

    printGame()

    if is_win():
        print('GAME OVER. \n Player with symbol {x} wins!'.format( x = player[turn] ))
        initGame()
    elif turn == 8:
        print('Game Over -  D R A W.')
        initGame()

    else:
        turn += 1


def is_win():
    for i in [0,1,2]:
        if pos_matrix[i][0]==pos_matrix[i][1]==pos_matrix[i][2]!=' ':
            return True
        elif pos_matrix[0][i]==pos_matrix[1][i]==pos_matrix[2][i]!=' ':
            return True
    if pos_matrix[0][0]==pos_matrix[1][1]==pos_matrix[2][2]!=' ':
        return True
    elif pos_matrix[0][2]==pos_matrix[1][1]==pos_matrix[2][0]!=' ':
        return True
    else:
        return False


initGame()
my_tictactoe((1,1))
my_tictactoe((2,1))
my_tictactoe((1,2))
my_tictactoe((2,2))
my_tictactoe((2,3))
my_tictactoe((1,3))
my_tictactoe((3,1))
my_tictactoe((3,2))
my_tictactoe((3,3))

要增强代码,请开始创建具有特定用途的较小功能(请参见printBoard()),直到每个功能只有one reason to change为止-阅读有关其他S OLID 的信息好-它们还有助于获得更清晰的代码。


编辑:添加了DRAW-State和initGame()