博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
day22 01 初识面向对象----简单的人狗大战小游戏
阅读量:5234 次
发布时间:2019-06-14

本文共 3530 字,大约阅读时间需要 11 分钟。

day22 01 初识面向对象----简单的人狗大战小游戏

假设有一个简单的小游戏:人狗大战   怎样用代码去实现呢?

       首先得有任何狗这两个角色,并且每个角色都有他们自己的一些属性,比如任务名字name,血量blood,攻击力aggr,人的性别,狗的品种等,如下就是定义了这两个角色:

someone={    'name':'王昭君',    'blood':100,    'aggr':1000,    'sex':'none'}dog={    'name':'溜溜球',    'blood':100,    'aggr':2000,    'kind':'泰迪'}

如上的定义就比较单一,就只能一个人和一只狗玩,如果是几个人和几条狗一起,就不能够实现了,如何实现呢?利用以前学过的知识,把人和狗都转换成变量就好了,而这样的实现方法就是定义函数,然后传参数,调用函数:

def someone(name,blood,aggr,sex):    someone={        'name': name,        'blood': blood,        'aggr': aggr,        'sex': sex    }    return someoneperson=someone('王昭君',100,1000,'girl')#要想多个人一起玩,只要多次传参调用函数someone就可以了print(person)def dog(name,blood,aggr,kind):    dog={        'name': name,        'blood': blood,        'aggr': aggr,        'kind': kind    }    return dogdog=dog('溜溜球',200,1000,'泰迪')#要想多条狗一起玩,只要多次传参调用函数dog就可以了print(dog)

这样用函数调用的方法相比与开始的直接定义具体的来说存在几个优点:

       代码精简了,方便增加多个角色,方便修改,而且人物更加规范了(有几个属性是固定的,什么属性也是固定的,每个角色所有的属性也是一样的)

       someone函数和dog函数都是定义了一类事物,可以抽象地称为人模子和狗模子,直到调用了函数,穿了参数,赋值之后才成了实实在在的人和狗

然后是人和狗都需要有攻击技能:

  人的技能:人打狗

  狗的技能:狗咬人

当人打狗的时候,狗会掉血,狗咬人的时候,人掉血

def attack(person,dog):    dog['blood']-=person['aggr']  #人和狗的角色都是字典,这里就可以直接用了    print('%s被人打了,掉了%s的血'%(dog['name'],person['aggr']))    def bite(dog,person):    person['blood']-=dog['aggr']    print('%s被狗咬了,掉了%s的血'%(person['name'],dog['aggr']))person=someone('王昭君',100,1000,'girl')#要想多个人一起玩,只要多次传参调用函数someone就可以了print(person)dog=dog('溜溜球',200,1000,'泰迪')#要想多条狗一起玩,只要多次传参调用函数dog就可以了print(dog)attack(person,dog)bite(dog,person)

运行的结果:

{
'sex': 'girl', 'name': '王昭君', 'blood': 100, 'aggr': 1000}{
'name': '溜溜球', 'blood': 200, 'aggr': 1000, 'kind': '泰迪'}溜溜球被人打了,掉了1000的血王昭君被狗咬了,掉了1000的血

虽然这样可以小小的玩一下了,但是还是存在问题,当你在技能函数外面调用:

attack(dog,person )bite(person,dog)

运行的结果就会反过来:

王昭君被人打了,掉了1000的血溜溜球被狗咬了,掉了1000的血

       这样子角色就会变乱了,不符合实际要求,实际效果是:人只能被狗咬,而狗只能被人打,要满足这个要求,就需要有一定的限制,要使得攻击技能函数不能在外面被调用,

解决这个问题可以使用以前学过的知识,函数的嵌套,闭包来解决,将攻击技能函数嵌套如对应的角色里面,这样要调用攻击技能函数只能先通过调用外层对应角色的函数来实现,

从而角色也就不会发生混乱了:

def someone(name,blood,aggr,sex):    someone={        'name': name,        'blood': blood,        'aggr': aggr,        'sex': sex,    }    def attack(dog):#将人的攻击技能函数嵌套在人物角色函数里面,并且这里只用传入狗的参数,而人物角色使用的则是外层函数定义的someone        dog['blood'] -= someone['aggr']  # 人和狗的角色都是字典,这里就可以直接用了        print('%s被人打了,掉了%s的血' % (dog['name'], someone['aggr']))    someone['attack']=attack #在人物角色的属性里面添加攻击技能,这里给的是攻击技能的函数名,也就是相当与在someone里面存了攻击技能函数的内存地址    return someonedef dog(name,blood,aggr,kind):    dog={        'name': name,        'blood': blood,        'aggr': aggr,        'kind': kind    }    def bite(someone):#将狗的攻击技能函数嵌套在狗角色函数里面,并且这里只用传入人的参数,而狗角色使用的则是外层函数定义的dog        someone['blood'] -= dog['aggr'] #人和狗的角色都是字典,这里就可以直接用了        print('%s被狗咬了,掉了%s的血' % (someone['name'], dog['aggr']))    dog['bite']=bite#在人狗的角色的属性里面添加攻击技能,这里给的是攻击技能的函数名,也就是相当与在dog里面存了攻击技能函数的内存地址    return dogperson=someone('王昭君',100,1000,'girl')#要想多个人一起玩,只要多次传参调用函数someone就可以了print(person) #person里面除了人物角色传入的参数属性还有添加的人物的攻击技能函数dog=dog('溜溜球',200,1000,'泰迪')#要想多条狗一起玩,只要多次传参调用函数dog就可以了print(dog)#dog里面除了狗的角色传入的参数属性还有添加的狗的攻击技能函数person['attack'](dog) #传入狗的角色,调用人物角色里面的攻击技能函数dog['bite'](person)   #传入人的角色,调用狗角色里面的攻击技能函数

运行结果:

{
'sex': 'girl', 'name': '王昭君', 'blood': 100, 'attack':
.attack at 0x000001C74E6E3D90>, 'aggr': 1000}{
'name': '溜溜球', 'blood': 200, 'bite':
.bite at 0x000001C74EDBF048>, 'kind': '泰迪', 'aggr': 1000}溜溜球被人打了,掉了1000的血王昭君被狗咬了,掉了1000的血

这样就完成了一个简单的人狗大战的小游戏了

这个游戏里面定义的人物角色就是一个类,而里面具体的人物王昭君就是一个对象

同样定义的狗角色也是一个类,而具体的狗溜溜球就是一个对象

 

转载于:https://www.cnblogs.com/wxm422562/p/10844125.html

你可能感兴趣的文章
TestCase NotePad3.0 of robotium
查看>>
POJ 2114 Boatherds
查看>>
生产随机字符串
查看>>
RPC框架性能基本比较测试
查看>>
自动化开发中的知识点
查看>>
POJ——T 2406 Power Strings
查看>>
使用spring boot 实现两个没有关系的类注入
查看>>
在YII中如何新添加一个component
查看>>
nginx/fpm启停
查看>>
51nod 1799 二分答案(分块打表)
查看>>
异或运算符的运用
查看>>
hdu 1800 (字典树)
查看>>
vue动态修改title
查看>>
连续滑动操作
查看>>
使用xtrabackup进行mysql数据库备份
查看>>
android 自定义动画
查看>>
js数组与对象的一些区别。
查看>>
社工入门之如何分析一个人的作息规律
查看>>
SDWebImage缓存图片的机制(转)
查看>>
初始化块与构造方法
查看>>