Path: blob/master/python-igra-morskoy-boy/main_lesson_7.py
5918 views
from tkinter import *1from tkinter import messagebox2import time3import random45tk = Tk()6app_running = True78size_canvas_x = 6009size_canvas_y = 60010s_x = s_y = 8 # размер игрового поля11s_y = 812step_x = size_canvas_x // s_x # шаг по горизонтали13step_y = size_canvas_y // s_y # шаг по вертикали14size_canvas_x = step_x * s_x15size_canvas_y = step_y * s_y16menu_x = 25017ships = s_x // 2 # определяем максимальное кол-во кораблей18ship_len1 = s_x // 5 # длина первого типа корабля19ship_len2 = s_x // 3 # длина второго типа корабля20ship_len3 = s_x // 2 # длина третьего типа корабля21enemy_ships = [[0 for i in range(s_x + 1)] for i in range(s_y + 1)]22list_ids = [] # список объектов canvas2324# points - список куда мы кликнули мышкой25points = [[-1 for i in range(s_x)] for i in range(s_y)]262728# print(enemy_ships)2930def on_closing():31global app_running32if messagebox.askokcancel("Выход из игры", "Хотите выйти из игры?"):33app_running = False34tk.destroy()353637tk.protocol("WM_DELETE_WINDOW", on_closing)38tk.title("Игра Морской Бой")39tk.resizable(0, 0)40tk.wm_attributes("-topmost", 1)41canvas = Canvas(tk, width=size_canvas_x + menu_x, height=size_canvas_y, bd=0, highlightthickness=0)42canvas.create_rectangle(0, 0, size_canvas_x, size_canvas_y, fill="white")43canvas.pack()44tk.update()454647def draw_table():48for i in range(0, s_x + 1):49canvas.create_line(step_x * i, 0, step_x * i, size_canvas_y)50for i in range(0, s_y + 1):51canvas.create_line(0, step_y * i, size_canvas_x, step_y * i)525354draw_table()555657def button_show_enemy():58for i in range(0, s_x):59for j in range(0, s_y):60if enemy_ships[j][i] > 0:61color = "red"62if points[j][i] != -1:63color = "green"64_id = canvas.create_rectangle(i * step_x, j * step_y, i * step_x + step_x, j * step_y + step_y,65fill=color)66list_ids.append(_id)676869def button_begin_again():70global list_ids71global points72for el in list_ids:73canvas.delete(el)74list_ids = []75generate_enemy_ships()76points = [[-1 for i in range(s_x)] for i in range(s_y)]777879b0 = Button(tk, text="Показать корабли противника", command=button_show_enemy)80b0.place(x=size_canvas_x + 20, y=30)8182b1 = Button(tk, text="Начать заново!", command=button_begin_again)83b1.place(x=size_canvas_x + 20, y=70)848586def draw_point(x, y):87#print(enemy_ships[y][x])88if enemy_ships[y][x] == 0:89color = "red"90id1 = canvas.create_oval(x * step_x, y * step_y, x * step_x + step_x, y * step_y + step_y, fill=color)91id2 = canvas.create_oval(x * step_x + step_x // 3, y * step_y + step_y // 3, x * step_x + step_x - step_x // 3,92y * step_y + step_y - step_y // 3, fill="white")93list_ids.append(id1)94list_ids.append(id2)95if enemy_ships[y][x] > 0:96color = "blue"97id1 = canvas.create_rectangle(x * step_x, y * step_y + step_y // 2 - step_y // 10, x * step_x + step_x,98y * step_y + step_y // 2 + step_y // 10, fill=color)99id2 = canvas.create_rectangle(x * step_x + step_x // 2 - step_x // 10, y * step_y,100x * step_x + step_x // 2 + step_x // 10, y * step_y + step_y, fill=color)101list_ids.append(id1)102list_ids.append(id2)103104105def add_to_all(event):106_type = 0 # ЛКМ107if event.num == 3:108_type = 1 # ПКМ109# print(_type)110mouse_x = canvas.winfo_pointerx() - canvas.winfo_rootx()111mouse_y = canvas.winfo_pointery() - canvas.winfo_rooty()112# print(mouse_x, mouse_y)113ip_x = mouse_x // step_x114ip_y = mouse_y // step_y115print(ip_x, ip_y, "_type:", _type)116if ip_x < s_x and ip_y < s_y:117if points[ip_y][ip_x] == -1:118points[ip_y][ip_x] = _type119draw_point(ip_x, ip_y)120print(len(list_ids))121122123canvas.bind_all("<Button-1>", add_to_all) # ЛКМ124canvas.bind_all("<Button-3>", add_to_all) # ПКМ125126127def generate_enemy_ships():128global enemy_ships129ships_list = []130# генерируем список случайных длин кораблей131for i in range(0, ships):132ships_list.append(random.choice([ship_len1, ship_len2, ship_len3]))133# print(ships_list)134135# подсчет суммарной длины кораблей136sum_1_all_ships = sum(ships_list)137sum_1_enemy = 0138139while sum_1_enemy != sum_1_all_ships:140# обнуляем массив кораблей врага141enemy_ships = [[0 for i in range(s_x + 1)] for i in142range(s_y + 1)] # +1 для доп. линии справа и снизу, для успешных проверок генерации противника143144for i in range(0, ships):145len = ships_list[i]146horizont_vertikal = random.randrange(1, 3) # 1- горизонтальное 2 - вертикальное147148primerno_x = random.randrange(0, s_x)149if primerno_x + len > s_x:150primerno_x = primerno_x - len151152primerno_y = random.randrange(0, s_y)153if primerno_y + len > s_y:154primerno_y = primerno_y - len155156# print(horizont_vertikal, primerno_x,primerno_y)157if horizont_vertikal == 1:158if primerno_x + len <= s_x:159for j in range(0, len):160try:161check_near_ships = 0162check_near_ships = enemy_ships[primerno_y][primerno_x - 1] + \163enemy_ships[primerno_y][primerno_x + j] + \164enemy_ships[primerno_y][primerno_x + j + 1] + \165enemy_ships[primerno_y + 1][primerno_x + j + 1] + \166enemy_ships[primerno_y - 1][primerno_x + j + 1] + \167enemy_ships[primerno_y + 1][primerno_x + j] + \168enemy_ships[primerno_y - 1][primerno_x + j]169# print(check_near_ships)170if check_near_ships == 0: # записываем в том случае, если нет ничего рядом171enemy_ships[primerno_y][primerno_x + j] = i + 1 # записываем номер корабля172except Exception:173pass174if horizont_vertikal == 2:175if primerno_y + len <= s_y:176for j in range(0, len):177try:178check_near_ships = 0179check_near_ships = enemy_ships[primerno_y - 1][primerno_x] + \180enemy_ships[primerno_y + j][primerno_x] + \181enemy_ships[primerno_y + j + 1][primerno_x] + \182enemy_ships[primerno_y + j + 1][primerno_x + 1] + \183enemy_ships[primerno_y + j + 1][primerno_x - 1] + \184enemy_ships[primerno_y + j][primerno_x + 1] + \185enemy_ships[primerno_y + j][primerno_x - 1]186# print(check_near_ships)187if check_near_ships == 0: # записываем в том случае, если нет ничего рядом188enemy_ships[primerno_y + j][primerno_x] = i + 1 # записываем номер корабля189except Exception:190pass191192# делаем подсчет 1ц193sum_1_enemy = 0194for i in range(0, s_x):195for j in range(0, s_y):196if enemy_ships[j][i] > 0:197sum_1_enemy = sum_1_enemy + 1198199# print(sum_1_enemy)200# print(ships_list)201#print(enemy_ships)202203204generate_enemy_ships()205206while app_running:207if app_running:208tk.update_idletasks()209tk.update()210time.sleep(0.005)211212213