153 lines
4.9 KiB
Python
153 lines
4.9 KiB
Python
import random
|
||
|
||
def dice():
|
||
return random.randint(1, 6)
|
||
|
||
|
||
def move(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(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 e < 10:
|
||
line += ' ' + str(e)
|
||
else:
|
||
line += str(e)
|
||
|
||
line += ' '
|
||
print(line)
|
||
|
||
|
||
def game_loop(auto, field):
|
||
random.seed()
|
||
exit_game = False
|
||
winner = None
|
||
result = 0
|
||
|
||
# Инициализируем список игроков
|
||
players = [Player("red"), Player("green"), Player("blue"), Player("yellow")]
|
||
|
||
if not auto:
|
||
# Изначально вывести пустое поле без игроков
|
||
draw(field, players)
|
||
|
||
# Игровой цикл (бесконечный)
|
||
while True:
|
||
|
||
# Если дана команда выйти из игры
|
||
if exit_game:
|
||
if not auto:
|
||
# Рисуем поле
|
||
draw(field, players)
|
||
|
||
# Вывод информации
|
||
print("Игра прервана")
|
||
|
||
# Сохранить результат
|
||
result = -1
|
||
break
|
||
|
||
if winner is not None:
|
||
if not auto:
|
||
# Нарисовать поле
|
||
draw(field, players)
|
||
|
||
# Вывести победителя
|
||
print((f'{winner.color} is winner'))
|
||
print(f'moves of winner are {winner.dices}')
|
||
|
||
# Сохранить результат
|
||
result = len(winner.dices)
|
||
|
||
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
|
||
|
||
# Бросает кубик
|
||
diced = dice()
|
||
|
||
# Двигаем игрока на кол-во шагов с кубика
|
||
move(p, diced, field)
|
||
|
||
# Сохраняем значение кубика
|
||
p.dices.append(diced)
|
||
|
||
# Eсли игрок попал в последнюю клетку
|
||
if p.position == len(field) - 1:
|
||
# Установить победителя (таким образом дать команду выйти из игры)
|
||
winner = p
|
||
|
||
# Прервать цикл обработки игроков
|
||
break
|
||
|
||
if not auto:
|
||
# Пустая строка
|
||
print()
|
||
|
||
# Рисует поле
|
||
draw(field, players)
|
||
|
||
# Возвращаем кол-во бросков
|
||
return result |