需要Python调试建议

时间:2015-10-27 23:19:44

标签: python loops

我正在尝试制作一个tic tac toe程序,我将用户设置为X,将计算机设置为Y.一旦获胜者是                                                                                                     宣布它是                                                                                                              应该 开始游戏再玩一次。它第一次在循环中完美运行,但在接下来的游戏中它 将用户更改为O,将计算机更改为O,也只是用户有一个计算机永远不会转的用户,                                                                                                   但该计划 将计算机注册为获胜因为计算机是O.如果程序选择计算机先行,                                                                                                         它会 第一步,但它不会再转弯。我认为循环有问题,但我无法弄清楚         其中。

 import random


winningCombinations=[]
userhistory=[]
secondchance=[]

def drawBoard(board):
    # This function prints out the board that it was passed.
    # "board" is a list of 10 strings representing the board (ignore index 0)
    print('')
    print('')
    print('   |   |')
    print(' ' + board[7] + ' | ' + board[8] + ' | ' + board[9])
    print('   |   |')
    print('-----------')
    print('   |   |')
    print(' ' + board[4] + ' | ' + board[5] + ' | ' + board[6])
    print('   |   |')
    print('-----------')
    print('   |   |')
    print(' ' + board[1] + ' | ' + board[2] + ' | ' + board[3])
    print('   |   |')
    print('')
    print('')

def getComputerMove():

    # Here is our algorithm for our Tic Tac Toe AI:
    if userhistory in winningCombinations:
        #try to beat it
        blockingMove = secondchance[len(secondchance)-1]
        return blockingMove
    else:
        #make a rando move

        move = random.randint(1, 9)
        while theBoard[move] != ' ': #if the move is invalid or occupied
            move = random.randint(1, 9)
        return move




print('Welcome to Tic Tac Toe!')

#First ask the user if it wants to be X or 0
userin = ''
#while not (userin == 'X' or userin == 'O'):
#   userin = raw_input('Do you want to be X or O?').upper()
# the first element in the tuple is the player's letter, the second is the computer's letter.
#if userin == 'X':
#    playerLetter, computerLetter = ['X', 'O']
#elif userin =="O":
#    computerLetter, playerLetter =  ['O', 'X']


numGames = 1 #to keep track of the user history



#computergenerates who gets to go first
if random.randint(0, 1) == 0:
    turn = 'computer'
else:
    turn = 'player'
print('The ' + turn + ' will go first.')



while True:

# Reset the board
    theBoard = [' '] * 10
    del userhistory[:]


    gameIsPlaying = True


    while gameIsPlaying:
        playerLetter = 'X'
        computerLetter = 'O'

        if turn == 'player':
            # Player's turn.
            drawBoard(theBoard)


            umove = int(raw_input('What is your next move? (1-9)'))
            while theBoard[umove] != ' ': #if the move is invalid or occupied
                umove = int(raw_input('What is your next move? (1-9)'))

            theBoard[umove]=playerLetter #places move onto board
            userhistory.append(umove) #records users moves
            secondchance.append(umove)#records users moves



#Check to see if its a winner
            if ((theBoard[7] == playerLetter and theBoard[8] == playerLetter and theBoard[9] == playerLetter) or # across the top
    (theBoard[4] == playerLetter and theBoard[5] == playerLetter and theBoard[6] == playerLetter) or # across the middle
    (theBoard[1] == playerLetter and theBoard[2] == playerLetter and theBoard[3] == playerLetter) or # across the bottom
    (theBoard[7] == playerLetter and theBoard[4] == playerLetter and theBoard[1] == playerLetter) or # down the left side
    (theBoard[8] == playerLetter and theBoard[5] == playerLetter and theBoard[2] == playerLetter) or # down the middle
    (theBoard[9] == playerLetter and theBoard[6] == playerLetter and theBoard[3] == playerLetter) or # down the right side
    (theBoard[7] == playerLetter and theBoard[5] == playerLetter and theBoard[3] == playerLetter) or # diagonal
    (theBoard[9] == playerLetter and theBoard[5] == playerLetter and theBoard[1] == playerLetter)):

                drawBoard(theBoard)
                print('Hooray! You have won the game!')
                del userhistory[len(userhistory)-1] #deleting last element to find the combination just before losing

                winningCombinations.append(userhistory) #stores the winning combination into another list
                numGames+=1
                gameIsPlaying = False

            else:
                empty = ' '
                if empty not in theBoard:
                    print('The game is a tie!')
                    break

                else:
                    turn = 'computer'


        else:
            # Computer's turn.
            cmove = getComputerMove()

            theBoard[cmove] = computerLetter

            if ((theBoard[7] == computerLetter and theBoard[8] == computerLetter and theBoard[9] == computerLetter) or # across the top
    (theBoard[4] == computerLetter and theBoard[5] == computerLetter and theBoard[6] == computerLetter) or # across the middle
    (theBoard[1] == computerLetter and theBoard[2] == computerLetter and theBoard[3] == computerLetter) or # across the bottom
    (theBoard[7] == computerLetter and theBoard[4] == computerLetter and theBoard[1] == computerLetter) or # down the left side
    (theBoard[8] == computerLetter and theBoard[5] == computerLetter and theBoard[2] == computerLetter) or # down the middle
    (theBoard[9] == computerLetter and theBoard[6] == computerLetter and theBoard[3] == computerLetter) or # down the right side
    (theBoard[7] == computerLetter and theBoard[5] == computerLetter and theBoard[3] == computerLetter) or # diagonal
    (theBoard[9] == computerLetter and theBoard[5] == computerLetter and theBoard[1] == computerLetter)):

                drawBoard(theBoard)
                print('Aw! You have lost the game, the computer has beaten you!')
                gameIsPlaying = False


            else:
                empty = ' '
                if empty not in theBoard:
                    print('The game is a tie!')
                    break


                else:

                    turn = 'player'

1 个答案:

答案 0 :(得分:3)

由于您要求调试建议,我将在该级别回答。

当您患病时,请询问疼痛的位置。打印命令是一种生硬但有效的武器。在代码的关键点,请坚持使用

等语句
print "CHECKPOINT A", "turn =", turn

换句话说,跟踪逻辑流程和有用值。这些语句在块的顶部或底部(循环或函数)特别有用。

接下来,当您有一长串代码时,请考虑将一些逻辑移动到一个函数中。在这个程序中,你的代码来检测胜利将是一个很好的选择:你有8行相同的代码,你可以隔离并用函数调用替换。

我希望这两个足以追踪问题;他们几乎处理了我自己的所有失败。我不是一个接一个地重复长期建议,而是向你推荐博客文章how to debug以获得进一步的建议。