gpt4 book ai didi

Python TIC TAC TOE 跳轮

转载 作者:行者123 更新时间:2023-12-01 03:45:00 27 4
gpt4 key购买 nike

我正在用 python 开发一个 tic-tac-toe 程序。现在,轮到人类了,一切顺利。然而,AI 在玩完第一个回合后,不会再玩任何后续回合。我扫描了代码,似乎找不到任何可能导致此问题的错误。

请忽略评论和涉及关系的部分。我仍在努力。

import random
import copy
import sys


the_board = [" "]*10


def printboard(board):
print(board[7] + " " + "|" + board[8] + " " + "|" + board[9])
print("--------")
print(board[4] + " " + "|" + board[5] + " " + "|" + board[6])
print("--------")
print(board[1] + " " + "|" + board[2] + " " + "|" + board[3])


def choose_player():
while True:
player = input("What do you want to be; X or O?")
if player == "X":
print("You chose X")
comp = "O"
break
elif player == "O":
print("You chose O")
comp = "X"
break
else:
print("Invalid Selection")
continue
return [player, comp]


def virtual_toss():
print("Tossing to see who goes first.....")
x = random.randint(0,1)
if x== 0:
print("AI goes first")
move = "comp"
if x == 1:
print("Human goes first")
move = "hum"
return move


def win(board,le):
if (board[7] == le and board[8] == le and board[9]==le) or (board[4] == le and board[5]==le and board[6] == le)or (board[1] == le and board[2]==le and board[3] == le)or (board[7] == le and board[5]==le and board[3] == le)or (board[9] == le and board[5]==le and board[1] == le)or (board[7] == le and board[4]==le and board[1] == le)or (board[8] == le and board[5]==le and board[2] == le)or (board[9] == le and board[6]==le and board[3] == le):
return True
else:
return False


def make_move(board,number,symbol):
board[number] = symbol


def board_full(board):
count = 0
for item in board:
if item in ["X","O"]:
count+= 1
if count ==9 :
return True
else:
return False


def valid_move(board,num):
if board[num] == " ":
return True
else:
return False


def player_move(board):
number = int(input("Enter the number"))
return number


def copy_board(board):
copied_board = copy.copy(board)
return copied_board


def check_corner(board):
if (board[7] == " ") or (board[9] == " ") or (board[1] == " ") or (board[3] == " "):
return True
else:
return False


def check_center(board):
if (board[5] == " "):
return True
else:
return False


while True:
count = 0
loop_break = 0
print("welcome to TIC TAC TOE")
pla,comp = choose_player()
turn = virtual_toss()
while True:
#printboard(the_board)
if board_full(the_board) == True:
again = input ("Game is a tie. Want to try again? Y for yes and N for No")
if again == "Y":
loop_break = 6
break
else:
system.exit()
#if loop_break == 6:
#continue

if turn == "hum":


while True:
number = player_move(the_board)
if (valid_move(the_board,number) == True) and not(board_full == False):
make_move(the_board,number,pla)
#printboard(the_board)
break
else:
print("Invalid Move, try again!")
continue
if (win(the_board,pla) == True):
print ("Yay, you won!!!")
printboard(the_board)
count = 1
loop_break = 7
break
else:
turn = "comp"
printboard(the_board)
continue

else:
copied_board = copy_board(the_board)
for i in range(1,10):
make_move(copied_board,i,pla)
if(win(copied_board,pla) == True):
make_move(the_board,i,comp)
printboard(the_board)
turn = "hum"
loop_break = 1
break
else:
continue
if loop_break == 1:
continue
if (check_corner(the_board) == True) or (check_center(the_board)==True):
for i in [7,9,1,3,5]:
if(valid_move(copied_board,i)==True):
make_move(copied_board,i,comp)
if(win(copied_board,comp)==True):
make_move(the_board,i,comp)
printboard(the_board)
print("The AI beat you")
loop_break = 2
count = 1
break
else:
make_move(the_board,i,comp)
printboard(the_board)
turn = "hum"
loop_break = 3
break
if loop_break == 2:
break
elif loop_break == 3:
continue
else:
for i in [8,4,6,2]:
if(valid_move(copied_board,i)==True):
make_move(copied_board,i,comp)
if(win(copied_board,comp)):
make_move(the_board,i,comp)
printboard(the_board)
print("The AI beat you")
count = 1
loop_break = 4
break
else:
make_move(the_board,i,comp)
printboard(the_board)
turn = "hum"
loop_break = 5
break
if loop_break == 4:
break
elif loop_break == 5:
continue

if count == 1:
again = input("Would you like to play again? y/n")
if again == "y":
continue
else:
system.exit()

最佳答案

总而言之,你的AI的问题是它总是选择相同的位置,这看起来就像“不再玩任何进一步的回合”。

为了证明这一点,只需在 AI 的 for 循环中添加 print 即可:

for i in range(1,10):
make_move(copied_board,i,pla)
if(win(copied_board,pla) == True):
make_move(the_board,i,comp)
print("The AI chose #%d"%i) # <-- here it is
printboard(the_board)
# ......

这是结果。

welcome to TIC TAC TOE
What do you want to be; X or O?X
You chose X
Tossing to see who goes first.....
Human goes first
Enter the number1
| |
--------
| |
--------
X | |
The AI chose #3
| |
--------
| |
--------
X | |O
Enter the number2
| |
--------
| |
--------
X |X |O
The AI chose #3
| |
--------
| |
--------
X |X |O
Enter the number

我无法给出解决此错误的具体建议,因为我完全不明白这个 AI 的意义#=_=(也许你应该使用 MiniMax )。但无论如何,你的人工智能不应该将棋子放置在相同的位置。

ps。您可能需要将 system.exit() 更改为 sys.exit()

pps。 for-else grammar Python 非常适合您。

ppp。 PyCharm 表示,“删除多余的括号”。

关于Python TIC TAC TOE 跳轮,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39062521/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com