Path: blob/master/python-igra-morskoy-boy/main_lesson_8.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)]2627# boom - список попаданий по кораблям противника28boom = [[0 for i in range(s_x)] for i in range(s_y)]293031# print(enemy_ships)3233def on_closing():34global app_running35if messagebox.askokcancel("Выход из игры", "Хотите выйти из игры?"):36app_running = False37tk.destroy()383940tk.protocol("WM_DELETE_WINDOW", on_closing)41tk.title("Игра Морской Бой")42tk.resizable(0, 0)43tk.wm_attributes("-topmost", 1)44canvas = Canvas(tk, width=size_canvas_x + menu_x, height=size_canvas_y, bd=0, highlightthickness=0)45canvas.create_rectangle(0, 0, size_canvas_x, size_canvas_y, fill="white")46canvas.pack()47tk.update()484950def draw_table():51for i in range(0, s_x + 1):52canvas.create_line(step_x * i, 0, step_x * i, size_canvas_y)53for i in range(0, s_y + 1):54canvas.create_line(0, step_y * i, size_canvas_x, step_y * i)555657draw_table()585960def button_show_enemy():61for i in range(0, s_x):62for j in range(0, s_y):63if enemy_ships[j][i] > 0:64color = "red"65if points[j][i] != -1:66color = "green"67_id = canvas.create_rectangle(i * step_x, j * step_y, i * step_x + step_x, j * step_y + step_y,68fill=color)69list_ids.append(_id)707172def button_begin_again():73global list_ids74global points75global boom76for el in list_ids:77canvas.delete(el)78list_ids = []79generate_enemy_ships()80points = [[-1 for i in range(s_x)] for i in range(s_y)]81boom = [[0 for i in range(s_x)] for i in range(s_y)]8283b0 = Button(tk, text="Показать корабли противника", command=button_show_enemy)84b0.place(x=size_canvas_x + 20, y=30)8586b1 = Button(tk, text="Начать заново!", command=button_begin_again)87b1.place(x=size_canvas_x + 20, y=70)888990def draw_point(x, y):91# print(enemy_ships[y][x])92if enemy_ships[y][x] == 0:93color = "red"94id1 = canvas.create_oval(x * step_x, y * step_y, x * step_x + step_x, y * step_y + step_y, fill=color)95id2 = canvas.create_oval(x * step_x + step_x // 3, y * step_y + step_y // 3, x * step_x + step_x - step_x // 3,96y * step_y + step_y - step_y // 3, fill="white")97list_ids.append(id1)98list_ids.append(id2)99if enemy_ships[y][x] > 0:100color = "blue"101id1 = canvas.create_rectangle(x * step_x, y * step_y + step_y // 2 - step_y // 10, x * step_x + step_x,102y * step_y + step_y // 2 + step_y // 10, fill=color)103id2 = canvas.create_rectangle(x * step_x + step_x // 2 - step_x // 10, y * step_y,104x * step_x + step_x // 2 + step_x // 10, y * step_y + step_y, fill=color)105list_ids.append(id1)106list_ids.append(id2)107108109def check_winner(x, y):110win = False111if enemy_ships[y][x] > 0:112boom[y][x] = enemy_ships[y][x]113sum_enemy_ships = sum(sum(i) for i in zip(*enemy_ships))114sum_boom = sum(sum(i) for i in zip(*boom))115print(sum_enemy_ships, sum_boom)116if sum_enemy_ships == sum_boom:117win = True118return win119120121def check_winner2():122win = True123for i in range(0, s_x):124for j in range(0, s_y):125if enemy_ships[j][i] > 0:126if points[j][i] == -1:127win = False128print(win)129return win130131132def add_to_all(event):133global points134_type = 0 # ЛКМ135if event.num == 3:136_type = 1 # ПКМ137# print(_type)138mouse_x = canvas.winfo_pointerx() - canvas.winfo_rootx()139mouse_y = canvas.winfo_pointery() - canvas.winfo_rooty()140# print(mouse_x, mouse_y)141ip_x = mouse_x // step_x142ip_y = mouse_y // step_y143print(ip_x, ip_y, "_type:", _type)144if ip_x < s_x and ip_y < s_y:145if points[ip_y][ip_x] == -1:146points[ip_y][ip_x] = _type147draw_point(ip_x, ip_y)148# if check_winner(ip_x, ip_y):149if check_winner2():150print("Победа!!!!!")151points = [[10 for i in range(s_x)] for i in range(s_y)]152print(len(list_ids))153154155canvas.bind_all("<Button-1>", add_to_all) # ЛКМ156canvas.bind_all("<Button-3>", add_to_all) # ПКМ157158159def generate_enemy_ships():160global enemy_ships161ships_list = []162# генерируем список случайных длин кораблей163for i in range(0, ships):164ships_list.append(random.choice([ship_len1, ship_len2, ship_len3]))165# print(ships_list)166167# подсчет суммарной длины кораблей168sum_1_all_ships = sum(ships_list)169sum_1_enemy = 0170171while sum_1_enemy != sum_1_all_ships:172# обнуляем массив кораблей врага173enemy_ships = [[0 for i in range(s_x + 1)] for i in174range(s_y + 1)] # +1 для доп. линии справа и снизу, для успешных проверок генерации противника175176for i in range(0, ships):177len = ships_list[i]178horizont_vertikal = random.randrange(1, 3) # 1- горизонтальное 2 - вертикальное179180primerno_x = random.randrange(0, s_x)181if primerno_x + len > s_x:182primerno_x = primerno_x - len183184primerno_y = random.randrange(0, s_y)185if primerno_y + len > s_y:186primerno_y = primerno_y - len187188# print(horizont_vertikal, primerno_x,primerno_y)189if horizont_vertikal == 1:190if primerno_x + len <= s_x:191for j in range(0, len):192try:193check_near_ships = 0194check_near_ships = enemy_ships[primerno_y][primerno_x - 1] + \195enemy_ships[primerno_y][primerno_x + j] + \196enemy_ships[primerno_y][primerno_x + j + 1] + \197enemy_ships[primerno_y + 1][primerno_x + j + 1] + \198enemy_ships[primerno_y - 1][primerno_x + j + 1] + \199enemy_ships[primerno_y + 1][primerno_x + j] + \200enemy_ships[primerno_y - 1][primerno_x + j]201# print(check_near_ships)202if check_near_ships == 0: # записываем в том случае, если нет ничего рядом203enemy_ships[primerno_y][primerno_x + j] = i + 1 # записываем номер корабля204except Exception:205pass206if horizont_vertikal == 2:207if primerno_y + len <= s_y:208for j in range(0, len):209try:210check_near_ships = 0211check_near_ships = enemy_ships[primerno_y - 1][primerno_x] + \212enemy_ships[primerno_y + j][primerno_x] + \213enemy_ships[primerno_y + j + 1][primerno_x] + \214enemy_ships[primerno_y + j + 1][primerno_x + 1] + \215enemy_ships[primerno_y + j + 1][primerno_x - 1] + \216enemy_ships[primerno_y + j][primerno_x + 1] + \217enemy_ships[primerno_y + j][primerno_x - 1]218# print(check_near_ships)219if check_near_ships == 0: # записываем в том случае, если нет ничего рядом220enemy_ships[primerno_y + j][primerno_x] = i + 1 # записываем номер корабля221except Exception:222pass223224# делаем подсчет 1ц225sum_1_enemy = 0226for i in range(0, s_x):227for j in range(0, s_y):228if enemy_ships[j][i] > 0:229sum_1_enemy = sum_1_enemy + 1230231# print(sum_1_enemy)232# print(ships_list)233# print(enemy_ships)234235236generate_enemy_ships()237238while app_running:239if app_running:240tk.update_idletasks()241tk.update()242time.sleep(0.005)243244245