hnc-daniil/HNC/Ladders/Game/game.py

153 lines
4.9 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
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