Python中的井字棋循环不运行
我不太明白为什么,下面这段 Python 3 代码在内层循环中没有像我希望的那样运行 tie(cell)
函数(这样循环就会在棋盘满的时候停止)。
有没有人知道这是为什么呢?谢谢!
import random
cell = ['1', '2', '3', '4', '5', '6', '7', '8', '9']
def owin(cell):
if cell[0] == cell[1] == cell[2] == 'O' or cell[3] == cell[4] == cell[5] == 'O' or cell[6] == cell[7] == cell[8] == 'O' or cell[0] == cell[3] == cell[6] == 'O' or cell[1] == cell[4] == cell[7] == 'O' or cell[2] == cell[5] == cell[8]== 'O':
return True
else:
return False
def xwin(cell):
if cell[0] == cell[1] == cell[2] == 'X' or cell[3] == cell[4] == cell[5] == 'X' or cell[6] == cell[7] == cell[8] == 'X' or cell[0] == cell[3] == cell[6] == 'X' or cell[1] == cell[4] == cell[7] == 'X' or cell[2] == cell[5] == cell[8]== 'X':
return True
else:
return False
def tie(cell):
if cell[0] in ('O', 'X') and cell[1] in ('O', 'X') and cell[2] in ('O', 'X') and cell[3] in ('O', 'X') and cell[4] in ('O', 'X') and cell[5] in ('O', 'X') and cell[6] in ('O', 'X') and cell[7] in ('O', 'X') and cell[8] in ('O', 'X'):
return True
else:
return False
board = '\n\t ' + cell[0] + ' | ' + cell[1] + ' | ' + cell[2] + '\n\t-----------\n\t ' + cell[3] + ' | ' + cell[4] + ' | ' + cell[5] + '\n\t-----------\n\t ' + cell[6] + ' | ' + cell[7] + ' | ' + cell[8]
print('\tTIC TAC TOE\n\t\tBy Lewis Cornwall')
instructions = input('Would you like to read the instructions? (y/n)')
if instructions == 'y':
print('\nEach player takes turns to place a peice on the following grid:\n\n\t 1 | 2 | 3\n\t-----------\n\t 4 | 5 | 6\n\t-----------\n\t 7 | 8 | 9\n\nBy inputing a vaule when prompted. The first to 3 peices in a row wins.')
player1 = input('Enter player 1\'s name: ')
player2 = input('Enter player 2\'s name: ')
print(player1 + ', you are O and ' + player2 + ', you are X.')
nextPlayer = player1
while not owin(cell) and not xwin(cell) and not tie(cell):
print('This is the board:\n' + board)
if nextPlayer == player1:
move = input('\n' + player1 + ', select a number (1 - 9) to place your peice: ')
cell[int(move) - 1] = 'O'
board = '\n\t ' + cell[0] + ' | ' + cell[1] + ' | ' + cell[2] + '\n\t-----------\n\t ' + cell[3] + ' | ' + cell[4] + ' | ' + cell[5] + '\n\t-----------\n\t ' + cell[6] + ' | ' + cell[7] + ' | ' + cell[8]
nextPlayer = player2
else:
move = input('\n' + player2 + ', select a number (1 - 9) to place your peice: ')
cell[int(move) - 1] = 'X'
board = '\n\t ' + cell[0] + ' | ' + cell[1] + ' | ' + cell[2] + '\n\t-----------\n\t ' + cell[3] + ' | ' + cell[4] + ' | ' + cell[5] + '\n\t-----------\n\t ' + cell[6] + ' | ' + cell[7] + ' | ' + cell[8]
nextPlayer = player1
if owin(cell):
print('Well done, ' + player1 + ', you won!')
elif xwin(cell):
print('Well done, ' + player2 + ', you won!')
else:
print('Unfortunately, niether of you were able to win today.')
input('Press <enter> to quit.')
4 个回答
0
条件应该是这样的:
while (not owin(cell) or not xwin(cell)) and not tie(cell):
1
替换函数 tie(cell) 中的条件
如果 cell 的第一个元素在 ('O', 'N') 中,并且第二个元素在 ('O', 'N') 中,并且第三个元素在 ('O', 'N') 中,并且第四个元素在 ('O', 'N') 中,并且第五个元素在 ('O', 'N') 中,并且第六个元素在 ('O', 'N') 中,并且第七个元素在 ('O', 'N') 中,并且第八个元素在 ('O', 'N') 中,并且第九个元素在 ('O', 'N') 中:
可以用
if cell[0] in ('O', 'X') and cell[1] in ('O', 'X') and cell[2] in ('O', 'X') and cell[3] in ('O', 'X') and cell[4] in ('O', 'X') and cell[5] in ('O', 'X') and cell[6] in ('O', 'X') and cell[7] in ('O', 'X') and cell[8] in ('O', 'X'):
2
在你写的代码中,tie(cell)
只出现了一次:
while not owin(cell) and not xwin(cell) and not tie(cell):
注意,这里是一个逻辑表达式。在几乎所有的编程语言中(包括Python),对这样的逻辑表达式都有一些优化:
# here test_func() won't be invoked
if 1 or test_func():
pass
# here test_func() won't be invoked
if 0 and test_func():
pass
# here test_func() would be invoked
if 1 and test_func():
pass
# here test_func() would be invoked
if 0 or test_func():
pass
所以,tie(cell)
没有被调用的原因是因为要么 owin(cell)
要么 xwin(cell)
返回了真(true)。