如何修复井字游戏...它给出了错误的赢家..(python)
How to fix tic tac toe...it gives incorrect winner..(python)
我正在 python shell 中创建一个简单的井字游戏...无论我尝试如何编辑代码,程序都会错误地分配获胜者...我的 check() 函数有问题
我尝试扫描垂直方向,然后是水平方向,然后是每个玩家转动后的游戏板的对角线,然后告诉获胜者第一个值是否与其他两个匹配...
我还解释了无效输入的错误
完整代码如下:
import os
import time
board = [['-','-','-'],
['-','-','-'],
['-','-','-'],]
def markit(row,col,mark):
try:
if board[row-1][col-1]!='-':
print("Already Marked!!")
time.sleep(1)
else:
board[row-1][col-1]=mark
except IndexError:
print("Out of Range...Reverting back")
time.sleep(1)
def reset():
board = [['-','-','-'],
['-','-','-'],
['-','-','-'],]
def check():
for i in range(len(board)):
if board[i][i]==board[i-1][i-1] and board[i][i]!='-':
print(board[i][i]," is a winner")
time.sleep(1.5)
y=input("Play Again?(y/n):")
if y==y:
reset()
else:
quit()
break
for i in range(len(board)):
for j in range(len(board)):
if board[j][i]==board[j][i-1] and board[j][i]!='-':
print(board[j][i]," is a winner")
time.sleep(1.5)
y=input("Play Again?(y/n):")
if y==y:
reset()
else:
quit()
break
for i in range(len(board)):
for j in range(len(board)):
if board[i][j]==board[i][j-1] and board[i][j]!='-':
print(board[i][j]," is a winner")
time.sleep(1.5)
y=input("Play Again?(y/n):")
if y==y:
reset()
else:
quit()
break
while True:
print(" 1 2 3")
for i in range(len(board)):
print(i+1,board[i])
row=int(input("P1||Enter row:"))
col=int(input("P1||Enter col:"))
markit(row,col,mark='X')
check()
os.system('cls')
print(" 1 2 3")
for i in range(len(board)):
print(i+1,board[i])
row=int(input("P2||Enter row:"))
col=int(input("P2||Enter col:"))
markit(row,col,mark='O')
check()
os.system('cls')
我希望正确地告诉获胜者,但它告诉了获胜者,尽管我的第一个值与其他两个不匹配。
而且如果玩家给出了无效的输入...它 returns 一个错误并且比赛继续但他错过了轮到他的机会!!...我也想纠正这个问题。
简要说明您的错误。
if board[i][j]==board[i][j-1] and board[i][j]!='-':
首先,您不需要在每个实例中都检查 board[i][j]!='-'
。使用 if board[i][0] != '-':
检查行中的起始值是否不为空就足够了。
其次,您写的那行代码检查两个相邻单元格的值是否相等,如果相等,则称为获胜。您需要检查所有 3 个相邻值是否都相等,然后才调用 winner。
要获得此行为,一种方法是声明一个布尔值 won
。如果有任何一点,你会得到 2 个不同的相邻值,你设置 won = False
并中断。
在循环结束时,如果 won == True
你宣布获胜者并相应地做事。
此外,在您的主要方法中,您应该在打印电路板之后而不是之前调用 check()
。像这样:
row=int(input("P1||Enter row:"))
col=int(input("P1||Enter col:"))
markit(row,col,mark='X')
os.system('cls')
print(" 1 2 3")
for i in range(len(board)):
print(i+1,board[i])
check()
我已经为您修复了水平检查。你可以尝试自己修复垂直和对角线。
won = True
for i in range(len(board)):
if board[i][0] != '-':
for j in range(len(board)-1):
if board[i][j]!=board[i][j+1]:
won = False
break
if won:
print(board[i][i]," is a winner")
time.sleep(1.5)
y=input("Play Again?(y/n):")
if y=='y':
reset()
else:
quit()
return
else:
won = True
return
要修复您的标记方法,请在您的方法中进行输入 markit()
您不能在此处使用 try-catch,因为 python 列表也是负索引。
使用 if 条件来确保 row/col 在范围内。
下面是修复。
def markit(mark):
while True:
row=int(input("P1||Enter row:"))
col=int(input("P1||Enter col:"))
if row <= 3 and row >= 1 and col <= 3 and col >= 1:
if board[row-1][col-1]!='-':
print("Already Marked!!")
else:
board[row-1][col-1]=mark
break
我正在 python shell 中创建一个简单的井字游戏...无论我尝试如何编辑代码,程序都会错误地分配获胜者...我的 check() 函数有问题
我尝试扫描垂直方向,然后是水平方向,然后是每个玩家转动后的游戏板的对角线,然后告诉获胜者第一个值是否与其他两个匹配...
我还解释了无效输入的错误
完整代码如下:
import os
import time
board = [['-','-','-'],
['-','-','-'],
['-','-','-'],]
def markit(row,col,mark):
try:
if board[row-1][col-1]!='-':
print("Already Marked!!")
time.sleep(1)
else:
board[row-1][col-1]=mark
except IndexError:
print("Out of Range...Reverting back")
time.sleep(1)
def reset():
board = [['-','-','-'],
['-','-','-'],
['-','-','-'],]
def check():
for i in range(len(board)):
if board[i][i]==board[i-1][i-1] and board[i][i]!='-':
print(board[i][i]," is a winner")
time.sleep(1.5)
y=input("Play Again?(y/n):")
if y==y:
reset()
else:
quit()
break
for i in range(len(board)):
for j in range(len(board)):
if board[j][i]==board[j][i-1] and board[j][i]!='-':
print(board[j][i]," is a winner")
time.sleep(1.5)
y=input("Play Again?(y/n):")
if y==y:
reset()
else:
quit()
break
for i in range(len(board)):
for j in range(len(board)):
if board[i][j]==board[i][j-1] and board[i][j]!='-':
print(board[i][j]," is a winner")
time.sleep(1.5)
y=input("Play Again?(y/n):")
if y==y:
reset()
else:
quit()
break
while True:
print(" 1 2 3")
for i in range(len(board)):
print(i+1,board[i])
row=int(input("P1||Enter row:"))
col=int(input("P1||Enter col:"))
markit(row,col,mark='X')
check()
os.system('cls')
print(" 1 2 3")
for i in range(len(board)):
print(i+1,board[i])
row=int(input("P2||Enter row:"))
col=int(input("P2||Enter col:"))
markit(row,col,mark='O')
check()
os.system('cls')
我希望正确地告诉获胜者,但它告诉了获胜者,尽管我的第一个值与其他两个不匹配。
而且如果玩家给出了无效的输入...它 returns 一个错误并且比赛继续但他错过了轮到他的机会!!...我也想纠正这个问题。
简要说明您的错误。
if board[i][j]==board[i][j-1] and board[i][j]!='-':
首先,您不需要在每个实例中都检查 board[i][j]!='-'
。使用 if board[i][0] != '-':
检查行中的起始值是否不为空就足够了。
其次,您写的那行代码检查两个相邻单元格的值是否相等,如果相等,则称为获胜。您需要检查所有 3 个相邻值是否都相等,然后才调用 winner。
要获得此行为,一种方法是声明一个布尔值 won
。如果有任何一点,你会得到 2 个不同的相邻值,你设置 won = False
并中断。
在循环结束时,如果 won == True
你宣布获胜者并相应地做事。
此外,在您的主要方法中,您应该在打印电路板之后而不是之前调用 check()
。像这样:
row=int(input("P1||Enter row:"))
col=int(input("P1||Enter col:"))
markit(row,col,mark='X')
os.system('cls')
print(" 1 2 3")
for i in range(len(board)):
print(i+1,board[i])
check()
我已经为您修复了水平检查。你可以尝试自己修复垂直和对角线。
won = True
for i in range(len(board)):
if board[i][0] != '-':
for j in range(len(board)-1):
if board[i][j]!=board[i][j+1]:
won = False
break
if won:
print(board[i][i]," is a winner")
time.sleep(1.5)
y=input("Play Again?(y/n):")
if y=='y':
reset()
else:
quit()
return
else:
won = True
return
要修复您的标记方法,请在您的方法中进行输入 markit()
您不能在此处使用 try-catch,因为 python 列表也是负索引。
使用 if 条件来确保 row/col 在范围内。 下面是修复。
def markit(mark):
while True:
row=int(input("P1||Enter row:"))
col=int(input("P1||Enter col:"))
if row <= 3 and row >= 1 and col <= 3 and col >= 1:
if board[row-1][col-1]!='-':
print("Already Marked!!")
else:
board[row-1][col-1]=mark
break