这是什么用沙盒游戏是什么

为什么面向对象的编程是有用的?(以一个角色扮演游戏为例) - 博客 - 伯乐在线
& 为什么面向对象的编程是有用的?(以一个角色扮演游戏为例)
| 标签: ,
本文面向的是那些刚刚接触编程,可能已经听说过”面向对象编程”,”OOP”,”类”,”继承/封装/多态”,以及其他计算机科学术语的,但是仍然没有真正明白如何使用OOP的朋友。在本文中,我将解释为什么使用OOP和如何轻松编码。这篇文章使用Python 3代码,但其概念适用于任何编程语言。
有两个关键的非面向对象编程概念需要马上理解:
重复的代码是一件坏事。
代码永远都在改变。
除了一些单任务和只运行一次的微小的”用完即弃”的程序,你几乎总是需要为了解决bug或增加新功能而更新你的代码。大部分编写良好的软件是那种可读性高,易于修改的软件。
如果你经常在你的程序中复制/黏贴代码,那么当你修改它的时候,就需要在很多地方做出同样的改动。这是棘手的。如果在某些地方遗漏了修改,你将到处修改bug或者实现的新功能有不一致性。重复的代码是一件坏事。程序中重复的代码将会把你置于bug和头痛之中。
函数让你摆脱重复的代码。你只需要将代码写到函数中一次,就可以在程序中的任何需要运行代码的地方调用它就可以。更新函数的代码就可以自动更新调用函数的地方。正如函数使得更新代码变得容易,使用面向对象编程技术也会组织你的代码使它更容易改变。记住代码总是在改变的。
一个角色扮演游戏栗子
大多数OOP教程都是令人作恶的。它们有”汽车”类和”鸣笛”方法,其他一些例子与新手写的或者之前接触过的实际程序都是不相关的。因此本博文将使用一个RPG类视频游戏(回忆下魔兽,宠物小精灵,或龙与地下城的世界)。我们已经习惯于将游戏中的事物想象成一些整数与字符的集合。看看Diablo(暗黑破坏神)角色屏幕或D&D角色表单上的数字:
从这些RPG视频游戏中去除图片,角色,装甲,其他对象只是变量形式的一个整数或者字符值的集合。不使用面向对象概念,你可以在Python中这样实现这些事物:
name = 'Elsa'
health = 50
magicPoints = 80
inventory = {'gold': 40, 'healing potion': 2, 'key': 1}
print('The hero %s has %s health.' % (name, health))
以上变量名都是非常通用的。为了在游戏中增加怪兽,你需要重命名玩家角色变量,并且增加一个怪兽角色:
heroName = 'Elsa'
heroHealth = 50
heroMagicPoints = 80
heroInventory = {'gold': 40, 'healing potion': 2, 'key': 1}
monsterName = 'Goblin'
monsterHealth = 20
monsterMagicPoints = 0
monsterInventory = {'gold': 12, 'dagger': 1}
print('The hero %s has %s health.' % (heroName, heroHealth))
当然你希望有更多的怪物,接着你会有类似monster1Name, monster2Name等等的变量。这不是一种好的编码方法,因此你可能会使用怪物变量列表:
monsterName = ['Goblin', 'Dragon', 'Goblin']
monsterHealth = [20, 300, 18]
monsterMagicPoints = [0, 200, 0]
monsterInventory = [{'gold': 12, 'dagger': 1}, {'gold': 890, 'magic amulet': 1}, {'gold': 15, 'dagger': 1}]
然后列表索引0处是第一个哥布林的状态,龙的状态在索引1处,另一个哥布林在索引2处。这样你可以在这些变量中存放很多怪物。
但是,这种代码容易导致错误。如果你的列表不同步,程序将无法正常工作。例如玩家击败了索引0处的哥布林,程序调用了vanquishMonster()函数。但这个函数有一个bug,它会(意外的)删除列表中的所有值除了monsterInventory:
def vanquishMonster(monsterIndex):
del monsterName[monsterIndex]
del monsterHealth[monsterIndex]
del monsterMagicPoints[monsterIndex]
# Note there is no del for monsterInventory
vanquishMonster(0)
怪兽列表最后看起来像这样:
monsterName = ['Dragon', 'Goblin']
monsterHealth = [300, 18]
monsterMagicPoints = [200, 0]
monsterInventory = [{'gold': 12, 'dagger': 1}, {'gold': 890, 'magic amulet': 1}, {'gold': 15, 'dagger': 1}]
现在龙的道具看起来跟之前哥布林的道具一样。第二个哥布林的道具是之前龙的道具。游戏迅速失控了。问题是你把一个怪物的数据散布在多个变量中。解决这个问题的方法是将一个怪物的数据放入一个字典里,然后使用一个字典列表:
monsters = [{'name': 'Goblin', 'health': 20, 'magic points': 0, 'inventory': {'gold': 12, 'dagger': 1}},
{'name': 'Dragon', 'health': 300, 'magic points': 200, 'inventory': {'gold': 890, 'magic amulet': 1}},
{'name': 'Goblin', 'health': 18, 'magic points': 0, 'inventory': {'gold': 15, 'dagger': 1}}]
啊哈!这段代码变得更加复杂了。例如,一个怪兽的状态是一个字典列表中的字典项。假如咒语或者道具栏也有它们自己的属性,且需要放到字典该怎么办?假如一个道具栏中的物品是一个背包,它本身包含了其他道具该怎么办?这个怪物列表会变得紧张。
这点是面向对象程序设计通过创建一个新的数据类型就可以解决的。
类是你程序中新数据类型的蓝图。面向对象编程对装甲,怪物等建模提供了新的方法,该方法比列表和字典的大杂烩好得多。虽然需要花些时间来熟悉OOP的概念。
事实上,因为英雄角色与怪兽们拥有相同的属性(健康值,状态值等等),我们只需要一个英雄与怪兽共享的通用的LivingThing类。你的代码可以变为:
class LivingThing():
def __init__(self, name, health, magicPoints, inventory):
self.name = name
self.health = health
self.magicPoints = magicPoints
self.inventory = inventory
# Create the LivingThing object for the hero.
hero = LivingThing('Elsa', 50, 80, {})
monsters = []
monsters.append(LivingThing('Goblin', 20, 0, {'gold': 12, 'dagger': 1}))
monsters.append(LivingThing('Dragon', 300, 200, {'gold': 890, 'magic amulet': 1}))
print('The hero %s has %s health.' % (hero.name, hero.health))
嘿,瞧瞧,使用类已经把我们的代码削减了一半,因为我们可以对玩家角色和怪兽使用同样的代码。
在上面的代码中,你可以定义新的数据类型/类(除了学院派,但是这两个术语基本上是一样的。参见)名为LivingThing。你可以实例化LivingThing变量/对象(重复一次,这两个术语基本上也是相同的)就好像你可以拥有整形值,字符值或布尔值一样。
上面代码特定于Python的细节:
class LivingThing():
上面class声明定义了一个新类,就像def声明定义一个新函数。该类名是LivingThing。
def __init__(self, name, health, magicPoints, inventory):
上面代码为LivingThing类定义了一个方法。”方法“只是命名属于这个类的函数。(参考)
这个方法很特别。__init__()用于类的构造函数(或者称为”构造方法”,”构造函数”,简写为”ctor”)。而一个类是一个新数据类型的蓝图,你还需要创建这个数据类型的值,以便于存储到变量或者使用函数传递。
当调用构造器创建新对象时,执行构造器中的代码,并返回一个新对象。这就是
hero = LivingThing('Elsa', 50, 80, {})
这行的意思。无论类名是什么,构造器总是被命名为__init__。
如果类没有__init__()方法,Python会为类提供通用的构造方法,该方法什么都不做。但是__init__()是初始化建立一个新对象的绝佳地方。
在Python语言中,方法中的第一个变量是self。self变量用于创建成员变量,后面会做解释。
构造函数体:
self.name = name
self.health = health
self.magicPoints = magicPoints
self.inventory = inventory
这看上去有点重复,但这段代码所作的就是对由构造函数创建的对象的成员变量赋值。成员变量开头是self.表示这些成员变量属于创建的对象,且不是函数中的普通局部变量。
调用构造器
# Create the LivingThing object for the hero.
hero = LivingThing('Elsa', 50, 80, {})
monsters = [LivingThing('Goblin', 20, 0, {'gold': 12, 'dagger': 1}),
LivingThing('Dragon', 300, 200, {'gold': 890, 'magic amulet': 1}),
LivingThing('Goblin', 18, 0, {'gold': 15, 'dagger': 1})]
print('The hero %s has %s health.' % (hero.name, hero.health))
Python中调用构造器就像是一个函数调用,该函数名为类名。因此LivingThing()就是调用LivingThing类的__init__()构造器。
LivingThing('Elsa', 50, 80, {})
调用创建了一个新的LivingThing对象,并保存在到hero变量里。以上代码还创建了3个怪兽LivingThing对象并保存在monsters列表中。
至此我们开始看到了面向对象编程的好处。如果其他程序员读了你的代码,当他们看到LivingThing()调用,他们知道他们可以搜索LivingThing类,然后从LivingThing类中找出所有他们想知道的细节。
但一个更大的好处是当你试图更新LivingThing类时才能体会的。
假如你想给你的RPG增加”饥饿”度属性。如果一个英雄或怪兽的饥饿度为0,他们一点也不饿。但如果他们的饥饿度超过100,那么他们将受到伤害并且健康值每天递减。你可以这样改变__init__()函数:
def __init__(self, name, health, magicPoints, inventory):
self.name = name
self.health = health
self.magicPoints = magicPoints
self.inventory = inventory
self.hunger = 0 # all living things start with hunger level 0
不需要修改其他任何代码行,你游戏中所有LivingThing对象现在都有了饥饿度。你不需要担心某些LivingThing对象有hunger成员变量,而有些没有:所有LivingThing对象都更新了。
你也不需要改变任何构造器调用,因为你没有在__init__()函数的参数列表总中增加一个新的饥饿度参数。这是因为队一个新的LivingThing对象的饥饿度来说0是一个很好的默认值。如果你在__init__()函数的参数列表总中增加一个新的饥饿度参数,那么你需要更新所有调用构造器的代码。但这对其他函数也是一样的。
如果你的RPG有很多类似的默认值,通过使用类的构造器进行默认值赋值,就可以避免当量的”样板”代码。
方法具有执行代码来影响对象本身的用途。例如,你可以编码来直接修改LivingThing对象的健康度:
hero = LivingThing('Elsa', 50, {})
hero.health -= 10 # Elsa takes 10 points of damage
但这样处理伤害不是一个非常健壮的方式。每当有什么东西受到伤害时就需要检查很多其他的游戏逻辑。例如,假设你想要检查一个角色在受到伤害后,它是否死亡。你需要这样的代码:
hero = LivingThing('Elsa', 50, {})
hero.health -= 10 # Elsa takes 10 points of damage
if hero.health & 0:
print(hero.name + ' has died!')
以上方法的问题是你需要检查各处代码来减少LivingThing对象的健康值。但是重复的代码是一件坏事。阻止重复的代码的非OOP方式可能是把以上方法放入一个函数中:
def takeDamage(livingThingObject, dmgAmount):
livingThingObject.health = self.health - dmgAmount
if livingThingObject.health & 0:
print(livingThingObject.name + ' is dead!')
hero = LivingThing('Elsa', 50, {})
takeDamage(hero, 10) # Elsa takes 10 points of damage
这是一个更好的解决方案,因为任何更新takeDamage()(例如装甲防护,保护性法术,增益效果等)只需要增加到takeDamage()函数中。
然而,不利的一面是,当您的程序规模增长,takeDamage()函数很容易迷失在其中。takeDamage()函数与LivingThing类的关系并不明显。如果你的程序有成百上千的函数,它将很难指出哪一个函数与LivingThing类有关系。
解决的方法是将这个函数变成LivingThing类的方法:
class LivingThing():
# ...other code in the class...
def takeDamage(self, dmgAmount):
self.health = self.health - dmgAmount
if self.health == 0:
print(self.name + ' is dead!')
# ...other code in the class...
hero = LivingThing('Elsa', 50, {})
hero.takeDamage(10) # Elsa takes 10 points of damage
一旦你的程序有很多类,每个类有许多方法和成员变量,你将开始看到OOP可以帮助组织你的程序而使他更易于管理。
公共与私有方法
方法与成员变量可以被标示为public或private。公共方法可以和公共成员变量可以在类内部或外部的任何代码调用和赋值。私有方法和私有成员变量只能在对象自己的类内部被调用和赋值。
在某些语言中,例如Java,这种”可以被调用/赋值”由编译器严格的保证。而Python,却没有”私有”和”公共”的概念。所有方法和成员变量都是”公共”的。然而,语言规定如果一个方法名开头是下划线,它就被认为是一个私有方法。这就是为什么你将看到_takeDamage()等方法了。你可以方便的编写代码从对象的类的外部调用私有函数或者设置私有成员变量,但你已经被彻底警告不要去这样做了。
公共/私有的区别的原因是为了解释类如何与外部代码进行交互的。(参考)类的程序员期望其他人不会编写代码调用私有方法或设置私有成员变量。
例如,takeDamage()方法包括健康值低于0就检查死亡。你可能想要在代码中添加各种各样的其他检查。护甲、敏捷性和防护法术来减少伤害的可能因素。LivingThing对象可能穿着一件魔法斗篷,通过增加抗损害值,而不是减少它们的健康值来进行治疗。这个游戏的所有逻辑都可以放入takeDamage()方法中。
如果你偶然的把代码放到那里,所有的OOP结构就毫无意义了
class LivingThing():
# ...code in the class...
hero = LivingThing('Elsa', 50, {})
# ...some more code...
if someCondition:
hero.health -= 50
语句hero.health -= 50会减少50点健康值,而不会考虑Elsa穿着哪种装甲,或者她有防护法术,或者她穿着魔法治疗披风。这段代码将直截了当的减少50点健康值。
很容易忘掉takeDamage()方法并且偶尔写出这样的代码。它不会检查英雄对象的健康值是否低于0。游戏继续运行好像Elsa还活着,及时她的健康值是负数!我们可以使用公共/私有成员和方法来避免这个bug。
如果你重命名health成员变量为_health且标记为私有的,那么当你写成这样就很容易捕获这个bug:
hero = LivingThing('Elsa', 50, {})
# ...some more code...
if someCondition:
hero._health -= 50 # WAIT! This code is outside the hero object's class but modifying a private member variable! This must be a bug!
在一种语言中如Java,如果编译器确保私有/公共访问,它就不可能编写非法访问自由成员和方法的程序。面向对象编程帮助我们防止这种bug。
使用LivingThing类表示龙是不错的,但是除了LivingThing类提供的属性外,龙有很多其他的属性。因此你想创建一个新的Dragon类,它包含如airSpeed和breathType(可以使用 'fire','blizzard', 'lightning', 'poison gas'等字符串表示)等成员变量。
因为Dragon对象也包含health,magicPoints,inventory和其他LivingThing对象的属性,你可以创建一个新的Dragon类,并且从LivingThing类复制/黏贴所有代码。但这将导致重复的代码这一坏习惯。
相反,可以使Dragon类作为LivingThing类的子类:
class LivingThing():
# ...other code in the class...
class Dragon(LivingThing):
# ...Dragon-specific code in the class...
实际上是说,”一个龙也是一种LivingThing,还有一些附加的方法和成员变量”。当你创建龙对象时,它会自动的拥有LivingThing的方法和成员变量(拯救我们脱离重复的代码)。但它也有龙特有的方法和成员变量。进一步说,任何处理LivingThing对象的代码都可以自动的操作龙对象,因为龙对象已经拥有了LivingThing成员变量和方法。这个原则被称为子类型多态性。
然而在实践中,继承是容易滥用的。你必须确保任何对LivingThing类做出的改变和更新都适用于Dragon类和所有其他LivingThing的子类。这可能不总是那么简单直接。
例如,如果你创建了LivingThing类的Monster和Hero子类,接着创建了Monster类的 FlyingMonster 和MagicalMonster子类,新的Dragon类继承自FlyingMonster 类还是MagicalMonster类?或者可能它只是Monster类的子类
这就是继承和OOP开始变得棘手且严谨的争论哪种是”正确”设计类的方式之所在。我希望报纸这篇博文简短而简单,因此我要把这些问题留给读者作为练习来调查。(参考
我讨厌由面向对象编程开始的面向初学者的程序教程。OOP是十分抽象的概念。有一些经验和编写过大型程序之前,你不会理解为什么使用类和对象使编程更容易。相反,它会给初学者留下一条陡峭的学习曲线去爬,他们不知道为什么攀登它。我希望这个RPG例子至少让你领略了为什么OOP是有帮助的。有更多的OOP。如果你想了解更多,试试搜索 和 。
如果你仍然对OOP概念感到迷惑,放心大胆的编写没有类的程序。你不需要它们,它们将导致过度设计的代码。但是一旦你已经有了一些编码经验,面向对象编程的好处会变得更加明显。祝你好运!
关于作者:
为作者带来更多读者;为读者筛选优质内容;专注IT互联网。
最新评论(期待您也参与评论)
汇集优质的Python技术文章和资源。人生苦短,我用Python!
JavaScript, CSS, HTML5 这里有前端的技术干货!
关注安卓移动开发业界动态,分享技术文章和优秀工具资源。
关注iOS移动开发业界动态,分享技术文章和优秀工具资源。
为作者带来更多读者;为读者筛选优质内容;专注IT互联网。
由数百名译者组成,立志翻译传播优秀的外文技术干货。
一个专门为IT单身男女服务的征婚传播平台。
收录优秀的工具资源,覆盖开发、设计、产品和管理等。
关于伯乐在线博客
在这个信息爆炸的时代,人们已然被大量、快速并且简短的信息所包围。然而,我们相信:过多“快餐”式的阅读只会令人“虚胖”,缺乏实质的内涵。伯乐在线博客团队正试图以我们微薄的力量,把优秀的原创/译文分享给读者,做一个小而精的精选博客,为“快餐”添加一些“营养”元素。
欢迎关注更多频道
– 分享和发现有价值的内容与观点
– 为IT单身男女服务的征婚传播平台
– 优秀的工具资源导航
– 翻译传播优秀的外文文章
– 国内外的精选博客文章
– JavaScript, HTML5, CSS
– 专注Android技术分享
– 专注iOS技术分享
– 专注Java技术分享
– 专注Python技术分享
(加好友请注明来意)
网站使用问题
请在询问或者反馈
& 2015 伯乐在线
赞助云主机, 赞助云存储这个是打游戏用的的频道-优酷视频
0视频播放数
还没有收到留言
频道介绍:
还未添加频道介绍
今日新增:0
最近没有访客
点击这里添加你的微博秀,展示你的微博和粉丝。
微信分享给好友
@对他说/推荐给粉丝
自定义主页模块
自定义视频栏目这是什么游戏pc版安装使用教程
这是什么游戏
更新时间:
下载:715次
平台:Android
宏碁 Liquid C1 这是什么游戏 pc版安装使用教程
是一款非常好玩的游戏,拥有简单的游戏操作和非常丰富的的内容,目前在安卓以及ios平台都已经可以玩上这款游戏了,PC版本用模拟器也可以玩!今天小编给大家带来pc版安装使用教程。
请选择品牌
请选择机型Liquid C1
小贴士:建议您想先设置机型,设置后您就直接浏览全部适合您手机的游戏,下载使用更放心。
九游()是手机游戏下载第一门户,提供最新宏碁宏碁Liquid C1下载、礼包、激活码,最好玩的这是什么游戏攻略,欢迎访问与玩家交流。
什么游戏?有许多人在这场游戏中的小游戏。他们是如此有趣和令人兴奋的。你想挑战这些游戏吗?
点击查看更多
您可能还想关注:
看了这是什么游戏pc版安装使用教程的用户还看了:
关于宏碁Liquid C1
宏碁集团(acer)创立于1976年,是全球第二大个人电脑品牌,宏碁以性价比优势在2009年以来销量一直占据全球前两名。主要从事自主品牌的笔记本电脑、台式机、液晶显示器、服务器及数字家庭等产品的研发、设计、行销与服务,持续提供全球消费者易用、可靠的资讯产品。 专区提供最新手机游戏免费下载。
Liquid C1的分辨率为540*960,是宏碁生产的一款触屏手机。宏碁Liquid C1手机用户可通过九游下载。您当前的位置是: ->
这是我的战争游戏后期使用技巧心得介绍
这是我的战争游戏后期使用技巧心得介绍
13:25:12来源:斗蟹游戏编辑:潘多拉之吻458
  这款游戏最近受到了很多小伙伴的关注,现在,我们就一起来看看这款游戏的攻略,也就是后期使用技巧介绍,赶紧来看看吧!  《这是我的战争》后期实用玩法技巧总结,游戏后期怎么玩。  【后续玩法更新+隐藏彩蛋探索】THIS WAR OF MINE这是我的战争已通关,浅谈下。  这是一款非杰出的求生类游戏。我玩了这款游戏四次后终于撑到了DAY45。保存我方人员,坚持一个半月就是游戏的主旨。  游戏分昼夜:  白昼首先安排食物分配,其次是夜间守夜/外出/受伤/生病人员的休息。  然后是收集雨水、制造工具。  雨水过滤器很好用,冬季前每天都要保持制造滤芯收集雨水的习惯。要知道冬季来临后雨水收集器就会冻住无法使用,外出收集积雪煮开是非常浪费宝贵的燃料的。  烟草和酒都可以提升士气。  有时候会有幸存者来敲门求救,开门吧,白天是没有充满恶意的幸存者上门的。  帮助上门的幸存者会提升部分我方人员的士气。  夜晚安排人员守夜、外出、休息。  外出探索地点推荐冬季中的超市,没有敌人且物资极为丰富。  其次是寂静小屋,里面只有两个手无缚鸡之力的老人。  木头和零件非常非常的重要,多多储备。  夜晚探索分两次,第一次派有军事训练/跑得快之类属性的人员去探路(开门前记得窥视),带好撬棍铲子(工具越早造越好)乃至一次性锯子。搜索各个储藏柜的位置并打开,顺便带回少量物资例如食物宝石。第二夜再派带有“强壮但跑得慢”之类属性的幸存者,不带任何东西去把物资彻底清空!留在那里的物资不会有人碰的(也许是真实性的欠缺。)  夜晚探索到4AM无论收获如何都要准备跑路了!天一亮狙击手出没就很难回去了,还可能受伤导致消耗和宝石等价的绷带!  杀人会降低我方人员的士气,甚至影响留守人员的心情(受过军事训练的人员除外,他们杀人不会内疚)。  外出人员死亡则会导致士气暴跌从而产生无法挽回的后果(they kill him like kill dog!),所以当你看到XX is
dead时,不要犹豫,立刻关闭游戏进程!  备注:厨子COOK做饭制药都节省不少材料,最关键的是杀人不会影响心情!!!简直屠夫有没有!  备注:超市冬天时人去楼空。  备注:寂静小屋老夫妇杀了严重减士气,但他俩身上有一瓶药两个钻石,杀不杀取决于你。  ============================  游戏分为三个阶段:  冬季前-冬季-冬季后:  制造温度计可以在左上角看到室温,游戏中温度低于12摄氏度就会导致随机的队友生病现象,从而浪费宝贵的药物甚至导致死亡,所以在第十天开始就要着手准备两个以上暖炉了。  游戏中没有保质期设定,任何食物都能保存超过45天。  武器并不是必要的,尽量避免夜晚搜寻时和他人交战。绷带是极有价值的物资,可以和白天随机出现的流浪幸存者换到十几块木头等资源。  小型陷阱是非常有用的设备,准备两个以上,这是可以用烂番茄换两份肉的神器。  沙发椅子没有必要,床铺1-2个足够了。  冬季中开始后食物永远不够,保持饿一顿饱一顿就好,slightly-hungry是很好的状态。  每隔一到两晚就有强盗/小偷光顾,从而损失物资,在我看来这是无法避免的。就算是修补房屋全部的破洞、大门,两个守夜人员,据点里面有防弹衣头盔猎枪和六枚子弹,还是会遭到小偷入侵,这似乎是一个bug,无法避免。  备注:市场是个好去处,冬季前晚上要常去,那里连吉他碎片都能买到。一块木头能换十几块糖。  备注:糖可以发酵酒,卖兵营一瓶酒可以换一杆突击步枪或者霰弹枪!一支烟可以换一颗子弹!兵营上面那个打探照灯的无视。他下方有个军需官,你可以和他交易。士兵那里是卖酒的极好地方!  备注:药物在废品回收站也可以卖到高价!医院你受伤生病了那里有医生可以给你收费治疗,治好睡一觉就痊愈了!交易要注意的是不要走进建筑内探索,会被攻击的。  ============================  不饿不会显示:  吃的饱饱是非常好的状态,第二天醒来不吃饭也可以。  吃的饱饱也容易激活满足状态,这点是很有利的,吃饱只需要在不饿的状态下多吃一顿就好,保持也很简单,每天一餐。  备注:二级火炉只要一个就够了,烧满六块保持即可。  备注:一点点饿这个状态,是饥饿时候吃一块生肉/蔬菜。  好了,以上就是小编为大家带来的这是我的战争游戏后期心得介绍,希望那个可以帮到大家哦!
游戏语言:简体中文
游戏类型:
游戏大小:784 MB
更新时间:
官方网站:
操作系统:XP系统 / VISTA系统 / WIN7系统 / WIN8系统
大家都在玩
热门游戏攻略
斗蟹推荐专题
使命召唤10
今日游戏推荐

我要回帖

更多关于 毒奶粉是什么游戏 的文章

 

随机推荐