From e1bf071bf71772cce2185ee51a864eeb3a2a5dbb Mon Sep 17 00:00:00 2001 From: vitalii Malcov Date: Fri, 7 Jul 2023 19:41:49 +0200 Subject: [PATCH] =?UTF-8?q?=D0=B7=D0=B0=D0=B3=D1=80=D1=83=D0=B6=D0=B0?= =?UTF-8?q?=D1=8E=20=D0=BF=D0=B0=D0=BF=D0=BA=D0=B8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Arrays/Dz27,06,2023.py | 16 +++ Arrays/Find_Second _Max.py | 41 ++++++++ Excercises/дз 27,06,2023,2.py | 16 +++ Excercises/дз 27,06,2023,3.py | 15 +++ Excercises/зд 27,06,2023.py | 14 +++ Ladders/LaddersV1.py | 186 ++++++++++++++++++++++++++++++++++ Ladders/LaddersV2.py | 8 ++ Ladders/LaddersV3.py | 9 ++ Ladders/LaddersV4.py | 16 +++ Ladders/LaddersV5.py | 25 +++++ Ladders/Player.py | 7 ++ Ladders/files.py | 33 ++++++ Ladders/level1.txt | 10 ++ Ladders/level2.txt | 10 ++ Ladders/level3.txt | 10 ++ Ladders/level4.txt | 10 ++ Ladders/level5.txt | 10 ++ Ladders/main.py | 136 +++++++++++++++++++++++++ Ladders/run.py | 31 ++++++ 19 files changed, 603 insertions(+) create mode 100644 Arrays/Dz27,06,2023.py create mode 100644 Arrays/Find_Second _Max.py create mode 100644 Excercises/дз 27,06,2023,2.py create mode 100644 Excercises/дз 27,06,2023,3.py create mode 100644 Excercises/зд 27,06,2023.py create mode 100644 Ladders/LaddersV1.py create mode 100644 Ladders/LaddersV2.py create mode 100644 Ladders/LaddersV3.py create mode 100644 Ladders/LaddersV4.py create mode 100644 Ladders/LaddersV5.py create mode 100644 Ladders/Player.py create mode 100644 Ladders/files.py create mode 100644 Ladders/level1.txt create mode 100644 Ladders/level2.txt create mode 100644 Ladders/level3.txt create mode 100644 Ladders/level4.txt create mode 100644 Ladders/level5.txt create mode 100644 Ladders/main.py create mode 100644 Ladders/run.py diff --git a/Arrays/Dz27,06,2023.py b/Arrays/Dz27,06,2023.py new file mode 100644 index 0000000..be68e58 --- /dev/null +++ b/Arrays/Dz27,06,2023.py @@ -0,0 +1,16 @@ +text = [("Я пришел, я ушел, я нашел")] + + +def word_count(text): + x = text.split() + y = {} + for i in x: + if i in text: + y[i] += 1 + else: + y[i] = 1 + return word_count + +p = word_count +for p in text: + print(p) diff --git a/Arrays/Find_Second _Max.py b/Arrays/Find_Second _Max.py new file mode 100644 index 0000000..671c638 --- /dev/null +++ b/Arrays/Find_Second _Max.py @@ -0,0 +1,41 @@ +def find_second_max(array): + if array and len(array) > 0: + array.sort() + 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_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/Excercises/дз 27,06,2023,2.py b/Excercises/дз 27,06,2023,2.py new file mode 100644 index 0000000..cfc9327 --- /dev/null +++ b/Excercises/дз 27,06,2023,2.py @@ -0,0 +1,16 @@ +text = [("Я пришел, я ушел, я нашел")] + + +def word_count(text): + text_dict = dict() + + for i in text: + if i in text_dict: + text_dict[i] = text_dict[i] + 1 + else: + text_dict[i] = -1 + return text_dict + +p = word_count +for p in text: + print(p) diff --git a/Excercises/дз 27,06,2023,3.py b/Excercises/дз 27,06,2023,3.py new file mode 100644 index 0000000..8ac9c8e --- /dev/null +++ b/Excercises/дз 27,06,2023,3.py @@ -0,0 +1,15 @@ +def word_count(text): + + text = [("Я пришел, я ушел, я нашел")] + text = text.lower() + for i in text: + if i in text: + text[i] = text[i] + 1 + else: + text[i] = -1 + return text + + +p = word_count +for p in text: + print(p) diff --git a/Excercises/зд 27,06,2023.py b/Excercises/зд 27,06,2023.py new file mode 100644 index 0000000..5666fca --- /dev/null +++ b/Excercises/зд 27,06,2023.py @@ -0,0 +1,14 @@ + + + +def word_count(text): + text = [("Я пришел, я ушел, я нашел")] + x = text + y = {} + for i in x: + if i in text: + y[i] += 1 + else: + y[i] = 1 + return word_count + diff --git a/Ladders/LaddersV1.py b/Ladders/LaddersV1.py new file mode 100644 index 0000000..0004324 --- /dev/null +++ b/Ladders/LaddersV1.py @@ -0,0 +1,186 @@ +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/Ladders/LaddersV2.py b/Ladders/LaddersV2.py new file mode 100644 index 0000000..50c60e2 --- /dev/null +++ b/Ladders/LaddersV2.py @@ -0,0 +1,8 @@ +import random +from LaddersV1 import LaddersV1 + + +class LaddersV2(LaddersV1): + + def dice(self): + return random.randint(1, 3) diff --git a/Ladders/LaddersV3.py b/Ladders/LaddersV3.py new file mode 100644 index 0000000..57b3200 --- /dev/null +++ b/Ladders/LaddersV3.py @@ -0,0 +1,9 @@ +from LaddersV1 import LaddersV1 + + +class LaddersV3(LaddersV1): + + def move(self, player, steps, field): + super().move(player, steps, field) + + player.skip = False diff --git a/Ladders/LaddersV4.py b/Ladders/LaddersV4.py new file mode 100644 index 0000000..5d91f12 --- /dev/null +++ b/Ladders/LaddersV4.py @@ -0,0 +1,16 @@ +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/Ladders/LaddersV5.py b/Ladders/LaddersV5.py new file mode 100644 index 0000000..04c1e4b --- /dev/null +++ b/Ladders/LaddersV5.py @@ -0,0 +1,25 @@ +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/Ladders/Player.py b/Ladders/Player.py new file mode 100644 index 0000000..b9f7c42 --- /dev/null +++ b/Ladders/Player.py @@ -0,0 +1,7 @@ +class Player: + + def __init__(self, color): + self.color = color + self.position = -1 + self.skip = False + self.dices = [] diff --git a/Ladders/files.py b/Ladders/files.py new file mode 100644 index 0000000..b697119 --- /dev/null +++ b/Ladders/files.py @@ -0,0 +1,33 @@ +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/Ladders/level1.txt b/Ladders/level1.txt new file mode 100644 index 0000000..5c4b798 --- /dev/null +++ b/Ladders/level1.txt @@ -0,0 +1,10 @@ +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/Ladders/level2.txt b/Ladders/level2.txt new file mode 100644 index 0000000..5b2000c --- /dev/null +++ b/Ladders/level2.txt @@ -0,0 +1,10 @@ +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/Ladders/level3.txt b/Ladders/level3.txt new file mode 100644 index 0000000..fe6d318 --- /dev/null +++ b/Ladders/level3.txt @@ -0,0 +1,10 @@ +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/Ladders/level4.txt b/Ladders/level4.txt new file mode 100644 index 0000000..44fa6f8 --- /dev/null +++ b/Ladders/level4.txt @@ -0,0 +1,10 @@ +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/Ladders/level5.txt b/Ladders/level5.txt new file mode 100644 index 0000000..6efd296 --- /dev/null +++ b/Ladders/level5.txt @@ -0,0 +1,10 @@ +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, 0, 0, 0, +0, 0, 0, 9, 9, 0, 8, 0, 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/Ladders/main.py b/Ladders/main.py new file mode 100644 index 0000000..ef9312e --- /dev/null +++ b/Ladders/main.py @@ -0,0 +1,136 @@ +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/Ladders/run.py b/Ladders/run.py new file mode 100644 index 0000000..bf62a44 --- /dev/null +++ b/Ladders/run.py @@ -0,0 +1,31 @@ +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