20241116 2024-2025-2 《Python程序设计》实验四报告

课程名称:《Python程序设计》
专业:计算机科学与技术
姓名:魏铼
学号:20241116
指导教师:王志强
日期:2024年6月9日
一.实验内容
用python写一个简单的闯关小游戏
二、实验过程及结果

  1. 实验过程

我先设计了三种职业,分别是战士、法师和盗贼,他们有不同的侧重点,能发挥不同的作用
战士:站桩打,靠药水回血
法师:靠技能爆发,可以远程消耗
盗贼:多打暴击,偷袭攒钱
以下是编写选择三种职业的代码

点击查看代码
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()  
3、运行结果 ![](https://img2024.cnblogs.com/blog/3618036/202506/3618036-20250610202327735-1419615155.png) ![](https://img2024.cnblogs.com/blog/3618036/202506/3618036-20250610202336541-2013014332.png) ![](https://img2024.cnblogs.com/blog/3618036/202506/3618036-20250610202342949-1788654589.png)

三、遇到的问题及解决过程
1、没什么灵感来做这个小游戏就去看了看微信广告推给我的玩意
2、有部分代码不会实现就问了ai

四.课程总结
王老师的课程幽默风趣、内容丰富,而且您能理解我们学生的感受,这些从您能设置作业补交、理解我们请假而且能和我们打成一片就能看出来。通过一个学期的python学习,我能用python语言写出一个小游戏,这是我一起想都不敢想的。最后,感谢王老师半年来的教导,谢谢您!

点击查看代码
posted @ 2025-06-10 20:35  Futuree  阅读(17)  评论(0)    收藏  举报