Tic-Tac-Toe游戏

时间:2014-11-12 05:42:11

标签: python tic-tac-toe

我为Tic-Tac-Toe游戏编写了一个代码。

以下是代码的作用:

  1. 获取播放器1的名称。
  2. 获取播放器2的名称。
  3. 询问玩家1是否需要XO
  4. 如果他选择X,则玩家2获得O,反之亦然。
  5. 打印空白板。
  6. 要求两位玩家逐个输入行和列并打印更新后的电路板。
    • 如果玩家没有重复上一个玩家的位置,一切正常,直到结束没有任何问题。
    • 如果玩家重复上一个玩家的位置,会显示一条消息,说明之前的玩家已经占据了这个位置并让他再次猜测。
  7. 现在,在此之后,如果我猜测除了前一个玩家已经采取的指数以外的任何指数,它将覆盖之前的玩家现货。

    发生这种情况时终端的屏幕截图:

    enter image description here

    我确定问题出在函数enterguess(turncount)中,但还没有能够发现它。知道问题在哪里吗?

    < --------------------------------------------- - [Demo Without the colors] ------------------------------------------ - >

    代码:

    import termcolor
    
    board = [[" ", " ", " "], [" ", " ", " "], [" ", " ", " "]]
    vb = termcolor.colored("|", "yellow", None, ['bold'])
    s = termcolor.colored("\t+---+---+---+", "yellow", None, ['bold'])
    players = {
            'player1' : '',
            'player2' : ''
    }
    sym = {
            'player1': '',
            'player2': ''
    }
    
    def rules ():
        print("\nWelcome to Tic Tac Toe...")
    
    def printboard():
        #boardlist = [[" "," "," "],[" "," "," "],[" "," "," "]]
        for row in board:
            print s
            print "\t" + vb + " " + row[0] + " " + vb + " " + row[1] + " " + vb + " " + row[2] + " " + vb
        print s
    
    def playerNames():
        p1 = termcolor.colored(raw_input("\nEnter name of Player 1: ").title(), 'red', None, ['underline'])
        p2 = termcolor.colored(raw_input("Enter name of Player 2: ").title(), 'blue', None, ['underline'])
        sym['player1'] = termcolor.colored(raw_input("\n" + p1 + ', you want X or O? - ').capitalize(), 'red', None, ['bold'])
        if sym['player1'] == 'X':
            sym['player2'] = termcolor.colored('O', 'blue', None, ['bold'])
        else:
            sym['player2'] = termcolor.colored('X', 'red', None, ['bold'])
        players['player1'] = p1
        players['player2'] = p2
        return {p1:termcolor.colored('X', 'red', None, ['bold']), p2: termcolor.colored('O', 'blue', None, ['bold'])}
    
    def enterguess(turncount):
        def guess(name):
            return (int(input("\n" + players[name] + ", Enter row number: ")),
                    int(input(players[name] + ", Enter column number: ")))
    
        if turncount % 2 == 0:
            (row, col) = guess('player1')
    
            try:
                if board[row - 1][col - 1] in [sym['player1'], sym['player2']]:
                    print "\n" + players['player2'] + " already took that spot! Please guess again."
                    enterguess(turncount)
            except:
                print "\nPlease enter the indexes between 1 and 3."
                enterguess(turncount)
    
        else:
            (row, col) = guess('player2')
    
            try:
                if board[row - 1][col - 1] in [sym['player1'], sym['player2']]:
                    print "\n" + players['player1'] + " already took that spot! Please guess again."
                    enterguess(turncount)
            except IndexError:
                print "\nPlease enter a number between 1 and 3."
                enterguess(turncount)
    
        return (row - 1, col - 1)
    
    
    def changeboard(row, col, xo, c):
        if c % 2 == 0:
            board[row][col] = xo[players['player1']]
        else:
            board[row][col] = xo[players['player2']]
    
    def checkWinner():
        for x in range(3):
            if board[x][0] == board[x][1] == board[x][2] and board[x][0] != " ":
                return [players[n] for n, s in sym.iteritems() if s == board[x][0]][0]
    
        for y in range(3):
            if board[0][y] == board[1][y] == board[2][y] and board[0][y] != " ":
                return [players[n] for n, s in sym.iteritems() if s == board[0][y]][0]
    
        xx = 0
        yy = 2
        while True:
            if board[xx][xx] == board[1][1] == board[2][yy] and board[xx][xx] != " ":
                return [players[n] for n, s in sym.iteritems() if s == board[xx][xx]][0]
            xx += 2
            yy -= 2
            if xx == 2:
                break
    
    
    def main():
        rules()
        xo = playerNames()
        printboard()
        turncount = 0
        for turn in range(9):
            (r, c) = enterguess(turncount)
            print (r, c)
            changeboard(r, c, xo, turncount)
            turncount += 1
            winner = checkWinner()
            printboard()
    
            if winner:
                print("\nCongratulations " + winner + "! You are the winner.\n")
                break
            if turn == 8:
                print ("\n    Well! Its a tie.\n")
    
    main()
    

1 个答案:

答案 0 :(得分:1)

您遇到的问题是,虽然您记得enterguess,但您不会将其退回。所以它只是一直调用enterguess直到给出一个有效的输入,然后它就会忽略所有这些并转到最终的返回语句,它仍然有错误的猜测。

添加return语句:

def enterguess(turncount):
    def guess(name):
        return (int(input("\n" + players[name] + ", Enter row number: ")),
                int(input(players[name] + ", Enter column number: ")))

    if turncount % 2 == 0:
        (row, col) = guess('player1')

        try:
            if board[row - 1][col - 1] in [sym['player1'], sym['player2']]:
                print "\n" + players['player2'] + " already took that spot! Please guess again."
                return enterguess(turncount)
        except:
            print "\nPlease enter the indexes between 1 and 3."
            return enterguess(turncount)

    else:
        (row, col) = guess('player2')

        try:
            if board[row - 1][col - 1] in [sym['player1'], sym['player2']]:
                print "\n" + players['player1'] + " already took that spot! Please guess again."
                return enterguess(turncount)
        except IndexError:
            print "\nPlease enter a number between 1 and 3."
            return nterguess(turncount)

    return (row - 1, col - 1)