求助:Bash井字棋脚本无法选中(3;3)格子问题
问题排查与修复
核心问题分析
你的脚本有两个关键错误导致无法选中(3;3)格子:
棋盘数组初始化不完整
原代码中board数组的第三行只定义了2个空格,缺少最后一个元素,导致数组仅有8个元素(索引0-7),而(3;3)对应的索引是8,访问该索引时会被判定为非空,因此is_free函数返回false,程序拒绝落子。游戏循环逻辑缩进错误
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_
相关产品推荐
相关产品推荐

