hnc-eduard/HNC/Ladders/LaddersV1.py

187 lines
6.7 KiB
Python
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

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