Path: blob/master/python-igra-morskoy-boy/main_lesson_6.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 = [] # список объектов canvas232425# print(enemy_ships)2627def on_closing():28global app_running29if messagebox.askokcancel("Выход из игры", "Хотите выйти из игры?"):30app_running = False31tk.destroy()323334tk.protocol("WM_DELETE_WINDOW", on_closing)35tk.title("Игра Морской Бой")36tk.resizable(0, 0)37tk.wm_attributes("-topmost", 1)38canvas = Canvas(tk, width=size_canvas_x + menu_x, height=size_canvas_y, bd=0, highlightthickness=0)39canvas.create_rectangle(0, 0, size_canvas_x, size_canvas_y, fill="white")40canvas.pack()41tk.update()424344def draw_table():45for i in range(0, s_x + 1):46canvas.create_line(step_x * i, 0, step_x * i, size_canvas_y)47for i in range(0, s_y + 1):48canvas.create_line(0, step_y * i, size_canvas_x, step_y * i)495051draw_table()525354def button_show_enemy():55for i in range(0, s_x):56for j in range(0, s_y):57if enemy_ships[j][i] > 0:58_id = canvas.create_rectangle(i * step_x, j * step_y, i * step_x + step_x, j * step_y + step_y,59fill="red")60list_ids.append(_id)616263def button_begin_again():64global list_ids65for el in list_ids:66canvas.delete(el)67list_ids = []68generate_enemy_ships()697071b0 = Button(tk, text="Показать корабли противника", command=button_show_enemy)72b0.place(x=size_canvas_x + 20, y=30)7374b1 = Button(tk, text="Начать заново!", command=button_begin_again)75b1.place(x=size_canvas_x + 20, y=70)767778def draw_point(x, y):79print(enemy_ships[y][x])80if enemy_ships[y][x] == 0:81color = "red"82id1 = canvas.create_oval(x * step_x, y * step_y, x * step_x + step_x, y * step_y + step_y, fill=color)83id2 = canvas.create_oval(x * step_x + step_x // 3, y * step_y + step_y // 3, x * step_x + step_x - step_x // 3,84y * step_y + step_y - step_y // 3, fill="white")85list_ids.append(id1)86list_ids.append(id2)87if enemy_ships[y][x] > 0:88color = "blue"89id1 = canvas.create_rectangle(x * step_x, y * step_y + step_y // 2 - step_y // 10, x * step_x + step_x,90y * step_y + step_y // 2 + step_y // 10, fill=color)91id2 = canvas.create_rectangle(x * step_x + step_x // 2 - step_x // 10, y * step_y,92x * step_x + step_x // 2 + step_x // 10, y * step_y + step_y, fill=color)93list_ids.append(id1)94list_ids.append(id2)959697def add_to_all(event):98_type = 0 # ЛКМ99if event.num == 3:100_type = 1 # ПКМ101# print(_type)102mouse_x = canvas.winfo_pointerx() - canvas.winfo_rootx()103mouse_y = canvas.winfo_pointery() - canvas.winfo_rooty()104# print(mouse_x, mouse_y)105ip_x = mouse_x // step_x106ip_y = mouse_y // step_y107print(ip_x, ip_y, "_type:", _type)108if ip_x < s_x and ip_y < s_y:109draw_point(ip_x, ip_y)110111112canvas.bind_all("<Button-1>", add_to_all) # ЛКМ113canvas.bind_all("<Button-3>", add_to_all) # ПКМ114115116def generate_enemy_ships():117global enemy_ships118ships_list = []119# генерируем список случайных длин кораблей120for i in range(0, ships):121ships_list.append(random.choice([ship_len1, ship_len2, ship_len3]))122# print(ships_list)123124# подсчет суммарной длины кораблей125sum_1_all_ships = sum(ships_list)126sum_1_enemy = 0127128while sum_1_enemy != sum_1_all_ships:129# обнуляем массив кораблей врага130enemy_ships = [[0 for i in range(s_x + 1)] for i in131range(s_y + 1)] # +1 для доп. линии справа и снизу, для успешных проверок генерации противника132133for i in range(0, ships):134len = ships_list[i]135horizont_vertikal = random.randrange(1, 3) # 1- горизонтальное 2 - вертикальное136137primerno_x = random.randrange(0, s_x)138if primerno_x + len > s_x:139primerno_x = primerno_x - len140141primerno_y = random.randrange(0, s_y)142if primerno_y + len > s_y:143primerno_y = primerno_y - len144145# print(horizont_vertikal, primerno_x,primerno_y)146if horizont_vertikal == 1:147if primerno_x + len <= s_x:148for j in range(0, len):149try:150check_near_ships = 0151check_near_ships = enemy_ships[primerno_y][primerno_x - 1] + \152enemy_ships[primerno_y][primerno_x + j] + \153enemy_ships[primerno_y][primerno_x + j + 1] + \154enemy_ships[primerno_y + 1][primerno_x + j + 1] + \155enemy_ships[primerno_y - 1][primerno_x + j + 1] + \156enemy_ships[primerno_y + 1][primerno_x + j] + \157enemy_ships[primerno_y - 1][primerno_x + j]158# print(check_near_ships)159if check_near_ships == 0: # записываем в том случае, если нет ничего рядом160enemy_ships[primerno_y][primerno_x + j] = i + 1 # записываем номер корабля161except Exception:162pass163if horizont_vertikal == 2:164if primerno_y + len <= s_y:165for j in range(0, len):166try:167check_near_ships = 0168check_near_ships = enemy_ships[primerno_y - 1][primerno_x] + \169enemy_ships[primerno_y + j][primerno_x] + \170enemy_ships[primerno_y + j + 1][primerno_x] + \171enemy_ships[primerno_y + j + 1][primerno_x + 1] + \172enemy_ships[primerno_y + j + 1][primerno_x - 1] + \173enemy_ships[primerno_y + j][primerno_x + 1] + \174enemy_ships[primerno_y + j][primerno_x - 1]175# print(check_near_ships)176if check_near_ships == 0: # записываем в том случае, если нет ничего рядом177enemy_ships[primerno_y + j][primerno_x] = i + 1 # записываем номер корабля178except Exception:179pass180181# делаем подсчет 1ц182sum_1_enemy = 0183for i in range(0, s_x):184for j in range(0, s_y):185if enemy_ships[j][i] > 0:186sum_1_enemy = sum_1_enemy + 1187188# print(sum_1_enemy)189# print(ships_list)190print(enemy_ships)191192193generate_enemy_ships()194195while app_running:196if app_running:197tk.update_idletasks()198tk.update()199time.sleep(0.005)200201202