python面向过程的编程思想,打怪游戏实例
python是一门高级的计算机编程语言,那python是面向对象的还是面向过程的呢?其实,python既可以用于面向过程的开发,也可以用于面向对象,只是python或其他的大多数编程语言都更加擅长于面向对象。
而什么是面向对象呢?其实,面向对象也好,面向过程也罢,更多的区别是在于编程思想,而不是编程的模式。面向对象和面向过程的定义都十分抽象,为了更好地介绍python的面向对象的编程设计,这一节我们来讲一讲面向过程的编程,再用python并不擅长的面向过程的方式来简单设计一段打怪游戏的实例。
面向过程的编程思想
什么是面向过程?
就是根据现实中的需求,将所要解决的问题分解成步骤,然后用函数的形式一步步实现,差不多就是函数式编程的概念,就是通过调用一个个函数的形式来完成程序的执行,以实现现实中的需求。
面向过程的编程语言的代表就是c语言(c++跟python一样,更擅长于面向对象),当然,c语言也可以进行面向对象的开发,只是比起c++来说要复杂挺多。
前面的章节当中,我们用python的迭代器,并用函数的形式设计了一个可以通关的猜数字的游戏,接下来,我们来尝试用python的面向过程的方式设计一个简单的打怪的游戏。
python打怪游戏实例
打怪游戏,我们的思路是这样的:设计一个主函数,来调用其他的处理各类事件的函数。然后我们简化了一些步骤,比如不用通过按键就直接来打怪(通过按键打怪的方法可以用pygame,这里暂且不用)。游戏的其他思路可参考下面的代码解析。
def hero(se=1,hp=10):
hp -= se
return hp
def boss(se=2,hp=5):
hp -= se
return hp
#hero函数和boss函数是英雄和boss的两个函数,参数se为武力值,hp为血量
#注意:hero中的hp为boss的血量,boss函数中的hp为英雄的血量
def upexp(se,money):
se = se+money
return se
#升级经验值以增加武力值的函数
def beat(a,b,c):
#英雄和怪物boss交战的函数
import time
h_hp = a #hero血量
b_hp = b #boss血量
h_se = c #hero打怪武力值
while h_hp > 0 and b_hp > 0:
#while的条件为英雄血量大于0并且boss血量大于0,因此当任何一方小于0,while结束,游戏结束
if h_hp <= 2: #当英雄血量低于或等于2
print('英雄,你的血量为%s'%h_hp)
uphp_inp = input('英雄是否要先撤退补充血量(y/n)?')
if uphp_inp == 'n':
b_hp = hero(se=h_se,hp=b_hp) #注意,hero返回的是boss的血量,传入的参数也是boss的血量
if b_hp > 0: #当boss的还有血量
print('英雄攻击,boss的血量还剩下%s'%b_hp)
time.sleep(1)
h_hp = boss(hp=h_hp)
if h_hp <= 0:
print('英雄血量小于0,game over')
return
else: #当boss没有血量
print('boss已经被消灭,恭喜英雄!')
return
else:
h_hp = 5 #当用户选择y之后,我们这里直接将英雄的血量重新赋值为5
b_hp = hero(se=h_se,hp=b_hp) #这里的代码表示的是英雄的血量大于2的情况
if b_hp <= 0:
print('boss血量小于0,已经被消灭')
break
else:
print('英雄攻击,boss血量还剩下%s'%b_hp)
time.sleep(1) #之所以要延迟一秒,主要是为了让打怪显得有次序感
h_hp = boss(hp=h_hp)
if h_hp <= 0:
print('英雄血量小于0,game over')
else:
print('boss攻击,英雄血量还剩下%s'%h_hp)
time.sleep(1)
def outup():
h_hp = 5
b_hp = 10 #boss血量
h_se = 1
beat(h_hp, b_hp, h_se)
#outup没有升级经验值,也就是没有升级武力值就打怪的函数
def withup():
upexp_inp = input('升级经验以增加武力值之前需要财富值,请问1+1=几:')
while upexp_inp != '2':
upexp_inp = input('回答错误,请问1+1=几:')
money = 2
h_se = upexp(se=1, money=2)
h_hp = 5
b_hp = 10 #boss血量
beat(h_hp, b_hp, h_se)
#withup是升级武力值的函数
#这里我们模仿c语言的面向过程的编程模式,写个主入口函数main
def main():
print('欢迎来到大器编程x1y1z1.com的python面向过程的打怪游戏实例...')
import time
time.sleep(1)
print('游戏开始')
time.sleep(1)
yn_inp = input('boss扛着棒槌过来了,英雄是否决定战斗(y/n):')
if yn_inp == 'n':
print('英雄选择退隐江湖,游戏退出!')
return
else:
print('boss的武力值为2,血量为10,英雄你的武力值为1,血量为5')
time.sleep(1)
up_inp = input('英雄是否要升级自己的武力值(y/n)')
if up_inp == 'n':
outup()
else:
withup()
#记得调用主函数main()
main()
#原创代码,转载请注明来源“大器编程x1y1z1.com”
打怪游戏代码解析
如上代码,我们从主函数main()入手,其逻辑是当英雄遇到怪物时,选择不战斗,退出游戏,选择战斗,先输出英雄和怪物的武力值、血量的比较,然后询问英雄需不需要升级经验以升级武力值,选择不升级,就调用outup()函数,选择升级,就调用withup()函数。
不管是outup()还是withup()函数,我们都声明了一系列的局部变量h_hp、b_hp和h_se等,作为参数传入beat()函数。不同的是withup()函数,我们调用了upexp()函数来升级经验,从而得到h_se变量。
beat()函数中,我们用了一个while循环,作为游戏的主体,并结合一个if条件判断,用来为英雄补充血量。
其他的代码解析,大家可以参考代码中的注释。
从上面的代码,我们不难发现,这总体来说,是通过函数的形式来设计执行程序的,相对来说是比较散的,也比较烦琐,比如英雄的血量啊,武力值啊之类的,基本上是分开的,并不是以一个主体的形式来呈现的,而什么才是主体的形式呢?这就是我们接下来要讲的面向对象编程OOP。