import random from Player import Player class LaddersV1(): def dice(self): diced = random.randint(1, 6) print(f'{diced} was diced') return diced def move(self, player, steps, field): # Алгоритм действий такой: # сначала увеличиваем позицию игрока на кол-во шагов. player.position += steps if player.position >= len(field): player.position = len(field) - 1 # Затем проверяем, нет ли особых действий на клетке, на которую попал игрок. cell = field[player.position] if cell > 0: # Если есть, то либо перемещаем игрока на новую позицию, либо выставляем свойство skip. if cell == player.position: # Пропусти следующий ход! player.skip = True else: player.position = cell def draw(self, field, players): for i in range(0, len(field), 10): sub = field[i:i+10] line = '' for j in range(len(sub)): e = sub[j] pos = i + j player_found = False for player_index in range(len(players)): pl = players[player_index] if pl.position == pos: line += pl.color[:2] player_found = True break if not player_found: if 0 <= e < 10: line += ' ' + str(e) else: line += str(e) line += ' ' print(line) def game_loop(self, auto, field): random.seed() exit_game = False stop_game = False winner = None result = 0 # Инициализируем список игроков players = [Player("red"), Player("green"), Player("blue"), Player("yellow")] if not auto: # Изначально вывести пустое поле без игроков self.draw(field, players) # Игровой цикл (бесконечный) while True: # Если дана команда выйти из игры if exit_game: if not auto: # Рисуем поле self.draw(field, players) # Вывод информации print("Игра прервана") # Сохранить результат result = -1 break # Если у игры выявлен победитель if winner is not None: if not auto: # Нарисовать поле self.draw(field, players) # Вывести победителя print((f'{winner.color} is winner')) print(f'moves of winner are {winner.dices}') # Сохранить результат result = len(winner.dices) break # Если выходим по причине зацикливания if stop_game: if not auto: # Рисуем поле self.draw(field, players) # Вывод информации print("Игра прервана по причине зацикливания") # Сохранить результат result = -1 break # Выполняет действия для каждого игрока for p in players: # Если игрок должен пропустить ход if p.skip: if not auto: # Вывести на экран информацию о том, что он пропускает ход print(f'{p.color} skips') # Не пропускать СЛЕДУЮЩИЙ ход p.skip = False # Если ход пропускать не надо else: if not auto: # Выводит текст на экран и ждет ввода inp = input(f'{p.color} to move') else: inp = '' # Обработка ввода # Если пользователь ввел exit или quit if inp == 'exit' or inp == 'quit': # Даем команду выйти из игры exit_game = True # Прервать цикл обработки игроков break # Бросаем кубик с возможностью повторить repeat = True while repeat: # Бросает кубик один раз diced = self.dice() # Двигаем игрока на кол-во шагов с кубика # Возвращает True, если нужно повторить ход repeat = self.move(p, diced, field) # Сохраняем значение кубика p.dices.append(diced) # Eсли игрок попал в последнюю клетку if p.position == len(field) - 1: # Установить победителя (таким образом дать команду выйти из игры) winner = p # Прервать цикл обработки игроков break # Проверяем "зацикливание" if len(p.dices) >= 1000: # Даем команду прервать игру stop_game = True # Прервать цикл обработки игроков break if not auto: # Пустая строка print() # Рисует поле self.draw(field, players) # Возвращаем кол-во бросков return result