Я сейчас создаю простую ООП-игру «Камень, ножницы, бумага» на Ruby, чтобы лучше понять, как все работает в Ruby OOP. Но я столкнулся с проблемой.
Я хочу получить доступ к переменной экземпляра из другого класса, но получаю эту ошибку при запуске программы
Traceback (most recent call last):
2: from rps.rb:44:in `<main>'
1: from rps.rb:40:in `start'
rps.rb:17:in `greeting': undefined method `name' for nil:NilClass (NoMethodError)
Строка 17 - это
puts "Welcome #{@player1.name} and #{@player2.name}"
Это весь мой код до сих пор
class Player
attr_accessor :name, :player1, :player2,
def initialize(name)
@name = name
@player1 = Player.new(name1)
@player2 = Player.new(name2)
end
end
class Main
def greeting
puts "Welcome to Rock-Paper-Scissor"
sleep(0.5)
puts "Welcome #{@player1.name} and #{@player2.name}"
end
def instruct
puts "The rules of the game are simple\n"
puts "Choose Rock, Paper or Scissor each turn\n "
puts "Paper beats Rock, Scissor beats paper and Rock beats Scissor\n"
puts "Ready....?"
end
end
def start
puts "Hi, please enter your name player 1: "
name1 = gets.chomp
puts "Hi, please enter your name player 2: "
name2 = gets.chomp
game = Main.new
game.greeting
game.instruct
end
start
***** В код внесены новые изменения для правильной работы *******
class Player
attr_accessor :name
def initialize(name)
@name = name
end
end
class Game
def greeting
puts "Hi, please enter your name player 1: "
name1 = gets.chomp
@player1 = Player.new(name1)
puts "Hi, please enter your name player 2: "
name2 = gets.chomp
@player2 = Player.new(name2)
puts "Welcome to Rock-Paper-Scissor"
sleep(0.5)
puts "Welcome #{@player1.name} and #{@player2.name}"
end
def instruct
puts "The rules of the game are simple\n"
puts "Choose Rock, Paper or Scissor each turn\n "
puts "Paper beats Rock, Scissor beats paper and Rock beats Scissor\n"
puts "Ready....?"
end
end
def start
game = Game.new
game.greeting
game.instruct
end
start
player1
иplayer2
не должны быть вMain
? Игрок - этоPlayer
, но не должен содержать двух игроков. - person mu is too short   schedule 23.12.2019Player
имеет 2 атрибута игрока, то у каждого из этих игроков есть по 2 игрока, а у этих - еще 2. Другими словами, вам нужно бесконечное количество игроков, чтобы создать одного игрока. Вам следует немного переосмыслить свою структуру. Вероятно, вам нуженGame
объект / класс с двумя игроками.Main
имя класса слишком общее, имо - person Viktor   schedule 23.12.2019Player
не должен содержать двух игроков. Что бы я тогда поместил в класс игрока? - person nimpa   schedule 23.12.2019Player
должен содержать атрибуты только одного игрока - в данном случае толькоname
. Вы можете отслеживать список игроков (@player1
,@player2
и т. Д.) Из классаMain
- person max pleaner   schedule 23.12.2019name1
иname2
в мойgreetings
вGame
, мог бы я поместить эту переменную в свой методstart
, не выдаваяundefined local variable or method method for name1
ошибку? - person nimpa   schedule 23.12.2019name
- это метод, а не переменная. Чтобы ответить на ваш вопрос: сообщение об ошибке означает, что либоplayer1
, либоplayer2
не классаPlayer
и, следовательно, не имеет метода с именемname
. - person user1934428   schedule 23.12.2019