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。


全栈后端 / python教程 :


























Copyright © 2022-2024 笨鸟工具 x1y1z1.com All Rights Reserved.