创建一个包含子弹、弹匣、枪和人四个类的模型,实现它们之间的交互逻辑。这个模型将允许人进行压子弹、装弹匣、开枪射击等操作,并且会处理被击中后的生命值变化。
-
类的设计:
Bullet:包含伤害值属性Magazine:管理子弹的存储,有容量限制,支持添加和取出子弹Gun:可以装载弹匣,支持发射子弹Person:有生命值和存活状态,能执行压子弹、装弹匣、开枪等操作
-
交互逻辑:
- 人可以将子弹压入弹匣(受弹匣容量限制)
- 人可以将弹匣装入枪(枪一次只能装一个弹匣)
- 人可以用枪射击目标,目标会受到伤害
- 当生命值小于等于 0 时,人会死亡
-
测试场景:
代码底部包含了一个测试场景,创建了两个士兵,演示了从装弹、装弹匣到射击的完整过程,展示了生命值减少直到死亡的整个过程。
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()

被折叠的 条评论
为什么被折叠?



