From e0745fa418a5c7f6472a79a31f70648b0088e2bc Mon Sep 17 00:00:00 2001 From: vitalii Malcov Date: Sun, 5 Nov 2023 18:22:42 +0100 Subject: [PATCH] =?UTF-8?q?"=D0=BF=D0=BE=D1=81=D0=BC=D0=BE=D1=82=D1=80?= =?UTF-8?q?=D0=B8=20=D0=B8=D0=B7=D0=BD=D0=B5=D0=BD=D0=B8=D1=8F=20=D0=B8=20?= =?UTF-8?q?=D0=B4=D0=B0=D0=B9=20=D0=BE=D1=86=D0=B5=D0=BD=D0=BA=D1=83=20?= =?UTF-8?q?=D0=B1=D0=B8=D1=82=D1=8D"?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../02.11.2023 Battle Ship/main4.py | 179 ++++++++++++++++++ 1 file changed, 179 insertions(+) create mode 100644 HNS/Excercises/02.11.2023 Battle Ship/main4.py diff --git a/HNS/Excercises/02.11.2023 Battle Ship/main4.py b/HNS/Excercises/02.11.2023 Battle Ship/main4.py new file mode 100644 index 0000000..3439916 --- /dev/null +++ b/HNS/Excercises/02.11.2023 Battle Ship/main4.py @@ -0,0 +1,179 @@ +from tkinter import * +from tkinter import messagebox +import time +import random + +tk = Tk() +app_running = True + +size_canvas_x = 600 +size_canvas_y = 600 +s_x = s_y = 12 # размер игрового поля +step_x = size_canvas_x // s_x # шаг по горизонтали +step_y = size_canvas_y // s_y # шаг по вертикали +size_canvas_x = step_x * s_x +size_canvas_y = step_y * s_y +menu_x = 250 +ships = s_x // 2 # определяем максимальное кол-во кораблей +ships_len1 = s_x // 3 # длина первого типа корабля +ships_len2 = s_x // 4 # длина второго типа корабля +ships_len3 = s_x // 6 # длина третьего типа корабля +ships_len4 = s_x // 12 # длина четвертого типа корабля +enemy_ships = [[0 for i in range(s_x + 1)] for i in range(s_y + 1)] +list_ids = [] # список объектов canvas + + +# print(enemy_ships) + +def on_closing(): + global app_running + if messagebox.askokcancel("Выход из игры", "Хотите выйти из игры?"): + app_running = False + tk.destroy() + + +tk.protocol("WM_DELETE_WINDOW", on_closing) +tk.title("Игра Морской Бой") +tk.resizable(0, 0) +tk.wm_attributes("-topmost", 1) +canvas = Canvas(tk, width=size_canvas_x + menu_x, height=size_canvas_y, bd=0, highlightthickness=0) +canvas.create_rectangle(0, 0, size_canvas_x, size_canvas_y, fill="white") +canvas.pack() +tk.update() + + +def draw_table(): + for i in range(0, s_x + 1): + canvas.create_line(step_x * i, 0, step_x * i, size_canvas_y) + for i in range(0, s_y + 1): + canvas.create_line(0, step_y * i, size_canvas_x, step_y * i) + + +draw_table() + + +def button_show_enemy(): + for i in range(0, s_x): + for j in range(0, s_y): + if enemy_ships[j][i] > 0: + _id = canvas.create_rectangle(i * step_x, j * step_y, i * step_x + step_x, j * step_y + step_y, + fill="red") + list_ids.append(_id) + + +def button_begin_again(): + global list_ids + for el in list_ids: + canvas.delete(el) + list_ids = [] + generate_enemy_ships() + + +b0 = Button(tk, text="Показать корабли противника", command=button_show_enemy) +b0.place(x=size_canvas_x + 20, y=30) + +b1 = Button(tk, text="Начать заново!", command=button_begin_again) +b1.place(x=size_canvas_x + 20, y=70) + + +def add_to_all(event): + _type = 0 # ЛКМ + if event.num == 3: + _type = 1 # ПКМ + # print(_type) + mouse_x = canvas.winfo_pointerx() - canvas.winfo_rootx() + mouse_y = canvas.winfo_pointery() - canvas.winfo_rooty() + # print(mouse_x, mouse_y) + ip_x = mouse_x // step_x + ip_y = mouse_y // step_y + print(ip_x, ip_y, "_type:", _type) + + +canvas.bind_all("", add_to_all) # ЛКМ +canvas.bind_all("", add_to_all) # ПКМ + + +def generate_enemy_ships(): + global enemy_ships + ships_list = [] + # генерируем список случайных длин кораблей + for i in range(0, ships): + ships_list.append(random.choice([ships_len1, ships_len2, ships_len3, ships_len4])) + # print(ships_list) + + # подсчет суммарной длины кораблей + sum_1_all_ships = sum(ships_list) + sum_1_enemy = 0 + + while sum_1_enemy != sum_1_all_ships: + # Обнуляем массив кораблей врага + # +1 для доп. линии справа и снизу, для успешных проверок генерации противника + enemy_ships = [[0 for i in range(s_x + 1)] for i in range(s_y + 1)] + + for i in range(0, ships): + len = ships_list[i] + horizont_vertikal = random.randrange(1, 3) # 1- горизонтальное 2 - вертикальное + + primerno_x = random.randrange(0, s_x) + if primerno_x + len > s_x: + primerno_x = primerno_x - len + + primerno_y = random.randrange(0, s_y) + if primerno_y + len > s_y: + primerno_y = primerno_y - len + + # print(horizont_vertikal, primerno_x,primerno_y) + if horizont_vertikal == 1: + if primerno_x + len <= s_x: + for j in range(0, len): + try: + check_near_ships = 0 + check_near_ships = enemy_ships[primerno_x][primerno_y - 1] + \ + enemy_ships[primerno_x][primerno_y + j] + \ + enemy_ships[primerno_x][primerno_y + j + 1] + \ + enemy_ships[primerno_x + 1][primerno_y + j + 1] + \ + enemy_ships[primerno_x - 1][primerno_y + j + 1] + \ + enemy_ships[primerno_x + 1][primerno_y + j] + \ + enemy_ships[primerno_x - 1][primerno_y + j] + # print(check_near_ships) + if check_near_ships == 0: # записываем в том случае, если нет ничего рядом + enemy_ships[primerno_x][primerno_y + j] = i + 1 # записываем номер корабля + except Exception: + pass + if horizont_vertikal == 2: + if primerno_y + len <= s_y: + for j in range(0, len): + try: + check_near_ships = 0 + check_near_ships = enemy_ships[primerno_x - 1][primerno_y] + \ + enemy_ships[primerno_x + j][primerno_y] + \ + enemy_ships[primerno_x + j + 1][primerno_y] + \ + enemy_ships[primerno_x + j + 1][primerno_y + 1] + \ + enemy_ships[primerno_x + j + 1][primerno_y - 1] + \ + enemy_ships[primerno_x + j][primerno_y + 1] + \ + enemy_ships[primerno_x + j][primerno_y - 1] + # print(check_near_ships) + if check_near_ships == 0: # записываем в том случае, если нет ничего рядом + enemy_ships[primerno_x + j][primerno_y] = i + 1 # записываем номер корабля + except Exception: + pass + + # делаем подсчет 1ц + sum_1_enemy = 0 + for i in range(0, s_x): + for j in range(0, s_y): + if enemy_ships[j][i] > 0: + sum_1_enemy = sum_1_enemy + 1 + + # print(sum_1_enemy) + # print(ships_list) + print(enemy_ships) + + +generate_enemy_ships() + +while app_running: + if app_running: + tk.update_idletasks() + tk.update() + time.sleep(0.005)