【问题标题】:How to fix tic tac toe...it gives incorrect winner..(python)如何修复井字游戏......它给出了不正确的获胜者......(python)
【发布时间】:2019-05-18 17:41:19
【问题描述】:

我正在 python shell 中创建一个简单的井字游戏...无论我尝试如何编辑代码,程序都会错误地分配获胜者...我的支票有问题( ) 函数

我尝试在每个玩家转身后扫描游戏板的垂直、水平、对角线,然后告诉获胜者第一个值是否与其他两个匹配...

我还考虑了无效输入的错误

这是完整的代码:

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')   

我希望正确地告诉获胜者,但即使我的第一个值与其他两个值不匹配,它也会告诉获胜者。

如果玩家输入无效...它会返回一个错误并且比赛继续但他错过了他的回合!!...我也想纠正这个问题。

【问题讨论】:

  • 你的 check 函数背后的逻辑是什么?
  • 我取行中的第一个元素并检查行中的其他 2 个元素....如果它们相同...那么 WINNER....然后它检查列和然后对角线使用相同的算法......为什么它不起作用?

标签: python-3.x algorithm tic-tac-toe


【解决方案1】:

这里是你的错误。

if board[i][j]==board[i][j-1] and board[i][j]!='-':

首先,您不需要在每个实例中检查board[i][j]!='-'。使用 if board[i][0] != '-': 检查行中的起始值是否为空就足够了。 其次,您编写的行检查 2 个相邻单元格的值是否相等,如果相等,则称为获胜。您需要检查所有 3 个相邻值是否相等,然后才调用获胜者。

要获得这种行为,一种方法是声明一个布尔值won。如果有任何一点,您会得到 2 个不同的相邻值,则设置 won = False 并中断。

在循环结束时,如果 won == True 你宣布获胜者并做相应的事情。

此外,在您的 main 方法中,您应该在打印板之后调用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

【讨论】:

  • 嘿....我还遇到了另一个错误....如果播放器输入错误...然后我让程序发出警告信息....但是播放器错过了轮到他!...你也可以解决这个问题吗?....给我一个提示或想法...我自己试试
  • @THEEPICGUY 使用修复程序编辑了原始答案。希望你得到它
猜你喜欢
  • 1970-01-01
  • 2013-02-11
  • 2020-07-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-04-19
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多