红宝石中的纸,剪刀,摇滚游戏。当数组更改数据时,它会更改另一个数组的数据(¿?)

时间:2013-10-27 22:13:26

标签: ruby arrays

这是我的代码:

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 wins),num3 vs num4(num3 wins)。然后决赛是Num2 vs Num3,在这个稳定队员中赢得阵容中的第一个人(Num2)。

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

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

这不应该发生!

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

1 个答案:

答案 0 :(得分:0)

为什么这必须是真的?

  

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

相反,将player1和player2作为数组,我会将它们重写为类Player的实例。然后在Player类中编写方法,这样您就可以调用player1.hand并返回'S' || 'R' || 'P'

通过这种方式,您可以存储玩家对玩家对象的胜利数量,

我会研究更多关于

的内容
  • case / when statements

  • 特殊初始化方法

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

  • 模块

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