Я пытаюсь сделать крестики нолики программу, я установил, чтобы пользователь 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'
Добро пожаловать в StackOverflow. Прочтите и следуйте инструкциям по отправке в справочной документации. Здесь используется MCVE (http://stackoverflow.com/help/mcve). Мы не сможем помочь вам, пока вы не опубликуете свой минимальный, полный код (короткий и способный воспроизвести ошибку) и точно опишите проблему. В этом случае вы опустили довольно много функций. – Prune
Многие вопросы о SO можно избежать, если пользователи узнают, как использовать отладчик. Это должно быть одним из первых шагов к изучению Python IMHO. Обычно дистрибутивы Python поставляются с отладчиком, ориентированным на линию, который называется _pdb_ или _pdb.py_. Используйте его для однократного прохождения части программы, которая идет не так, и вы часто увидите проблему. Часто это происходит так, что люди, которые отвечают на вопросы SO, выяснили это в первую очередь. – tdelaney
Я включил всю программу сейчас – user135094