Ruby: L oop, задачи случая и итераций (камень, ножницы, бумага) - PullRequest
0 голосов
/ 07 мая 2020

Я ruby студент с 1 месяца, и я застрял с одной частью моего кода. Проект основан на игре (камень, ножницы, бумага), но я столкнулся с проблемой, которую не могу решить на данный момент. Я хотел бы добавить один параметр в эту игру, особенно когда пользователь вводит неправильный ввод, отображая сообщение, но с условием, которое я добавил, он не работает.

elsif player_choice != 'r' || player_choice != 'p' || player_choice != 's' || player_choice != 'q' || player_choice != 'x'
          puts "wrong input"

Итак, если у вас есть совет или какой-нибудь намек, чтобы поделиться со мной, будет здорово! (см. ниже весь код).

Большое спасибо.

      #intro
    puts "***** WELCOME TO PAPER SCISSORS ROCKS GAME *****"

    puts "Input p = Paper, r = Rocks, s = Scissors, x = Display your score , q = Quit the game. "
    25.times { print "-" }
    puts

    #scores

    playerScore = 0
    cpuScore = 0

    CHOICES = {'p' => 'Paper', 'r' => 'Rock', 's' => 'Scissors', 'x' => 'score','q' => 'quit' }
    CHOICE_CPU = {'p' => 'Paper', 'r' => 'Rock', 's' => 'Scissors'}


    loop do

      # player picks
      begin 
        puts "Select your pick: (p/r/s/x/q)"
        player_choice = gets.chomp.downcase
      end until CHOICES.keys.include?(player_choice)

      # computer picks
      cpu_choice = CHOICE_CPU.keys.sample

    def throw_message(winning_choice)
      case winning_choice
      when 'p'
        puts "Paper wraps Rock!"
      when 'r'
        puts "Rock smashes Scissors!"
      when 's'
        puts "Scissors cuts Paper!"
      when 'x'
        puts "Live score"
      when 'q'
        puts "you decide to quit the game"
      end
    end

    #display scores
     if player_choice == 'x'
       throw_message(player_choice)
       puts  "PLAYER : #{playerScore} CPU : #{cpuScore}"

    #quit the game

    elsif  player_choice == 'q'
           throw_message(player_choice)
           break

    # tie result
    elsif player_choice == cpu_choice
        puts "It's a Tie ! "

    #player win

    elsif (player_choice == 'p' && cpu_choice == 'r') || (player_choice == 'r' && cpu_choice == 's') || (player_choice == 's' && cpu_choice == 'p')
        throw_message(playe·r_choice)
        puts "You Win"
        playerScore +=1

    #display invalid input

    elsif player_choice != 'r' || player_choice != 'p' || player_choice != 's' || player_choice != 'q' || 
   player_choice != 'x'
          puts "wrong input"

    #cpu win 

    else throw_message(cpu_choice)
          puts "Computer Win"
          cpuScore +=1


    end

    end

1 Ответ

1 голос
/ 07 мая 2020

Переместите проверку CHOICES.keys.include?(player_choice) в начало основного if / else logi c. Если вы проверите свой ввод как можно раньше, остальная часть кода может предположить, что ввод хорош; нет необходимости снова перечислять все возможные варианты.

Я использую case / when, потому что его легче читать, чем if / elsif. throw_message определен вне l oop, внутри l oop он многократно переопределяется. И я удалил варианты из throw_message, которые не имеют отношения к игре; это позволяет избежать повторения полного набора вариантов.

def throw_message(winning_choice)
  case winning_choice
  when 'p'
    puts "Paper wraps Rock!"
  when 'r'
    puts "Rock smashes Scissors!"
  when 's'
    puts "Scissors cuts Paper!"
  end
end

def player_wins?(player_choice, cpu_choice)
  return player_choice == 'p' && cpu_choice == 'r') ||
         player_choice == 'r' && cpu_choice == 's') ||
         player_choice == 's' && cpu_choice == 'p')
end

loop do
  # player picks
  puts "Select your pick: (p/r/s/x/q)"
  player_choice = gets.chomp.downcase

  # cpu picks
  cpu_choice = CHOICE_CPU.keys.sample

  case
  when !CHOICES.keys.include?(player_choice)
    puts "wrong input"
  when player_choice == 'x'
    puts "Live score"
    puts  "PLAYER : #{playerScore} CPU : #{cpuScore}"
  when player_choice == 'q'
    puts "you decide to quit the game"
    break
  when player_choice == cpu_choice
    puts "It's a tie!"
  when player_wins?(player_choice, cpu_choice)
    throw_message(player_choice)
    puts "You Win"
    playerScore +=1
  else
    throw_message(cpu_choice)
    puts "Computer Win"
    cpuScore +=1
  end
end
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...