Bash - 特定のパラメータ内でより大きく、より低い

Bash - 特定のパラメータ内でより大きく、より低い

単純な乱数推測ゲームを開発していますが、いくつかの難しさに固執しました。コアゲームが動作していますが、もっと欲しいです。たとえば、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"

関連情報