hnc-vitalii/HNC/Ladders/LaddersV1.py

187 lines
6.7 KiB
Python
Raw Permalink Normal View History

2023-07-07 19:41:49 +02:00
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