尝试编写一个来自Udemy课程的简单井字棋。我做错了什么?

huangapple go评论96阅读模式
英文:

Try to code a simple Tic Tac Toe from a Udemy course. What did I do wrong?

问题

  1. 下面是我用于简单井字游戏的代码。我遇到了以下错误,不知道该如何解决。在Jupyter笔记本中,这个程序是可以运行的,但是当我尝试在VSCode中运行脚本时,就会出现错误。我需要指导如何修复这个错误。
  2. ***错误如下: ***

Traceback (most recent call last):
File "x:\Python\Python_Bootcamp\Complete-Python-3-Bootcamp-master\04-Milestone Project - 1\TIC_TAC_TOE.py", line 105, in <module>
display_board(board)
File "x:\Python\Python_Bootcamp\Complete-Python-3-Bootcamp-master\04-Milestone Project - 1\TIC_TAC_TOE.py", line 8, in display_board
print(board[1] + '|' + board[2] + '|' + board[3])
~~~~~^^^
IndexError: list index out of range

  1. ### 井字游戏 ###


import random

  1. # 显示游戏的游戏板

def display_board(board):
# print(&#39;\n&#39;*100) # 只让您看到游戏板的一个版本
print(board[1] + &#39;|&#39; + board[2] + &#39;|&#39; + board[3])
print(&#39;-----&#39;)
print(board[4] + &#39;|&#39; + board[5] + &#39;|&#39; + board[6])
print(&#39;-----&#39;)
print(board[7] + &#39;|&#39; + board[8] + &#39;|&#39; + board[9])

  1. # 选择玩家1是X还是O

`def player_input():
marker = ''

  1. while marker != &#39;X&#39; and marker != &#39;O&#39;:
  2. marker = input(&#39;玩家1选择 X O: &#39;)
  3. player1 = marker.upper()
  4. if player1 == &#39;X&#39;:
  5. player2 = &#39;O&#39;
  6. else:
  7. player2 = &#39;X&#39;
  8. return(player1, player2)`
  1. # 在游戏板上占据位置并放置标记

def place_marker(board,marker,position):
board[position] = marker

  1. # 检查是否获胜

def win_check(board, mark):
return ((board[7] == mark and board[8] == mark and board[9] == mark) or # 底线横排
(board[4] == mark and board[5] == mark and board[6] == mark) or # 中间横排
(board[1] == mark and board[2] == mark and board[3] == mark) or # 顶部横排
(board[7] == mark and board[4] == mark and board[1] == mark) or # 左侧竖排
(board[2] == mark and board[5] == mark and board[8] == mark) or # 中间竖排
(board[3] == mark and board[6] == mark and board[9] == mark) or # 右侧竖排
(board[3] == mark and board[5] == mark and board[7] == mark) or # 对角线
(board[9] == mark and board[5] == mark and board[1] == mark)) # 对角线

  1. # 随机决定是玩家1还是玩家2先开始

`def choose_first():
flip = random.randint(0,1)

  1. if flip == 0:
  2. return (&#39;玩家1&#39;)
  3. else:
  4. return (&#39;玩家2&#39;)`
  1. # 检查位置是否可用

def space_check(board, position):
return board[position] == &#39; &#39; # 如果空格为空,则返回值为True

  1. # 检查游戏板是否已满

def full_board_check(board):
for i in range(1,10):
if space_check(board,i):
return False # False 表示该位置为空
else:
return True # True 表示游戏板已满

  1. # 玩家选择他们在游戏板上的下一个位置的功能

`def player_choice(board):
position = 0

  1. while position not in [1,2,3,4,5,6,7,8,9]:
  2. position = int(input(&#39;选择您的位置: &#39;))
  3. return position

def replay():

  1. choice = input(&#39;您想再玩一次吗?&#39;)
  2. return choice == &#39;Yes&#39;`
  1. ### 游戏设置 ###

`print('欢迎来玩井字游戏!')

while True:
board = [' '*10]
player1_marker,player2_marker = player_input()
turn = choose_first()
print(turn + '将先行')
game_on = ''

  1. play_game = input(&#39;您准备好玩了吗?是或否: &#39;)
  2. if play_game.lower()[0] == &#39;y&#39;:
  3. game_on == True
  4. else:
  5. game_on == False
  6. # 玩家1回合
  7. if turn == &#39;玩家1&#39;:
  8. # 显示游戏板
  9. display_board(board)
  10. # 选择位置
  11. position = player_choice(board)
  12. # 在选择的位置放置标记
  13. place_marker(board,player1_marker,position)
  14. # 检查是否获胜
  15. if win_check(board,player1_marker) == True:
  16. display_board(board)
  17. print(&#39;玩家1赢得了比赛!&#39;)
  18. game_on = False
  19. # 检查是否为平局
  20. else:
  21. if full_board_check(board):
  22. display_board(board)
  23. print(&#39;平局!&#39;
英文:

Below is the code I used for my simple Tic Tac Toe game. I receive the following error I have no idea how to get around. This program does work in Jupyter notebook, but when I try to run the script in VScode, the error appears. I need guidance on how I can fix this error.

***THE ERROR IS AS FOLLOWS: ***

  1. Traceback (most recent call last):
  2. File &quot;x:\Python\Python_Bootcamp\Complete-Python-3-Bootcamp-master-Milestone Project - 1\TIC_TAC_TOE.py&quot;, line 105, in &lt;module&gt;
  3. display_board(board)
  4. File &quot;x:\Python\Python_Bootcamp\Complete-Python-3-Bootcamp-master-Milestone Project - 1\TIC_TAC_TOE.py&quot;, line 8, in display_board
  5. print(board[1] + &#39;|&#39; + board[2] + &#39;|&#39; + board[3])
  6. ~~~~~^^^
  7. IndexError: list index out of range

TIC TAC TOE GAME

  1. `
  2. import random
  3. `

Display the board for the game

  1. `def display_board(board):
  2. # print(&#39;\n&#39;*100) # Lets you only see one version of the board
  3. print(board[1] + &#39;|&#39; + board[2] + &#39;|&#39; + board[3])
  4. print(&#39;-----&#39;)
  5. print(board[4] + &#39;|&#39; + board[5] + &#39;|&#39; + board[6])
  6. print(&#39;-----&#39;)
  7. print(board[7] + &#39;|&#39; + board[8] + &#39;|&#39; + board[9])`

Choose whether player 1 is X or O

  1. `def player_input():
  2. marker = &#39;&#39;
  3. while marker != &#39;X&#39; and marker != &#39;O&#39;:
  4. marker = input(&#39;Player 1 choose X or O: &#39;)
  5. player1 = marker.upper()
  6. if player1 == &#39;X&#39;:
  7. player2 = &#39;O&#39;
  8. else:
  9. player2 = &#39;X&#39;
  10. return(player1, player2)`

Takes a position on the board and puts a marker on position

  1. `def place_marker(board,marker,position):
  2. board[position] = marker`

Check to see if win

  1. `def win_check(board, mark):
  2. return ((board[7] == mark and board[8] == mark and board[9] == mark) or # across the bottom
  3. (board[4] == mark and board[5] == mark and board[6] == mark) or # across the middle
  4. (board[1] == mark and board[2] == mark and board[3] == mark) or # across the top
  5. (board[7] == mark and board[4] == mark and board[1] == mark) or # down the left column
  6. (board[2] == mark and board[5] == mark and board[8] == mark) or # down the middle
  7. (board[3] == mark and board[6] == mark and board[9] == mark) or # down the right side
  8. (board[3] == mark and board[5] == mark and board[7] == mark) or # diagonal
  9. (board[9] == mark and board[5] == mark and board[1] == mark)) # diagonal`

Random flip to see if Player 1 or Player 2 goes first

  1. `def choose_first():
  2. flip = random.randint(0,1)
  3. if flip == 0:
  4. return (&#39;Player 1&#39;)
  5. else:
  6. return (&#39;Player 2&#39;)`

Check to see if position freely available

  1. `def space_check(board, position):
  2. return board[position] == &#39; &#39; # If space is empty the return value will be True`

Check to see if the board is full

  1. `def full_board_check(board):
  2. for i in range(1,10):
  3. if space_check(board,i):
  4. return False # Fales meaning the space is empty of marker
  5. else:
  6. return True # True meaning the board is full`

Function for player to choose their next position on the board

  1. `def player_choice(board):
  2. position = 0
  3. while position not in [1,2,3,4,5,6,7,8,9]:
  4. position = int(input(&#39;Choose your position: &#39;))
  5. return position
  6. def replay():
  7. choice = input(&#39;Do you want to play again?&#39;)
  8. return choice == &#39;Yes&#39;`

GAME SETUP

  1. `print(&#39;Welcome to Tic Tac Toe!&#39;)
  2. while True:
  3. board = [&#39; &#39;*10]
  4. player1_marker,player2_marker = player_input()
  5. turn = choose_first()
  6. print(turn + &#39; will go first&#39;)
  7. game_on = &#39;&#39;
  8. play_game = input(&#39;Are you ready to play Yes or No?: &#39;)
  9. if play_game.lower()[0] == &#39;y&#39;:
  10. game_on == True
  11. else:
  12. game_on == False
  13. # Player 1 Turn
  14. if turn == &#39;Player 1&#39;:
  15. # Show board
  16. display_board(board)
  17. # Choose a position
  18. position = player_choice(board)
  19. # Place marker on choosen position
  20. place_marker(board,player1_marker,position)
  21. # Check if they won
  22. if win_check(board,player1_marker) == True:
  23. display_board(board)
  24. print(&#39;Player 1 has won the game!&#39;)
  25. game_on = False
  26. # Check to see if Tie
  27. else:
  28. if full_board_check(board):
  29. display_board(board)
  30. print(&#39;TIE GAME&#39;)
  31. break
  32. # If there&#39;s no tie turn to Player 2
  33. else:
  34. turn = &#39;Player 2&#39;
  35. # Player2&#39;s turn.
  36. if turn == &#39;Player 2&#39;:
  37. # Show board
  38. # display_board(board)
  39. # Show position
  40. position = player_choice(board)
  41. #Place marker on position
  42. place_marker(board,player2_marker,position)
  43. # Check to see if win
  44. if win_check(board,player2_marker) == True:
  45. display_board(board)
  46. print(&#39;Player 2 has won the game!&#39;)
  47. game_on = False
  48. # Check to see if Tie
  49. else:
  50. full_board_check(board)
  51. display_board(board)
  52. print(&#39;TIE GAME&#39;)
  53. break
  54. else:
  55. turn = &#39;Player 1&#39;
  56. # If players do not want to play again, quit
  57. if not replay():
  58. break`

I've tried to comment out different lines of code to test some of the board configurations. I can get the board to show, but once I try to play a full game I get an error.

答案1

得分: 1

你初始化了board

  1. board = [' '*10]

所以board是只有一个元素的列表(一个包含10个空格的字符串)。因此索引1并不存在。

也许你想要写:

  1. board = 10*[' ']

这样你就会得到一个包含10个元素的列表,每个元素都是空格 ' '(10个空格)。

我测试了一下,使用你的代码是可以的,我成功进行了我的第一步。

英文:

You have init

  1. board = [&#39; &#39;*10]

so board is a list of only one element (one string with 10 spaces). So index 1 does not exists.

maybee you wanted to write:

  1. board = 10*[&#39; &#39;]

so you have a list with 10 elements ' ' (10 times one blank/space).

I tested it and it works with your code, and I managed to play my first move.

huangapple
  • 本文由 发表于 2023年2月10日 03:22:10
  • 转载请务必保留本文链接:https://go.coder-hub.com/75403462.html
匿名

发表评论

匿名网友

:?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen:

确定