2015-10-27 4 views
0

Я пытаюсь сделать крестики нолики программу, я установил, чтобы пользователь X и компьютер, чтобы быть Y. После победитель заявил он должен , чтобы начать игру снова играть , Он запускается отлично через цикл в первый раз, но в следующей игре он изменяет пользователя на O и на компьютер на O, также только пользователь имеет поворот, который компьютер никогда не идет, , но программа регистрирует компьютер как выигрышный потому что компьютер равен O. Если программа выбирает компьютер первым, будет делать первый ход, но он не получит поворот снова. Я думаю, что что-то не так с петлей, но я не могу найти где.Python советы отладки требуется

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' 
+0

Добро пожаловать в StackOverflow. Прочтите и следуйте инструкциям по отправке в справочной документации. Здесь используется MCVE (http://stackoverflow.com/help/mcve). Мы не сможем помочь вам, пока вы не опубликуете свой минимальный, полный код (короткий и способный воспроизвести ошибку) и точно опишите проблему. В этом случае вы опустили довольно много функций. – Prune

+0

Многие вопросы о SO можно избежать, если пользователи узнают, как использовать отладчик. Это должно быть одним из первых шагов к изучению Python IMHO. Обычно дистрибутивы Python поставляются с отладчиком, ориентированным на линию, который называется _pdb_ или _pdb.py_. Используйте его для однократного прохождения части программы, которая идет не так, и вы часто увидите проблему. Часто это происходит так, что люди, которые отвечают на вопросы SO, выяснили это в первую очередь. – tdelaney

+0

Я включил всю программу сейчас – user135094

ответ

3

Поскольку вы просите совета по отладке, я отвечу на этом уровне.

Когда у вас есть больной пациент, спросите, где он болит. Команда печати - это тупое, но эффективное оружие. В критических точках в коде, застревают в заявлении, таких как

print "CHECKPOINT A", "turn =", turn 

Другими словами, проследить как логический поток и полезные значения. Эти утверждения особенно полезны в верхней или нижней части блока (цикл или функция).

Далее, когда у вас есть длинный блок кода, рассмотрите возможность перемещения некоторой логики в функцию. В этой программе ваш код для обнаружения выигрыша был бы хорошим кандидатом: у вас есть 8 длинных строк одинакового кода, которые вы могли бы выделить и заменить вызовом функции.

Я ожидаю, что этих двух будет достаточно, чтобы отследить проблему; они справляются практически со всеми моими неудачами. Вместо того, чтобы повторять давние советы, один пункт за другим, я рекомендую вам сообщение в блоге how to debug для дальнейших предложений.

+0

Я попробовал ваше предложение по контрольной точке, и все по-прежнему выглядит нормально. Я понятия не имею, в чем проблема – user135094

+0

Я редактировал код выше, чтобы включить всю мою программу – user135094

Смежные вопросы