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)