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