Ruby on rails Ruby:循环、案例和迭代问题(石头、布、剪刀)

Ruby on rails Ruby:循环、案例和迭代问题(石头、布、剪刀),ruby-on-rails,ruby,Ruby On Rails,Ruby,我从一个月起就是ruby的学生,我的代码中有一部分被卡住了。这个项目是基于一个游戏(石头、纸、剪刀)的,但我面临一个暂时无法解决的问题。我想为这个游戏添加一个参数,特别是当用户通过显示消息输入错误的输入,但我添加的条件不起作用时 elsif player_choice != 'r' || player_choice != 'p' || player_choice != 's' || player_choice != 'q' || player_choice != 'x' pu

我从一个月起就是ruby的学生,我的代码中有一部分被卡住了。这个项目是基于一个游戏(石头、纸、剪刀)的,但我面临一个暂时无法解决的问题。我想为这个游戏添加一个参数,特别是当用户通过显示消息输入错误的输入,但我添加的条件不起作用时

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

移动
选项。键。包括?(玩家选择)
检查主if/else逻辑的顶部。如果您尽早验证您的输入,那么代码的其余部分可以假定输入是好的;没有必要再详细说明所有可能的选择

我使用case/when是因为它比if/elsif更容易阅读<代码>抛出消息在循环外部定义,在循环内部重复定义。我已经从
throw\u 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