有没有办法进入for循环,然后从当前位置反转该循环?

时间:2018-10-10 18:58:13

标签: python for-loop reverse

例如,我已经开始编码UNO!游戏中我需要做反向卡。整个“主要游戏代码”,您可以在其中放置卡并重新分类堆等。“主要游戏代码”在以下循环中: while self.gamestr==True: for l in range(1,players+1): 而且我需要在循环内将循环设置为range(1,players + 1,-1),然后在仍处于循环中的情况下再次将其更改回原来的范围! 预先感谢,

2 个答案:

答案 0 :(得分:3)

没有简单的方法可以执行您想要的操作。您可以也许将列表倒置,但是您还需要移动列表的一部分以确保正确的播放器在行中“下一个”。

一个更好的选择是简单地使用另一种循环。最简单的方法可能是使用while循环,并在一些可以更改的变量中跟踪您所在的索引以及递增的方向:

players_list = range(1, players+1) # not actually a list in Python 3, but that doesn't matter
player_index = 0
player_direction = 1 # going forwards in the list, to start

while True:
    current_player = players_list[player_index]

    # do game stuff here with current_player

    if game_over:
        break

    if reverse:
        player_direction = -player_direction

    players_index = (players_index + player_direction) % players # update for next index

您也许还可以将某些逻辑放入生成器函数中。这样一来,您就可以封装出一些有点混乱的循环和反转逻辑,并使主循环代码仅为for player in player_gen()。唯一棘手的事情是弄清楚您的游戏逻辑如何告诉生成器何时撤消(以及何时退出)。如果生成器是某个类的方法(也许是Game类的方法),那么使用属性或方法调用来为您处理事情就很容易了(game_over变量可以是{{ 1}},而self.game_over的翻转可以在player_direction方法中进行。

答案 1 :(得分:0)

这只是如何完成此操作的demo,在绘制通配符时,您可以使用切片和相反的步骤[::-1]

来重新构建正在循环的列表。
players = [1, 2, 3]
while True:
    for i, v in enumerate(players):
        if v == 1:
            print('wild card')
            players = players[i - 1::-1] + players[:i - 1:-1]
    print(players)
    for i, v in enumerate(players):
        if v == 3:
            print('wild card')
            players = players[i - 1::-1] + players[:i - 1:-1]
    print(players)
    break
wild card
[3, 2, 1]
wild card
[1, 2, 3]

在这里,我们看到wild是否在player 1上,那么它变成player 3的回合游戏,当wildplayer 3上时,它又反转了及其在player 1上。这是适用于您的游戏的总体思路,这种格式只是为了演示。