游戏在Python Tic Tac Toe游戏中不起作用



我已经为一款Python井字游戏工作了大约一个月,终于可以看到结局了。我正在为游戏的代码而挣扎,非常感谢任何人为克服这一障碍提供的建议。

问题:

每次玩家移动时,我的game_board都会重新打印一次。因此,游戏在任何一个棋盘都填满之前就结束了。

代码

这是我的游戏板代码:

game_board = ['#'] + ([' ']*9)
display_board(game_board)

这是我的游戏代码:

print('Welcome to Tic Tac Toe!')
# turn = '' # needs to be an empty string because we're storing the result of go_first(), a string, inside
while True: # loop forever
game_board = [' ']*10 # clear board 
player1_marker , player2_marker = assign_marker() # assign players to marker
turn = go_first() # randomly choose who goes first
print(f"{turn}, you're up first!")
play_game = input("Ready? Enter Yes or No.")
if play_game.lower()[0] == 'y': 
game_on = True
else:
game_on = False
while game_on: # initiates the start of the game
if turn == 'Player 1': # if player 1 is first
position = player_choice(game_board) # ask for position from player
place_marker(game_board, player1_marker, position) # place marker at the position
display_board(game_board) # display board
if check_winner(game_board, player1_marker): # if there are no more moves
game_on = False
print(f"{turn} wins!")
else: # if there's no winner
if is_board_full(game_board): # check to see if the board is full
# if board is full but there's no winner, it's a draw
print("It's a draw!")
break
else: # if the board is NOT full ...
turn = 'Player 2' #move on to player 2; THIS IS HOW TO ALTERNATE TURNS
else: # if player 2 is first
position = player_choice(game_board) # ask for position from player
place_marker(game_board, player2_marker, position) # place marker at the position
display_board(game_board)
if check_winner(game_board, player2_marker):
game_on = False
print(f"{turn} wins!")
else: # if there's no winner
if is_board_full(game_board): # check to see if the board is full
# if board is full but there's no winner, it's a draw
game_on = False
print("It's a draw!")
break
else: # if the board is NOT full ...
turn = 'Player 1' #move on to player 2; THIS IS HOW TO ALTERNATE TURNS
if not replay():
break

结果

Welcome to Tic Tac Toe!
Player 1 has chosen X
Player 2 is O
Player 1, you're up first!
| |
| | 
_____
| |
| | 
_____
| |
| |X
| |
| | 
_____
| |
|O| 
_____
| |
| |X
| |
X| | 
_____
| |
|O| 
_____
| |
| |X
| |
X|O| 
_____
| |
|O| 
_____
| |
| |X
| |
X|O|X
_____
| |
|O| 
_____
| |
| |X
| |
X|O|X
_____
| |
|O| 
_____
| |
|O|X
Player 2 wins!
---------------------------------------------------------------------------
IndexError                                Traceback (most recent call last)
<ipython-input-36-9859c5aad566> in <module>
54                     turn = 'Player 1' #move on to player 2; THIS IS HOW TO ALTERNATE TURNS
55 
---> 56     if not replay():
57         break
<ipython-input-30-73127fbca36c> in replay()
9         choice = input("Do you want to play again? ") # program will keep asking for valid input
10 
---> 11         if choice.lower()[0] == 'n':
12             print("GAME OVER.")
13             return False
IndexError: string index out of range

而且,由于这与IndexError有关:

def replay():
choice = ' '
# declare variable, which is an empty string
while choice.lower()[0] != 'y': #uppercasing the 'Y' ensures that input can only be uppercase
# while loop ensures any other input will be rejected
choice = input("Do you want to play again? ") # program will keep asking for valid input
if choice.lower()[0] == 'n':
print("GAME OVER.")
return False
else:
print("LET'S PLAY!")
return True
# if player wants a replay, return a boolean True

有人猜测我的代码为什么不起作用吗

我希望这是一个足够的代码通知任何可能的回应。我很乐意分享更多的代码。

此外,我理解有些人是否会觉得StackOverflow不是解决此类问题的地方。我只是在努力学习和解决问题!提前感谢!

我解决了这个问题,最终完成了游戏!!以下是对我有效的方法。我希望这些解决方案能帮助其他人

  1. 我在我的def display_board(board(功能(上面没有显示(中添加了print('\n'*50(,这样当我的板重新打印时——这显然是它应该做的——我重新打印的板并不是一块一块的
  2. 同样没有在上面的代码中显示,我意识到在我的用于检查winner的函数中,最初的参数是";板;以及";标记";我正在返回板[位置]==标记。该函数本应采用变元";板;并且";MARK">并返回板[位置]==MARK

在我做出这些更改后,我注意到我的板打印出来的时间有延迟,这是我在开发这个项目的早期遇到的一个错误。为了解决这个问题,我做了以下更改:

  1. game_onwhile循环(如上所示(中,我重新组织了turn="Player 1"或"Player 2"时应该发生的操作顺序。我没有将我的动作排序为(1(position=player_choice(game_board(、(2(place_marker(game_board,player1_marker,position(和(3(display_board(game_board(,而是将它们重新排序为:
  2. if check_winner下,我确保display_board(game_board(是第一个可操作的项目

查看下面的最终游戏代码:

print('Welcome to Tic Tac Toe!')
# turn = '' # needs to be an empty string because we're storing the result of go_first(), a string, inside
while True: # loop forever
game_board = [' ']*10 # clear board 
player1_marker , player2_marker = assign_marker() # assign players to marker
turn = go_first() # randomly choose who goes first
print(f"{turn}, you're up first!")
play_game = input("Ready? Enter Yes or No.")

if play_game.lower()[0] == 'y': 
game_on = True
print("LET'S PLAY!")
else:
game_on = False
while game_on: # initiates the start of the game
if turn == 'Player 1': # if player 1 is first
display_board(game_board) # display board
position = player_choice(game_board) # ask for position from player
place_marker(game_board, player1_marker, position) # place marker at the position
if check_winner(game_board, player1_marker): # if there are no more moves
display_board(game_board) # display board
print(f"{turn} wins!")
game_on = False
else: # if there's no winner
if is_board_full(game_board): # check to see if the board is full
# if board is full but there's no winner, it's a draw
display_board(game_board) # display board
print("It's a draw!")
break
else: # if the board is NOT full ...
turn = 'Player 2' #move on to player 2; THIS IS HOW TO ALTERNATE TURNS
else: # Player 2's turn
display_board(game_board)
position = player_choice(game_board) # ask for position from player
place_marker(game_board, player2_marker, position) # place marker at the position
if check_winner(game_board, player2_marker):
display_board(game_board) # display board
print(f"{turn} wins!")
game_on = False
else: # if there's no winner
if is_board_full(game_board): # check to see if the board is full
# if board is full but there's no winner, it's a draw
display_board(game_board) # display board
print("It's a draw!")
break
else: # if the board is NOT full ...
turn = 'Player 1' #move on to player 1; THIS IS HOW TO ALTERNATE TURNS
if not replay():
break

最新更新