自己做视频网站上传视频,别墅庭院园林景观设计公司,哈尔滨网站建设30t,郑州市做网站的公让我们穿越到《龙珠》世界#xff0c;一起揭开 面向对象编程 的神秘面纱吧。
面向过程编程与面向对象编程
天下第一武道会
选手登记
第 22 届天下第一武道会即将召开#xff0c;各路武术高手齐聚一堂#xff0c;其中最受瞩目的#xff0c;当属卡卡罗特#xff08;孙悟…让我们穿越到《龙珠》世界一起揭开 面向对象编程 的神秘面纱吧。
面向过程编程与面向对象编程
天下第一武道会
选手登记
第 22 届天下第一武道会即将召开各路武术高手齐聚一堂其中最受瞩目的当属卡卡罗特孙悟空一行人以及比克大魔王为首的邪恶力量。
每名选手在报名参加武道会时都需要填写报名表。你觉得下列哪种数据类型 更适合 用于存储每名选手的个人信息呢 整数型浮点型字符串列表型还是字典类型呢
️ 嗯……选手所填写的报名表中包含 多种信息每条信息的 类别 与 具体内容 间存在一一对应的关系。这么看来我们应该使用 字典 来存储信息。 相信这对你来说已经是小菜一碟了。储存好选手们的信息天下第一武道会终于可以开始啦
决斗方式
本届武道会采取 回合制 决斗方式即一方进攻后攻防交换轮到另一方进攻。如此不断重复直到某一方 生命值降为 0 或 0 以下判定为战败。
回合制战斗这类形式决斗双方会不断 重复“A 攻击 B 防御、B 攻击 A 防御” 这一过程所以我们用 循环结构 来表示这是没有问题的。但是决斗 直到 某一方生命值降为 0 或 0 以下才会停止我们无法预先估计循环次数因此比起 for 型循环这里更适合用 while 型循环结构来表示喔。
确定了整体结构后我们来继续思考决斗过程是 A 攻击 B 防御、B 攻击 A 防御然后又轮到 A 攻击 B 防御、B 攻击 A 防御。因此循环体内最重要的两个步骤就是 发起攻击、防御攻击。
而每次有人发动攻击都可能使防御方重伤倒地不起生命值降为 0 或 0 以下所以 A 打 B 之后我们需要判断一下此时 B 生命值是否小于等于 0。如果小于等于 0则 B 战败、A 获胜。B 打 A 后同理。
我们将上述思路整合一下就能画出决斗过程流程图啦
搭好了整体框架下面我们来逐步填充细节吧
攻击防御
循环体内有两大关键步骤因此我们可以设计两个函数 发起攻击函数 hit()接受 2 个参数第一个参数表示攻击方第二个参数表示攻击对象防御攻击函数 defend()接受 2 个参数第一个参数表示受到攻击的人第二个参数表示受到的伤害。 发动攻击函数 hit() 比较好办我们只要让攻击方大喝一声“哋”接着调用 defend() 函数让防御方防御即可。写成代码的话就是这样
# 发动攻击
def hit(attacker, target):print( 【{}】发起攻击\n.format(attacker[name]))defend(target, attacker[ATK])
在防御攻击函数 defend() 中我们则可以加一些花样——卡卡罗特和比克大魔王这样的武林高手肯定不会傻愣愣地站在原地挨打。因此我们可以设定当某人防御攻击时有 20% 几率完美闪避毫发无损。
那么新的问题就来了我们要如何体现这“20% 几率闪避”呢
这就要用到我们在 前面 几关学习过的 random 模块中的 randint() 方法了。
randint() 方法接受两个整数将返回包括这两个整数之间、加上两个数本身在内的所有整数。
借助 randint() 函数我们就能设计闪避机制了。首先我们随机生成一个 1100 之间的整数包括 1 和 100。此时它有 1% 的可能是 1有 1% 的可能是 2有 1% 的可能是 3……即它有 20% 的可能小于等于 20。
所以判定防御方是否闪避成功的问题就可以转化为判断生成的随机数是否小于等于 20 的问题。写成代码的话就是这样
from random import randint# 防御攻击
def defend(defender, damage):# 若生成的随机数小于等于 20则闪避成功if randint(1, 100) 20:print( 【{}】完美躲避了攻击\n.format(defender[name]))# 否则扣除对应生命值else:defender[HP] defender[HP] - damageprint( 【{}】受到 {} 点伤害...\n.format(defender[name], damage)) 提示这里的前缀“ ”仅起到装饰作用。你可以根据自己的喜好设计不同的输出效果哦 编程练习
请你根据上面分析过程完成防御攻击函数 defend()并按照注释中的要求调用函数。
要求 防御方有 20% 几率完美闪避攻击若闪避成功则输出 【xxx】完美躲避了攻击否则输出 【xxx】受到 xxx 点伤害。 from random import randint# 选手信息
kakarot {name: 卡卡罗特, HP: 100, ATK: 25}
piccolo {name: 比克大魔王, HP: 150, ATK: 15}# 发动攻击
def hit(attacker, target):print( 【{}】发起攻击\n.format(attacker[name]))defend(target, attacker[ATK])# 在下面进行代码补充
# 防御攻击# 调用函数让卡卡罗特向比克大魔王发动攻击# 调用函数让比克大魔王向卡卡罗特发动攻击
补充后打代码为
from random import randint# 选手信息
kakarot {name: 卡卡罗特, HP: 100, ATK: 25}
piccolo {name: 比克大魔王, HP: 150, ATK: 15}# 发动攻击
def hit(attacker, target):# print(attacker)print( 【{}】发起攻击\n.format(attacker[name]))defend(target, attacker[ATK])# 防御攻击
def defend(target, atk):if randint(1,100) 20:# 如果有闪避则完美闪避print( 【{}】完美躲避了攻击.format(target[name]))else:# 如果没有闪避则被攻击收到上海print( 【{}】受到 {} 点伤害.format(target[name], atk))
# 调用函数让卡卡罗特向比克大魔王发动攻击
hit(kakarot, piccolo)
# 调用函数让比克大魔王向卡卡罗特发动攻击
hit(piccolo, kakarot)# 输出结果为
# 【卡卡罗特】发起攻击
# 【比克大魔王】受到 25 点伤害
# 【比克大魔王】发起攻击
# 【卡卡罗特】受到 15 点伤害
太棒啦循环体内两大步骤都搞定了最后我们只需要把这几个“零件”组装到一起就能让选手们展开决斗了。
不过我们目前编写的这一版代码还存在两大问题
第一大问题是由于我们是用 字典类型变量 存储选手信息的所以每新增一位选手我们都需要 重复定义相同数据结构多少还是有些麻烦。我们有没有什么方法能够定义出一个通用的选手 模板 呢
第二大问题是我们调用 hit() 函数让 A 向 B 发动攻击时编写出的代码是 hit(A, B)。按照我们的语言习惯可能会被误解为“同时攻击 A 和 B”hit A and B。我们有没有什么方法能够让代码更符合我们的认知习惯呢
解决这两个问题的方法并不难。它所要用到的 Python 语法就是我们本单元的重点——类。困难的地方在于这次我们不仅要学习新的语法还要学习一种新的分析问题方式——面向对象编程。
两种重要编程思想
编程届一直存在两种编程思想一种是 面向过程另一种是 面向对象。首先让我们来看看什么是 面向过程编程。
面向过程编程
面向过程编程 方式将程序看作 命令 的集合按照 问题解决步骤 编写程序。我们一直以来就是用这种方式分析问题、编写程序的。
比如我们在分析决斗过程时先将决斗过程拆解为两大步骤为每个步骤设计函数实现最终代码结构是这样的
# 选手信息
kakarot {name: 卡卡罗特, HP: 100, ATK: 25}
piccolo {name: 比克大魔王, HP: 150, ATK: 15}# 发动攻击
def hit(attacker, target):pass# 防御攻击
def defend(defender, damage):pass# 展开决斗
while True:# 每回合开始由卡卡罗特先发动攻击hit(kakarot, piccolo)# 判断此时决斗是否分出胜负if piccolo[HP] 0:break# 若未分出胜负则攻防交换由比克大魔王发动攻击hit(piccolo, kakarot)# 判断此时决斗是否分出胜负if kakarot[HP] 0:break 提示此处代码省略了函数实现细节。 可以看到用面向过程思想写出来的代码最大优点在于 步骤清晰。但与此同时我们也注意到程序中的 数据 与 函数 间是十分松散的只有编写代码的我们心里清楚 hit() 函数中的 attacker 参数与 target 参数实际上是由 name 键、HP 键和 ATK 键构成的字典类型变量。
理想状况下我们当然可以记住每个变量的类型、结构。可是如果问题规模不断扩大我们又该怎么办呢
比如对于一场真实的武道会来说我们不仅要存储选手们的信息还要存储主持人、裁判等 不同身份 的人的信息我们不仅要表现决斗过程还要表现赛前抽签、主持人主持比赛、裁判判决比赛等过程……此时若继续采用 面向过程编程 思想那我们编写出的程序势必会结构混乱。即使把它们拆解成一个个模块也是治标不治本。
如果想“治本”则需要转变看待问题的角度尝试用 面向对象编程 思想重新审视周遭的一切。
面向对象编程
想弄明白什么是 面向对象编程首先我们要明白什么是 对象。
咳咳这里的“对象”指的肯定不是伴侣而是 具有一系列特征和行为的个体。我们需要解决的问题则可看作 对象与对象之间的交互。比如在天下第一武道会中每名选手都是独立的个体可视作一个 对象。一场决斗是两位选手之间的对决即两个对象之间的交互。
进一步地我们发现虽然 对象 A 和 对象 B 是独立的个体但他们都有姓名、生命值、攻击力这三样 特征都有 发动攻击 和 防御攻击 这两样行为。因此我们可以说他们是同一 类 的。这里不妨为它取名为 选手类。
运用这一思想我们能够轻松地应对大规模问题——
由于主持人、裁判、选手之间 特征 和可以做出的 行为 各不相同因此我们可以定义出三大 类 描述他们后续任务无非就是将这三个类写成代码
不知道你发现了吗在用 面向对象编程 思想分析问题时我们并没有关注 问题解决步骤而是从 对象 出发先弄清楚什么样的对象能做什么事再从中归纳总结出几大 类每个 类 都有自己着自己的特征与行为。
这就是 面向对象编程 与 面向过程编程 的最大区别。面向对象编程 方法将编程视作 对象 的集合从 对象与对象间的交互 角度出发思考问题。
这种思维方式更贴近我们平时认知世界的直觉。因此即使我们不明白类相关的语法规则和背后的实现逻辑也能够按照我们的生活经验推断出代码对应的含义。比如对于下面这段代码
kakarot Player(卡卡罗特, 100, 25)
piccolo Player(比克大魔王, 150, 15)kakarot.hit(piccolo)
不妨猜猜看代码第三行 kakarot.hit(piccolo) 描述了一种怎样的行为呢 Akakarot 攻击 piccolo Bpiccolo 攻击 kakarot Ckakarot 和 piccolo 同时受到了攻击 答案当然选A了。是不是很简单 从“kakarot”、“hit”、“piccolo”这三个词的顺序我们不难推断出这行代码是在描述 kakarot 攻击 piccoloKakarot hit Piccolo。这就是面向对象编程的魅力所在
面向对象编程的概念就介绍到这里啦。
类 是抽象的模板对象 是具象的个体。上述过程中共出现了三位角色分别是大勇、卡卡罗特、比克大魔王所以涉及到的对象就是他们三人。而“主持人”与“选手”是他们所属的 类。
改用另一种思维方式分析问题是一项需要不断练习才能真正领会、掌握的事不能一蹴而就。所以本关我们重在梳理 决斗过程 逻辑并简要了解了 面向对象编程 的概念知道了它和我们传统的 面向过程编程 方式间的区别
编程练习_回合制决胜负
请你根据 决斗过程流程图 和注释中的提示信息补全代码让卡卡罗特和比克大魔王展开决斗吧你也可以在此基础上修改让决斗过程更加丰富有趣哦。
决斗说明 决斗采取 回合制由卡卡罗特先发动攻击。 决斗过程流程图
from random import randint# 选手信息
kakarot {name: 卡卡罗特, HP: 100, ATK: 25}
piccolo {name: 比克大魔王, HP: 150, ATK: 15}# 发动攻击
def hit(attacker, target):print( 【{}】发起攻击\n.format(attacker[name]))defend(target, attacker[ATK])# 防御攻击
def defend(defender, damage):# 若生成的随机数小于等于 20则闪避成功if randint(1, 100) 20:print( 【{}】完美躲避了攻击\n.format(defender[name]))# 否则扣除对应生命值else:defender[HP] defender[HP] - damageprint( 【{}】受到 {} 点伤害...\n.format(defender[name], damage))# 展开决斗
while True:# 每回合开始由卡卡罗特先发动攻击hit(kakarot, piccolo)# 判断此时决斗是否分出胜负if piccolo[HP] 0:print({}获胜.format(kakarot[name]))break# 若未分出胜负则攻防交换由比克大魔王发动攻击hit(piccolo, kakarot)# 判断此时决斗是否分出胜负if kakarot[HP] 0:print({}获胜.format(piccolo[name]))break# 输出结果为获胜结果是随机的
# 【卡卡罗特】发起攻击
# 【比克大魔王】受到 25 点伤害...
# 【比克大魔王】发起攻击
# 【卡卡罗特】受到 15 点伤害...
# 【卡卡罗特】发起攻击
# 【比克大魔王】受到 25 点伤害...
# 【比克大魔王】发起攻击
# 【卡卡罗特】受到 15 点伤害...
# 【卡卡罗特】发起攻击
# 【比克大魔王】受到 25 点伤害...
# 【比克大魔王】发起攻击
# 【卡卡罗特】受到 15 点伤害...
# 【卡卡罗特】发起攻击
# 【比克大魔王】受到 25 点伤害...
# 【比克大魔王】发起攻击
# 【卡卡罗特】受到 15 点伤害...
# 【卡卡罗特】发起攻击
# 【比克大魔王】受到 25 点伤害...
# 【比克大魔王】发起攻击
# 【卡卡罗特】受到 15 点伤害...
# 【卡卡罗特】发起攻击
# 【比克大魔王】受到 25 点伤害...
# 卡卡罗特获胜
编程练习_决斗时喊出技能名不是很酷吗
不好了不好了比克大魔王率领一众小弟包围了武道会主办方说“哼区区‘攻击力 15’怎能体现出我强大的招式呢我提议在登记信息时将我们的绝招也登记上去决斗时各自报出技能。谁敢不从”
主办本想拉着卡卡罗特一行人撑腰没想到小悟空连连点头“对呀喊出技能名多酷哇。就这么办吧”
哎……看来只能麻烦你改进一下之前的代码了。
要求 选用 合适 的数据类型存储每位选手信息编写 hit() 函数该函数接受两个参数 attacker 和 target表示 attacker 随机使用自己任意一个技能向 target 发动攻击。 另外进攻方在攻击时要喊出自己使用了什么技能就像这样
hit(kakarot, piccolo)# 输出 【卡卡罗特】使出残象拳向【比克大魔王】发动攻击
数据说明 卡卡罗特kakarot 生命值HP100技能SKILLS 残象拳威力 10八手拳威力 15变身赛亚人威力 50 比克大魔王piccolo 生命值HP150技能SKILLS 魔光线威力 10魔光炮威力 15爆裂魔光炮威力 20 # 请在此处登记卡卡罗特选手信息# 请在此处登记比克大魔王选手信息# 请在此处定义 hit() 函数# 调用 hit() 函数
优化后代码非固定答案
import random
# 请在此处登记卡卡罗特选手信息
kakarot {name:卡卡罗特,HP:100,技能:[{name:残象拳,damage:80},{name:八手拳,damage:15},{name:变身赛亚人,damage:50}]
}
# 请在此处登记比克大魔王选手信息
piccolo {name:比克大魔王,HP:150,技能:[{name:魔光线,damage:10},{name:魔光炮,damage:10},{name:爆裂魔光炮,damage:20}]
}# 请在此处定义 hit() 函数
def hit(attacker, target):# 技能skill random.choice(attacker[技能])[name]print( 【{}】使出{}向【{}】发动攻击.format(attacker[name], skill, target[name]))
# 调用 hit() 函数
hit(kakarot, piccolo)
下章预告python的 类 和 对象
下章我来带你在动手编写代码过程中逐步加深对 类 和 对象 的理解。
我们要如何定义选手类选手与选手间的交互又要如何实现这些问题在下一关都会得到解答。我们不见不散
文章转载自: http://www.morning.jjhng.cn.gov.cn.jjhng.cn http://www.morning.gtjkh.cn.gov.cn.gtjkh.cn http://www.morning.wdwfm.cn.gov.cn.wdwfm.cn http://www.morning.nqrlz.cn.gov.cn.nqrlz.cn http://www.morning.mmosan.com.gov.cn.mmosan.com http://www.morning.nwpnj.cn.gov.cn.nwpnj.cn http://www.morning.mzkn.cn.gov.cn.mzkn.cn http://www.morning.krgjc.cn.gov.cn.krgjc.cn http://www.morning.kflbf.cn.gov.cn.kflbf.cn http://www.morning.fwnqq.cn.gov.cn.fwnqq.cn http://www.morning.lsqxh.cn.gov.cn.lsqxh.cn http://www.morning.fppzc.cn.gov.cn.fppzc.cn http://www.morning.lbywt.cn.gov.cn.lbywt.cn http://www.morning.jwbfj.cn.gov.cn.jwbfj.cn http://www.morning.gqbks.cn.gov.cn.gqbks.cn http://www.morning.xknsn.cn.gov.cn.xknsn.cn http://www.morning.gyqnc.cn.gov.cn.gyqnc.cn http://www.morning.nrtpb.cn.gov.cn.nrtpb.cn http://www.morning.btpzn.cn.gov.cn.btpzn.cn http://www.morning.ptqpd.cn.gov.cn.ptqpd.cn http://www.morning.bfsqz.cn.gov.cn.bfsqz.cn http://www.morning.pmsl.cn.gov.cn.pmsl.cn http://www.morning.mbpfk.cn.gov.cn.mbpfk.cn http://www.morning.mwzt.cn.gov.cn.mwzt.cn http://www.morning.qrdkk.cn.gov.cn.qrdkk.cn http://www.morning.hxsdh.cn.gov.cn.hxsdh.cn http://www.morning.yccnj.cn.gov.cn.yccnj.cn http://www.morning.bybhj.cn.gov.cn.bybhj.cn http://www.morning.mpmtz.cn.gov.cn.mpmtz.cn http://www.morning.qwyms.cn.gov.cn.qwyms.cn http://www.morning.fgxr.cn.gov.cn.fgxr.cn http://www.morning.vvdifactory.com.gov.cn.vvdifactory.com http://www.morning.dlhxj.cn.gov.cn.dlhxj.cn http://www.morning.mxmzl.cn.gov.cn.mxmzl.cn http://www.morning.kbfzp.cn.gov.cn.kbfzp.cn http://www.morning.wqrk.cn.gov.cn.wqrk.cn http://www.morning.rcmwl.cn.gov.cn.rcmwl.cn http://www.morning.fqcdh.cn.gov.cn.fqcdh.cn http://www.morning.gmwdl.cn.gov.cn.gmwdl.cn http://www.morning.sgbk.cn.gov.cn.sgbk.cn http://www.morning.rcwzf.cn.gov.cn.rcwzf.cn http://www.morning.qyhcg.cn.gov.cn.qyhcg.cn http://www.morning.gdgylp.com.gov.cn.gdgylp.com http://www.morning.lqjpb.cn.gov.cn.lqjpb.cn http://www.morning.dodoking.cn.gov.cn.dodoking.cn http://www.morning.jcbmm.cn.gov.cn.jcbmm.cn http://www.morning.lffrh.cn.gov.cn.lffrh.cn http://www.morning.pqyms.cn.gov.cn.pqyms.cn http://www.morning.slpcl.cn.gov.cn.slpcl.cn http://www.morning.ghqyr.cn.gov.cn.ghqyr.cn http://www.morning.xnnxp.cn.gov.cn.xnnxp.cn http://www.morning.sdecsd.cn.gov.cn.sdecsd.cn http://www.morning.lmjkn.cn.gov.cn.lmjkn.cn http://www.morning.gllgf.cn.gov.cn.gllgf.cn http://www.morning.ksjnl.cn.gov.cn.ksjnl.cn http://www.morning.yrcxg.cn.gov.cn.yrcxg.cn http://www.morning.wqpm.cn.gov.cn.wqpm.cn http://www.morning.rdmz.cn.gov.cn.rdmz.cn http://www.morning.hyfrd.cn.gov.cn.hyfrd.cn http://www.morning.bmyrl.cn.gov.cn.bmyrl.cn http://www.morning.ttfh.cn.gov.cn.ttfh.cn http://www.morning.nlywq.cn.gov.cn.nlywq.cn http://www.morning.wqbrg.cn.gov.cn.wqbrg.cn http://www.morning.dcdhj.cn.gov.cn.dcdhj.cn http://www.morning.fnzbx.cn.gov.cn.fnzbx.cn http://www.morning.swzpx.cn.gov.cn.swzpx.cn http://www.morning.ykrkq.cn.gov.cn.ykrkq.cn http://www.morning.lpgw.cn.gov.cn.lpgw.cn http://www.morning.bxch.cn.gov.cn.bxch.cn http://www.morning.bpmns.cn.gov.cn.bpmns.cn http://www.morning.ryfpx.cn.gov.cn.ryfpx.cn http://www.morning.yfnhg.cn.gov.cn.yfnhg.cn http://www.morning.rhjsx.cn.gov.cn.rhjsx.cn http://www.morning.tgqzp.cn.gov.cn.tgqzp.cn http://www.morning.fbjqq.cn.gov.cn.fbjqq.cn http://www.morning.rcklc.cn.gov.cn.rcklc.cn http://www.morning.mlpch.cn.gov.cn.mlpch.cn http://www.morning.xtgzp.cn.gov.cn.xtgzp.cn http://www.morning.kqblk.cn.gov.cn.kqblk.cn http://www.morning.bpcf.cn.gov.cn.bpcf.cn