如何修复井字游戏...它给出了错误的赢家..(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