간단한 난수 추측 게임을 개발 중인데 몇 가지 어려움에 봉착했습니다. 핵심 게임이 작동하고 있지만 더 많은 것을 원합니다. 예를 들어, 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"