Python 简单模仿组装、射击的动作

创建一个包含子弹、弹匣、枪和人四个类的模型,实现它们之间的交互逻辑。这个模型将允许人进行压子弹、装弹匣、开枪射击等操作,并且会处理被击中后的生命值变化。

  1. 类的设计

    • Bullet:包含伤害值属性
    • Magazine:管理子弹的存储,有容量限制,支持添加和取出子弹
    • Gun:可以装载弹匣,支持发射子弹
    • Person:有生命值和存活状态,能执行压子弹、装弹匣、开枪等操作
  2. 交互逻辑

    • 人可以将子弹压入弹匣(受弹匣容量限制)
    • 人可以将弹匣装入枪(枪一次只能装一个弹匣)
    • 人可以用枪射击目标,目标会受到伤害
    • 当生命值小于等于 0 时,人会死亡
  3. 测试场景
    代码底部包含了一个测试场景,创建了两个士兵,演示了从装弹、装弹匣到射击的完整过程,展示了生命值减少直到死亡的整个过程。

from __future__ import annotations
from typing import Optional, List


class Bullet:
    """子弹类,包含伤害属性"""
    def __init__(self, damage: int = 20) -> None:
        self.damage: int = damage  # 子弹的伤害值


class Magazine:
    """弹匣类,用于容纳子弹"""
    def __init__(self, capacity: int = 10) -> None:
        self.capacity: int = capacity  # 弹匣容量
        self.bullets: List[Bullet] = []  # 存储子弹的列表
    
    def add_bullet(self, bullet: Bullet) -> bool:
        """向弹匣中添加子弹"""
        if len(self.bullets) < self.capacity:
            self.bullets.append(bullet)
            return True
        return False  # 弹匣已满,无法添加
    
    def remove_bullet(self) -> Optional[Bullet]:
        """从弹匣中取出一颗子弹"""
        if self.bullets:
            return self.bullets.pop()  # 弹出最后一颗子弹
        return None  # 弹匣为空,无法取出
    
    def is_full(self) -> bool:
        """检查弹匣是否已满"""
        return len(self.bullets) == self.capacity
    
    def is_empty(self) -> bool:
        """检查弹匣是否为空"""
        return len(self.bullets) == 0
    
    def __str__(self) -> str:
        return f"弹匣(容量: {len(self.bullets)}/{self.capacity})"


class Gun:
    """枪类,用于发射子弹"""
    def __init__(self) -> None:
        self.current_magazine: Optional[Magazine] = None  # 当前装载的弹匣
    
    def load_magazine(self, magazine: Magazine) -> bool:
        """装弹匣"""
        if self.current_magazine is None:
            self.current_magazine = magazine
            return True
        return False  # 已经有弹匣,无法再装
    
    def unload_magazine(self) -> Optional[Magazine]:
        """卸弹匣"""
        magazine = self.current_magazine
        self.current_magazine = None
        return magazine
    
    def shoot(self) -> Optional[Bullet]:
        """发射一颗子弹"""
        if self.current_magazine and not self.current_magazine.is_empty():
            return self.current_magazine.remove_bullet()
        return None  # 没有弹匣或弹匣为空,无法发射
    
    def __str__(self) -> str:
        if self.current_magazine:
            return f"枪(已装{self.current_magazine})"
        return "枪(未装弹匣)"


class Person:
    """人类,能够操作枪和子弹"""
    def __init__(self, name: str, health: int = 100) -> None:
        self.name: str = name  # 姓名
        self.health: int = health  # 生命值
        self.is_alive: bool = True  # 是否存活
    
    def load_bullet_into_magazine(self, bullet: Bullet, magazine: Magazine) -> bool:
        """将子弹压入弹匣"""
        if magazine.add_bullet(bullet):
            print(f"{self.name}将子弹压入{magazine}")
            return True
        print(f"{self.name}无法将子弹压入{magazine}(已装满)")
        return False
    
    def load_magazine_into_gun(self, magazine: Magazine, gun: Gun) -> bool:
        """将弹匣装入枪"""
        if gun.load_magazine(magazine):
            print(f"{self.name}将{magazine}装入{gun}")
            return True
        print(f"{self.name}无法将{magazine}装入{gun}(已有弹匣)")
        return False
    
    def shoot(self, gun: Gun, target: Person) -> bool:
        """用枪射击目标"""
        if not self.is_alive:
            print(f"{self.name}已经死亡,无法射击")
            return False
            
        bullet: Optional[Bullet] = gun.shoot()
        if bullet:
            print(f"{self.name}开枪射击{target.name}")
            target.take_damage(bullet.damage)
            return True
        print(f"{self.name}尝试射击,但{gun}")
        return False
    
    def take_damage(self, damage: int) -> None:
        """受到伤害"""
        self.health -= damage
        print(f"{self.name}受到{damage}点伤害,剩余生命值: {self.health}")
        
        if self.health <= 0 and self.is_alive:
            self.is_alive = False
            print(f"{self.name}已死亡")
    
    def __str__(self) -> str:
        status: str = "存活" if self.is_alive else "死亡"
        return f"{self.name}(生命值: {self.health}, 状态: {status})"


# 测试代码
if __name__ == "__main__":
    # 创建人物
    soldier1: Person = Person("士兵甲")
    soldier2: Person = Person("士兵乙")
    
    # 创建子弹
    bullets: List[Bullet] = [Bullet() for _ in range(7)]
    
    # 创建弹匣
    magazine: Magazine = Magazine(capacity=5)
    
    # 创建枪
    gun: Gun = Gun()
    
    print("初始状态:")
    print(soldier1)
    print(soldier2)
    print(magazine)
    print(gun)
    print()
    
    # 士兵甲装弹
    for bullet in bullets:
        soldier1.load_bullet_into_magazine(bullet, magazine)
    
    print("\n装弹后:")
    print(magazine)
    print()
    
    # 士兵甲装弹匣
    soldier1.load_magazine_into_gun(magazine, gun)
    
    print("\n装弹匣后:")
    print(gun)
    print()
    
    # 士兵甲射击士兵乙
    for _ in range(6):  # 尝试射击6次,弹匣只有5发子弹
        soldier1.shoot(gun, soldier2)
        print(gun)
        print(soldier2)
        print()
    

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值