python游戏对象_python中的口袋妖怪游戏:类/对象,战斗和deepcopy

我是python的新手,我正在尝试做一个Pokemon游戏(比如gameboy和nds游戏)。我已经创建了口袋妖怪和训练师课程,我想实现战斗力学。我以为它运行得很好,但后来我发现,如果我输了这场战斗,程序就会进入一个无限循环。在

我尝试了很多方法来发现这个错误,我发现当它退出“while alive(pokemon1)and alive(pokemon2)”循环时,pokemon1的hp会返回到全hp,但是pokemon2仍然保持当前的hp(我已经打印了一张图来显示它)。这对我来说毫无意义,因为这两个教练的代码是一样的。有人知道为什么会这样吗?我希望它继续与目前的生命口袋妖怪在循环和战斗结束。在

下面是我的代码示例:import copy

import random

class Pokemon(object):

def __init__(self, name, hp):

self.name = name

self.hp = hp

def ataque(self, oponent):

oponent.hp = oponent.hp - 150 #just for a test

class Trainer(object):

def __init__(self, name, *pokemon):

self.name = name

self.pokemon, self.pokemonname = [], []

for pkmn in pokemon:

self.pokemon.append(copy.deepcopy(pkmn))

self.pokemonname.append(pkmn.name)

weavile = Pokemon ('Weavile', 150) #change the hp to more than 150 if you want to win

garchomp = Pokemon ('Garchomp', 250)

roserade = Pokemon ('Roserade', 160)

ambipom = Pokemon ('Ambipom', 160)

me = Trainer('You', weavile) #or choose ambipom to win

cynthia = Trainer('Cynthia', garchomp)

def alive(pokemon): #check if the pokemon is alive

if pokemon.hp>0:

return True

if pokemon.hp<=0:

pokemon.hp=0

return False

def battle(trainer1, trainer2): #battle between two trainers

fight1, fight2 = True, True

while fight1 and fight2:

print ('Choose a pokemon:', trainer1.pokemonname)

pokemon1 = eval(input())

while not alive(pokemon1):

print (pokemon1.name, 'is out of batlle. Choose another pokemon')

pokemon1 = eval(input())

pokemon2 = random.choice(trainer2.pokemon)

while not alive(pokemon2):

pokemon2 = random.choice(trainer2.pokemon)

print (trainer1.name, 'chose', pokemon1.name, '\n', trainer2.name, 'chose', pokemon2.name)

while alive(pokemon1) and alive(pokemon2):

pokemon1.ataque(pokemon2)

if alive(pokemon2):

pokemon2.ataque(pokemon1)

print (pokemon1.name, pokemon1.hp)

print (pokemon2.name, pokemon2.hp)

print (trainer1.pokemon[0].name, trainer1.pokemon[0].hp) #here its returning the original hp

print (trainer2.pokemon[0].name, trainer2.pokemon[0].hp) #here its returning the current hp, as it should

if not any(alive(pokemon) for pokemon in trainer1.pokemon):

fight1 = False

if not any(alive(pokemon) for pokemon in trainer2.pokemon):

fight2 = False

battle(me, cynthia)

如果你按照我在这里写的方式运行代码,你需要在列表中选择一个口袋妖怪(只有一个:weavile-简化),所以只需输入weavile。在那之后,Weaville将攻击,然后被garchomp攻击。Weavile在第一次命中时会被击败(0点生命值),但是在循环“while alive(pokemon1)…它会显示Weavile还有150点生命,它会继续要求你选择一个口袋妖怪,即使它已经死了。在

如果你想赢:在“我”对象中选择双刃剑而不是武器,或者在武器对象中将武器血量更改为150以上。如果你这样做,它会按我的意愿运行,结束战斗。在

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值