TicTacToe Bash脚本

huangapple go评论101阅读模式
英文:

TicTacToe Bash script

问题

我无法选择最后一个方格(3;3)。主要问题就在这里。希望有人能帮助我,因为我无法知道问题出在哪里。

代码在这里:

  1. #!/bin/bash
  2. board=(" " " " " "
  3. " " " " " "
  4. " " " " )
  5. function draw_board {
  6. echo "+---+---+---+"
  7. echo "| ${board[0]} | ${board[1]} | ${board[2]} |"
  8. echo "+---+---+---+"
  9. echo "| ${board[3]} | ${board[4]} | ${board[5]} |"
  10. echo "+---+---+---+"
  11. echo "| ${board[6]} | ${board[7]} | ${board[8]} |"
  12. echo "+---+---+---+"
  13. }
  14. function check_win {
  15. local symbol=$1
  16. if [[ ${board[0]} == $symbol && ${board[1]} == $symbol && ${board[2]} == $symbol ]] ||
  17. [[ ${board[3]} == $symbol && ${board[4]} == $symbol && ${board[5]} == $symbol ]] ||
  18. [[ ${board[6]} == $symbol && ${board[7]} == $symbol && ${board[8]} == $symbol ]] ||
  19. [[ ${board[0]} == $symbol && ${board[3]} == $symbol && ${board[6]} == $symbol ]] ||
  20. [[ ${board[1]} == $symbol && ${board[4]} == $symbol && ${board[7]} == $symbol ]] ||
  21. [[ ${board[2]} == $symbol && ${board[5]} == $symbol && ${board[8]} == $symbol ]] ||
  22. [[ ${board[0]} == $symbol && ${board[4]} == $symbol && ${board[8]} == $symbol ]] ||
  23. [[ ${board[2]} == $symbol && ${board[4]} == $symbol && ${board[6]} == $symbol ]]; then
  24. echo true
  25. else
  26. echo false
  27. fi
  28. }
  29. function is_free {
  30. local index=$1
  31. if [[ ${board[$index]} == " " ]]; then
  32. echo true
  33. else
  34. echo false
  35. fi
  36. }
  37. function game_loop {
  38. local player="X"
  39. local move_count=0
  40. local win=false
  41. while [[ $move_count -lt 10 && $win == false ]]; do
  42. draw_board
  43. echo "$player következik. Adja meg az x koordinátát [1-3]: "
  44. read x
  45. echo "Adja meg az y koordinátát [1-3]: "
  46. read y
  47. x=$((x-1))
  48. y=$((y-1))
  49. if [[ $x -lt 0 || $x -gt 2 || $y -lt 0 || $y -gt 2 ]]; then
  50. echo "Hibás koordináta!" >&2
  51. elif [[ $(is_free $((y*3+x))) == true ]]; then
  52. board[$((y*3+x))]= "$player"
  53. win=$(check_win $player)
  54. if [[ $win == true ]]; then
  55. echo "$player győzött!"
  56. else
  57. ((move_count++))
  58. if [[ $player == "X" ]]; then
  59. player="O"
  60. else
  61. player="X"
  62. fi
  63. echo "Lépéshiba!" >&2
  64. fi
  65. fi
  66. done
  67. if [[ $win == false ]]; then
  68. draw_board
  69. echo "Döntetlen!"
  70. fi
  71. }

我尝试了3;3,程序没有接受它并让我再试一次。谢谢阅读!如果您有任何解决方案,请与我分享!祝您愉快的一天!

英文:

I can't select the last square (3;3). The main problem was that. I hope someone can help me because i cannot know whats the problem.

The code is here:

  1. #!/bin/bash
  2. board=( " " " " " "
  3. " " " " " "
  4. " " " " )
  5. function draw_board {
  6. echo "+---+---+---+"
  7. echo "| ${board[0]} | ${board[1]} | ${board[2]} |"
  8. echo "+---+---+---+"
  9. echo "| ${board[3]} | ${board[4]} | ${board[5]} |"
  10. echo "+---+---+---+"
  11. echo "| ${board[6]} | ${board[7]} | ${board[8]} |"
  12. echo "+---+---+---+"
  13. }
  14. function check_win {
  15. local symbol=$1
  16. if [[ ${board[0]} == $symbol && ${board[1]} == $symbol && ${board[2]} == $symbol ]] ||
  17. [[ ${board[3]} == $symbol && ${board[4]} == $symbol && ${board[5]} == $symbol ]] ||
  18. [[ ${board[6]} == $symbol && ${board[7]} == $symbol && ${board[8]} == $symbol ]] ||
  19. [[ ${board[0]} == $symbol && ${board[3]} == $symbol && ${board[6]} == $symbol ]] ||
  20. [[ ${board[1]} == $symbol && ${board[4]} == $symbol && ${board[7]} == $symbol ]] ||
  21. [[ ${board[2]} == $symbol && ${board[5]} == $symbol && ${board[8]} == $symbol ]] ||
  22. [[ ${board[0]} == $symbol && ${board[4]} == $symbol && ${board[8]} == $symbol ]] ||
  23. [[ ${board[2]} == $symbol && ${board[4]} == $symbol && ${board[6]} == $symbol ]]; then
  24. echo true
  25. else
  26. echo false
  27. fi
  28. }
  29. function is_free {
  30. local index=$1
  31. if [[ ${board[$index]} == " " ]]; then
  32. echo true
  33. else
  34. echo false
  35. fi
  36. }
  37. function game_loop {
  38. local player="X"
  39. local move_count=0
  40. local win=false
  41. while [[ $move_count -lt 10 && $win == false ]]; do
  42. draw_board
  43. echo "$player következik. Adja meg az x koordinátát [1-3]: "
  44. read x
  45. echo "Adja meg az y koordinátát [1-3]: "
  46. read y
  47. x=$((x-1))
  48. y=$((y-1))
  49. if [[ $x -lt 0 || $x -gt 2 || $y -lt 0 || $y -gt 2 ]]; then
  50. echo "Hibás koordináta!" >&2
  51. elif [[ $(is_free $((y*3+x))) == true ]]; then
  52. board[$((y*3+x))]="$player"
  53. win=$(check_win $player)
  54. if [[ $win == true ]]; then
  55. echo "$player győzött!"
  56. else
  57. ((move_count++))
  58. if [[ $player == "X" ]]; then
  59. player="O"
  60. else
  61. player="X"
  62. fi
  63. echo "Lépéshiba!" >&2
  64. fi
  65. fi
  66. done
  67. if [[ $win == false ]]; then
  68. draw_board
  69. echo "Dontetlen!"
  70. fi
  71. }

I tried 3;3 and the program was not accept it and give me another try. Thank you for the reading! If you have any solution please share with me! Have a nice day!

答案1

得分: 1

你原始的脚本是一个不错的终端游戏示例。然而...

在计算网格中的放置位置时存在一些逻辑错误。

此外,我将bash数组向右移动了一个位置,以使3x3矩阵更符合传统数学坐标的表示。

在下面这个脚本的改编中,我还使用了一些通用理解的英语等效字符串来更新消息字符串。

我个人不太喜欢使用elif,因此我将这些代码段展开以提高清晰度(在我的观点中)。希望你喜欢这个更新后的版本。

修改后的脚本:

  1. #!/bin/bash
  2. board=(" "
  3. " " " " " "
  4. " " " " " " "
  5. " " " " " " " )
  6. function draw_board {
  7. echo -e "\n\t+---+---+---+"
  8. echo -e "\t| ${board[1]} | ${board[2]} | ${board[3]} |"
  9. echo -e "\t+---+---+---+"
  10. echo -e "\t| ${board[4]} | ${board[5]} | ${board[6]} |"
  11. echo -e "\t+---+---+---+"
  12. echo -e "\t| ${board[7]} | ${board[8]} | ${board[9]} |"
  13. echo -e "\t+---+---+---+"
  14. }
  15. function check_win {
  16. local symbol=${1}
  17. if [[ ${board[1]} == ${symbol} && ${board[2]} == ${symbol} && ${board[3]} == ${symbol} ]] ||
  18. [[ ${board[4]} == ${symbol} && ${board[5]} == ${symbol} && ${board[6]} == ${symbol} ]] ||
  19. [[ ${board[7]} == ${symbol} && ${board[8]} == ${symbol} && ${board[9]} == ${symbol} ]] ||
  20. [[ ${board[1]} == ${symbol} && ${board[4]} == ${symbol} && ${board[7]} == ${symbol} ]] ||
  21. [[ ${board[2]} == ${symbol} && ${board[5]} == ${symbol} && ${board[8]} == ${symbol} ]] ||
  22. [[ ${board[3]} == ${symbol} && ${board[6]} == ${symbol} && ${board[9]} == ${symbol} ]] ||
  23. [[ ${board[1]} == ${symbol} && ${board[5]} == ${symbol} && ${board[9]} == ${symbol} ]] ||
  24. [[ ${board[3]} == ${symbol} && ${board[5]} == ${symbol} && ${board[7]} == ${symbol} ]]; then
  25. echo "true"
  26. else
  27. echo "false"
  28. fi
  29. }
  30. function is_free {
  31. local index=${1}
  32. if [[ ${board[${index}]} == " " ]]; then
  33. echo "true"
  34. else
  35. echo "false"
  36. fi
  37. }
  38. function game_loop {
  39. local player="X"
  40. local move_count=0
  41. local win=false
  42. draw_board
  43. while [[ ${move_count} -lt 9 ]]; do
  44. echo -e "\nPlayer $player:\n\tEnter your choice of x coordinate [1-3]: \c"
  45. read x
  46. echo -e "\tEnter your choice of y coordinate [1-3]: \c"
  47. read y
  48. if [[ $x -lt 1 || $x -gt 3 || $y -lt 1 || $y -gt 3 ]]; then
  49. echo -e "\tInvalid coordinate entered!" >&2
  50. else
  51. if [[ $(is_free $(( (y-1) * 3 + x )) == true ]]; then
  52. board[$(( (y-1) * 3 + x ))]="${player}"
  53. ((move_count++))
  54. win=$(check_win $player)
  55. if [[ ${win} == "true" ]]; then
  56. draw_board
  57. echo -e "\n\t*** ${player} wins Tic-Tac-Toe ***"
  58. break
  59. else
  60. if [[ ${player} == "X" ]]; then
  61. player="O"
  62. else
  63. player="X"
  64. fi
  65. fi
  66. else
  67. echo -e "\t\t That space is taken. Please choose another ..."
  68. fi
  69. fi
  70. draw_board
  71. done
  72. if [[ ${win} == "false" ]]; then
  73. echo -e "\n\t*** Draw ***"
  74. fi
  75. }
  76. game_loop

希望这对你有所帮助。

英文:

Your original script was a nice piece of work for a terminal game. However...

There was some logic error in the calculation of the placement positions in the grid.

Also, I shifted the bash array by one ... in order to make the 3x3 matrix more consistent with traditional mathematical representations of coordinates.

In the below adaptation of the script, I have also updated the message strings with some sensible equivalents in English for common understanding.

I am personally not a fan of elif usage, so I exploded those code segments for more clarity (in my view). I hope you like the updated version.

The modified script:

  1. #!/bin/bash
  2. board=( " "
  3. " " " " " "
  4. " " " " " "
  5. " " " " " " )
  6. function draw_board {
  7. echo -e "\n\t+---+---+---+"
  8. echo -e "\t| ${board[1]} | ${board[2]} | ${board[3]} |"
  9. echo -e "\t+---+---+---+"
  10. echo -e "\t| ${board[4]} | ${board[5]} | ${board[6]} |"
  11. echo -e "\t+---+---+---+"
  12. echo -e "\t| ${board[7]} | ${board[8]} | ${board[9]} |"
  13. echo -e "\t+---+---+---+"
  14. }
  15. function check_win {
  16. local symbol=${1}
  17. if [[ ${board[1]} == ${symbol} && ${board[2]} == ${symbol} && ${board[3]} == ${symbol} ]] ||
  18. [[ ${board[4]} == ${symbol} && ${board[5]} == ${symbol} && ${board[6]} == ${symbol} ]] ||
  19. [[ ${board[7]} == ${symbol} && ${board[8]} == ${symbol} && ${board[9]} == ${symbol} ]] ||
  20. [[ ${board[1]} == ${symbol} && ${board[4]} == ${symbol} && ${board[7]} == ${symbol} ]] ||
  21. [[ ${board[2]} == ${symbol} && ${board[5]} == ${symbol} && ${board[8]} == ${symbol} ]] ||
  22. [[ ${board[3]} == ${symbol} && ${board[6]} == ${symbol} && ${board[9]} == ${symbol} ]] ||
  23. [[ ${board[1]} == ${symbol} && ${board[5]} == ${symbol} && ${board[9]} == ${symbol} ]] ||
  24. [[ ${board[3]} == ${symbol} && ${board[5]} == ${symbol} && ${board[7]} == ${symbol} ]]; then
  25. echo "true"
  26. else
  27. echo "false"
  28. fi
  29. }
  30. function is_free {
  31. local index=${1}
  32. if [[ ${board[${index}]} == " " ]]; then
  33. echo "true"
  34. else
  35. echo "false"
  36. fi
  37. }
  38. function game_loop {
  39. local player="X"
  40. local move_count=0
  41. local win=false
  42. draw_board
  43. while [[ ${move_count} -lt 9 ]]; do
  44. #echo "$player következik. Adja meg az x koordinátát [1-3]: "
  45. echo -e "\nPlayer $player:\n\tEnter your choice of x coordinate [1-3]: \c"
  46. read x
  47. echo -e "\tEnter your choice of y coordinate [1-3]: \c"
  48. read y
  49. if [[ $x -lt 1 || $x -gt 3 || $y -lt 1 || $y -gt 3 ]]; then
  50. echo -e "\tInvalid coordinate entered!" >&2
  51. else
  52. if [[ $(is_free $(( (y-1) * 3 + x ))) == true ]]; then
  53. board[$(( (y-1) * 3 + x ))]="${player}"
  54. ((move_count++))
  55. win=$(check_win $player)
  56. if [[ ${win} == "true" ]]; then
  57. draw_board
  58. echo -e "\n\t*** ${player} wins Tic-Tac-Toe ***"
  59. break
  60. else
  61. if [[ ${player} == "X" ]]; then
  62. player="O"
  63. else
  64. player="X"
  65. fi
  66. fi
  67. else
  68. echo -e "\t\t That space is taken. Please choose another ..."
  69. fi
  70. fi
  71. draw_board
  72. done
  73. if [[ ${win} == "false" ]]; then
  74. echo -e "\n\t*** Draw ***"
  75. fi
  76. }
  77. game_loop

huangapple
  • 本文由 发表于 2023年2月27日 19:17:49
  • 转载请务必保留本文链接:https://go.coder-hub.com/75579778.html
匿名

发表评论

匿名网友

:?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen:

确定