Ruby到Python3的转换建议

时间:2018-11-16 23:44:41

标签: python ruby python-3.x

在我的项目的一部分中,我正在分析不同的算法,以查看解决游戏的多种代理的性能。我找到了要实现的游戏,但是它是在Ruby中实现的,我对阅读代码不是很熟悉。我想知道您是否可以帮助我解决这个问题。

一个类看起来像这样:

require 'io/console'

class Player
  attr_accessor :x

  def initialize
    @x = 0
  end

  def get_input
    input = STDIN.getch
    if input == 'a'
      return :left
    elsif input == 'd'
      return :right
    elsif input == 'q'
      exit
    end

    return :nothing
  end
end

而且我相信我可以使用以下方法将其成功转换为Python:

class Player:

def __init__(self, x = 0):
    self.x = x

def get_input:
    user_input = input("what direction? left = a, right = d, nothing = s")
    direction = 'nothing'

    if user_input == 'a':
        return direction = 'left'
    else:
        return direction  = 'right'

    return direction

但是,还有另一个名为Ruby的游戏类,我无法充分理解它。这是代码:

class Game
  attr_accessor :score, :map_size

  def initialize player
    @run = 0
    @map_size = 12
    @start_position = 3
    @player = player
    reset

    # Clear the console
    puts "\e[H\e[2J"

  end
…

我想知道您是否知道“ def初始化播放器”这一行的含义。这是否意味着它正在创建一个播放器?但是然后我不确定运行变量在哪里适合所有这些。

我非常感谢您可以提供的所有帮助,如果需要,我将能够提供Game类的完整代码(仅约80行)。感谢您的所有帮助。

2 个答案:

答案 0 :(得分:0)

在Ruby def initialize中定义了一个构造函数。如果没有明确的含义,Ruby不需要为参数加括号,因此Python等效项为def __init__(self, player):,它定义了一个以Game作为参数的player实例。看来您已经想出用@取代self.

对于您的Player类,构造函数的更准确翻译是:

class Player:

    def __init__(self):
        self.x = 0

Ruby版本不允许您将x指定为构造函数的参数,它将初始化初始化为零,而没有任何选择可以覆盖它。

快速浏览this quick intro to Ruby for Python users,您可能会受益。

答案 1 :(得分:0)

对于x[2] # "/SampleData/exp294/K9" 来说,def initialize player对于经过Python训练的眼睛来说更具可读性,这也是用Ruby编写的通常方式。它不是在创建玩家,而是在创建游戏实例,并以“玩家”作为参数。