From 24411632abef731610609b0beb2ed047afe92d9e Mon Sep 17 00:00:00 2001 From: Artur Savitskiy Date: Tue, 27 Jun 2023 19:19:19 +0200 Subject: [PATCH] Change project structure --- LaddersV1.py | 186 --------------------------------------------- LaddersV2.py | 8 -- LaddersV3.py | 9 --- LaddersV4.py | 16 ---- LaddersV5.py | 25 ------ Player.py | 7 -- TestGit.txt | 0 files.py | 33 -------- find_second_max.py | 60 --------------- level1.txt | 10 --- level2.txt | 10 --- level3.txt | 10 --- level4.txt | 10 --- level5.txt | 10 --- main.py | 136 --------------------------------- run.py | 31 -------- 16 files changed, 561 deletions(-) delete mode 100755 LaddersV1.py delete mode 100755 LaddersV2.py delete mode 100755 LaddersV3.py delete mode 100755 LaddersV4.py delete mode 100755 LaddersV5.py delete mode 100755 Player.py delete mode 100644 TestGit.txt delete mode 100755 files.py delete mode 100755 find_second_max.py delete mode 100755 level1.txt delete mode 100755 level2.txt delete mode 100755 level3.txt delete mode 100755 level4.txt delete mode 100755 level5.txt delete mode 100755 main.py delete mode 100755 run.py diff --git a/LaddersV1.py b/LaddersV1.py deleted file mode 100755 index 726f3f5..0000000 --- a/LaddersV1.py +++ /dev/null @@ -1,186 +0,0 @@ -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 - - diff --git a/LaddersV2.py b/LaddersV2.py deleted file mode 100755 index f3d1549..0000000 --- a/LaddersV2.py +++ /dev/null @@ -1,8 +0,0 @@ -import random -from LaddersV1 import LaddersV1 - - -class LaddersV2(LaddersV1): - - def dice(self): - return random.randint(1, 3) diff --git a/LaddersV3.py b/LaddersV3.py deleted file mode 100755 index 51b903e..0000000 --- a/LaddersV3.py +++ /dev/null @@ -1,9 +0,0 @@ -from LaddersV1 import LaddersV1 - - -class LaddersV3(LaddersV1): - - def move(self, player, steps, field): - super().move(player, steps, field) - - player.skip = False diff --git a/LaddersV4.py b/LaddersV4.py deleted file mode 100755 index 3d2b55f..0000000 --- a/LaddersV4.py +++ /dev/null @@ -1,16 +0,0 @@ -from LaddersV1 import LaddersV1 - - -class LaddersV4(LaddersV1): - - def move(self, player, steps, field): - super().move(player, steps, field) - - # Возвращаем True если значение поля отрицательное - return field[player.position] < 0 - - - - - - diff --git a/LaddersV5.py b/LaddersV5.py deleted file mode 100755 index 1562b7d..0000000 --- a/LaddersV5.py +++ /dev/null @@ -1,25 +0,0 @@ -from LaddersV1 import LaddersV1 - - -class LaddersV5(LaddersV1): - - def move(self, player, steps, field): - # считаем сколько клеток осталось до конца - r = len(field) - 1 - player.position - - super().move(player,steps, field) - - # если количество клеток, которые игроку надо пройти, больше чем клеток до конца - if steps > r: - # двигаем игрока назад от конца поля - # на количество клеток в виде разнице оставшихся клеток до конца и клеток которые надо пройти - player.position = len(field) - 1 - (steps - r) - - # Возвращаем True если значение поля отрицательное - return field[player.position] < 0 - - - - - - diff --git a/Player.py b/Player.py deleted file mode 100755 index cb23d20..0000000 --- a/Player.py +++ /dev/null @@ -1,7 +0,0 @@ -class Player: - - def __init__(self, color): - self.color = color - self.position = -1 - self.skip = False - self.dices = [] diff --git a/TestGit.txt b/TestGit.txt deleted file mode 100644 index e69de29..0000000 diff --git a/files.py b/files.py deleted file mode 100755 index 85514e4..0000000 --- a/files.py +++ /dev/null @@ -1,33 +0,0 @@ -import os - - -def list_levels(): - files = os.listdir(path='.') - result = [] - for file in files: - if file.lower().endswith('.txt'): - result.append(file) - - return result - - -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 \ No newline at end of file diff --git a/find_second_max.py b/find_second_max.py deleted file mode 100755 index 4e63586..0000000 --- a/find_second_max.py +++ /dev/null @@ -1,60 +0,0 @@ -def find_second_max(array): - # Проверяем входные данные - if array and len(array) > 0: - # Максимальное значение - первое значение - my_max = array[0] - # Второе по величине число пока не найдено - my_second_max = None - - # Проходим все элементы массива - for i in array: - # Если текущий элемент массива больше максимального - if i > my_max: - # Бывшее до сих пор максимальное значение - становится вторым по величине - my_second_max = my_max - # Текущий элемент становится максимальным значением - my_max = i - # Если текущий элемент массива меньше максималььного - elif i < my_max: - # Если второе по величине значение еще не найдено - if my_second_max is None: - # Текущий элемент становится вторым по величине значением - my_second_max = i - # Если второе по величине значение уже определено - else: - # Если текущий элемент больше текущего второго по величине значения - if i > my_second_max: - # Текущий элемент становится вторым по величине значением - my_second_max = i - - # Вариант когда текущий элемент равен минимальному значению, мы не рассматриваем, - # т.к. он никак не влияет на найденные значения - - return my_second_max - - # Если массив пустой или вообще не имеет значения - return None - - -################################################# -def verifier(test_name, actual, expected): - print(test_name) - if actual != expected: - print("=======> FAILED! <=======") - print(f"Got value <{actual}>") - print(f"Expected value is <{expected}>") - else: - print("PASSED") - print() - - -second_max_tests = [([1, 6, 3, 6, 54, 3, 6, 3, 1, 2, 8], 8), - ([2, 2, 2, 2, 2, 2, 2, 2, 2], None), - ([2, 2, 2, 2, 2, 2, 2, 2, 4], 2), - ([], None), - ([1, 0, -1], 0), - ([4, -7, 6, 23, -5, 23, -4, 5, 7, 100], 23)] - -for i in range(len(second_max_tests)): - verifier(f"Second max test {i+1}", find_second_max(second_max_tests[i][0]), second_max_tests[i][1]) - diff --git a/level1.txt b/level1.txt deleted file mode 100755 index 83200ef..0000000 --- a/level1.txt +++ /dev/null @@ -1,10 +0,0 @@ -0, 0, 2, 3, 4, 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, 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, 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, 0, 0, 0, 0, 0, 0, 1, 0 \ No newline at end of file diff --git a/level2.txt b/level2.txt deleted file mode 100755 index 5474b09..0000000 --- a/level2.txt +++ /dev/null @@ -1,10 +0,0 @@ -0, 0, 2, 0, 0, 0, 0, 0, 0, 0, -0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -0, 0, 0, 0, 0, 0, 4, 0, 0, 0, -0, 7, 0, 0, 0, 0, 0, 0, 0, 0, -0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -0, 6, 0, 0, 0, 0, 3, 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, 0, 0, 0, 0, -0, 0, 0, 0, 0, 0, 0, 0, 1, 0 \ No newline at end of file diff --git a/level3.txt b/level3.txt deleted file mode 100755 index 670fcde..0000000 --- a/level3.txt +++ /dev/null @@ -1,10 +0,0 @@ -6, 0, 2, 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, 0, 0, 0, 0, 0, 0, 0, 0, -0, 0, 0, 5, 0, 0, 0, 0, 0, 0, -7, 0, 0, 0, 0, 0, 0, 0, 0, 0, -0, 0, 1, 1, 1, 1, 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, 0, 0, 3, 1, 0 \ No newline at end of file diff --git a/level4.txt b/level4.txt deleted file mode 100755 index e6920de..0000000 --- a/level4.txt +++ /dev/null @@ -1,10 +0,0 @@ -0, 0, -1, -1, -1, 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, 9, 0, 0, 0, 0, 0, 0, 0, -0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -0, 9, 0, 8, 0, 0, 0, 0, 0, 0, -0, 0, 0, 0, 0, 3, 0, 0, 0, 0, -0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -0, 0, 0, 0, 4, 0, 0, 0, 0, 0, -0, 0, 0, 0, 0, 5, 6, 7, 1, 0 \ No newline at end of file diff --git a/level5.txt b/level5.txt deleted file mode 100755 index 5bb4ed2..0000000 --- a/level5.txt +++ /dev/null @@ -1,10 +0,0 @@ -0, 0, 2, 0, 0, 0, 0, 0, 0, 0, -0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -0, 0, 0, 9, 0, 9, 0, 0, 0, 0, -0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -0, 3, 0, 0, 4, 0, 5, 0, 6, 0, -0, 0, 0, 0, 0, 0, 0, 80, 0, 0, -0, 0, 0, 9, 9, 0, 8, 90, 7, 0, -0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -0, 0, 9, 0, 0, 9, 9, 9, 1, 0 \ No newline at end of file diff --git a/main.py b/main.py deleted file mode 100755 index 095f91d..0000000 --- a/main.py +++ /dev/null @@ -1,136 +0,0 @@ -from run import run -from files import list_levels -from files import load - - -def level_menu(levels): - for i in range(1, len(levels) + 1): - print(f'{i}. Level {i}') - print(f'{len(levels) + 1}. Назад') - - -def level_menu_loop(levels): - while True: - level_menu(levels) - 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 game_versions_menu(): - ## 1 ## - max_version = 6 - for i in range(1, max_version): - print(f'{i}. Version {i}') - - print(f'{max_version}. Назад') - - -def game_version_loop(): - ## 2 ## - while True: - game_versions_menu() - inp = input() - if inp.isnumeric(): - op = int(inp) - if 1 <= op <= 6: - ## 3 ## - if op <= 5: - return op - else: - # Выход из меню - return 0 - else: - print('Выберите номер из меню!') - else: - print('Вводите только цифры!') - - -def main_menu(): - print('1. Выбор уровня') - print('2. Выбор кол-ва запусков') - print('3. Выбор версии игры') ## 4 ## - print('4. Запуск') - print('5. Выход') - - -def main_menu_loop(): - levels = list_levels() - level = '' - runs = 1 - version = 0 ## 5.1 ## - - while True: - print(f'Выбранный уровень: {level}') - print(f'Кол-во запусков: {runs}') - print(f'Выбранная версия правил: {version}') - - print() - - # Вывод меню на экран - main_menu() - # Ввод от пользователя - inp = input() - - # Валидация ввода пользователя - if inp.isnumeric(): - op = int(inp) - if 1 <= op <= 5: - # Ввод пользователя валидирован, выполняем действие - if op == 1: - # Выбор уровня - ret = level_menu_loop(levels) - - if ret is not None: - level = ret - - elif op == 2: - # Ввод кол-во запусков - inp2 = input('Введите кол-во запусков: ') - if inp2.isnumeric(): - runs = int(inp2) - else: - print('Вводите только цифры!') - - ## 5.2 ## - elif op == 3: - # Выбор версии игры - ret = game_version_loop() - - if ret > 0: - version = ret - - elif op == 4: - # Запуск - if level in levels: - if version > 0: - run(load(level), runs, version) ## 7 ## - else: - print('Для начала выберите версию!') ## 8 ## - else: - print('Для начала выберите уровень!') - - else: - # Завершение программы - break - - else: - print('Выберите номер из меню!') - else: - print('Вводите только цифры!') - - -main_menu_loop() diff --git a/run.py b/run.py deleted file mode 100755 index da0c4ba..0000000 --- a/run.py +++ /dev/null @@ -1,31 +0,0 @@ -from LaddersV1 import LaddersV1 -from LaddersV2 import LaddersV2 -from LaddersV3 import LaddersV3 -from LaddersV4 import LaddersV4 - - -def run(level, runs, version): - if version == 1: - game = LaddersV1() - if version == 2: - game = LaddersV2() - if version == 3: - game = LaddersV3() - if version == 4: - game = LaddersV4() - - # Ручной или авто режим - auto = False - - # Если больше одного запуска - if runs > 1: - # Автоматически включаем авто режим - auto = True - - results = [] - - for i in range(runs): - results.append(game.game_loop(auto, level)) - - print(f'Average: {sum(results)/runs}') - print() \ No newline at end of file