Path: blob/master/python-igra-morskoy-boy/main_lesson_12.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_y16delta_menu_x = 417menu_x = step_x * delta_menu_x # 25018menu_y = 4019ships = s_x // 2 # определяем максимальное кол-во кораблей20ship_len1 = s_x // 5 # длина первого типа корабля21ship_len2 = s_x // 3 # длина второго типа корабля22ship_len3 = s_x // 2 # длина третьего типа корабля23enemy_ships1 = [[0 for i in range(s_x + 1)] for i in range(s_y + 1)]24enemy_ships2 = [[0 for i in range(s_x + 1)] for i in range(s_y + 1)]25list_ids = [] # список объектов canvas2627# points1 - список куда мы кликнули мышкой28points1 = [[-1 for i in range(s_x)] for i in range(s_y)]29points2 = [[-1 for i in range(s_x)] for i in range(s_y)]3031# boom - список попаданий по кораблям противника32boom = [[0 for i in range(s_x)] for i in range(s_y)]3334# ships_list - список кораблей игрока 1 и игрока 235ships_list = []3637# print(enemy_ships1)3839def on_closing():40global app_running41if messagebox.askokcancel("Выход из игры", "Хотите выйти из игры?"):42app_running = False43tk.destroy()444546tk.protocol("WM_DELETE_WINDOW", on_closing)47tk.title("Игра Морской Бой")48tk.resizable(0, 0)49tk.wm_attributes("-topmost", 1)50canvas = Canvas(tk, width=size_canvas_x + menu_x + size_canvas_x, height=size_canvas_y + menu_y, bd=0,51highlightthickness=0)52canvas.create_rectangle(0, 0, size_canvas_x, size_canvas_y, fill="white")53canvas.create_rectangle(size_canvas_x + menu_x, 0, size_canvas_x + menu_x + size_canvas_x, size_canvas_y,54fill="lightyellow")55canvas.pack()56tk.update()575859def draw_table(offset_x=0):60for i in range(0, s_x + 1):61canvas.create_line(offset_x + step_x * i, 0, offset_x + step_x * i, size_canvas_y)62for i in range(0, s_y + 1):63canvas.create_line(offset_x, step_y * i, offset_x + size_canvas_x, step_y * i)646566draw_table()67draw_table(size_canvas_x + menu_x)6869t0 = Label(tk, text="Игрок №1", font=("Helvetica", 16))70t0.place(x=size_canvas_x // 2 - t0.winfo_reqwidth() // 2, y=size_canvas_y + 3)71t1 = Label(tk, text="Игрок №2", font=("Helvetica", 16))72t1.place(x=size_canvas_x + menu_x + size_canvas_x // 2 - t1.winfo_reqwidth() // 2, y=size_canvas_y + 3)7374t0.configure(bg="red")75t0.configure(bg="#f0f0f0")767778def button_show_enemy1():79for i in range(0, s_x):80for j in range(0, s_y):81if enemy_ships1[j][i] > 0:82color = "red"83if points1[j][i] != -1:84color = "green"85_id = canvas.create_rectangle(i * step_x, j * step_y, i * step_x + step_x, j * step_y + step_y,86fill=color)87list_ids.append(_id)888990def button_show_enemy2():91for i in range(0, s_x):92for j in range(0, s_y):93if enemy_ships2[j][i] > 0:94color = "red"95if points2[j][i] != -1:96color = "green"97_id = canvas.create_rectangle(size_canvas_x + menu_x + i * step_x, j * step_y, size_canvas_x + menu_x + i * step_x + step_x, j * step_y + step_y,98fill=color)99list_ids.append(_id)100101102def button_begin_again():103global list_ids104global points1, points2105global boom106global enemy_ships1, enemy_ships2107for el in list_ids:108canvas.delete(el)109list_ids = []110generate_ships_list()111# print(ships_list)112enemy_ships1 = generate_enemy_ships()113enemy_ships2 = generate_enemy_ships()114points1 = [[-1 for i in range(s_x)] for i in range(s_y)]115points2 = [[-1 for i in range(s_x)] for i in range(s_y)]116boom = [[0 for i in range(s_x)] for i in range(s_y)]117118119b0 = Button(tk, text="Показать корабли Игрока №1", command=button_show_enemy1)120b0.place(x=size_canvas_x + 20, y=30)121122b1 = Button(tk, text="Показать корабли Игрока №2", command=button_show_enemy2)123b1.place(x=size_canvas_x + 20, y=70)124125b2 = Button(tk, text="Начать заново!", command=button_begin_again)126b2.place(x=size_canvas_x + 20, y=110)127128129def draw_point(x, y):130# print(enemy_ships1[y][x])131if enemy_ships1[y][x] == 0:132color = "red"133id1 = canvas.create_oval(x * step_x, y * step_y, x * step_x + step_x, y * step_y + step_y, fill=color)134id2 = canvas.create_oval(x * step_x + step_x // 3, y * step_y + step_y // 3, x * step_x + step_x - step_x // 3,135y * step_y + step_y - step_y // 3, fill="white")136list_ids.append(id1)137list_ids.append(id2)138if enemy_ships1[y][x] > 0:139color = "blue"140id1 = canvas.create_rectangle(x * step_x, y * step_y + step_y // 2 - step_y // 10, x * step_x + step_x,141y * step_y + step_y // 2 + step_y // 10, fill=color)142id2 = canvas.create_rectangle(x * step_x + step_x // 2 - step_x // 10, y * step_y,143x * step_x + step_x // 2 + step_x // 10, y * step_y + step_y, fill=color)144list_ids.append(id1)145list_ids.append(id2)146147148def draw_point2(x, y, offset_x=size_canvas_x + menu_x):149# print(enemy_ships1[y][x])150if enemy_ships2[y][x] == 0:151color = "red"152id1 = canvas.create_oval(offset_x + x * step_x, y * step_y, offset_x + x * step_x + step_x, y * step_y + step_y, fill=color)153id2 = canvas.create_oval(offset_x + x * step_x + step_x // 3, y * step_y + step_y // 3, offset_x + x * step_x + step_x - step_x // 3,154y * step_y + step_y - step_y // 3, fill="white")155list_ids.append(id1)156list_ids.append(id2)157if enemy_ships2[y][x] > 0:158color = "blue"159id1 = canvas.create_rectangle(offset_x + x * step_x, y * step_y + step_y // 2 - step_y // 10, offset_x + x * step_x + step_x,160y * step_y + step_y // 2 + step_y // 10, fill=color)161id2 = canvas.create_rectangle(offset_x + x * step_x + step_x // 2 - step_x // 10, y * step_y,162offset_x + x * step_x + step_x // 2 + step_x // 10, y * step_y + step_y, fill=color)163list_ids.append(id1)164list_ids.append(id2)165166167def check_winner(x, y):168win = False169if enemy_ships1[y][x] > 0:170boom[y][x] = enemy_ships1[y][x]171sum_enemy_ships1 = sum(sum(i) for i in zip(*enemy_ships1))172sum_boom = sum(sum(i) for i in zip(*boom))173#print(sum_enemy_ships1, sum_boom)174if sum_enemy_ships1 == sum_boom:175win = True176return win177178179def check_winner2():180win = True181for i in range(0, s_x):182for j in range(0, s_y):183if enemy_ships1[j][i] > 0:184if points1[j][i] == -1:185win = False186#print(win)187return win188189190def add_to_all(event):191global points1, points2192_type = 0 # ЛКМ193if event.num == 3:194_type = 1 # ПКМ195# print(_type)196mouse_x = canvas.winfo_pointerx() - canvas.winfo_rootx()197mouse_y = canvas.winfo_pointery() - canvas.winfo_rooty()198# print(mouse_x, mouse_y)199ip_x = mouse_x // step_x200ip_y = mouse_y // step_y201print(ip_x, ip_y, "_type:", _type)202if ip_x < s_x and ip_y < s_y:203if points1[ip_y][ip_x] == -1:204points1[ip_y][ip_x] = _type205draw_point(ip_x, ip_y)206# if check_winner(ip_x, ip_y):207if check_winner2():208print("Победа!!!!!")209points1 = [[10 for i in range(s_x)] for i in range(s_y)]210#print(len(list_ids))211212if ip_x >= s_x + delta_menu_x and ip_x <= s_x + s_x + delta_menu_x and ip_y < s_y:213# print("ok")214if points2[ip_y][ip_x - s_x - delta_menu_x] == -1:215points2[ip_y][ip_x - s_x - delta_menu_x] = _type216draw_point2(ip_x - s_x - delta_menu_x, ip_y)217# if check_winner(ip_x, ip_y):218if check_winner2():219print("Победа!!!!!")220points2 = [[10 for i in range(s_x)] for i in range(s_y)]221222223canvas.bind_all("<Button-1>", add_to_all) # ЛКМ224canvas.bind_all("<Button-3>", add_to_all) # ПКМ225226227def generate_ships_list():228global ships_list229ships_list = []230# генерируем список случайных длин кораблей231for i in range(0, ships):232ships_list.append(random.choice([ship_len1, ship_len2, ship_len3]))233# print(ships_list)234235236def generate_enemy_ships():237global ships_list238enemy_ships = []239240# подсчет суммарной длины кораблей241sum_1_all_ships = sum(ships_list)242sum_1_enemy = 0243244# print("sum: ", sum_1_all_ships)245246while sum_1_enemy != sum_1_all_ships:247# обнуляем массив кораблей врага248enemy_ships = [[0 for i in range(s_x + 1)] for i in249range(s_y + 1)] # +1 для доп. линии справа и снизу, для успешных проверок генерации противника250251for i in range(0, ships):252len = ships_list[i]253horizont_vertikal = random.randrange(1, 3) # 1- горизонтальное 2 - вертикальное254255primerno_x = random.randrange(0, s_x)256if primerno_x + len > s_x:257primerno_x = primerno_x - len258259primerno_y = random.randrange(0, s_y)260if primerno_y + len > s_y:261primerno_y = primerno_y - len262263# print(horizont_vertikal, primerno_x,primerno_y)264if horizont_vertikal == 1:265if primerno_x + len <= s_x:266for j in range(0, len):267try:268check_near_ships = 0269check_near_ships = enemy_ships[primerno_y][primerno_x - 1] + \270enemy_ships[primerno_y][primerno_x + j] + \271enemy_ships[primerno_y][primerno_x + j + 1] + \272enemy_ships[primerno_y + 1][primerno_x + j + 1] + \273enemy_ships[primerno_y - 1][primerno_x + j + 1] + \274enemy_ships[primerno_y + 1][primerno_x + j] + \275enemy_ships[primerno_y - 1][primerno_x + j]276# print(check_near_ships)277if check_near_ships == 0: # записываем в том случае, если нет ничего рядом278enemy_ships[primerno_y][primerno_x + j] = i + 1 # записываем номер корабля279except Exception:280pass281if horizont_vertikal == 2:282if primerno_y + len <= s_y:283for j in range(0, len):284try:285check_near_ships = 0286check_near_ships = enemy_ships[primerno_y - 1][primerno_x] + \287enemy_ships[primerno_y + j][primerno_x] + \288enemy_ships[primerno_y + j + 1][primerno_x] + \289enemy_ships[primerno_y + j + 1][primerno_x + 1] + \290enemy_ships[primerno_y + j + 1][primerno_x - 1] + \291enemy_ships[primerno_y + j][primerno_x + 1] + \292enemy_ships[primerno_y + j][primerno_x - 1]293# print(check_near_ships)294if check_near_ships == 0: # записываем в том случае, если нет ничего рядом295enemy_ships[primerno_y + j][primerno_x] = i + 1 # записываем номер корабля296except Exception:297pass298299# делаем подсчет 1ц300sum_1_enemy = 0301for i in range(0, s_x):302for j in range(0, s_y):303if enemy_ships[j][i] > 0:304sum_1_enemy = sum_1_enemy + 1305306# print(sum_1_enemy)307# print(ships_list)308# print(enemy_ships)309return enemy_ships310311312generate_ships_list()313# print(ships_list)314enemy_ships1 = generate_enemy_ships()315enemy_ships2 = generate_enemy_ships()316# print("****************************")317# print(enemy_ships1)318# print("****************************")319# print(enemy_ships2)320# print("****************************")321322while app_running:323if app_running:324tk.update_idletasks()325tk.update()326time.sleep(0.005)327328329