如何使Python在序列中正常工作而不必每次重新启动?

如何使Python在序列中正常工作而不必每次重新启动?,python,pygame,Python,Pygame,我对python/pygame非常陌生,因此如果我没有使用正确的术语,请原谅我 我正在做一个游戏,玩家射击两个物体。当一个物体被击中时,生命值在时间上减少380%,在时间上减少1320%。我已经通过使用rand.choice和一个列表实现了这一点 我想重做它的设置方式,以便我确切地知道结果会是什么,以及以什么顺序 一位朋友建议使用一个长度范围,但他只知道如何使用不同的编码语言 这是我的代码: hits = pg.sprite.groupcollide(self.enemies, self.sha

我对python/pygame非常陌生,因此如果我没有使用正确的术语,请原谅我

我正在做一个游戏,玩家射击两个物体。当一个物体被击中时,生命值在时间上减少380%,在时间上减少1320%。我已经通过使用rand.choice和一个列表实现了这一点

我想重做它的设置方式,以便我确切地知道结果会是什么,以及以什么顺序

一位朋友建议使用一个长度范围,但他只知道如何使用不同的编码语言

这是我的代码:

hits = pg.sprite.groupcollide(self.enemies, self.shards, False, True)
for hit in hits:
   hit.health -= choice(RANDO)
   hit.vel = vec(0, 0)
   print('win')
RANDO的定义如下:

RANDO = [LOSE, LOSE, JACKPOT, LOSE, LOSE,
         LOSE, LOSE, LOSE, LOSE, JACKPOT]
损失=3,头奖=13

我希望每次射击敌人的结果都是我随机列出的。所以玩家只会在第3次和第10次中大奖。基本上,玩家每次射击时,所造成的伤害将根据列表中的下一步决定

我知道我必须摆脱rand.choice,我用它来让游戏攻击以一定的伤害和一定的百分比随机命中,但我不再需要它了


如果有人知道我应该使用什么或插入什么,我将不胜感激。我只需要它从列表中提取一个值,然后通过它来计算。

您可以保留一个计数器:

hit_count = 0
for hit in hits:
   hit.health -= RANDO[hit_count % len(RAND0)]
   hit_count += 1
   hit.vel = vec(0, 0)
   print('win')
如果列表中只有一个元素,只需根据需要
pop

for hit in hits:
   hit.health -= RANDO.pop()
   hit.vel = vec(0, 0)
   print('win')

功能检查:

LOSE = 3
JACKPOT = 13
RANDO = [LOSE, LOSE, JACKPOT, LOSE, LOSE,
         LOSE, LOSE, LOSE, LOSE, JACKPOT]

hit_count = 0
health = 50
for hit in range(10):
   health -= RANDO[hit_count % len(RANDO)]
   hit_count += 1
   print('new health', health)
输出:

new health 47
new health 44
new health 31        JACKPOT
new health 28
new health 25
new health 22
new health 19
new health 16
new health 13
new health 0         JACKPOT
new health 47
new health 44
new health 31
new health 28
new health 25
new health 22
new health 19
new health 16
new health 13
new health 0
我在第二个解决方案上的错误:
pop
从另一端起作用:

for hit in range(10):
   health -= RANDO.pop(0)
   print('new health', health)
输出:

new health 47
new health 44
new health 31        JACKPOT
new health 28
new health 25
new health 22
new health 19
new health 16
new health 13
new health 0         JACKPOT
new health 47
new health 44
new health 31
new health 28
new health 25
new health 22
new health 19
new health 16
new health 13
new health 0

您可以保留一个柜台:

hit_count = 0
for hit in hits:
   hit.health -= RANDO[hit_count % len(RAND0)]
   hit_count += 1
   hit.vel = vec(0, 0)
   print('win')
如果列表中只有一个元素,只需根据需要
pop

for hit in hits:
   hit.health -= RANDO.pop()
   hit.vel = vec(0, 0)
   print('win')

功能检查:

LOSE = 3
JACKPOT = 13
RANDO = [LOSE, LOSE, JACKPOT, LOSE, LOSE,
         LOSE, LOSE, LOSE, LOSE, JACKPOT]

hit_count = 0
health = 50
for hit in range(10):
   health -= RANDO[hit_count % len(RANDO)]
   hit_count += 1
   print('new health', health)
输出:

new health 47
new health 44
new health 31        JACKPOT
new health 28
new health 25
new health 22
new health 19
new health 16
new health 13
new health 0         JACKPOT
new health 47
new health 44
new health 31
new health 28
new health 25
new health 22
new health 19
new health 16
new health 13
new health 0
我在第二个解决方案上的错误:
pop
从另一端起作用:

for hit in range(10):
   health -= RANDO.pop(0)
   print('new health', health)
输出:

new health 47
new health 44
new health 31        JACKPOT
new health 28
new health 25
new health 22
new health 19
new health 16
new health 13
new health 0         JACKPOT
new health 47
new health 44
new health 31
new health 28
new health 25
new health 22
new health 19
new health 16
new health 13
new health 0

一种简单的方法是创建一个预期序列的列表(正如您已经使用
RANDO
所做的那样),然后使用来“循环”此序列:

λ python
Python 3.7.3 (v3.7.3:ef4ec6ed12, Mar 25 2019, 21:26:53) [MSC v.1916 32 bit (Intel)] on win32
Type "help", "copyright", "credits" or "license" for more information.
>>> RANDO = ['LOSE', 'LOSE', 'JACKPOT', 'LOSE', 'LOSE', 'LOSE', 'LOSE', 'LOSE', 'LOSE', 'LOSE', 'JACKPOT']
>>> from itertools import cycle
>>> RANDO_GEN = cycle(RANDO)
>>> for _ in range(25):
...     print(next(RANDO_GEN))
...
LOSE
LOSE
JACKPOT
LOSE
LOSE
LOSE
LOSE
LOSE
LOSE
LOSE
JACKPOT
LOSE
LOSE
JACKPOT
LOSE
LOSE
LOSE
LOSE
LOSE
LOSE
LOSE
JACKPOT
LOSE
LOSE
JACKPOT
>>>
cycle
返回一个生成器,使用
next
获取这个无限序列的下一个元素;因此,您只需将代码替换为:

LOSE = 3
JACKPOT = 13
RANDO = cycle([LOSE, LOSE, JACKPOT, LOSE, LOSE,
         LOSE, LOSE, LOSE, LOSE, JACKPOT])

...

for hit in hits:
    hit.health -= next(RANDO)
    hit.vel = vec(0, 0)
    print('win')

一种简单的方法是创建一个预期序列的列表(正如您已经使用
RANDO
所做的那样),然后使用来“循环”此序列:

λ python
Python 3.7.3 (v3.7.3:ef4ec6ed12, Mar 25 2019, 21:26:53) [MSC v.1916 32 bit (Intel)] on win32
Type "help", "copyright", "credits" or "license" for more information.
>>> RANDO = ['LOSE', 'LOSE', 'JACKPOT', 'LOSE', 'LOSE', 'LOSE', 'LOSE', 'LOSE', 'LOSE', 'LOSE', 'JACKPOT']
>>> from itertools import cycle
>>> RANDO_GEN = cycle(RANDO)
>>> for _ in range(25):
...     print(next(RANDO_GEN))
...
LOSE
LOSE
JACKPOT
LOSE
LOSE
LOSE
LOSE
LOSE
LOSE
LOSE
JACKPOT
LOSE
LOSE
JACKPOT
LOSE
LOSE
LOSE
LOSE
LOSE
LOSE
LOSE
JACKPOT
LOSE
LOSE
JACKPOT
>>>
cycle
返回一个生成器,使用
next
获取这个无限序列的下一个元素;因此,您只需将代码替换为:

LOSE = 3
JACKPOT = 13
RANDO = cycle([LOSE, LOSE, JACKPOT, LOSE, LOSE,
         LOSE, LOSE, LOSE, LOSE, JACKPOT])

...

for hit in hits:
    hit.health -= next(RANDO)
    hit.vel = vec(0, 0)
    print('win')

最终起作用的是使用了popleft元素

    '''for hit in hits:
          hit.health -= RANDO.pop()
          hit.vel = vec(0, 0)
          print('win')'''
在我希望它运行的列表之前添加deque

    '''LOSE = 3
       JACKPOT = 13
       RANDO = deque([LOSE, LOSE, JACKPOT, LOSE, LOSE,
                 LOSE, LOSE, LOSE, LOSE, JACKPOT])'''

现在,它按顺序一个接一个地浏览列表——在它从末尾开始向后运行之前。

最终运行的是使用了popleft元素

    '''for hit in hits:
          hit.health -= RANDO.pop()
          hit.vel = vec(0, 0)
          print('win')'''
在我希望它运行的列表之前添加deque

    '''LOSE = 3
       JACKPOT = 13
       RANDO = deque([LOSE, LOSE, JACKPOT, LOSE, LOSE,
                 LOSE, LOSE, LOSE, LOSE, JACKPOT])'''

现在,它按顺序一个接一个地浏览列表——在它从末尾开始并向后运行之前。

计数器在计时时没有选择JACKPOT值。RANDO.pop也没有按顺序做,但它似乎能满足我的需要。在第6次拍摄中,程序关闭时出现错误:indexError:pop from empty List计数器在拍摄时没有选择JACKPOT值。RANDO.pop也没有按顺序做,但它似乎能满足我的需要。在第6个镜头中,程序关闭时出现错误:indexer-ror:pop from empty list