Советы по преобразованию Ruby в Python3 - PullRequest
0 голосов
/ 17 ноября 2018

для части моего проекта Я анализирую различные алгоритмы, чтобы увидеть производительность разных типов агентов, решающих игру.Я нашел игру для реализации, однако она написана на 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 есть еще один класс под названием Game, и я не могу понять его достаточно хорошо.Вот код:

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 initialize player".Означает ли это, что он создает игрока?Но тогда я не уверен, куда переменная run вписывается во все это.

Я ценю всю помощь, которую вы можете предложить, и я смогу предоставить полный код для класса Game (он всего около 80 строк), если потребуется.Спасибо за вашу помощь.

Ответы [ 2 ]

0 голосов
/ 17 ноября 2018

def initialize player более читабелен для глаз, обученных Python, как def initialize(player), что также является обычным способом написать его на Ruby.это не создание Player, это создание экземпляра Game с аргументом «player».

0 голосов
/ 17 ноября 2018

В Ruby def initialize определяет конструктор. Ruby не требует скобок для параметров, если их значение однозначно без них, поэтому эквивалент Python будет def __init__(self, player):, что определяет Game экземпляр с player в качестве аргумента. Похоже, вы уже решили заменить @ s на self..

Для вашего Player класса более точный перевод для конструктора:

class Player:

    def __init__(self):
        self.x = 0

Версия Ruby не позволяет указывать x в качестве аргумента для конструктора, она жестко привязывает инициализацию к нулю без возможности переопределить это.

Вы можете получить быстрый взгляд на это краткое введение в Ruby для пользователей Python .

...