前言
前言
初学者要想成功,一句话,大量的实操,大量的练,乍一看我的这个答案似乎有点敷衍,但是这确实是我接触Python以来,总结出的最有价值的经验,接下来分享我自己初学时用来练手的经典实战小项目,适合初学者敲的代码。
1.街霸游戏
1.1 KO街霸
游戏小剧场
特别调查员春丽突然收到了来自中尉查理的一封邮件,邮件里详细地说明了神月家族在美国唐人街举办的街霸挑战赛,挑战的终极boss正是街霸维加。春丽在很小的时候,父亲就被维加残忍地杀害,为报父仇,春丽毅然决然地买好了飞往唐人街的机票。
邪恶的维加正通过催眠术,控制着在擂台上饮败的格斗家们在世界各地执行暗杀计划。
隆远在印度修行,孤身一人的春丽能在擂台上挑战成功吗?
程序完整源码
这是一个针对Python初学者的练手小程序,简单地模拟春丽与维加的格斗过程。有一定开发经验的朋友可以对程序进行扩展,比如利用多进程来模拟春丽同时与多人进行格斗。
Python
# 导入random模块,执行random模块中的choice方法来随机获取列表中的元素
import random
import time
VEGA_STRATEGIES = ["原地蹲防", "失误", "回旋攻击", "失误", "伤害修正", "回血", "超必杀"]
CHUNLI_KUNFU = ["气功拳", "旋转踢", "百裂脚", "霸山天升脚"]
def countdown(seconds=3, message=""):
"""
:param seconds: 倒数的秒数
:param message: 倒计时结束后输出的提示信息
:return:
"""
for _ in range(seconds, 0, -1):
_, _ = print(_), time.sleep(1)
else:
print(message)
def generate_prompts(kunfu):
"""
:param kunfu: 街霸格斗选手的格斗招数,为一个列表对象,例如["气功拳", "旋转踢"]
:return: 返回用户指令输入的提示信息,为一个字符串对象
"""
prompts = "\n"
for index, value in enumerate(kunfu):
prompts += "<{}>{}".format(index, value)
prompts += "\n输入<>中的指令来挑战街霸:__\b\b"
return prompts
def fight():
# 定义整型变量fighter,用来保存街霸维加的血量
vega = 100
# 定义整型变量chunli,用来保存春丽的血量
chunli = 100
blood = 5
prompts = generate_prompts(CHUNLI_KUNFU)
countdown(message="Fight!")
# 执行while循环,不断重复执行下面的代码
while True:
# 春丽或boss其中一人血量为0时就退出战斗
if vega * chunli == 0:
break
# 执行input函数获得键盘的输入内容
command = input(prompts)
# 对输入的字符串类型转换为整型,读者在输入时必须输入有效的数字,否则会抛出异常
try:
command = int(command)
_ = CHUNLI_KUNFU[command]
except (ValueError, IndexError):
print("春丽,这是在战斗,请输入正确的战斗指令!")
continue
print("春丽对街霸使出了{}".format(CHUNLI_KUNFU[command]))
# 使用random模块中的choice函数,来随机选择列表里的值
vega_strategy = random.choice(VEGA_STRATEGIES)
if vega_strategy == "失误":
print("街霸维加在对战中反击失误!")
else:
print("街霸维加在对战中对你使用了{}".format(vega_strategy))
if vega_strategy in {
"原地蹲防", "回血"}:
if vega_strategy == "回血" and vega < 100:
vega += blood
elif vega_strategy == "失误":
vega -= blood*2
elif vega_strategy == "伤害修正":
vega -= blood
elif vega_strategy == "超必杀":
chunli -= blood*2
else:
chunli -= blood
chunli = 0 if chunli <=0 else chunli
vega = 0 if vega <=0 else vega
print("\n-*- 春丽现在的血量:{} 维加现在的血量:{} -*-".format(chunli, vega))
time.sleep(3)
if chunli == 0:
print("春丽,你战败了!")
else:
print("维加,我今天终于把你打败,父亲泉下有知,可以瞑目了!")
if __name__ == "__main__":
fight()
程序的输出界面
1.2 春丽VS巴洛克
游戏小剧场
虽然美丽的春丽打败了维加,但邪恶的影罗组织并未就此覆灭。许多年以后,春丽站在A号街区,会突然想起打败神月卡琳后的那个下午。当时,身躯高大的巴洛克已将面具摘下,道场中的其他四名影子杀手,形如雕塑,酷似木偶…春丽经过这场残酷的战斗以后,在背部留下了一道很长的月牙形伤痕。
在本节程序实战中,通过多进程的方式来模拟春丽一人对抗影罗组织的五名邪恶杀手。
参考源码
通过多进程+队列来模拟春丽1VS5的街霸游戏挑战赛:
from multiprocessing import Process, Queue
import random
class Fighter:
def __init__(self, name, blood = 100, justice = True, kungfu = None, enemies = 1):
"""
:param name: 表示该fighter的姓名
:param blood: 表示该fighter的血量
:param justice: 布尔类型,表示该fighter是否代表正义的一方
:param kungfu: 表示该fighter的格斗技能
:param enemies: 表示该fighter对抗的敌人数
"""
self.__name = name
self.__blood = blood
self.__justice = justice
self.__kungfu = kungfu
self.__enemies = enemies
def attack(self):
kungfu, harm = None, 0
if self.__blood > 0:
kungfu = random.choice(list(self.__kungfu.keys()))
harm = self.__kungfu[kungfu]
return kungfu, harm
@property
def nam