単純な乱数推測ゲームを開発していますが、いくつかの難しさに固執しました。コアゲームが動作していますが、もっと欲しいです。たとえば、nonceが10(より高いまたは低い)以内にある場合は、別のメッセージが届きます。
#!/bin/bash
name=Jack
num=$(( 1+$RANDOM%101 ))
echo $num
target=$num
goes=0
until [[ $guess -eq $target ]]
do
goes=$(( $goes+1 ))
echo "Guess $goes. Enter a number between 0 and 100"
read guess
if [[ $((number - $guess)) -gt 10 ]]
then
echo "Too low"
elif [[ $((guess - $number)) -gt 10 ]]
then
echo "Too high"
elif [[ $(($number - $guess)) -le 10 ]]
then
echo "You are within ten"
elif [[ $(($guess - $low)) -le 10 ]] ||
then
echo "You are within ten"
fi
done
echo "Well done $name, it took $goes goes to guess $num"
どんな助けでも大変感謝します。
答え1
最初のステートメントを変更し、最後の部分をelif
ステートメントとして追加します。
if [[ $((number - $guess)) -gt 10 ]]
then
echo "Too low"
elif [[ $((guess - $number)) -gt 10 ]]
then
echo "Too high"
elif [[ $(($number - $guess)) -le 10 ]]
then
echo "You are within ten but too low"
elif [[ $(($guess - $number)) -le 10 ]]
then
echo "You are within ten but too high"
fi
答え2
#!/bin/bash
number=$(( 1 + (RANDOM%100) )) # random number [1,100]
while read -p 'Guess: '; do
[[ $REPLY == *[![:digit:]]* ]] && continue
if [[ REPLY -eq number ]]; then
echo Correct
break
elif [[ REPLY -gt number ]]; then
too=large
delta=$(( REPLY - number ))
else
too=small
delta=$(( number - REPLY ))
fi
if [[ delta -le 10 ]]; then
close=' (but close)'
else
close=
fi
printf 'No, too %s%s\n' "$too" "$close"
done
単純な入力検証(数値以外の値を含む入力を無視)を実装し、与えられた推測が大きすぎるか小さいかと推測と正解との差を計算しますdelta
。使用乾式原理、大きすぎる、小さすぎる、またはサイズが間違っている場合は、推測に従って変数と適切too
な文字列を設定し、close
最後にユーザーが再試行できるようにする前にメッセージを印刷します。
ゲームは正確な推測、ユーザーがCtrl+D入力終了信号を押すか、Ctrl+C単にスクリプトを中断することによって終了します。
上記のゲームをプレイするためのスクリプトです。このスクリプトは、上記のスクリプトをguessinggame
現在のディレクトリで使用できると想定しています。
#!/bin/bash
coproc bash guessinggame
make_guess () {
printf 'Guessing %d\n' "$1"
printf '%s\n' "$1" >&${COPROC[1]}
}
guess=50 # initial guess
change=25 # next guess this much higher/lower
make_guess "$guess"
tries=1
while read; do
printf 'Game says "%s"\n' "$REPLY"
if [[ $REPLY == 'Correct' ]]; then
break
fi
if [[ $REPLY == *close* ]] && [[ change -gt 10 ]]; then
# Close call, do not change too much in next guess!
change=10
fi
if [[ $REPLY == *small* ]]; then
guess=$(( guess + change ))
else
guess=$(( guess - change ))
fi
change=$(( change / 2 ))
[[ change -eq 0 ]] && change=1
make_guess "$guess"
tries=$(( tries + 1 ))
done <&${COPROC[0]}
printf 'Guessed correctly after %d tries\n' "$tries"
例を実行してください:
$ bash guesser
Guessing 50
Game says "No, too large"
Guessing 25
Game says "No, too large (but close)"
Guessing 15
Game says "No, too small (but close)"
Guessing 20
Game says "No, too small (but close)"
Guessing 22
Game says "Correct"
Guessed correctly after 5 tries
答え3
数学が解決策です:)..次のコードをチェックしてください。
#!/bin/bash
name=Jack
number=$(( 1+$RANDOM%101 ))
echo $number
target=$number
goes=0
until [[ $guess -eq $target ]]
do
goes=$(( $goes+1 ))
echo "Guess $goes. Enter a number between 0 and 100"
read guess
if [[ $((number - guess)) -eq 0 ]]; then break; fi
if [[ $((number - guess)) -gt 10 ]]
then
echo "Too low"
elif [[ $((guess - number)) -gt 10 ]]
then
echo "Too high"
elif [[ $((number - guess)) -le 10 ]]
then
if [[ $((number - guess)) -lt 0 ]]
then
echo "You are within ten on the higher side"
else
echo "You are within ten on the lower side"
fi
fi
done
echo "Well done $name, it took $goes goes to guess $number"