0

ロールする私のコードでは、r と書いてから Enter キーを押すだけですが、それを読み取らず、while ループを再開する else に移動するようには見えません。ロールする唯一の方法は、(standard_in) 1: 解析エラーではなく、r 以外の何かを入力することです。

#!/bin/bash
#this is a game that is two player and it is a race to get to 
#100 before the other player

echo "Player 1 name?"
read p1
echo "Player 2 name?"
read p2
echo "Okay $p1 and $p2. $p1 will go first"
p1s=0
p2s=0
pt=1
while [ $pt -eq 1 ]; do
echo "roll or stay"
read choice
if [ $choice == r ]; then

die=$(($RANDOM%6+1))

elif [ $die -eq 1 ]; then
p1s=$(echo "$p1s-$count" |bc)
echo "You rolled a 1. Your score is $p1s"
echo "$p2 turn now."
sleep 1
count=0
pt=2

elif [ $die -gt 1 ]; then
p1s=$(echo "$p1s+$die" |bc)
count=$(echo "$count+$die" |bc)
echo "You rolled a $die. Your score is $p1s"
pt=1

else

if [ $choice == s ]; then
echo "Okay $p1 your score is $p1s"
echo "$p2 turn now"
sleep 1
count=0
pt=2

else
if [ $p1s -gt 99 ]; then
echo "$p1 won. $p2 lost"
echo "would you like to play again?"
read again
elif [ $again  yes ]; then
echo "Okay one second."
sleep 1
clear
bash num.sh
elif [ $again == no ]; then
exit

else

pt=1
fi
fi
fi

done

2 番目のプレーヤーにとって 2 番目ではないことを心配する必要はありません。プレーヤー 2 だけの正確なコードと同じであるため、それを切り取りました。

サンプル入出力

Player 1 name?
guy1
Player 2 name?
guy2
Okay guy1 and guy2. guy1 will go first
roll or stay
r
roll or stay
rr
(standard_in) 1: parse error
You rolled a 5. Your score is 5
roll or stay
roll
(standard_in) 1: parse error
You rolled a 5. Your score is 10
roll or stay
s
(standard_in) 1: parse error
You rolled a 5. Your score is 15
roll or stay
4

2 に答える 2

4

さて、あなたのコードに関するいくつかのコメント。

  • インデントがないので、これは非常に読みにくいです。入れ子にするときは、入れ子になっているものをインデントします。インデントを使用すると、ループの開始点と終了点、どのコードがどの if/else に属しているかなどを確認できます。
  • bash では、偶発的な展開を避けるために、常に変数を引用符で囲む必要があります。たとえば、誰かが*「r」の代わりにアスタリスク ( ) を入力するとどうなりますか? あなたのif発言は、不思議で神秘的なことをするでしょう。
  • 演算子の使い方が間違っています。bash では、単一の角括弧と を使用してif、文字列の等価性を二重ではなく単一の等号 ( =) と比較します。そして、数値的な平等が必要な場合は、-eq. ただし、二重角括弧を使用して、bash の拡張テストを見たいと思うかもしれません。(詳細については、man ページを確認してください。)
  • bash が単独で実行できることには、外部ツールを使用しないようにしてください。 bcたとえば、整数演算には必要ありません。

というわけで、ここにあなたのコード セグメントを少し書き直したものがあります。

while [ "$pt" -eq 1 ]; do

    read -p "Roll or stay (r/s)? " choice

    if [ "$choice" = r ]; then

        die=$(($RANDOM%6+1))

    elif [ "$die" -eq 1 ]; then

        p1s=$((p1s - count))
        echo "You rolled a 1. Your score is $p1s"
        echo "$p2 turn now."
        sleep 1 
        count=0 
        pt=2    

    elif [ $die -gt 1 ]; then

        p1s=$((p1s + die))
        count=$((count + die))
        echo "You rolled a $die. Your score is $p1s"
        pt=1    

    else

あなたのプログラム ロジックが正しいかどうかについて、私は何の主張もしていないことに注意してください。

そして、一体何num.shですか?大切ですか?

于 2012-11-09T03:37:00.577 に答える
0

適切にインデントされたコード ( ghitiの書き直されたコード セグメントを参照) を見た後、トップ レベルの if-block が次のようになっていることがわかります。

if [ $choice == r ]; then
    die=... #roll the die
elif [ $die -eq 1 ]...
elif [ $die -gt 1 ]...
else
    do something...
fi

問題は、[ $choice == r ]が true の場合、サイコロを振って残りのエントリをスキップすることelifですelse。したがって、何もせずに次の反復に進みます (サイコロを振ることを除く)。

$choiceこれを修正する 1 つの方法は、と$dieを個別のifブロックとしてチェックすることです。つまり、

if [ $choice == r ]; then
    #roll the die
else
    #break or something...
fi

if [ $die -eq 1 ]; then
    #do something
elif the rest of $die-related checks  
于 2012-11-09T07:12:40.177 に答える