Python Tictaoe接头错误
这是我的Tic.Tac.Toe游戏,效果不错。但我有一个功能来检查电路板是否已满,但这不起作用。我可以让它转到播放器1,然后是播放器2,但在它停止之后。有人能帮忙吗Python Tictaoe接头错误,python,Python,这是我的Tic.Tac.Toe游戏,效果不错。但我有一个功能来检查电路板是否已满,但这不起作用。我可以让它转到播放器1,然后是播放器2,但在它停止之后。有人能帮忙吗 # Tic Tac Toe Game import time import sys who = 'p1' finished = 'no' board = [0,1,2, 3,4,5, 6,7,8] def show(): print (board[0], '|', board [1],
# Tic Tac Toe Game
import time
import sys
who = 'p1'
finished = 'no'
board = [0,1,2,
3,4,5,
6,7,8]
def show():
print (board[0], '|', board [1], '|', board[2])
print ('---------')
print (board[3], '|', board [4], '|', board[5])
print ('---------')
print (board[6], '|', board [7], '|', board[8])
def checkWin():
if board[0] == 'x' and board[3] == 'x' and board[6] == 'x':
finished = 'yes'
return True
elif board[0] == 'y' and board[3] == 'y' and board[6] == 'y':
finished = 'yes'
return True
elif board[1] == 'x' and board[4] == 'x' and board[7] == 'x':
finished = 'yes'
return True
elif board[1] == 'y' and board[4] == 'y' and board[7] == 'y':
finished = 'yes'
return True
elif board[2] == 'y' and board[5] == 'y' and board[8] == 'y':
finished = 'yes'
return True
elif board[2] == 'x' and board[5] == 'x' and board[8] == 'x':
finished = 'yes'
return True
elif board[0] == 'y' and board[1] == 'y' and board[2] == 'y':
finished = 'yes'
return True
elif board[0] == 'x' and board[1] == 'x' and board[2] == 'x':
finished = 'yes'
return True
elif board[3] == 'x' and board[4] == 'x' and board[5] == 'x':
finished = 'yes'
return True
elif board[3] == 'y' and board[4] == 'y' and board[5] == 'y':
finished = 'yes'
return True
elif board[6] == 'y' and board[7] == 'y' and board[8] == 'y':
finished = 'yes'
return True
elif board[6] == 'x' and board[7] == 'x' and board[8] == 'x':
finished = 'yes'
return True
elif board[0] == 'x' and board[4] == 'x' and board[8] == 'x':
finished = 'yes'
return True
elif board[0] == 'y' and board[4] == 'y' and board[8] == 'y':
finished = 'yes'
return True
elif board[2] == 'y' and board[4] == 'y' and board[6] == 'y':
finished = 'yes'
return True
elif board[2] == 'x' and board[4] == 'x' and board[6] == 'x':
finished = 'yes'
return True
else:
return False
def boardFull():
if board[0] == 'x' or board[0] == 'y' and board[1] == 'x' or board[1] == 'y' and board[2] == 'x' or board[2] == 'y' and board[3] == 'x' or board[3] == 'y' and board[4] == 'x' or board[4] == 'y' and board[5] == 'x' or board[5] == 'y' and board[6] == 'x' or board[6] == 'y' and board[6] == 'x' or board[6] == 'y' and board[7] == 'x' or board[7] == 'y' and board[8] == 'x' or board[8] == 'y':
finished = 'yes'
return True
else:
finished = 'no'
return False
print ('Welcome to a two-player Tic.Tac.Toe Game!')
time.sleep(2)
print ("Just pick a spot to put your mark!")
time.sleep(1.5)
print ('Now, start!')
time.sleep(0.2)
print (show())
while checkWin() == False and boardFull() == False:
while who == 'p1':
try:
p1 = int(input('Player 1, select a spot: '))
if board[p1] != 'x' and board[p1] != 'o':
board[p1] = 'x'
who = 'p2'
break
else:
print ('This spot is taken.')
pass
except (ValueError, IndexError):
print ('That is not available. Please try again.')
print (show())
while who == 'p2':
try:
p2 = int(input('Player 2, select a spot: '))
if board[p2] != 'x' and board[p2] != 'o':
board[p2] = 'o'
who = 'p1'
break
else:
print ('This spot is taken.')
pass
except (ValueError, IndexError):
print ('That is not available. Please try again.')
print (show())
while checkWin() == True:
if boardFull() == False:
# x
if board[0] == 'x' and board[3] == 'x' and board[6] == 'x':
print ('Player 1 won!')
sys.exit()
elif board[1] == 'x' and board[4] == 'x' and board[7] == 'x':
print ('Player 1 won!')
sys.exit()
elif board[2] == 'x' and board[5] == 'x' and board[8] == 'x':
print ('Player 1 won!')
sys.exit()
elif board[0] == 'x' and board[1] == 'x' and board[2] == 'x':
print ('Player 1 won!')
sys.exit()
elif board[3] == 'x' and board[4] == 'x' and board[5] == 'x':
print ('Player 1 won!')
sys.exit()
elif board[6] == 'x' and board[7] == 'x' and board[8] == 'x':
print ('Player 1 won!')
sys.exit()
elif board[0] == 'x' and board[4] == 'x' and board[8] == 'x':
print ('Player 1 won!')
sys.exit()
elif board[2] == 'x' and board[4] == 'x' and board[6] == 'x':
print ('Player 1 won!')
sys.exit()
# y
else:
print ('Player 2 won!')
sys.exit()
else:
print ("It's a tie.")
很明显,问题在于101所说的boardFull的实现。我没有记忆优先级规则(这就是为什么在复杂表达式中使用括号是个好主意,即使在技术上不需要括号的地方),但我相信“或”的优先级低于“和”,意思是如果设置了
board[0]
,则boardFull
将返回True
,不管董事会的其他状态如何
我首先修改boardFull
以接受board
作为参数,而不是让它检查全局变量的状态。这使得函数更容易推理,更容易测试,并提高了可重用性。我还编写了一个简单的测试套件来测试其行为:
import unittest
def create_board():
return list(range(0, 9))
def board_full(board):
if board[0] == 'x' or board[0] == 'y' and board[1] == 'x' or board[1] == 'y' and board[2] == 'x' or board[2] == 'y' and board[3] == 'x' or board[3] == 'y' and board[4] == 'x' or board[4] == 'y' and board[5] == 'x' or board[5] == 'y' and board[6] == 'x' or board[6] == 'y' and board[6] == 'x' or board[6] == 'y' and board[7] == 'x' or board[7] == 'y' and board[8] == 'x' or board[8] == 'y':
finished = 'yes'
return True
else:
finished = 'no'
return False
class TestBoardFull(unittest.TestCase):
def setUp(self):
self.board = create_board()
def test_default_board_is_not_full(self):
default_board = self.board
self.assertFalse(board_full(default_board))
def test_board_after_two_moves_is_not_full(self):
board = self.board
board[0] = 'x'
board[1] = 'y'
self.assertFalse(board_full(board))
def test_board_is_full_after_all_tiles_marked(self):
board = self.board
board[0] = 'x'
board[1] = 'y'
board[2] = 'x'
board[3] = 'y'
board[4] = 'x'
board[5] = 'y'
board[6] = 'x'
board[7] = 'y'
board[8] = 'x'
self.assertTrue(board_full(board))
if __name__ == '__main__':
unittest.main()
目前,board\u full(board)
使用您的原始实现,我们可以显示它不正确:
F。。
======================================================================
失败:两次移动后测试板未满(主测试板已满)
----------------------------------------------------------------------
回溯(最近一次呼叫最后一次):
文件“C:/Users/.PyCharmCE2016.3/config/scratches/scratch.py”,第26行,在两次移动后的测试板中未满
自身资产虚假(董事会成员(董事会成员))
断言者错误:True不是false
----------------------------------------------------------------------
在0.000秒内运行了3次测试
失败(失败=1)
然后,我尝试更正实现:
def board_full(board):
return all(tile == 'x' or tile == 'y' for tile in board)
至少根据我目前定义的测试,测试它是否有效:
。。。
----------------------------------------------------------------------
在0.000秒内运行了3次测试
好啊
您有很多问题。一种是你在船上设置了x
或o
,但你选择了x
或y
。接下来是两次移动后返回True
。但您可以计算正确的移动,而不是检查所有单元格。正确移动9次后,棋盘将满
您的代码可以更短
show()
checkWin()
可以返回False
或winnerx
或o
,这被视为True
,最后您不必再次检查谁是赢家
在循环中,当玩家1和2移动时,你不检查棋盘是否已满,所以游戏挂起,因为玩家1移动后棋盘已满,玩家2无法移动
checkWin()。
我数了数正确的移动,以检查棋盘是否已满-移动9步后,棋盘应已满
# Tic Tac Toe Game
import time
# --- fucntions ---
def show(board):
print('''-----------
{} | {} | {}
-----------
{} | {} | {}
-----------
{} | {} | {}
-----------'''.format(*board))
def check_winner(board, q):
if board[0] == q and board[3] == q and board[6] == q:
return True
elif board[1] == q and board[4] == q and board[7] == q:
return True
elif board[2] == q and board[5] == q and board[8] == q:
return True
elif board[0] == q and board[1] == q and board[2] == q:
return True
elif board[3] == q and board[4] == q and board[5] == q:
return True
elif board[6] == q and board[7] == q and board[8] == q:
return True
elif board[0] == q and board[4] == q and board[8] == q:
return True
elif board[2] == q and board[4] == q and board[6] == q:
return True
return False
# --- start ---
board = list(range(9))
player = 'x'
number = '1'
moves = 0
print('Welcome to a two-player Tic.Tac.Toe Game!')
time.sleep(2)
print("Just pick a spot to put your mark!")
time.sleep(1.5)
print('Now, start!')
time.sleep(0.2)
show(board)
while True:
while True:
try:
idx = int(input('Player {}, select a spot: '.format(number)))
if board[idx] not in ('x', 'o'):
board[idx] = player
moves += 1
break
else:
print('This spot is taken.')
except (ValueError, IndexError):
print('That is not available. Please try again.')
show(board)
winner = check_winner(board, player)
if winner or moves == 9:
break
# change player after checking who win
if player == 'x':
player = 'o'
number = '2'
else:
player = 'x'
number = '1'
if winner:
print('Player {} won!'.format(number))
else:
print("It's a tie.")
首先,如果电路板[0]=“x”或…,则函数boardFull
以开头:返回True
,这是错误的;即使只有平方0是x
,它也将计算为True
。您应该用一个值填充板-即0
,然后您必须检查board[0]!='0'
而不是board[0]='x'或board[0]='y'
您可以使用参数创建checkWin
,然后运行checkWin('x')
和checkWin('y'))
-这样,checkWin
中的代码会更简单。who=='p1':
和who=='p2':
中的循环非常相似-您可以创建一个函数并使用不同的参数执行-代码会更简单、更短。@Something,我对您的代码做了一些改进,以帮助您解决问题,并演示一种更具python风格和程序员友好的编写方法。如果您有任何疑问,请随时就要点发表评论。