You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

求助:Bash井字棋脚本无法选中(3;3)格子问题

问题排查与修复

核心问题分析

你的脚本有两个关键错误导致无法选中(3;3)格子:

  1. 棋盘数组初始化不完整
    原代码中board数组的第三行只定义了2个空格,缺少最后一个元素,导致数组仅有8个元素(索引0-7),而(3;3)对应的索引是8,访问该索引时会被判定为非空,因此is_free函数返回false,程序拒绝落子。

  2. 游戏循环逻辑缩进错误
    echo "Lépéshiba!"的位置错误,无论落子是否成功都会触发错误提示;同时分支结构的fi闭合位置混乱,导致逻辑流程异常。

修复后的完整代码

#!/bin/bash

# 修复:补充第三行的第三个空格,确保数组有9个元素
board=( " "  " "  " "
        " "  " "  " "
        " "  " "  " " )

function draw_board {
    echo "+---+---+---+"
    echo "| ${board[0]} | ${board[1]} | ${board[2]} |"
    echo "+---+---+---+"
    echo "| ${board[3]} | ${board[4]} | ${board[5]} |"
    echo "+---+---+---+"
    echo "| ${board[6]} | ${board[7]} | ${board[8]} |"
    # 修复:移除${board[8]}后面多余的空格,保持格式统一
    echo "+---+---+---+"
}

function check_win {
    local symbol=$1
    if [[ ${board[0]} == $symbol && ${board[1]} == $symbol && ${board[2]} == $symbol ]] ||
       [[ ${board[3]} == $symbol && ${board[4]} == $symbol && ${board[5]} == $symbol ]] ||
       [[ ${board[6]} == $symbol && ${board[7]} == $symbol && ${board[8]} == $symbol ]] ||
       [[ ${board[0]} == $symbol && ${board[3]} == $symbol && ${board[6]} == $symbol ]] ||
       [[ ${board[1]} == $symbol && ${board[4]} == $symbol && ${board[7]} == $symbol ]] ||
       [[ ${board[2]} == $symbol && ${board[5]} == $symbol && ${board[8]} == $symbol ]] ||
       [[ ${board[0]} == $symbol && ${board[4]} == $symbol && ${board[8]} == $symbol ]] ||
       [[ ${board[2]} == $symbol && ${board[4]} == $symbol && ${board[6]} == $symbol ]]; then
        echo true
    else
        echo false
    fi
}


function is_free {
    local index=$1
    if [[ ${board[$index]} == " " ]]; then
        echo true
    else
        echo false
    fi
}

function game_loop {
    local player="X"
    local move_count=0
    local win=false
    while [[ $move_count -lt 9 && $win == false ]]; do
        # 修复:move_count上限改为9,因为棋盘只有9个格子
        draw_board
        echo "$player következik. Adja meg az x koordinátát [1-3]: "
        read x
        echo "Adja meg az y koordinátát [1-3]: "
        read y
        x=$((x-1))
        y=$((y-1))
        if [[ $x -lt 0 || $x -gt 2 || $y -lt 0 || $y -gt 2 ]]; then
            echo "Hibás koordináta!" >&2
        elif [[ $(is_free $((y*3+x))) == true ]]; then
            board[$((y*3+x))]="$player"
            win=$(check_win $player)
            if [[ $win == true ]]; then
                echo "$player győzött!"
            else
                ((move_count++))
                if [[ $player == "X" ]]; then
                    player="O"
                else
                    player="X"
                fi
            fi
        else
            # 修复:仅当位置已被占用时输出错误提示
            echo "Lépéshiba!" >&2
        fi
    done
    if [[ $win == false ]]; then
        draw_board
        echo "Dontetlen!"
    fi
}

# 修复:添加调用游戏循环的语句,否则脚本执行后无任何动作
game_loop

额外优化点

  • 修正了draw_board中最后一行的格式错误,移除了多余空格
  • 将move_count的循环上限从10改为9,符合9个格子的实际情况
  • 添加了game_loop的调用语句,确保脚本执行后启动游戏

内容的提问来源于stack exchange,提问作者csernakgeri_

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.30 07:57:07