我遇到了一些麻烦,无法使井字棋算法运转。这是一个用于检查移动是否赢得游戏的算法。

这个算法在对角线和第三排或第三列上表现得非常好。但是出现了一个问题:当有人在第一行或第二行、第一列或第二列赢得胜利时,没有显示胜利。Row和Col表示下棋的位置,Player表示下棋的人是谁。

让我困惑的是它没有认出所有行和列的胜利,这对我来说好像很奇怪,我只是错过了问题可能出在哪里。

--[[
    检查每次移动时是否获胜的函数
]]

function checkWin(row, col, player)
    -- 检查行。我有了标记放置的行。检查它,看是否有获胜的情况。
    for c = 1, 3 do
        if board[row][c] ~= player then
            break
        end
        if c == 3 then
            gWhoWon = player
            gameOver = true
        end
    end

    -- 检查列。我有了标记放置的列。检查它,看是否有获胜的情况。
    for r = 1, 3 do
        if board[r][col] ~= player then
            break
        end
        if r == 3 then
            gWhoWon = player
            gameOver = true
        end
    end

    -- 检查对角线。检查两个对角线,看是否有获胜的情况(可以使这更有效,只看重要的对角线)。

    -- 第一个对角线
    for d = 1, 3 do
        if board[d][d] ~= player then
            break
        end
        if d == 3 then
            gWhoWon = player
            gameOver = true
        end
    end

    -- 反对角线
    for d = 1, 3 do
        if board[d][4-d] ~= player then
            break
        end
        if d == 3 then
            gWhoWon = player
            gameOver = true
        end
    end

    --[[
    if turn == 9 then
        gameOver = true
    end
    ]]
end

这是我初始化棋盘并调用checkWin函数的函数:

function PlayState:init()
    xTurn = true
    gameOver = false
    turn = 1
    gWhoWon = ""

    -- 棋盘
    board = {
        {"", "", ""},
        {"", "", ""},
        {"", "", ""}
    }
end

function PlayState:update(dt)
    -- 当有人获胜时,转换为获胜状态
    if gameOver then
        gStateMachine:change('win')
    end

    -- 如果有鼠标左键单击,则在该方块上插入“X”或“O”
    if love.mouse.wasPressed(1) then
        -- 获取鼠标位置
        x = love.mouse.getX()
        y = love.mouse.getY()

        -- 遍历棋盘
        for row = 1, 3 do
            for col = 1, 3 do
                -- 如果鼠标单击在方格内,且该方格为空
                if isInsideSquare(x, y, row, col) and isEmpty(row, col) then
                    -- 在方格上放置“X”
                    if xTurn then
                        board[col][row] = 'x'
                        checkWin(row, col, 'x')  -- 检查这个移动是否获胜
                        xTurn = false
                    -- 在方格上放置“O”
                    else
                        board[col][row] = 'o'
                        checkWin(row, col, 'o')  -- 检查这个移动是否获胜
                        xTurn = true
                    end
                turn = turn + 1
                end
            end
        end
    end
end

原文链接 https://stackoverflow.com/questions/71187580

点赞
stackoverflow用户5459839
stackoverflow用户5459839

board 矩阵的维度上混淆了行和列的值:

  • update 方法中,你有像这样的代码:board[col][row] = 'x',所以列是矩阵的 第一个 维度,但是:

  • checkWin 函数中,你有像这样的代码:board[row][c] ~= player,所以列是矩阵的 第二个 维度

这将导致意外的结果。确保调和你的代码,使得两个数组维度总是被用于相同的轴(行 vs 列)。

2022-02-20 08:39:08