Path: blob/master/python-igra-morskoy-boy/main_lesson_9.py
5918 views
from tkinter import *1from tkinter import messagebox2import time3import random45tk = Tk()6app_running = True78size_canvas_x = 5009size_canvas_y = 50010s_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 = step_x * 4 # 25017menu_y = 4018ships = s_x // 2 # определяем максимальное кол-во кораблей19ship_len1 = s_x // 5 # длина первого типа корабля20ship_len2 = s_x // 3 # длина второго типа корабля21ship_len3 = s_x // 2 # длина третьего типа корабля22enemy_ships = [[0 for i in range(s_x + 1)] for i in range(s_y + 1)]23list_ids = [] # список объектов canvas2425# points - список куда мы кликнули мышкой26points = [[-1 for i in range(s_x)] for i in range(s_y)]2728# boom - список попаданий по кораблям противника29boom = [[0 for i in range(s_x)] for i in range(s_y)]303132# print(enemy_ships)3334def on_closing():35global app_running36if messagebox.askokcancel("Выход из игры", "Хотите выйти из игры?"):37app_running = False38tk.destroy()394041tk.protocol("WM_DELETE_WINDOW", on_closing)42tk.title("Игра Морской Бой")43tk.resizable(0, 0)44tk.wm_attributes("-topmost", 1)45canvas = Canvas(tk, width=size_canvas_x + menu_x + size_canvas_x, height=size_canvas_y + menu_y, bd=0,46highlightthickness=0)47canvas.create_rectangle(0, 0, size_canvas_x, size_canvas_y, fill="white")48canvas.create_rectangle(size_canvas_x + menu_x, 0, size_canvas_x + menu_x + size_canvas_x, size_canvas_y,49fill="lightyellow")50canvas.pack()51tk.update()525354def draw_table(offset_x=0):55for i in range(0, s_x + 1):56canvas.create_line(offset_x + step_x * i, 0, offset_x + step_x * i, size_canvas_y)57for i in range(0, s_y + 1):58canvas.create_line(offset_x, step_y * i, offset_x + size_canvas_x, step_y * i)596061draw_table()62draw_table(size_canvas_x + menu_x)6364t0 = Label(tk, text="Игрок №1", font=("Helvetica", 16))65t0.place(x=size_canvas_x // 2 - t0.winfo_reqwidth() // 2, y=size_canvas_y+3)66t1 = Label(tk, text="Игрок №2", font=("Helvetica", 16))67t1.place(x=size_canvas_x + menu_x + size_canvas_x // 2 - t1.winfo_reqwidth() // 2, y=size_canvas_y+3)6869t0.configure(bg="red")70t0.configure(bg="#f0f0f0")717273def button_show_enemy():74for i in range(0, s_x):75for j in range(0, s_y):76if enemy_ships[j][i] > 0:77color = "red"78if points[j][i] != -1:79color = "green"80_id = canvas.create_rectangle(i * step_x, j * step_y, i * step_x + step_x, j * step_y + step_y,81fill=color)82list_ids.append(_id)838485def button_begin_again():86global list_ids87global points88global boom89for el in list_ids:90canvas.delete(el)91list_ids = []92generate_enemy_ships()93points = [[-1 for i in range(s_x)] for i in range(s_y)]94boom = [[0 for i in range(s_x)] for i in range(s_y)]959697b0 = Button(tk, text="Показать корабли противника", command=button_show_enemy)98b0.place(x=size_canvas_x + 20, y=30)99100b1 = Button(tk, text="Начать заново!", command=button_begin_again)101b1.place(x=size_canvas_x + 20, y=70)102103104def draw_point(x, y):105# print(enemy_ships[y][x])106if enemy_ships[y][x] == 0:107color = "red"108id1 = canvas.create_oval(x * step_x, y * step_y, x * step_x + step_x, y * step_y + step_y, fill=color)109id2 = canvas.create_oval(x * step_x + step_x // 3, y * step_y + step_y // 3, x * step_x + step_x - step_x // 3,110y * step_y + step_y - step_y // 3, fill="white")111list_ids.append(id1)112list_ids.append(id2)113if enemy_ships[y][x] > 0:114color = "blue"115id1 = canvas.create_rectangle(x * step_x, y * step_y + step_y // 2 - step_y // 10, x * step_x + step_x,116y * step_y + step_y // 2 + step_y // 10, fill=color)117id2 = canvas.create_rectangle(x * step_x + step_x // 2 - step_x // 10, y * step_y,118x * step_x + step_x // 2 + step_x // 10, y * step_y + step_y, fill=color)119list_ids.append(id1)120list_ids.append(id2)121122123def check_winner(x, y):124win = False125if enemy_ships[y][x] > 0:126boom[y][x] = enemy_ships[y][x]127sum_enemy_ships = sum(sum(i) for i in zip(*enemy_ships))128sum_boom = sum(sum(i) for i in zip(*boom))129print(sum_enemy_ships, sum_boom)130if sum_enemy_ships == sum_boom:131win = True132return win133134135def check_winner2():136win = True137for i in range(0, s_x):138for j in range(0, s_y):139if enemy_ships[j][i] > 0:140if points[j][i] == -1:141win = False142print(win)143return win144145146def add_to_all(event):147global points148_type = 0 # ЛКМ149if event.num == 3:150_type = 1 # ПКМ151# print(_type)152mouse_x = canvas.winfo_pointerx() - canvas.winfo_rootx()153mouse_y = canvas.winfo_pointery() - canvas.winfo_rooty()154# print(mouse_x, mouse_y)155ip_x = mouse_x // step_x156ip_y = mouse_y // step_y157print(ip_x, ip_y, "_type:", _type)158if ip_x < s_x and ip_y < s_y:159if points[ip_y][ip_x] == -1:160points[ip_y][ip_x] = _type161draw_point(ip_x, ip_y)162# if check_winner(ip_x, ip_y):163if check_winner2():164print("Победа!!!!!")165points = [[10 for i in range(s_x)] for i in range(s_y)]166print(len(list_ids))167168169canvas.bind_all("<Button-1>", add_to_all) # ЛКМ170canvas.bind_all("<Button-3>", add_to_all) # ПКМ171172173def generate_enemy_ships():174global enemy_ships175ships_list = []176# генерируем список случайных длин кораблей177for i in range(0, ships):178ships_list.append(random.choice([ship_len1, ship_len2, ship_len3]))179# print(ships_list)180181# подсчет суммарной длины кораблей182sum_1_all_ships = sum(ships_list)183sum_1_enemy = 0184185while sum_1_enemy != sum_1_all_ships:186# обнуляем массив кораблей врага187enemy_ships = [[0 for i in range(s_x + 1)] for i in188range(s_y + 1)] # +1 для доп. линии справа и снизу, для успешных проверок генерации противника189190for i in range(0, ships):191len = ships_list[i]192horizont_vertikal = random.randrange(1, 3) # 1- горизонтальное 2 - вертикальное193194primerno_x = random.randrange(0, s_x)195if primerno_x + len > s_x:196primerno_x = primerno_x - len197198primerno_y = random.randrange(0, s_y)199if primerno_y + len > s_y:200primerno_y = primerno_y - len201202# print(horizont_vertikal, primerno_x,primerno_y)203if horizont_vertikal == 1:204if primerno_x + len <= s_x:205for j in range(0, len):206try:207check_near_ships = 0208check_near_ships = enemy_ships[primerno_y][primerno_x - 1] + \209enemy_ships[primerno_y][primerno_x + j] + \210enemy_ships[primerno_y][primerno_x + j + 1] + \211enemy_ships[primerno_y + 1][primerno_x + j + 1] + \212enemy_ships[primerno_y - 1][primerno_x + j + 1] + \213enemy_ships[primerno_y + 1][primerno_x + j] + \214enemy_ships[primerno_y - 1][primerno_x + j]215# print(check_near_ships)216if check_near_ships == 0: # записываем в том случае, если нет ничего рядом217enemy_ships[primerno_y][primerno_x + j] = i + 1 # записываем номер корабля218except Exception:219pass220if horizont_vertikal == 2:221if primerno_y + len <= s_y:222for j in range(0, len):223try:224check_near_ships = 0225check_near_ships = enemy_ships[primerno_y - 1][primerno_x] + \226enemy_ships[primerno_y + j][primerno_x] + \227enemy_ships[primerno_y + j + 1][primerno_x] + \228enemy_ships[primerno_y + j + 1][primerno_x + 1] + \229enemy_ships[primerno_y + j + 1][primerno_x - 1] + \230enemy_ships[primerno_y + j][primerno_x + 1] + \231enemy_ships[primerno_y + j][primerno_x - 1]232# print(check_near_ships)233if check_near_ships == 0: # записываем в том случае, если нет ничего рядом234enemy_ships[primerno_y + j][primerno_x] = i + 1 # записываем номер корабля235except Exception:236pass237238# делаем подсчет 1ц239sum_1_enemy = 0240for i in range(0, s_x):241for j in range(0, s_y):242if enemy_ships[j][i] > 0:243sum_1_enemy = sum_1_enemy + 1244245# print(sum_1_enemy)246# print(ships_list)247# print(enemy_ships)248249250generate_enemy_ships()251252while app_running:253if app_running:254tk.update_idletasks()255tk.update()256time.sleep(0.005)257258259