python人狗大战游戏_day22 01 初识面向对象----简单的人狗大战小游戏
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
}returnsomeone
person=someone('王昭君',100,1000,'girl')
#要想多个人一起玩,只要多次传参调用函数someone就可以了
print(person)
def dog(name,blood,aggr,kind):
dog={'name': name,'blood': blood,'aggr': aggr,'kind': kind
}returndog
dog=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里面存了攻击技能函数的内存地址returnsomeone
def 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里面存了攻击技能函数的内存地址returndog
person=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的血
这样就完成了一个简单的人狗大战的小游戏了
这个游戏里面定义的人物角色就是一个类,而里面具体的人物王昭君就是一个对象
同样定义的狗角色也是一个类,而具体的狗溜溜球就是一个对象
python人狗大战游戏_day22 01 初识面向对象----简单的人狗大战小游戏相关推荐
- 用Unity3D实现简单的井字棋小游戏
用Unity3D实现简单的井字棋小游戏 项目地址 井字棋小游戏 完成效果图 实现思路 首先定义游戏的数据部分: /* 井字棋中每一个棋格中的逻辑控制常量,代表这个棋格的状态 */ private co ...
- 使用UE4制作简单的局域网对战小游戏
原帖地址:https://arcecho.github.io/2017/04/28/使用UE4制作简单的局域网对战小游戏/ 大多数文章都是只讲到大致的UE4网络的概念,并未涉及实际使用.事实上在使用的 ...
- java游戏黑莓手机,简约而不简单 16款经典黑莓手机小游戏
[IT168 应用]随着 AppStore 和 Android 市场的发展,大家已经逐渐适应在市场中为自己的智能机淘一些自己喜欢的游戏和应用,黑莓其实也提供了这一市场. 尽管国内黑莓的氛围并不如上两种 ...
- 星益小游戏平台源码 内置80多个在线小游戏
简介: 星益小游戏平台源码是一款星益在线小游戏可的网站源码,本程序由小星合集整理制作,共计80个小游戏. 内置了80个在线小游戏,直接就能玩耍,上传到空间用! 本程序大部分都是自适应,但是使用电脑端体 ...
- C语言简单的键盘玩扫雷小游戏(完结)
1:这次我们会将前面的代码进行整合,和整理,最终使我们的程序可以有效的运行起来. [1]初始化函数. void GameInit() { //随机数种子 srand((unsigned ...
- 一个简单的五子连珠小游戏
一个简单的五子连珠小游戏 程序目的:设计一个五子连珠小游戏 1,棋盘大小是9X9 2,初始状态棋盘上随机分布着7个不同色的棋子. 3,当同色的棋子有5颗连在一起排成横向.纵向或者斜向时,游戏者可以得1 ...
- python拼图游戏代码_GitHub 上哪些勾起回忆的经典小游戏(Python)
经常有人问我 Python 能开发游戏吗?今天就直接给大家推荐一个汇集多款经典小游戏的Github项目:Free Python Games. 项目地址:grantjenks/free-python-g ...
- Python快速编程入门#学习笔记02# |第十章 :Python计算生态与常用库(附.小猴子接香蕉、双人乒乓球小游戏源码)
全文目录 学习目标 1. Python计算生态概述 1.1 Python计算生态概述 2. Python生态库的构建与发布 2.1 模块的构建与使用 * 2.1.1第三方库/模块导入的格式 2.2 包 ...
- 【游戏开发实战】使用Unity 2019制作仿微信小游戏飞机大战(七):主角飞机碰撞与爆炸
文章目录 零.教程目录 一.前言 二.本篇目标 三.飞机机碰撞组件:BoxCollider2D.Rigidbody2D 四.添加Tag:Enemy 五.主角飞机碰撞处理:OnTriggerEnter2 ...
最新文章
- 【蓝桥java】递归基础之计算共多少种走法
- Vue2.0中引入element-ui
- sulime text 3
- 业务上云后,58到家运维平台的演进之路(含成本规划与监控建议)
- PostgreSQL 创建库时如何指定 Collate, Ctype
- DataGridVidw添加CheckBox。并通过一个 CheckBox来控制其全选。
- HBase的hbase shell 详解
- mysql常用命令整理
- 2021年Java大厂面试必备面试题
- native react 更新机制_React Native 热更新实现(客户端 + 服务器端)
- 程序员5种编程入门方法,如何快速学会一门编程语言?
- R中两种常用并行方法——2. snowfall
- leetcode 1037. 有效的回旋镖(三点共线问题)
- 基于微信小程序的电影院购票平台
- java 声明式编程_声明式编程 - SegmentFault 思否
- JavaScript Promise返回值详解
- gdal geometry java_GDAL Geometry对象操作 - 创建对象
- 判断任意一个二维数组里是否有鞍点(多个鞍点和单个鞍点均能判断),以及鞍点的输出(c语言)
- 基于ipk安装包形式移植helloworld驱动模块到openwrt系统
- PHP基础面试问题汇总