設計基本思路:
- 設置一個抽象類(),用來初始化奧特曼與小怪獸的基本屬性();同時設置一個抽象類方法(),奧特曼與小怪獸對象皆可重載該方法設置自己的攻擊方法;設置一個函數用於判斷對象的
- 設置一個奧特曼類,繼承自類,調用父類的初始化方法初始化奧特曼的與屬性,同時設置自己的屬性(魔法值);重載方法對小怪獸造成隨機傷害(普通攻擊);依靠設置究極必殺技(_ )以及魔法羣體傷害(_ );設定普通攻擊之後自動恢復一定的魔法值()
- 設置一個小怪獸類,繼承自類,調用父類的初始化方法初始化小怪獸的與屬性;重載方法對奧特曼造成隨機傷害
- 當某一方陣亡則退出遊戲:奧特曼使用判斷是否存活,設置方法(_ _ )判斷全體小怪獸是否存活
- 每回合攻擊選擇一隻存活的小怪獸:設置方法(_ _)用於選擇存活的小怪獸
- 每回合結束顯示奧特曼與小怪獸的信息:設置方法( _)顯示信息
- 主體設置:(1)定義奧特曼與小怪獸對象,進行遊戲;(2)首先選擇一個活着的小怪獸併產生一個隨機值,當隨機值處於某個範圍內,奧特曼採用普通攻擊()攻擊小怪獸;(3)隨機值處於某個範圍並且魔法值足夠則觸發魔法傷害,對全體小怪獸造成傷害,否則使用魔法失敗;(4)隨機值處於另一個範圍且魔法值足夠觸發究極必殺技,否則使用普通攻擊;(5)若選定的小怪獸攻擊之後依然存活則回擊奧特曼;(6)回合結束顯示奧特曼與小怪獸信息;(7)當某一方陣亡則退出遊戲,宣佈某一方遊戲勝利
實現:
1.需要使用抽象類與抽象方法,從模塊導入以及包;需要使用隨機值,從模塊導入以及包
from abc import ABCMeta, abstractmethod
from random import randint, randrange
2.定義抽象類
class Fighter(object, metaclass=ABCMeta):
"""戰鬥者"""
#通過__slots__魔法限定對象可以綁定的成員變量
__slots__ = ('_name', '_hp')
def __init__(self, name, hp):
"""初始化方法
:param name: 名字
:param hp: 生命值
"""
self._name = name
self._hp = hp
#使用property裝飾器定義getter以及setter方法
@property
def name(self):
return self._name
@property
def hp(self):
return self._hp
@hp.setter
def hp(self, hp):
self._hp = hp if hp >= 0 else 0
@property
def alive(self):
return self._hp > 0
#抽象類方法
@abstractmethod
def attack(self, other):
"""攻擊
:param other: 被攻擊的對象
"""
pass
3.定義奧特曼()類,繼承自類
class Ultraman(Fighter):
"""奧特曼"""
__slots__ = ('_name', '_hp', '_mp')
def __init__(self, name, hp, mp):
"""初始化方法
:param name: 名字
:param hp: 生命值
:param mp: 魔法值
"""
super().__init__(name, hp)
self._mp = mp
#普通攻擊
def attack(self, other):
other.hp -= randint(15, 25)
def huge_attack(self, other):
"""究極必殺技(打掉對方至少50點或四分之三的血)
:param other: 被攻擊的對象
:return: 使用成功返回True否則返回False
"""
#放出大招,消耗50點魔法值造成傷害;魔法值不夠則採用普通攻擊
if self._mp >= 50:
self._mp -= 50
injury = other.hp * 3 // 4
injury = injury if injury >= 50 else 50
other.hp -= injury
return True
else:
self.attack(other)
return False
def magic_attack(self, others):
"""魔法攻擊
:param others: 被攻擊的羣體
:return: 使用魔法成功返回True否則返回False
"""
#釋放魔法攻擊,消耗20魔法點;魔法值不夠則使用魔法失敗
if self._mp >= 20:
self._mp -= 20
for temp in others:
if temp.alive:
temp.hp -= randint(10, 15)
return True
else:
return False
def resume(self):
"""恢復魔法值"""
incr_point = randint(1, 10)
self._mp += incr_point
return incr_point
#顯示奧特曼個人信息
def __str__(self):
return '~~~%s奧特曼~~~\n' % self._name + \
'生命值: %d\n' % self._hp + \
'魔法值: %d\n' % self._mp
4.定義小怪獸()類,繼承自類
class Monster(Fighter):
"""小怪獸"""
__slots__ = ('_name', '_hp')
def attack(self, other):
other.hp -= randint(10, 20)
#顯示小怪獸個人信息
def __str__(self):
return '~~~%s小怪獸~~~\n' % self._name + \
'生命值: %d\n' % self._hp
5.判斷全體小怪獸是否存活
def is_any_alive(monsters):
"""判斷有沒有小怪獸是活着的"""
for monster in monsters:
if monster.alive > 0:
return True
return False
6.選擇一隻活着的小怪獸
def select_alive_one(monsters):
"""選中一隻活着的小怪獸"""
monsters_len = len(monsters)
while True:
index = randrange(monsters_len)
monster = monsters[index]
if monster.alive > 0:
return monster
7.顯示奧特曼和小怪獸的信息
def display_info(ultraman, monsters):
"""顯示奧特曼和小怪獸的信息"""
print(ultraman)
for monster in monsters:
print(monster, end='')
8.主體邏輯
def main():
u = Ultraman('花花', 1000, 120)
m1 = Monster('狄仁傑', 250)
m2 = Monster('李元芳', 500)
m3 = Monster('王大錘', 750)
ms = [m1, m2, m3]
fight_round = 1
while u.alive and is_any_alive(ms):
print('=======第%02d回合======' % fight_round)
m = select_alive_one(ms)
skill = randint(1, 10)
if skill <= 6:
print('%s使用普通攻擊打了%s.' % (u.name, m.name))
u.attack(m)
print('%s的魔法值恢復了%d點.' % (u.name, u.resume()))
elif skill <= 9: # 30%的概率使用魔法攻擊(可能因魔法值不足而失敗)
if u.magic_attack(ms):
print('%s使用了魔法攻擊.' % u.name)
else:
print('%s使用魔法失敗.' % u.name)
else: # 10%的概率使用究極必殺技(如果魔法值不足則使用普通攻擊)
if u.huge_attack(m):
print('%s使用究極必殺技虐了%s.' % (u.name, m.name))
else:
print('%s使用普通攻擊打了%s.' % (u.name, m.name))
print('%s的魔法值恢復了%d點.' % (u.name, u.resume()))
if m.alive > 0: # 如果選中的小怪獸沒有死就回擊奧特曼
print('%s回擊了%s.' % (m.name, u.name))
m.attack(u)
display_info(u, ms) # 每個回合結束後顯示奧特曼和小怪獸的信息
fight_round += 1
print('\n========戰鬥結束!========\n')
if u.alive > 0:
print('%s奧特曼勝利!\n' % u.name)
else:
print('小怪獸勝利!\n')
if __name__ == '__main__':
main()
測試: