首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Ruby: RPG库存系统

Ruby: RPG库存系统
EN

Stack Overflow用户
提问于 2016-01-07 00:49:31
回答 1查看 229关注 0票数 2

现在我终于知道了类继承在ruby中是如何工作的,我正在为文本rpg设计一个库存系统。不过,有些怪癖我还是搞不明白。

物品类别:

代码语言:javascript
复制
class Item
    attr_accessor :name, :type, :attack, :armor, :wearloc, :weight, :price
    def initialize(name, type, attack, armor, wearloc, weight, price)
        @name = name
        @type = type
        @attack = attack
        @armor = armor
        @wearloc = wearloc
        @weight = weight
        @price = price
    end
end

库存类别:

代码语言:javascript
复制
class Inventory
    attr_accessor :items
    def initialize
        @@items = []
    end

    def add_item(item)
        @@items << item
    end

    attr_accessor :inventory
    def inventory
        @@items.each do |item|
            puts "#{item.name} (#{item.type})"
            if item.attack != nil ; puts " %-20s %00d" % ['Attack', item.attack] ; end
            if item.armor != nil ; puts " %-20s %00d" % ['Armor', item.armor] ; end
            if item.wearloc != nil ; puts " %-20s %00s" % ['Wear', item.wearloc] ; end
            if item.weight != nil ; puts " %-20s %00d" % ['Weight', item.weight] ; end
            if item.price != nil ; puts " %-20s %00d" % ['Price', item.price] ; end
        end
    end
end

球员班:

代码语言:javascript
复制
class Player < Inventory
    attr_accessor :playername
    def initialize(playername)
        @playername = playername
    end
end

实例化库存,创建几个项目,并将它们添加到清单中所有工作。

代码语言:javascript
复制
inv = Inventory.new
broadsword = Item.new('a heavy broadsword', 'weapon', 5, nil, 'wield', 15, 2)
breastplate = Item.new('a mithril breastplate', 'armor', nil, 10, 'torso', 15, 5)
ring = Item.new('a gold ring', 'armor', nil, 3, 'finger', 2, 20)
inv.add_item(broadsword)
inv.add_item(breastplate)
inv.add_item(ring)

但是,当我从Player类调用inventory方法时,我得到了所需的输出,以及3 #item对象,如下所示:

代码语言:javascript
复制
a heavy broadsword (weapon)
 Attack               5
 Wear                 wield
 Weight               15
 Price                2
a mithril breastplate (armor)
 Armor                10
 Wear                 torso
 Weight               15
 Price                5
a gold ring (armor)
 Armor                3
 Wear                 finger
 Weight               2
 Price                20
#<Item:0x007fae1b8b11d8>
#<Item:0x007fae1b8b1138>
#<Item:0x007fae1b8b1098>

为什么最后三条线在那里?我不知道它是从哪里来的,也不知道怎么解决它。

更新:

用实例vars而不是类vars重新处理项< Inventory < Player继承。

代码语言:javascript
复制
class Player
    attr_accessor :playername
    def initialize(playername)
        @playername = playername
    end
end

class Inventory < Player
    attr_accessor :items
    def initialize
        @items = []
    end

    def add_item(item)
        @items << item
    end

    attr_accessor :inventory
    def inventory
        @items.each do |item|
            puts "#{item.name} (#{item.type})"
            if item.attack != nil ; puts " %-20s %00d" % ['Attack', item.attack] ; end
            if item.armor != nil ; puts " %-20s %00d" % ['Armor', item.armor] ; end
            if item.wearloc != nil ; puts " %-20s %00s" % ['Wear', item.wearloc] ; end
            if item.weight != nil ; puts " %-20s %00d" % ['Weight', item.weight] ; end
            if item.price != nil ; puts " %-20s %00d" % ['Price', item.price] ; end
        end
        nil
    end
end

class Item < Inventory
    attr_accessor :name, :type, :attack, :armor, :wearloc, :weight, :price
    def initialize(name, type, attack, armor, wearloc, weight, price)
        @name = name
        @type = type
        @attack = attack
        @armor = armor
        @wearloc = wearloc
        @weight = weight
        @price = price
    end
end

inv = Inventory.new
broadsword = Item.new('a heavy broadsword', 'weapon', 5, nil, 'wield', 15, 2)
breastplate = Item.new('a mithril breastplate', 'armor', nil, 10, 'torso', 15, 5)
ring = Item.new('a gold ring', 'armor', nil, 3, 'finger', 2, 20)
inv.add_item(broadsword)
inv.add_item(breastplate)
inv.add_item(ring)

player = Player.new('Chris')
# puts player.inventory
puts inv.inventory
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2016-01-07 01:03:02

方法返回方法中最后一条语句的值。

对于Inventory#inventory,最后一条语句是@@items.each方法。each返回它被调用的集合,因此返回值是@@items数组。

如果不希望该方法返回任何内容,则可以将0放在末尾:

代码语言:javascript
复制
def inventory
  @@items.each do |item|
    # code to print the item stats
  end

  nil
end
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/34645578

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档