小白的自我救赎:今日份python学习

又重看了一遍类和对象,感觉不会的地方还是有不少,通过代码来熟悉吧

练习:奥特曼打小怪兽
奥特曼:名字,血量,魔法值,魔法攻击,普通攻击,大招,魔法值可以恢复
怪兽:名字,血量,普通攻击
公共的:名字,血量,是否存活,攻击

from random import random,randint
from abc import ABCMeta,abstractmethod
#通过abc模块的ABCMeta元类和abstractmethod包装器来达到抽象类的效果,抽象类不能实例化,专门为了让别的类继承它
class Fighter(object, metaclass=ABCMeta):
#通过__slots__魔法限定对象可以绑定的成员变量
	__slots__ = ('_name','_hp')
	def __init__(self,name,hp):
		self._name = name
		self._hp = hp
	@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 True if self._hp > 0 else False
	@abstractmethod
	def attack(self,other):
		pass


class ultaman(Fighter):
	
	__slots__ = ('_name','_hp','_mp')
	
	def __init__(self,name,hp,mp):
		super().__init__(name,hp)
		self._mp = mp
	
	def attack(self,other):
		other.hp -= randint(10,20)
	
	def huge_attack(self,other):
		if self._mp >= 50:
			self._mp -=50
			injury = other.hp * 3 // 4
			other.hp -= 50 if injury < 50 else injury
			return True
		else:
			return False

	def magic_attack(self,others):
		if self._mp >= 20:
			self._mp -=20
			for other in others:
				if other.alive:
					other.hp -=randint(10,15)
			return True
		return False
	
	def resume(self):
		self._mp +=randint(1,20)
		return self._mp
	
	def show(self):
		print(self.name,'奥特曼',' 生命值:',self.hp,'魔法值:',self._mp)


class Monster(Fighter):
	__slots__ = ('_name','_hp')
	
	def attack(self,other):
		other.hp -= randint(10,20)

	def show(self):
		print(self._name,'小怪兽',' 生命值:',self._hp)


def is_any_alive(monsters):
	for monster in monsters:
		if monster.alive:
			return True
	return False

def select_monster(monsters):
	while True:
		for monster in monsters:
			if monster.alive:
				return monster


def display_info(ultaman,monsters):
	print(ultaman.show())
	for monster in monsters:
		print(monster.show())

def main():
	u = ultaman('骆昊', 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('第',fight_round,'回合')
		m = select_monster(ms)
		skill = randint(1, 10)  # 通过随机数选择使用哪种技能
		if skill < 6:
			print('%s使用普通攻击打了%s.' % (u.name, m.name))
			u.attack(m)
			u.resume()
			print('%s的魔法值恢复了' % (u.name))
		elif skill <= 9:
			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('使用大招失败.' )
        			u.resume()
        			print('%s的魔法值恢复.' % (u.name))
        	if m.alive > 0:
        		m.attack(u)
        		print('%s回击了%s.' % (m.name, u.name))
        	display_info(u, ms)  # 每个回合结束后显示奥特曼和小怪兽的信息
		fight_round += 1
	print('回合结束')
	if u.alive > 0:
    		print('%s奥特曼胜利!' % u.name)
	else:
		print('小怪兽胜利!')
	
if __name__ == '__main__':
    main()


			




					
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值