前言
放下 Python 已经半年了,在期中考试之后,很快就要涉及算法初步了,我觉得通过 Python 的思维,对算法的学习有十分显著的帮助,便花费几小时写了这个 KillAliens 小游戏。
其中最重要的两个部分,分别是 分数的持续读写并运算 和 随机事件的生成 这两个部分,接下来我将详细讲述如何实现整个 KillAliens 小游戏以及这两个部分的实现过程。
基于
此 KillAilens 小游戏,灵感来源于我很久之前写的简单的 击杀外星人.py 这个只有不到 30 行的 简单文字表达 游戏,在 KillAilens 里,记分系统是 击杀外星人.py 没有的,同时使用了字典,使用键值对实现每个种类的 Ailen 对应一个属于自己的分数。
击杀外星人.py 可以在我的 Python 学习仓库内找到。
补充
这个小游戏 初次写于 2022/5/14 在经过研究后,2022/5/19 修改了算法,提高了线程性能,旧代码在仓库中名称为 KillAliens.py 或 KillAliens_NoComment.py ,新代码在仓库中名称为 KillAliens_V2.py 或 KillAliens_NoComment_V2.py
输出预览
代码预览
代码分析
分析说明
本文的代码分析,主要是讲所使用的主要语法,不会具体分析每行代码的作用,这需要自行理解。
注释
在 Python 中,注释用 井号 即 # 进行标识。井号后的内容将会被 Python 解释器 忽略,在本文内附上的代码是没有功能性注释的,只有作者注释。
模块引入
代码 第 9-10 行 分别引入了 random 模块和 time 模块。
import random
import time
这两个模块的作用分别是随机处理、使 Python 线程休眠指定时间。
random 的用法曾在 Python 学习日记 – 坐标移动 #random 模块 中讲过,这里就不再多说。
time 的作用技术使 Python 线程休眠指定时间,而这个时间是按照秒为单位的,让我们尝试一下吧:
name = input("你的名字:")
time.sleep(1)
print(f"你好{name}")
这是运行结果
上述代码的第一行在 Python 线程开始运行后,立马执行,询问名字,在得到用户输入的值后,执行第二行的代码,Python 解释器在第二行得到指令,要求休眠 1 秒 进而休眠,在 Python 线程休眠了 1 秒 后,才继续执行第三行的代码,输出名字。
字典 和 for 语句
在 Python 中,字典是使用 { } 花括号括起来的内容,其中包括两个内容,分别是键 (key) 和值 (value),我们称之为键值对,每一个键对应一个值,在 KillAliens 中,第 12-17 行 是一个字典,第 18 行 是一个字典,这两个字典书写格式不同,但都是字典,没有任何区别,第 12-17 行 的书写格式是为了解决美观问题,即我们在 Python 中被要求规范书写代码,这是一个良好的习惯。
使用字典,是为了方便 for 语句的输出,让我们写一个 字典 和 for 语句的输出试试吧:
为了方便观看学习,我将每个键值对分开写了。运行结果:
for 语句中,有严格的顺序对应,name 对应键,money 对应值,而 items() 是为了循环输出,直到字典没有更多的键值对可以打印才跳出循环。
而在 for 语句内的 print 可以使用上述对键值对的命名,也就是可以使用 name 和 money 对应字典内的键和值,进行读取。
除了 for 语句外,字典也可以被直接读和写,但这仅针对值的读和写。
让我们先看读取
在 print 中使用 { },代表读取特定区域的内容,而在其中加入 [ ] ,是为了读取特定区域内的某项特定值。
在上述代码中,使用 {name_and_money['Mark']} 读取了 name_and_money 字典中 Mark 这个键所对应的值 10 。让我们来看看输出结果
现在让我们看看写入
让我们看看输出结果
值得注意的是,与读取部分不同,我没有给这个值带 引号 ' ' 这是因为,带上引号就代表了这是一个字串符,需要我们转换它为浮点数才能继续进行运算,而不带引号,就代表了这是一个纯粹的数字,可以直接运算了。
当然,这是运算写入,也可以直接写入
我们在这里举了一个男朋友的例子,直接覆盖替换了键所对的值。
这里覆盖使用的是字串符,数字也是同样的道理。
值得注意的是,如此覆盖的修改是永久性的。
让我们看看是什么意思
输出结果
Tom 作为对照组,是没有变过的,他的男朋友一直是 Brown,而 Mark 在更改后,for 语句读取字典也同样读取的是修改后的值。
if-elif-else 进阶
KillAlines 中,使用了 if 语句的进阶,在 if 语句中,嵌套 if 语句,并且使用了 in 语法,让我们使用 KillAlines 节选的代码,进行修改后讲解吧。
为了展示不同的结果,我进行了多次运行。
第一次运行,我们走了 if 的判断,随机挑选的一个数,在对照组 state_one 中,所以我们返回了成功,第二次运行,我们走了 elif 判断,随机挑选的一个数,不在对照组 state_one 中,所以我们返回了失败,第三次运行,我们输入了 Magneto,if 和 elif 判断都不符合规则,移交 else 处理,返回了提示。
在 KillAliens 中,这样有效避免了输入不存在的内容,导致程序报错。
While 循环
While 循环在 KillAliens 中,仅仅进行了简单使用,不进行过多讲解,可以查看 Python3 循环语句 | 菜鸟教程 进行学习。
尾声
KillAlines 是我写的一个较为复杂的程序,算是一个简单的文字小游戏,仅通过 Python 完成的记分系统、判断系统、击杀系统,都是很完善且较为简单的,但这些数据仅存在线程当中,仍然有很大