Por que meu loop não está continuando corretamente no meu jogo de tesoura de papel rock?

1

Eu estou fazendo um jogo de tesouras de papel bo3 rock. Até agora eu consegui trabalhar sob todas as condições, exceto gravatas. Quando um empate ocorre, ele é destinado a "refazer" esse jogo apenas subtraindo 1 de I. No entanto, ele não parece estar funcionando e não consigo entender por quê.

Aqui está o meu código:

#!/bin/bash

#rock beats scissors, scissors beats paper, paper beats rock, 
userwin=0
compwin=0

printf "Welcome to rock paper scissors. "

for i in {1..3}
do
    printf "Type 'r', 'p', or 's': "

    #get users selection
    read user

    #detect input and assign it to a num that will be used to check against computer.
    if [[ $user == [rR] || $user == "Rock" || $user == "rock" ]]
      then
        user="r"
    elif [[ $user == [sS] || $user == "scissors" || $user == "Scissors" ]]
      then
        user="s"
    elif [[ $user == [pP] || $user == "paper" || $user == "Paper" ]]
      then
        user="p"
    else
        printf "Not a valid submission, you entered: %s\n" "$user"
    fi

   #get random number between 1 and 9
   comp=$(shuf -i 1-9 -n 1)

   #detect what number it was and assign either r p s to it. 
   if ((1<=comp && comp<=3))
     then 
       comp="r"
       printf "Computer chooses rock\n"
   elif ((4<=comp && comp<=6))
     then
       comp="s"
       printf "Computer chooses scissors\n"
   elif ((6<=comp && comp<=9))
     then
       comp="p"
       printf "Computer chooses paper\n"
   else
       printf "not in range?"
   fi

   #find out who won
   if [[ $user == "$comp" ]]
     then
        i=$((i-1))
        printf "It's a tie, remake!\n"
   elif [[ $user == "r" && $comp == "p" ]]
     then
       printf "You lose!\n"
       compwin=$((compwin+1))
   elif [[ $user == "p" && $comp == "r" ]]
     then  
       printf "You win!\n"
       userwin=$((userwin+1))
   elif [[ $user == "s" && $comp == "r" ]]
     then  
       printf "You lose!\n"
       compwin=$((compwin+1))
   elif [[ $user == "r" && $comp == "s" ]]
     then  
       printf "You win!\n"
       userwin=$((userwin+1))
   elif [[ $user == "p" && $comp == "s" ]]
     then  
       printf "You lose!\n"
       compwin=$((compwin+1))
   elif [[ $user == "s" && $comp == "p" ]]
     then  
       printf "You win!\n"
   else
       printf "something is borked"
   fi

   if [[ $userwin == 2 ]]
     then
       printf "You win the bo3!\n"
       break
   elif [[ $compwin == 2 ]]
     then
       printf "You lose the bo3!\n"    
       break
   else
      reali=$((i+1))
      printf "\nGame %s start\n" "$reali"
   fi

done

E aqui está um exemplo de um jogo que falhou:

noah: [~/myFiles/scripts] ./rps.sh
Welcome to rock paper scissors. Type 'r', 'p', or 's': r
Computer chooses rock
It's a tie, remake!

Game 1 start
Type 'r', 'p', or 's': r
Computer chooses paper
You lose!

Game 3 start
Type 'r', 'p', or 's': r
Computer chooses scissors
You win!

Game 4 start
noah: [~/myFiles/scripts]

Parece que algo está mexendo com o meu inteiro, mas mesmo com o bash -x eu não consigo entender o porquê. Alguém mais experiente pode dar uma olhada?

    
por Egrodo 18.06.2016 / 23:53

1 resposta

3

Você não pode modificar a variável dentro do ciclo for como este em bash . Ah ... você pode, mas isso não afetará as iterações. Não é contado loop como podemos ser usados para a partir de C.

Exemplo mínimo:

#!/bin/bash
for i in {1..3}
do
    echo $i
    i=$((i-1))
    echo $i
done

obviamente imprime:

./b.sh 
1
0
2
1
3
2

É melhor você estar com loop padrão com condição (como proposto por Kusalananda):

#!/bin/bash
i=0
while ((i++ < 3)); do
    echo $i
    # your code here
    #i=$((i-1))
    #echo $i
done

Deixando também a antiga proposta abaixo, mas o texto acima é claramente melhor.

Você seria melhor com loop infinito e cuidaria de sua própria variável dentro, se quiser modificar a quantidade de execuções. Algo como isso deve fazer o trabalho (no exemplo incremento de 2, caso contrário nunca terminaria):

#!/bin/bash
i=1
while true; do
    if [[ $i > "3" ]]; then
        break
    fi
    echo $i
    i=$((i-1))
    echo $i

    i=$((i+2))
done
    
por 19.06.2016 / 00:11