day22 01 初识面向对象----简单的人狗大战小游戏
day22 01 初识面向对象----简单的人狗大战小游戏
假设有一个简单的小游戏:人狗大战 怎样用代码去实现呢?
首先得有任何狗这两个角色,并且每个角色都有他们自己的一些属性,比如任务名字name,血量blood,攻击力aggr,人的性别,狗的品种等,如下就是定义了这两个角色:
someone={
'name':'王昭君',
'blood':,
'aggr':,
'sex':'none'
} dog={
'name':'溜溜球',
'blood':,
'aggr':,
'kind':'泰迪'
}
如上的定义就比较单一,就只能一个人和一只狗玩,如果是几个人和几条狗一起,就不能够实现了,如何实现呢?利用以前学过的知识,把人和狗都转换成变量就好了,而这样的实现方法就是定义函数,然后传参数,调用函数:
def someone(name,blood,aggr,sex):
someone={
'name': name,
'blood': blood,
'aggr': aggr,
'sex': sex
}
return someone
person=someone('王昭君',,,'girl')
#要想多个人一起玩,只要多次传参调用函数someone就可以了
print(person) def dog(name,blood,aggr,kind):
dog={
'name': name,
'blood': blood,
'aggr': aggr,
'kind': kind
}
return dog
dog=dog('溜溜球',,,'泰迪')
#要想多条狗一起玩,只要多次传参调用函数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('王昭君',,,'girl')#要想多个人一起玩,只要多次传参调用函数someone就可以了
print(person)
dog=dog('溜溜球',,,'泰迪')#要想多条狗一起玩,只要多次传参调用函数dog就可以了
print(dog)
attack(person,dog)
bite(dog,person)
运行的结果:
{'sex': 'girl', 'name': '王昭君', 'blood': , 'aggr': }
{'name': '溜溜球', 'blood': , 'aggr': , '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 someone 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里面存了攻击技能函数的内存地址
return dog person=someone('王昭君',,,'girl')#要想多个人一起玩,只要多次传参调用函数someone就可以了
print(person) #person里面除了人物角色传入的参数属性还有添加的人物的攻击技能函数
dog=dog('溜溜球',,,'泰迪')#要想多条狗一起玩,只要多次传参调用函数dog就可以了
print(dog)#dog里面除了狗的角色传入的参数属性还有添加的狗的攻击技能函数
person['attack'](dog) #传入狗的角色,调用人物角色里面的攻击技能函数
dog['bite'](person) #传入人的角色,调用狗角色里面的攻击技能函数
运行结果:
{'sex': 'girl', 'name': '王昭君', 'blood': , 'attack': <function someone.<locals>.attack at 0x000001C74E6E3D90>, 'aggr': }
{'name': '溜溜球', 'blood': , 'bite': <function dog.<locals>.bite at 0x000001C74EDBF048>, 'kind': '泰迪', 'aggr': }
溜溜球被人打了,掉了1000的血
王昭君被狗咬了,掉了1000的血
这样就完成了一个简单的人狗大战的小游戏了
这个游戏里面定义的人物角色就是一个类,而里面具体的人物王昭君就是一个对象
同样定义的狗角色也是一个类,而具体的狗溜溜球就是一个对象
day22 01 初识面向对象----简单的人狗大战小游戏的更多相关文章
- python开发面向对象基础:人狗大战学面向对象
一,通过函数写人狗大战这个故事 #!/usr/bin/env python #_*_coding:utf-8_*_ #1.函数 人模子 def person(name,level,life_value ...
- 081 01 Android 零基础入门 02 Java面向对象 01 Java面向对象基础 01 初识面向对象 06 new关键字
081 01 Android 零基础入门 02 Java面向对象 01 Java面向对象基础 01 初识面向对象 06 new关键字 本文知识点:new关键字 说明:因为时间紧张,本人写博客过程中只是 ...
- 080 01 Android 零基础入门 02 Java面向对象 01 Java面向对象基础 01 初识面向对象 05 单一职责原则
080 01 Android 零基础入门 02 Java面向对象 01 Java面向对象基础 01 初识面向对象 05 单一职责原则 本文知识点:单一职责原则 说明:因为时间紧张,本人写博客过程中只是 ...
- 079 01 Android 零基础入门 02 Java面向对象 01 Java面向对象基础 01 初识面向对象 04 实例化对象
079 01 Android 零基础入门 02 Java面向对象 01 Java面向对象基础 01 初识面向对象 04 实例化对象 本文知识点:实例化对象 说明:因为时间紧张,本人写博客过程中只是对知 ...
- 078 01 Android 零基础入门 02 Java面向对象 01 Java面向对象基础 01 初识面向对象 03 创建类
078 01 Android 零基础入门 02 Java面向对象 01 Java面向对象基础 01 初识面向对象 03 创建类 本文知识点:创建类 说明:因为时间紧张,本人写博客过程中只是对知识点的关 ...
- 077 01 Android 零基础入门 02 Java面向对象 01 Java面向对象基础 01 初识面向对象 02 类和对象
077 01 Android 零基础入门 02 Java面向对象 01 Java面向对象基础 01 初识面向对象 02 类和对象 本文知识点:类和对象 说明:因为时间紧张,本人写博客过程中只是对知识点 ...
- 076 01 Android 零基础入门 02 Java面向对象 01 Java面向对象基础 01 初识面向对象 01 Java面向对象导学
076 01 Android 零基础入门 02 Java面向对象 01 Java面向对象基础 01 初识面向对象 01 Java面向对象导学 本文知识点:Java面向对象导学 说明:因为时间紧张,本人 ...
- day23 02 组合(继续人狗大战游戏)
day23 02 组合(继续人狗大战游戏) 面向对象的三大特性:继承 多态 封装 先讲解一下组合 组合:一个对象的属性值是另一个类的对象:对象.属性.属性(一般有两个点) 继续扩展day22 01里面 ...
- day24 python学习 类 画元,命名空间作用域,组合,人狗大战升级
类命名空间与对象.实例的命名空间 创建一个类就会创建一个类的名称空间,用来存储类中定义的所有名字,这些名字称为类的属性 而类有两种属性:静态属性和动态属性 静态属性就是直接在类中定义的变量 动态属性就 ...
随机推荐
- C. Coconut(2017 ACM-ICPC 亚洲区(乌鲁木齐赛区)网络赛)
额,只是一道签到题,emmm直接代码: #include <cstdio> #include <cstring> #include <algorithm> usin ...
- Hexo瞎折腾系列(6) - 将博客同时部署到Github和Coding
前言 由于本人只是将Hexo博客同时部署到 Github 和 Coding.net ,所以这里只介绍怎么同时部署到这两个网站的pages. 之所以选择这两个网站,是因为国外用户可以访问 Github, ...
- AWVS11使用教程——Acunetix Web Vulnerability Scanner 11.x
AWVS11使用教程 一:普通扫描. 二:报告生成. 三:登陆扫描. Acunetix Web Vulnerability Scanner(简称AWVS)是一款知名的网络漏洞扫描工具,它通过网络爬虫测 ...
- Unity项目学习笔记
1.TCP和IP IP:主要作用是在复杂的网络环境中将数据包发送给的最终的目标地址. 端口号:系统会分给系统端口号 一般知名的端口号在0-1023之间,而我们经常使用的自定义/动态分配的端口号则一般 ...
- 4. iOS测试常用方法
1. [XCUIElement exists]方法只能确定这个View是否存在,即使不在当前屏幕上也返回True.如果要确定View是否在屏幕可见范围内,可以判断其Frame是否在Window的 ...
- AndroidStudio中使用SVN
AndroidStudio中使用SVN提交项目 1.安装SVN,我选择使用TortoiseSVN-1.8.7.25475-x64-svn-1.8.9.msi(安装文件地址如下:http://downl ...
- P3371 【模板】单源最短路径
题目描述 如题,给出一个有向图,请输出从某一点出发到所有点的最短路径长度. 输入输出格式 输入格式: 第一行包含三个整数N.M.S,分别表示点的个数.有向边的个数.出发点的编号. 接下来M行每行包含三 ...
- Axure-计算输入字数
说明:Axure版本为7.0 1.添加多行文本框,设置名称为Input,添加文本框,设置名称为msg,样式如下: 2.为input添加“文本改变时”事件,设置全局变量,如下所示: 3.再添加“设置文本 ...
- java实现单向链表的增、删、改、查
单向链表 作者:vashon package com.ywx.link; /** * 单向链表 * @author vashon * */ public class LinkTest { public ...
- UVA 11346 Probability 概率 (连续概率)
题意:给出a和b,表示在直角坐标系上的x=[-a,a] 和 y=[-b,b]的这样一块矩形区域.给出一个数s,问在矩形内随机选择一个点p=(x,y),则(0.0)和p点组成的矩形面积大于s的概率是多少 ...