python的面向对象OOP,打怪游戏实例升级版
为了能够让大家充分理解什么是面向对象,在上一章节中,我们特地讲解了python的面向过程,并用python并不擅长的面向过程的编程思想简单设计了一个打怪游戏实例。这一节,我们将正式地来介绍Python的面向对象的编程思想OOP,并将上一节中设计的打怪游戏的实例代码进行面向对象地重新设计编写。
python面向对象OOP
什么是面向对象,英文缩写为OOP,是一种软件(应用)开发的方法,更是一种思想。要理解面向对象,自然要先理解什么是对象。
对象,可以指向具体的某一个事物,比如人、动物、植物等。
那么面向对象,自然就是“直接用某一个具体的事物来进行编程!比如让人换个衣服,让人吃饭,或者让动物飞翔等等”。当然了,这样定义可能不是很正确,但个人认为这样更有助于理解面向对象。
当下,除了c语言之外,大多数的计算机语言,比如C++、Java、C#、Python、Golang等大都更加擅长于面向对象。
好了,下面我们将通过升级上一章节python面向过程的编程思想,打怪游戏实例中的打怪游戏实例代码,变为面向对象的方法模式,同时优化了一些程序逻辑。
python面向对象的打怪游戏实例
import time #导入time库
class NPC:
#声明了一个游戏NPC的类,用于封装NPC的属性和方法
def __init__(self, se, hp): #初始化数据,相当于初始化对象的属性,se为武力值,hp为血量
self.se = se
self.hp = hp
def beat(self): #设计一个beat()方法,用于返回NPC的武力值
return self.se
def upexp(self): #设计了升级经验值(武力值)的方法
self.se = self.se + 2
def uphp(self): #设计了升级血量的方法
self.hp = 5
#上面的类,就相当于游戏中的人物模型,有了这样的人物模型,接下来,我们就可以直接通过python的面向对象对人物直接进行编程。
#下面的函数是英雄hero和boss怪物的战斗fire()函数,封装了二者的战斗过程,参数是NPC对象,函数的代码块就是直接对人物进行编程
def fire(hero, boss):
while hero.hp > 0 and boss.hp > 0:
if hero.hp <= 2:
print('英雄,你的血量为%s'%hero.hp)
uphp_inp = input('英雄是否要先撤退补充血量(y/n)?')
if uphp_inp == 'n':
boss.hp = boss.hp - hero.beat()
print('英雄攻击,boss的血量还剩下%s'%boss.hp)
if boss.hp > 0:
time.sleep(1)
hero.hp -= boss.beat() #和上面boss.hp的式子一样
print('boss攻击,英雄的血量还剩下%s' %hero.hp)
if hero.hp <= 0:
print('英雄血量小于0,game over')
return
else:
print('boss已经被消灭,恭喜英雄!')
return
else:
hero.uphp() #升级血量
boss.hp -= hero.beat()
print('英雄攻击,boss血量还剩下%s'%boss.hp)
if boss.hp <= 0:
print('boss血量小于0,已经被消灭')
break
time.sleep(1)
hero.hp -= boss.beat()
print('boss攻击,英雄血量还剩下%s'%hero.hp)
if hero.hp <= 0:
print('英雄血量过低,game over')
time.sleep(1)
#游戏的主函数
def mian():
print('欢迎来到大器编程x1y1z1.com的python面向对象的打怪游戏实例!')
time.sleep(1)
print('英雄正在创建...')
time.sleep(1)
hero = NPC(1,5) #创建一个NPC对象,并赋值给变量hero,其中se=1,hp=5
print('英雄已经诞生,武力值为%s,血量为%s' %(hero.se, hero.hp))
time.sleep(1)
boss = NPC(2,10) #创建了另一个NPC对象,并赋值给变量boss,其中se=2,hp=10
yn_inp = input('boss挥舞着棒槌步步紧逼,英雄是否决定迎战(y/n):')
if yn_inp == 'n':
print('英雄与世无争,退隐江湖!游戏退出!')
return
else:
print('boss的武力值为%s,血量为%s' %(boss.se, boss.hp))
time.sleep(1)
upexp_inp = input('英雄是否要升级武力值(y/n):')
if upexp_inp == 'n':
fire(hero, boss)
else:
upexp_inp = input('升级武力值之前,需要先回答问题,请问1+1=?:')
while upexp_inp != '2':
upexp_inp = input('回答错误,请问1+1=?:')
hero.upexp()
fire(hero, boss)
#一定要记得调用主函数main(),否则程序无法执行。
mian()
打怪游戏升级版代码解析
python的类,我们将在下面的章节进行介绍,这一章节还是以了解或理解面向对象和面向过程的编程思想、模式为主:
- 如上代码,再对照一下上一章节中的面向过程的函数式编程的代码,我们不难发现一点,python,即便采用的是面向对象的编程模式,仍然离不开函数式的编程,也就是面向对象里头也有面向过程,如此足以见得理解面向过程的重要性。
- NPC游戏人物模型,封装了人物的属性,比如血量、武力值,还有方法等,这就有别于上一节中的面向过程的游戏设计过程中需要另外声明英雄和boss的武力值h_se、b_se和血量h_hp、b_hp等,很显然,通过面向对象,英雄和boss的血量啊武力值啊,方法啊等之类的属性是一体的,就像人的身高、体重之类的,一体的,用计算机的逻辑来说就像有一个“数据库”可以用来储存这些属性,并可以随时修改,也就是上面中的定义的那样,面向对象的编程就是直接对英雄和boss 进行编程,逻辑非常清晰,不会繁琐。
- 其他的参考代码中的注释。
对python的面向对象和面向过程有了初步的了解和理解之后,下面我们将具体介绍一下python的类,及其继承、多态等内容。