Bashシェルスクリプトで1〜999の数字をあてるゲームを作ってみる

Bash,CentOS,Linux,Ubuntu,Zsh

はじめに

「子供と遊ぶ」+「プログラミングの学習」のために、1〜999の数字をあてるゲームを作ってみました。

過去に別の言語で作ったことはありましたが、最近プログラミングをしていなかったせいで衰えを感じたため、
どのぐらい衰えたか心配になり試してみました。

検証環境

$ uname -moi
x86_64 x86_64 GNU/Linux

$ head -n 2 /etc/os-release
NAME="Ubuntu"
VERSION="21.04 (Hirsute Hippo)"

$ bash -version | head -n 1
GNU bash, バージョン 5.1.4(1)-release (x86_64-pc-linux-gnu)

ソースコード

ここで掲載しているスクリプトはGithubにもプッシュしておきました。

genzouw/game-of-guess - GitHub

game_of_guess.sh

#!/usr/bin/env bash
set -o errexit
set -o nounset

ANS=$((RANDOM % 999 + 1))

MAX_RETRY=10

for ((i = 0; i < MAX_RETRY; i++)); do
  read -r -p "数値(0〜999)を入力してください: " GUESS
  if [[ $GUESS -eq $ANS ]]; then
    echo "あなたの勝ち!"
    exit 0
  elif [[ $GUESS -gt $ANS ]]; then
    echo "大きすぎ! (残り $((MAX_RETRY - i - 1)))"
  else
    echo "小さすぎ! (残り $((MAX_RETRY - i - 1)))"
  fi
done

echo "あなたの負け! 答えは $ANS"
exit 1

実行

$ ./game_of_guess.sh
数値(0〜999)を入力してください: 500
大きすぎ! (残り 9)
数値(0〜999)を入力してください: 251
小さすぎ! (残り 8)
数値(0〜999)を入力してください: 375
小さすぎ! (残り 7)
数値(0〜999)を入力してください: 437
小さすぎ! (残り 6)
数値(0〜999)を入力してください: 468
小さすぎ! (残り 5)
数値(0〜999)を入力してください: 484
小さすぎ! (残り 4)
数値(0〜999)を入力してください: 497
あなたの勝ち!

おまけ:答えを自動的に求めるスクリプト

game_of_guess_auto.sh

#!/usr/bin/env bash
set -o errexit
set -o nounset

ANS=$((RANDOM % 999 + 1))

MAX_RETRY=10

TOP=1000
BOTTOM=1

for ((i = 0; i < MAX_RETRY; i++)); do
  GUESS=$(((TOP + BOTTOM) / 2))
  echo "数値(0〜999)を入力してください: "$GUESS
  if [[ $GUESS -eq $ANS ]]; then
    echo "あなたの勝ち!"
    exit 0
  elif [[ $GUESS -gt $ANS ]]; then
    echo "大きすぎ! (残り $((MAX_RETRY - i - 1)))"
    TOP=$GUESS
  else
    echo "小さすぎ! (残り $((MAX_RETRY - i - 1)))"
    BOTTOM=$GUESS
  fi
done

echo "あなたの負け! 答えは $ANS"
exit 1

ひとこと

実はコードの大部分は GitHub Copilot が作成してくれました。

全くプログラミングの練習になっていないですね(汗)

Vimから呼び出すように設定しているのですが、どうやって推測しているのでしょう?