【发布时间】:2020-04-14 07:56:23
【问题描述】:
我正在用 ruby 创建一个简单的 Rock, Paper, Scissor OOP 游戏,以便更好地了解 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,但不应包含两个玩家。 -
如果
Player对象有 2 个玩家属性,那么这些玩家也各有 2 个玩家,另外还有 2 个。换句话说,您需要无限数量的玩家来创建一个玩家。你应该重新考虑一下你的结构。您可能想要的是一个有 2 个玩家的Game对象/类。Main类名太通用了 imo -
很抱歉,我不明白为什么我的班级
Player不应该包含这两个玩家。那我会在播放器类中放什么? -
Player类应该只包含单个玩家的属性 - 在这种情况下,只是name。您可以从Main类中跟踪玩家列表(@player1、@player2等) -
好的,我现在明白了。感谢您清除它。我对代码进行了更改以使其现在可以工作。我会在上面编辑。但我确实有另一个问题,而不是将变量
name1和name2放入我的greetings中Game是否有办法让我将该变量放入我的方法start而不抛出 @ 987654343@错误?
标签: ruby oop instance-variables