Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/ruby/25.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ruby-使用While,if/else语句,玩家vs电脑的摇滚剪纸游戏_Ruby - Fatal编程技术网

Ruby-使用While,if/else语句,玩家vs电脑的摇滚剪纸游戏

Ruby-使用While,if/else语句,玩家vs电脑的摇滚剪纸游戏,ruby,Ruby,好的,我对这一点还不熟悉,我知道有一种更好的方法可以用更少的打字和更好的方法来写一把石头剪刀。我只是还没到那里。所以请容忍我 代码可以工作,但有时当我输入“r”、“p”、“s”时,它不会返回任何内容,或者“无效输入,请重试”。我尝试输入范围 if player_input=[“a”。“o”]to_s,以防玩家的输入不是游戏的命令。但仍然如此。我试过包含?方法 有人能告诉我怎么操作r,p,s吗。并为其他所有内容提供“无效条目,重试”?在这个代码中 带条件中断的循环 实现这一点的一种方法是使用循环,

好的,我对这一点还不熟悉,我知道有一种更好的方法可以用更少的打字和更好的方法来写一把石头剪刀。我只是还没到那里。所以请容忍我

代码可以工作,但有时当我输入“r”、“p”、“s”时,它不会返回任何内容,或者“无效输入,请重试”。我尝试输入范围

if player_input=[“a”。“o”]to_s
,以防玩家的输入不是游戏的命令。但仍然如此。我试过包含?方法

有人能告诉我怎么操作r,p,s吗。并为其他所有内容提供“无效条目,重试”?在这个代码中

带条件中断的循环 实现这一点的一种方法是使用循环,该循环仅在您有有效输入时才会中断。例如:

$player_count = 0
$computer_count = 0

what_to_include = %w{r p s}

paper = "p"
rock = "r"
scissors = "s"

def computer_input
  computer = rand(3)
  if computer == 0
    computer = "p"
  elsif computer == 1
    computer = "r"
  else
    computer = "s"
  end
end


while true

puts "Player Score: #{$player_count}, \tComputer Score: #{$computer_count}"

print "Choose rock (r), paper (p), or scissors (s): "
player_input = gets.chomp.downcase

  if player_input == rock && computer_input == scissors
    puts "Player chose rock. \nComputer chose scissors."
    puts "Rock beats scissors, player wins the round."
    $player_count += 1

  elsif player_input == scissors && computer_input == paper
    puts "Player chose scissors. \nComputer chose paper."
    puts "Scissors beat paper, player wins the round."
    $player_count += 1

  elsif player_input == paper && computer_input == rock
    puts "Player chose paper. \nComputer chose rock"
    puts "Paper beats rock, player wins the round."
    $player_count += 1

  elsif computer_input == rock && player_input == scissors
    puts "Player chose scissors. \nComputer chose rock."
    puts "Rock beats scissos, Computer wins the round"
    $computer_count += 1

  elsif computer_input == scissors && player_input == paper
    puts "Player chose paper. \nComputer chose scissors."
    puts "Scissors beats paper, Computer wins the round"
    $computer_count += 1

  elsif computer_input == paper && player_input == rock
    puts "Player chose rock. \nComputer chose paper."
    puts "Paper beats rock, Computer wins the round"
    $computer_count += 1

  # elsif player_input == computer_input
  #   puts "Player chose #{player_input},\n Computer chose #{computer_input}"
  #   puts "Tie, choose again"  #tried with this but returns r, s, p instead of word

  elsif player_input == rock && computer_input == rock ||
        player_input == paper && computer_input == paper ||
        player_input == scissors && computer_input == scissors
    puts "Player chose rock. \nComputer chose rock."
    puts "Tie, choose again"
  end

  if player_input.include?("abcdefghijklmnoqtuvxzy")
    puts "Invalid entry, try again."
  end

  if $player_count == 2
    puts "Player wins!"
    break
  elsif $computer_count == 2
    puts "Computer wins!"
    break
  end
end
当然还有其他方法可以做到这一点,还有更惯用的方法。但是,这应该解决您的特定问题,而不需要太多重构。

使用条件中断循环 实现这一点的一种方法是使用循环,该循环仅在您有有效输入时才会中断。例如:

$player_count = 0
$computer_count = 0

what_to_include = %w{r p s}

paper = "p"
rock = "r"
scissors = "s"

def computer_input
  computer = rand(3)
  if computer == 0
    computer = "p"
  elsif computer == 1
    computer = "r"
  else
    computer = "s"
  end
end


while true

puts "Player Score: #{$player_count}, \tComputer Score: #{$computer_count}"

print "Choose rock (r), paper (p), or scissors (s): "
player_input = gets.chomp.downcase

  if player_input == rock && computer_input == scissors
    puts "Player chose rock. \nComputer chose scissors."
    puts "Rock beats scissors, player wins the round."
    $player_count += 1

  elsif player_input == scissors && computer_input == paper
    puts "Player chose scissors. \nComputer chose paper."
    puts "Scissors beat paper, player wins the round."
    $player_count += 1

  elsif player_input == paper && computer_input == rock
    puts "Player chose paper. \nComputer chose rock"
    puts "Paper beats rock, player wins the round."
    $player_count += 1

  elsif computer_input == rock && player_input == scissors
    puts "Player chose scissors. \nComputer chose rock."
    puts "Rock beats scissos, Computer wins the round"
    $computer_count += 1

  elsif computer_input == scissors && player_input == paper
    puts "Player chose paper. \nComputer chose scissors."
    puts "Scissors beats paper, Computer wins the round"
    $computer_count += 1

  elsif computer_input == paper && player_input == rock
    puts "Player chose rock. \nComputer chose paper."
    puts "Paper beats rock, Computer wins the round"
    $computer_count += 1

  # elsif player_input == computer_input
  #   puts "Player chose #{player_input},\n Computer chose #{computer_input}"
  #   puts "Tie, choose again"  #tried with this but returns r, s, p instead of word

  elsif player_input == rock && computer_input == rock ||
        player_input == paper && computer_input == paper ||
        player_input == scissors && computer_input == scissors
    puts "Player chose rock. \nComputer chose rock."
    puts "Tie, choose again"
  end

  if player_input.include?("abcdefghijklmnoqtuvxzy")
    puts "Invalid entry, try again."
  end

  if $player_count == 2
    puts "Player wins!"
    break
  elsif $computer_count == 2
    puts "Computer wins!"
    break
  end
end

当然还有其他方法可以做到这一点,还有更惯用的方法。不过,这应该可以解决您的特定问题,而无需进行太多重构。

测试=~是在Ruby中测试正则表达式。任何介于(2)斜线之间的内容
/^[rps]$/
是一个正则表达式


^关于正则表达式的好信息

=~正在测试Ruby中的正则表达式。任何介于(2)斜线之间的内容
/^[rps]$/
是一个正则表达式


^关于正则表达式的好信息

这里有一种更简洁、更像Ruby的游戏编写方法

loop do
  print "Choose rock (r), paper (p), or scissors (s): "
  player_input = gets.chomp.downcase
  break if player_input =~ /^[rps]$/
  puts "Invalid entry, try again."
end

需要注意的几点:

  • 我已经将从玩家那里获取有效条目的工作降级到了一个单独的方法,在这个方法中,我使用(通常首选
    ,而true
    ,等等)进行循环
  • 我用符号来表示选择和结果
  • 我用这种方法得到了计算机的随机选择
  • 我使用数组来表示赢家和输家的选择对(从玩家的角度)

    • 这里有一种更简洁、更像红宝石的游戏编写方法

      loop do
        print "Choose rock (r), paper (p), or scissors (s): "
        player_input = gets.chomp.downcase
        break if player_input =~ /^[rps]$/
        puts "Invalid entry, try again."
      end
      

      需要注意的几点:

      • 我已经将从玩家那里获取有效条目的工作降级到了一个单独的方法,在这个方法中,我使用(通常首选
        ,而true
        ,等等)进行循环
      • 我用符号来表示选择和结果
      • 我用这种方法得到了计算机的随机选择
      • 我使用数组来表示赢家和输家的选择对(从玩家的角度)

      所以我认为问题在于你需要像电脑一样定义播放器。我用和你一样的东西重做了作业,现在看来效果不错$玩家计数=0 $computer\u count=0

      RockPaperScissors.new.play(3)
      

      希望这有帮助

      所以我认为问题在于你需要像电脑一样定义玩家。我用和你一样的东西重做了作业,现在看来效果不错$玩家计数=0 $computer\u count=0

      RockPaperScissors.new.play(3)
      

      希望这有帮助

      使用太多的
      |
      和if/elsif对于这个问题来说真的很奇怪。您可以做一些更简单的事情,如:

      def computer_input
        computer = rand(3)
        if computer == 0
          computer = "p"
        elsif computer == 1
          computer = "r"
        else
          computer = "s"
        end
      end
      
          def player_input
        if player == "r"
          player = "r"
        elsif player == "p"
          player = "p"
        else player == "s"
          player = "s"
        end
      end
      
      while true
      
        puts "Player Score: #{$player_count}, \tComputer Score: #{$computer_count}"
      
        puts "Choose rock (r), paper (p), or scissors (s) "
      
        player_input = gets.chomp
      
        if player_input == "r" && computer_input == "s"
          puts "Player chose rock. \nComputer chose scissors."
          puts "Rock beats scissors, player wins the round."
          $player_count += 1
      
        elsif player_input == "s" && computer_input == "p"
          puts "Player chose scissors. \nComputer chose paper."
          puts "Scissors beat paper, player wins the round."
          $player_count += 1
      
        elsif player_input == "p" && computer_input == "r"
          puts "Player chose paper. \nComputer chose rock"
          puts "Paper beats rock, player wins the round."
          $player_count += 1
      
        elsif computer_input == "r" && player_input == "s"
          puts "Player chose scissors. \nComputer chose rock."
          puts "Rock beats scissos, Computer wins the round"
          $computer_count += 1
      
        elsif computer_input == "s" && player_input == "p"
          puts "Player chose paper. \nComputer chose scissors."
          puts "Scissors beats paper, Computer wins the round"
          $computer_count += 1
      
        elsif computer_input == "p" && player_input == "r"
          puts "Player chose rock. \nComputer chose paper."
          puts "Paper beats rock, Computer wins the round"
          $computer_count += 1
      
        elsif player_input == computer_input
          puts "Tie, go again!"
      
        else
          puts "Invalid Entry"
        end
      
        if $player_count == 2
          puts "Player wins!"
          break
        elsif $computer_count == 2
          puts "Computer wins!"
          break
        end
      end
      

      使用太多的
      |
      和if/elsif对于这个问题来说真的很奇怪。您可以做一些更简单的事情,如:

      def computer_input
        computer = rand(3)
        if computer == 0
          computer = "p"
        elsif computer == 1
          computer = "r"
        else
          computer = "s"
        end
      end
      
          def player_input
        if player == "r"
          player = "r"
        elsif player == "p"
          player = "p"
        else player == "s"
          player = "s"
        end
      end
      
      while true
      
        puts "Player Score: #{$player_count}, \tComputer Score: #{$computer_count}"
      
        puts "Choose rock (r), paper (p), or scissors (s) "
      
        player_input = gets.chomp
      
        if player_input == "r" && computer_input == "s"
          puts "Player chose rock. \nComputer chose scissors."
          puts "Rock beats scissors, player wins the round."
          $player_count += 1
      
        elsif player_input == "s" && computer_input == "p"
          puts "Player chose scissors. \nComputer chose paper."
          puts "Scissors beat paper, player wins the round."
          $player_count += 1
      
        elsif player_input == "p" && computer_input == "r"
          puts "Player chose paper. \nComputer chose rock"
          puts "Paper beats rock, player wins the round."
          $player_count += 1
      
        elsif computer_input == "r" && player_input == "s"
          puts "Player chose scissors. \nComputer chose rock."
          puts "Rock beats scissos, Computer wins the round"
          $computer_count += 1
      
        elsif computer_input == "s" && player_input == "p"
          puts "Player chose paper. \nComputer chose scissors."
          puts "Scissors beats paper, Computer wins the round"
          $computer_count += 1
      
        elsif computer_input == "p" && player_input == "r"
          puts "Player chose rock. \nComputer chose paper."
          puts "Paper beats rock, Computer wins the round"
          $computer_count += 1
      
        elsif player_input == computer_input
          puts "Tie, go again!"
      
        else
          puts "Invalid Entry"
        end
      
        if $player_count == 2
          puts "Player wins!"
          break
        elsif $computer_count == 2
          puts "Computer wins!"
          break
        end
      end
      

      我正在试图理解=~/^$/的作用。你能澄清一下吗?@Diego他们将正则表达式锚定到字符串的开头和结尾。如果没有它们,像
      foos
      pbar
      这样的东西也会匹配,这可能不是您想要的。我知道了,我正在阅读更多关于regexp的内容。我试着处理代码中被剪掉的部分,但没有成功。我是否将while循环切换为循环?要让它工作吗?我正在试图理解=~/^$/的作用。你能澄清一下吗?@Diego他们将正则表达式锚定到字符串的开头和结尾。如果没有它们,像
      foos
      pbar
      这样的东西也会匹配,这可能不是您想要的。我知道了,我正在阅读更多关于regexp的内容。我试着处理代码中被剪掉的部分,但没有成功。我是否将while循环切换为循环?要使其工作,可以使用=~运算符或#匹配方法实现模式匹配。模式匹配可以通过使用=~运算符或#匹配方法来实现。明白了哇!是的,我需要更多的时间,知识和实践来完成它。谢谢你的意见。一位匿名人士建议进行大量编辑。该编辑包含了一些有趣的想法,并且结构良好,但我更喜欢我所拥有的,因此不接受该编辑。然而,我鼓励那个人在这里发布解决方案。哇!是的,我需要更多的时间,知识和实践来完成它。谢谢你的意见。一位匿名人士建议进行大量编辑。该编辑包含了一些有趣的想法,并且结构良好,但我更喜欢我所拥有的,因此不接受该编辑。然而,我鼓励那个人在这里发布解决方案。