Есть ли способ оказаться внутри цикла for, а затем повернуть этот цикл из текущей позиции? - PullRequest
0 голосов
/ 10 октября 2018

Например, я начал кодировать UNO!В игре мне нужно сделать обратную карту.Весь «Основной код игры», куда вы кладете карту и заново сортируете колоду и т. Д. «Основной код игры» находится в этом цикле: while self.gamestr==True: for l in range(1,players+1): И мне нужно, чтобы цикл был в диапазоне (1, игроки + 1, -1) находясь внутри цикла, и снова измените его, оставаясь в цикле!Заранее спасибо,

Ответы [ 2 ]

0 голосов
/ 10 октября 2018

Это всего лишь 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, играющим в обратном направлении, когда wild включен player 3, он снова включается и включается player 1.Это общая идея для вашей игры, этот формат только для демонстрации.

0 голосов
/ 10 октября 2018

Нет простого способа сделать то, что вы хотите.Вы можете возможно перевернуть список на месте, но вам также необходимо переместить его части, чтобы убедиться, что правильный игрок «следующий» в очереди.

Лучший выбор - это простоиспользовать другой вид цикла.Самым простым может быть использование цикла 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 может быть self.game_over, апереключение player_direction может быть выполнено методом reverse.

...