187 lines
6.9 KiB
Python
Executable File
187 lines
6.9 KiB
Python
Executable File
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
|
||
|
||
|