20241116 2024-2025-2 《Python程序设计》实验四报告
课程名称:《Python程序设计》
专业:计算机科学与技术
姓名:魏铼
学号:20241116
指导教师:王志强
日期:2024年6月9日
一.实验内容
用python写一个简单的闯关小游戏
二、实验过程及结果
- 实验过程
我先设计了三种职业,分别是战士、法师和盗贼,他们有不同的侧重点,能发挥不同的作用
战士:站桩打,靠药水回血
法师:靠技能爆发,可以远程消耗
盗贼:多打暴击,偷袭攒钱
以下是编写选择三种职业的代码
点击查看代码
class Player:
def __init__(self, job):
self.job = job
if job == Job.WARRIOR: #战士属性
self.health = 120
self.attack = 15
self.defense = 8
self.magic_power = 0
elif job == Job.MAGE: #法师属性
self.health = 80
self.attack = 10
self.defense = 5
self.magic_power = 20 #魔力
elif job == Job.THIEF: #盗贼属性
self.health = 90
self.attack = 12
self.defense = 6
self.crit_rate = 30 #暴击率30%
self.steal_prob = 20 #偷取金币概率20%
self.gold = 0
self.items = {"药水": 3}#初始自带三瓶药
点击查看代码
def show_status(self):
if self.job == Job.THIEF:
print(f"\n【{self.job.value}】生命值:{self.health} | 攻击力:{self.attack} | 防御力:{self.defense} | 暴击率:{self.crit_rate}% | 偷取概率:{self.steal_prob}% | 金币:{self.gold}") !盗贼与其他职业多了点东西
else:
print(f"\n【{self.job.value}】生命值:{self.health} | 攻击力:{self.attack} | 防御力:{self.defense} | 魔法强度:{getattr(self, 'magic_power', 0)} | 金币:{self.gold}")
print(f"道具:{', '.join([f'{k}x{v}' for k, v in self.items.items()])}")
再就是药水的使用,不同职业用了药水之后回复效果也不同
点击查看代码
def use_item(self, item):
if item != "药水":
print("未知道具!")
return
# 各职业药水恢复量
heal = {
Job.WARRIOR: 60,
Job.MAGE: 50,
Job.THIEF: 55
}[self.job]
max_health = {
Job.WARRIOR: 120,
Job.MAGE: 80,
Job.THIEF: 90
}[self.job]
if self.items[item] > 0:
self.health = min(self.health + heal, max_health)
self.items[item] -= 1
print(f"使用药水!恢复{heal}生命值,当前生命值:{self.health}")
else:
print(f"你没有{item}了!")
盗贼和法师的技能
点击查看代码
def cast_spell(self, monster):
if self.job == Job.MAGE:
# 法师技能:魔法飞弹
damage = self.magic_power + random.randint(5, 10)
monster.health -= damage
print(f"你释放魔法飞弹!对{monster.name}造成{damage}点魔法伤害!")
elif self.job == Job.THIEF:
# 盗贼技能:暗影突袭(提升暴击+偷取概率,立即攻击一次)
print("你释放暗影突袭!暴击率提升至50%,偷取概率提升至40%!")
original_crit = self.crit_rate
original_steal = self.steal_prob
self.crit_rate = 50
self.steal_prob = 40
self.thief_attack(monster) # 发动一次连击
# 技能结束后重置属性
self.crit_rate = original_crit
self.steal_prob = original_steal
点击查看代码
def thief_attack(self, monster):
#盗贼专属攻击:连击+暴击+偷取
if self.job != Job.THIEF:
return
damage = 0
crit_count = 0
# 每回合攻击2次
for _ in range(2):
# 计算暴击
if random.randint(1, 100) <= self.crit_rate:
single_damage = self.attack * 2
crit_count += 1
else:
single_damage = self.attack
damage += single_damage
# 计算偷取金币
if random.randint(1, 100) <= self.steal_prob:
steal_gold = random.randint(5, 10)
self.gold += steal_gold
print(f"偷取{steal_gold}金币!当前金币:{self.gold}")
monster.health -= damage
print(f"你发动盗贼连击!造成{damage}点伤害(暴击{crit_count}次)")
点击查看代码
class Monster:
def __init__(self, name, health, attack, reward_gold):
self.name = name
self.health = health
self.attack = attack
self.reward_gold = reward_gold
def attack_player(self, player):
"""怪物攻击玩家(防御抵消伤害)"""
damage = max(0, self.attack - player.defense)
player.health -= damage
print(f"{self.name}攻击你!造成{damage}点伤害!")
class Skeleton(Monster):
def __init__(self):
super().__init__("骷髅兵", 30, 8, 10)
class Goblin(Monster):
def __init__(self):
super().__init__("哥布林", 40, 12, 15)
class Boss(Monster):
def __init__(self):
super().__init__("地牢领主", 100, 20, 50)
最后还有一些随机事件
点击查看代码
def generate_event(player, floor):
"""随机生成关卡事件"""
event_type = random.choice(["战斗", "宝箱", "陷阱"])
if event_type == "战斗":
# 第3关固定BOSS,其他关随机小怪
if floor == 3:
monster = Boss()
else:
monster = random.choice([Skeleton(), Goblin()])
print(f"\n【第{floor}关】你遇到了一只{monster.name}!")
fight(player, monster)
elif event_type == "宝箱":
print(f"\n【第{floor}关】发现一个宝箱!")
treasure = random.choice(["金币", "药水", "攻击力卷轴", "防御力卷轴"])
if treasure == "金币":
gain = random.randint(20, 50)
player.gold += gain
print(f"获得{gain}金币!当前金币:{player.gold}")
elif treasure == "药水":
player.items["药水"] += 1
print(f"获得1瓶药水!当前药水数量:{player.items['药水']}")
elif treasure == "攻击力卷轴":
player.attack += 5
print(f"攻击力+5!当前攻击力:{player.attack}")
elif treasure == "防御力卷轴":
player.defense += 3
print(f"防御力+3!当前防御力:{player.defense}")
elif event_type == "陷阱":
print(f"\n【第{floor}关】触发陷阱!损失20生命值!")
player.health -= 20
if player.health < 0:
player.health = 0
战斗逻辑
点击查看代码
def fight(player, monster):
"""战斗流程(支持职业专属操作)"""
while player.health > 0 and monster.health > 0:
player.show_status()
print(f"{monster.name}的生命值:{monster.health}")
action = input("\n选择行动:1.普通攻击 2.使用药水 3.释放技能 4.查看状态 > ")
if action == "1":
# 不同职业攻击逻辑
if player.job == Job.THIEF:
player.thief_attack(monster)
else:
damage = player.attack
monster.health -= damage
print(f"你攻击了{monster.name}!造成{damage}点伤害!")
if monster.health <= 0:
print(f"\n击败{monster.name}!获得{monster.reward_gold}金币!")
player.gold += monster.reward_gold
break
# 怪物反击
monster.attack_player(player)
if player.health <= 0:
print("\n你被击败了...游戏结束!")
break
elif action == "2":
player.use_item("药水")
elif action == "3":
player.cast_spell(monster)
# 技能释放后怪物反击(若怪物存活)
if monster.health > 0:
monster.attack_player(player)
if player.health <= 0:
print("\n你被击败了...游戏结束!")
break
elif action == "4":
player.show_status()
else:
print("无效选择!请重新输入。")
time.sleep(1) # 控制战斗节奏
点击查看代码
def choose_job():
"""角色选择界面"""
print("请选择你的职业:")
print("1. 战士(生命120,攻击15,防御8,药水恢复60生命)")
print("2. 法师(生命80,攻击10,防御5,可释放魔法飞弹)")
print("3. 盗贼(生命90,攻击12,防御6,可连击、暴击、偷取金币)")
while True:
choice = input("输入数字选择职业(1/2/3)> ")
if choice == "1":
return Job.WARRIOR
elif choice == "2":
return Job.MAGE
elif choice == "3":
return Job.THIEF
else:
print("无效选择!请重新输入。")
def main():
# 选择职业
job = choose_job()
player = Player(job)
print(f"\n欢迎{player.job.value}!你将挑战3层地牢,击败最终BOSS!")
for floor in range(1, 4):
print(f"\n================ 第{floor}关开始 ================")
generate_event(player, floor)
if player.health <= 0:
break
input("\n按回车键进入下一关...")
if player.health > 0:
print("\n================ 最终BOSS战! ================")
boss = Boss()
fight(player, boss)
if player.health > 0:
print("\n🎉 恭喜你!击败地牢领主,通关成功!")
player.show_status()
else:
print("\n游戏结束,下次再来挑战吧~")
if __name__ == "__main__":
main()
2、实验源代码
点击查看代码
import random
import time
from enum import Enum
# ------------------- 定义职业枚举 -------------------
class Job(Enum):
WARRIOR = "战士"
MAGE = "法师"
THIEF = "盗贼"
# ------------------- 角色类(含职业专属属性和技能) -------------------
class Player:
def __init__(self, job):
self.job = job
# 不同职业初始属性
if job == Job.WARRIOR:
self.health = 120
self.attack = 15
self.defense = 8
self.magic_power = 0
elif job == Job.MAGE:
self.health = 80
self.attack = 10
self.defense = 5
self.magic_power = 20
elif job == Job.THIEF:
self.health = 90
self.attack = 12
self.defense = 6
self.crit_rate = 30 # 暴击率30%
self.steal_prob = 20 # 偷取金币概率20%
self.gold = 0
self.items = {"药水": 3} # 初始3瓶药水
def show_status(self):
"""显示角色状态(不同职业显示专属属性)"""
if self.job == Job.THIEF:
print(f"\n【{self.job.value}】生命值:{self.health} | 攻击力:{self.attack} | 防御力:{self.defense} | 暴击率:{self.crit_rate}% | 偷取概率:{self.steal_prob}% | 金币:{self.gold}")
else:
print(f"\n【{self.job.value}】生命值:{self.health} | 攻击力:{self.attack} | 防御力:{self.defense} | 魔法强度:{getattr(self, 'magic_power', 0)} | 金币:{self.gold}")
print(f"道具:{', '.join([f'{k}x{v}' for k, v in self.items.items()])}")
def use_item(self, item):
"""使用道具(不同职业药水恢复量不同)"""
if item != "药水":
print("未知道具!")
return
# 各职业药水恢复量
heal = {
Job.WARRIOR: 60,
Job.MAGE: 50,
Job.THIEF: 55
}[self.job]
max_health = {
Job.WARRIOR: 120,
Job.MAGE: 80,
Job.THIEF: 90
}[self.job]
if self.items[item] > 0:
self.health = min(self.health + heal, max_health)
self.items[item] -= 1
print(f"使用药水!恢复{heal}生命值,当前生命值:{self.health}")
else:
print(f"你没有{item}了!")
def cast_spell(self, monster):
"""释放技能(法师/盗贼专属)"""
if self.job == Job.MAGE:
# 法师技能:魔法飞弹
damage = self.magic_power + random.randint(5, 10)
monster.health -= damage
print(f"你释放魔法飞弹!对{monster.name}造成{damage}点魔法伤害!")
elif self.job == Job.THIEF:
# 盗贼技能:暗影突袭(提升暴击+偷取概率,立即攻击一次)
print("你释放暗影突袭!暴击率提升至50%,偷取概率提升至40%!")
original_crit = self.crit_rate
original_steal = self.steal_prob
self.crit_rate = 50
self.steal_prob = 40
self.thief_attack(monster) # 发动一次连击
# 技能结束后重置属性
self.crit_rate = original_crit
self.steal_prob = original_steal
def thief_attack(self, monster):
"""盗贼专属攻击:连击+暴击+偷取"""
if self.job != Job.THIEF:
return
damage = 0
crit_count = 0
# 每回合攻击2次
for _ in range(2):
# 计算暴击
if random.randint(1, 100) <= self.crit_rate:
single_damage = self.attack * 2
crit_count += 1
else:
single_damage = self.attack
damage += single_damage
# 计算偷取金币
if random.randint(1, 100) <= self.steal_prob:
steal_gold = random.randint(5, 10)
self.gold += steal_gold
print(f"偷取{steal_gold}金币!当前金币:{self.gold}")
monster.health -= damage
print(f"你发动盗贼连击!造成{damage}点伤害(暴击{crit_count}次)")
# ------------------- 怪物类(父类+具体怪物子类) -------------------
class Monster:
def __init__(self, name, health, attack, reward_gold):
self.name = name
self.health = health
self.attack = attack
self.reward_gold = reward_gold
def attack_player(self, player):
"""怪物攻击玩家(防御抵消伤害)"""
damage = max(0, self.attack - player.defense)
player.health -= damage
print(f"{self.name}攻击你!造成{damage}点伤害!")
class Skeleton(Monster):
def __init__(self):
super().__init__("骷髅兵", 30, 8, 10)
class Goblin(Monster):
def __init__(self):
super().__init__("哥布林", 40, 12, 15)
class Boss(Monster):
def __init__(self):
super().__init__("地牢领主", 100, 20, 50)
# ------------------- 关卡事件生成(战斗/宝箱/陷阱) -------------------
def generate_event(player, floor):
"""随机生成关卡事件"""
event_type = random.choice(["战斗", "宝箱", "陷阱"])
if event_type == "战斗":
# 第3关固定BOSS,其他关随机小怪
if floor == 3:
monster = Boss()
else:
monster = random.choice([Skeleton(), Goblin()])
print(f"\n【第{floor}关】你遇到了一只{monster.name}!")
fight(player, monster)
elif event_type == "宝箱":
print(f"\n【第{floor}关】发现一个宝箱!")
treasure = random.choice(["金币", "药水", "攻击力卷轴", "防御力卷轴"])
if treasure == "金币":
gain = random.randint(20, 50)
player.gold += gain
print(f"获得{gain}金币!当前金币:{player.gold}")
elif treasure == "药水":
player.items["药水"] += 1
print(f"获得1瓶药水!当前药水数量:{player.items['药水']}")
elif treasure == "攻击力卷轴":
player.attack += 5
print(f"攻击力+5!当前攻击力:{player.attack}")
elif treasure == "防御力卷轴":
player.defense += 3
print(f"防御力+3!当前防御力:{player.defense}")
elif event_type == "陷阱":
print(f"\n【第{floor}关】触发陷阱!损失20生命值!")
player.health -= 20
if player.health < 0:
player.health = 0
# ------------------- 战斗核心逻辑 -------------------
def fight(player, monster):
"""战斗流程(支持职业专属操作)"""
while player.health > 0 and monster.health > 0:
player.show_status()
print(f"{monster.name}的生命值:{monster.health}")
action = input("\n选择行动:1.普通攻击 2.使用药水 3.释放技能 4.查看状态 > ")
if action == "1":
# 不同职业攻击逻辑
if player.job == Job.THIEF:
player.thief_attack(monster)
else:
damage = player.attack
monster.health -= damage
print(f"你攻击了{monster.name}!造成{damage}点伤害!")
if monster.health <= 0:
print(f"\n击败{monster.name}!获得{monster.reward_gold}金币!")
player.gold += monster.reward_gold
break
# 怪物反击
monster.attack_player(player)
if player.health <= 0:
print("\n你被击败了...游戏结束!")
break
elif action == "2":
player.use_item("药水")
elif action == "3":
player.cast_spell(monster)
# 技能释放后怪物反击(若怪物存活)
if monster.health > 0:
monster.attack_player(player)
if player.health <= 0:
print("\n你被击败了...游戏结束!")
break
elif action == "4":
player.show_status()
else:
print("无效选择!请重新输入。")
time.sleep(1) # 控制战斗节奏
# ------------------- 主流程(角色选择+关卡推进) -------------------
def choose_job():
"""角色选择界面"""
print("请选择你的职业:")
print("1. 战士(生命120,攻击15,防御8,药水恢复60生命)")
print("2. 法师(生命80,攻击10,防御5,可释放魔法飞弹)")
print("3. 盗贼(生命90,攻击12,防御6,可连击、暴击、偷取金币)")
while True:
choice = input("输入数字选择职业(1/2/3)> ")
if choice == "1":
return Job.WARRIOR
elif choice == "2":
return Job.MAGE
elif choice == "3":
return Job.THIEF
else:
print("无效选择!请重新输入。")
def main():
# 选择职业
job = choose_job()
player = Player(job)
print(f"\n欢迎{player.job.value}!你将挑战3层地牢,击败最终BOSS!")
for floor in range(1, 4):
print(f"\n================ 第{floor}关开始 ================")
generate_event(player, floor)
if player.health <= 0:
break
input("\n按回车键进入下一关...")
if player.health > 0:
print("\n================ 最终BOSS战! ================")
boss = Boss()
fight(player, boss)
if player.health > 0:
print("\n🎉 恭喜你!击败地牢领主,通关成功!")
player.show_status()
else:
print("\n游戏结束,下次再来挑战吧~")
if __name__ == "__main__":
main()
三、遇到的问题及解决过程
1、没什么灵感来做这个小游戏就去看了看微信广告推给我的玩意
2、有部分代码不会实现就问了ai
四.课程总结
王老师的课程幽默风趣、内容丰富,而且您能理解我们学生的感受,这些从您能设置作业补交、理解我们请假而且能和我们打成一片就能看出来。通过一个学期的python学习,我能用python语言写出一个小游戏,这是我一起想都不敢想的。最后,感谢王老师半年来的教导,谢谢您!
浙公网安备 33010602011771号