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"

관련 정보