Python⼩游戏之奥特曼打⼩怪兽
开始Python的复习!(以前学的忘了好多-_-)
主要参考的是Github上的⼀个项⽬:
⽂章主要是对该项⽬中的内容进⾏学习穿插⼀点⾃⼰的学习想法等内容~
基本上就是照着链接中的内容复现了⼀遍。
总结
要想⽤程序说清楚或者复现⼀件事情,⾸先要对事件进⾏梳理。
事件涉及到什么对象,对象包含哪些属性。
在实现或者说对抗过程中,有哪些东西需要作出改变?
编写相应⽅法函数来实现这些功能时,需要什么?最后以什么形式呈现。
上层架构很重要。
以奥特曼打⼩怪兽为例:
1. ⼏个奥特曼,⼏个怪兽
2. 奥特曼打怪兽:攻击⼒,⾎量
3. 怪兽回击奥特曼:攻击⼒,⾎量
4. 什么时候游戏结束?
# !/usr/bin/env python
# 第⼀句话:配置解释器路径
# -*- coding:utf-8 -*-
# 第⼆句话:⽂件编码
# 案例1:奥特曼打⼩怪兽
from abc import ABCMeta, abstractmethod
from random import randint, randrange
class Fighter(object, metaclass=ABCMeta):
__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 self._hp > 0
@abstractmethod
def attack(self, other):
pass
class Ultraman(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(15, 25)
def huge_attack(self, other):
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
"""
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
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
def is_any_alive(monsters):
"""判断有没有⼩怪兽是活着的"""
for monster in monsters:
if monster.alive > 0:
return True
return False
def select_alive_one(monsters):
"""选中⼀只活着的⼩怪兽"""
monsters_len = len(monsters)
while True:
index = randrange(monsters_len)
monster = monsters[index]
if monster.alive > 0:
return monster
def display_info(ultraman, monsters):
"""显⽰奥特曼和⼩怪兽的信息"""
print(ultraman)
for monster in monsters:
print(monster, end='')
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: # 60%的概率使⽤普通攻击
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:
python可以做什么游戏print('%s奥特曼胜利!' % u.name)
else:
print('⼩怪兽胜利!')
if __name__ == '__main__':
main()
# 在编写此类代码中,⾸先要明确所有对象中有哪些共同点?事件中涉及了哪些需要编写的⽅法,按照事件的流程仔细梳理清楚。
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论