首页 > 解决方案 > 为什么我的获胜者检查功能无法正常工作?

问题描述

我正在开发 connect4 游戏,现在我正在检查获胜者,但获胜者检查功能无法正常工作。如何解决?在 pycharm 编辑器中,它说即使使用了变量获胜者也没有使用。在四个相同的数字垂直之后,它没有打印谁是赢家。我不知道如何解决它。谢谢!

from termcolor import colored

field = [[" ", " ", " ", " ", " ", " ", " "], [" ", " ", " ", " ", " ", " ", " "], [" ", " ", " ", " ", " ", " ", " "], [" ", " ", " ", " ", " ", " ", " "], [" ", " ", " ", " ", " ", " ", " "], [" ", " ", " ", " ", " ", " ", " "]]


def drawField(field):
    for row in range(11):
        if row % 2 == 0:
            rowIndex = int(row / 2)
            for column in range(13):
                if column % 2 == 0:
                    columnIndex = int(column / 2)
                    if column == 12:
                        print(field[rowIndex][columnIndex])
                    else:
                        print(field[rowIndex][columnIndex], end="")
                else:
                    print("|", end="")
        else:
            print("-------------")


def reset():
    for i in range(6):
        for b in range(7):
            field[i][b] = " "


drawField(field)
Player = 1


def winnerCheck(characters):

    maxSQ = 0
    char = False
    sq = 0
    for i in characters:
        if i != char:
            char = i
            sq = 1
        else:
            sq += 1
        if sq > maxSQ:
            maxChar = char
            maxSQ = sq
            if maxChar == "X" or maxChar == "O":
                if maxSQ == 4:
                    winner = 0
                    if maxChar == "X":
                        winner = "1"
                    else:
                        winner = "2"
                    print("--------------------------------------")
                    print("|  The winner is player", winner, end="")
                    print("      |")
                    print("--------------------------------------")


while True:
    rowIndex = False
    currentChoice = False
    print("Player turn:", Player)
    column = int(input("Please enter a column: ")) - 1
    if column <= 6:
        print(True)
    else:
        print("You can choose numbers only between 1 and 7 included!")
        continue
    if Player == 1:
        for i in range(5, -1, -1):
            if field[0][column] != " ":
                print("This column is already filled up! You can't put here anymore!")
                full = 0
                for b in range(7):
                    if field[0][b] != " ":
                        full += 1
                if full == 7:
                    print("There is no winner!")
                    reset()
                break
            else:
                if field[i][column] != " ":
                    continue
                else:
                    field[i][column] = colored("X", "red")
                    drawField(field)
                    Player = 2
                    currentChoice = field[i][column]
                    rowIndex = i
                    break
    else:
        for i in range(5, -1, -1):
            if field[0][column] != " ":
                print("This column is already filled up! You can't put here anymore!")
                full = 0
                for b in range(7):
                    if field[0][b] != " ":
                        full += 1
                if full == 7:
                    print("There is no winner!")
                    reset()
                break
            else:
                if field[i][column] != " ":
                    continue
                else:
                    field[i][column] = colored("O", "green")
                    drawField(field)
                    currentChoice = field[i][column]
                    Player = 1
                    rowIndex = i
                    break
    characters = []


    for i in range(6):
        print(i)
        characters.append(field[i][column])
    print(characters)
    winnerCheck(characters)

标签: pythonalgorithmfunctionlogicgame-development

解决方案


主要问题在于这些代码行:

if maxChar == "X" or maxChar == "O":

再往下一点:

if maxChar == "X":

这些条件永远不会成立,因为您的字符绝不是“X”或“O”,而是调用生成的 ANSI 转义码colored,例如'\x1b[31mX\x1b[0m'

这是代码的“模型”和“视图”方面的混合。

最好的解决方法是不要将结果存储colored()在您的field列表中。相反,只需存储普通的“X”和“O”值。然后在你的drawField函数中,做必要的事情来为你的输出带来颜色。

所以改变:

field[i][column] = colored("X", "red")

field[i][column] = "X"

并对您拥有的位置进行相同的更改colored("O", "green")

然后在drawField变化:

    if column == 12:
        print(field[rowIndex][columnIndex])
    else:
        print(field[rowIndex][columnIndex], end="")

至:

    ch = field[rowIndex][columnIndex]
    output = colored(ch, "red" if ch == "X" else "green")
    if column == 12:
        print(output)
    else:
        print(output, end="")

其他一些评论:

您的代码只会连续检测到垂直四个。目前您只将有关一列的信息传递给winnerCheck. 你会想要扩展这个函数来检测水平和对角线的胜利......

有不必要的代码重复。就像构造中的两个块一样if Player == 1 .... else。您应该尝试只制作一个块,因为唯一的区别是您分配给field[i][column].

正如评论中提到的,你有一个winner=0没有效果的,因为你立即为它分配了一个不同的值。您可以一次性初始化winner

winner = "1" if maxChar == "X" else "2"

平局检查不应要求用户做出无效的移动。您应该在进行最后一次有效移动时检测到平局。


推荐阅读