diff --git a/Game/Player.py b/Game/Player.py new file mode 100644 index 0000000..e69de29 diff --git a/Game/game.py b/Game/game.py new file mode 100644 index 0000000..636159f --- /dev/null +++ b/Game/game.py @@ -0,0 +1,153 @@ +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 \ No newline at end of file diff --git a/Game/main.py b/Game/main.py new file mode 100644 index 0000000..b29cf7a --- /dev/null +++ b/Game/main.py @@ -0,0 +1,135 @@ + + +from Player import Player + + +def load(file): + # 1. Загрузить весь файл в строку + f = open(file, 'r') + s = f.read() + + # 2. Заменить все пробелы и переводы строки на "ничего" + s = s.replace(' ', '') + s = s.replace('\n', '') + + # 3. Из полученной строки создать массив, используя разделитель "," + a = s.split(',') + + # a - массив строк, в которых хранятся числа + b = [] + for x in a: + b.append(int(x)) + # b - массив чисел из а + + f.close() + return b + + + + + +def level_menu(): + for i in range(1, len(levels) + 1): + print(f'{i}. Level {i}') + print(f'{len(levels) + 1}. Назад') + + +def level_menu_loop(): + while True: + level_menu() + inp = input() + if inp.isnumeric(): + op = int(inp) + if 1 <= op <= len(levels) + 1: + if op <= len(levels): + # Выбор уровня + return levels[op - 1] + else: + # Выход из меню + return None + + else: + print('Выберите номер из меню!') + else: + print('Вводите только цифры!') + + +def main_menu(): + print('1. Выбор уровня') + print('2. Выбор кол-ва запусков') + print('3. Запуск') + print('4. Выход') + + +def main_menu_loop(): + level = '' + runs = 1 + + while True: + print(f'Выбранный уровень: {level}') + print(f'Кол-во запусков: {runs}') + print() + + # Вывод меню на экран + main_menu() + # Ввод от пользователя + inp = input() + + # Валидация ввода пользователя + if inp.isnumeric(): + op = int(inp) + if 1 <= op <= 4: + # Ввод пользователя валидирован, выполняем действие + if op == 1: + # Выбор уровня + ret = level_menu_loop() + + if ret is not None: + level = ret + + elif op == 2: + # Ввод кол-во запусков + inp2 = input('Введите кол-во запусков: ') + if inp2.isnumeric(): + runs = int(inp2) + else: + print('Вводите только цифры!') + + elif op == 3: + # Запуск + if level in levels: + run(load(level), runs) + else: + print('Для начала выберите уровень!') + + else: + # Завершение программы + break + + else: + print('Выберите номер из меню!') + else: + print('Вводите только цифры!') + + +def run(level, runs): + # Ручной или авто режим + auto = False + + # Если больше одного запуска + if runs > 1: + # Автоматически включаем авто режим + auto = True + + results = [] + + for i in range(runs): + results.append(game_loop(auto, level)) + + print(f'Average: {sum(results)/runs}') + print() + + +levels = ['level1.txt', 'level2.txt', 'level3.txt', 'level4.txt', 'level5.txt', 'level6.txt'] +#random.seed() +main_menu_loop() \ No newline at end of file diff --git a/Level/level_1.txt b/Level/level_1.txt new file mode 100644 index 0000000..127fc9c --- /dev/null +++ b/Level/level_1.txt @@ -0,0 +1,10 @@ +0, 0, 2, 0, 0, 0, 13, 22, 0, 0, +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 90, 0, 0, +0, 0, 8, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 98, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 5, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 12, 89, 0, 0 \ No newline at end of file diff --git a/Level/level_2.txt b/Level/level_2.txt new file mode 100644 index 0000000..cfab93b --- /dev/null +++ b/Level/level_2.txt @@ -0,0 +1,10 @@ +0, 0, 2, 0, 0, 0, 13, 22, 0, 0, +0, 0, 12, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 25, 0, 0, 90, 0, 0, +0, 0, 8, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 45, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 98, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 63, 0, 5, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 76, 12, 89, 0, 0 \ No newline at end of file diff --git a/Level/level_3.txt b/Level/level_3.txt new file mode 100644 index 0000000..fe8d65f --- /dev/null +++ b/Level/level_3.txt @@ -0,0 +1,10 @@ +0, 0, 2, 0, 0, 0, 13, 22, 0, 0, +0, 0, 12, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 25, 0, 0, 90, 0, 0, +0, 0, 8, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 45, 0, 0, 0, 0, 0, +0, 1, 0, 0, 0, 0, 98, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 63, 0, 5, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 76, 12, 2, 0, 0 \ No newline at end of file diff --git a/Level/level_4.txt b/Level/level_4.txt new file mode 100644 index 0000000..703031c --- /dev/null +++ b/Level/level_4.txt @@ -0,0 +1,10 @@ +0, 1, 2, 0, 4, 0, 13, 22, 0, 0, +0, 0, 12, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 25, 0, 27, 90, 0, 0, +0, 0, 8, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 45, 0, 47, 0, 0, 0, +0, 1, 0, 0, 0, 0, 98, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 63, 0, 5, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 76, 10, 2, 0, 0 \ No newline at end of file diff --git a/Level/level_5.txt b/Level/level_5.txt new file mode 100644 index 0000000..1e12259 --- /dev/null +++ b/Level/level_5.txt @@ -0,0 +1,10 @@ +0, 1, 2, 0, 4, 0, 13, 22, 0, 0, +0, 0, 12, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 25, 0, 27, 90, 0, 0, +0, 0, 8, 0, 0, 0, 0, 0, 0, 0, +0, 0, 52, 0, 45, 0, 47, 0, 0, 0, +0, 1, 0, 0, 0, 0, 98, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 83, 0, 5, 0, 0, 0, 0, 0, +0, 0, 93, 0, 0, 76, 10, 2, 98, 0 \ No newline at end of file