0

这是我的代码:

class RockPaperScissors

   # Exceptions this class can raise:
  class NoSuchStrategyError < StandardError
  end

  def self.winner(player1, player2)
    if ((player1[1] == 'R') && (player2[1] == 'S') ||
        (player1[1] == 'S') && (player2[1] == 'P') ||
        (player1[1] == 'P') && (player2[1] == 'R'))
      return player1
    elsif ((player1[1] == 'R') && (player2[1] == 'P') ||
        (player1[1] == 'S') && (player2[1] == 'R') ||
        (player1[1] == 'P') && (player2[1] == 'S'))
      return player2
    elsif ((player1[1] == 'R') && (player2[1] == 'R') ||
        (player1[1] == 'S') && (player2[1] == 'S') ||
        (player1[1] == 'P') && (player2[1] == 'P'))
      return player1
    end

  end

  def self.tournament_winner(tournament)
    player1 = Array.new
    player2 = Array.new
    nextround = Array.new

    while tournament.length != 1 do

      tournament.each_with_index {|item, index|
        if (index%2!=0)
          player2[0] = item[0]
          player2[1] = item[1]
        elsif (index%2 ==0)
          player1[0] = item[0]
          player1[1] = item[1]
        else
          puts 'bananas'
        end

        if (index%2!=0)
          nextround[(index-1)/2] = winner(player1, player2)
        end
      }
      tournament=nextround
    end
    return tournament

  end
end



RockPaperScissors.tournament_winner([["num1", "R"], ["num2", "P"], ["num3", "P"], ["num4", "R"]])

好吧,最后一行是执行启动。这段代码进行了一场石头剪刀布比赛。它将包含每个角色及其攻击的数组作为输入,并且它必须返回包含冠军及其攻击的数组。

比赛是 num1 vs num2(num2 胜),num3 vs num4(num3 胜)。然后决赛是Num2 vs Num3,在这个稳定的人中赢得了阵列中的第一个人(Num2)。

这似乎过于复杂,因为代码必须处理任意数量的字符,只要它们的数量是 base2(2、4、8、16 个字符......等)。

我的问题是下一个(调试代码,你会看到)。当它改变数组'Player1'或'Player2'的值时,它也会改变数组'nextround'中的值,即使它不在那一行!

这不应该发生!

顺便说一句,我正在学习 Ruby,所以这可能是一个非常愚蠢的失败。

4

1 回答 1

0

为什么这需要是真的?

“这似乎过于复杂,因为代码必须处理任意数量的字符,只要它们的数量是 base2(2、4、8、16 个字符......等)。”

与其让 player1 和 player2 成为数组,不如将它们重写为 Player 类的实例。然后在 Player 类中编写方法,以便您可以调用player1.hand它并返回'S' || 'R' || 'P'

这样您就可以在玩家对象上存储玩家的获胜次数,

我想了解更多的事情

  • case/when 语句

  • 特殊的初始化方法

  • attrs_accessor(用于使数据可跨类访问)

  • 模块

我也看到它完成了,我可能错了,但通常你不会把类放在类中。

于 2013-10-28T04:13:31.680 回答