Path: blob/master/python-igra-morskoy-boy/main_lesson_13.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 = []363738# print(enemy_ships1)3940def on_closing():41global app_running42if messagebox.askokcancel("Выход из игры", "Хотите выйти из игры?"):43app_running = False44tk.destroy()454647tk.protocol("WM_DELETE_WINDOW", on_closing)48tk.title("Игра Морской Бой")49tk.resizable(0, 0)50tk.wm_attributes("-topmost", 1)51canvas = Canvas(tk, width=size_canvas_x + menu_x + size_canvas_x, height=size_canvas_y + menu_y, bd=0,52highlightthickness=0)53canvas.create_rectangle(0, 0, size_canvas_x, size_canvas_y, fill="white")54canvas.create_rectangle(size_canvas_x + menu_x, 0, size_canvas_x + menu_x + size_canvas_x, size_canvas_y,55fill="lightyellow")56canvas.pack()57tk.update()585960def draw_table(offset_x=0):61for i in range(0, s_x + 1):62canvas.create_line(offset_x + step_x * i, 0, offset_x + step_x * i, size_canvas_y)63for i in range(0, s_y + 1):64canvas.create_line(offset_x, step_y * i, offset_x + size_canvas_x, step_y * i)656667draw_table()68draw_table(size_canvas_x + menu_x)6970t0 = Label(tk, text="Игрок №1", font=("Helvetica", 16))71t0.place(x=size_canvas_x // 2 - t0.winfo_reqwidth() // 2, y=size_canvas_y + 3)72t1 = Label(tk, text="Игрок №2", font=("Helvetica", 16))73t1.place(x=size_canvas_x + menu_x + size_canvas_x // 2 - t1.winfo_reqwidth() // 2, y=size_canvas_y + 3)7475t0.configure(bg="red")76t0.configure(bg="#f0f0f0")777879def button_show_enemy1():80for i in range(0, s_x):81for j in range(0, s_y):82if enemy_ships1[j][i] > 0:83color = "red"84if points1[j][i] != -1:85color = "green"86_id = canvas.create_rectangle(i * step_x, j * step_y, i * step_x + step_x, j * step_y + step_y,87fill=color)88list_ids.append(_id)899091def button_show_enemy2():92for i in range(0, s_x):93for j in range(0, s_y):94if enemy_ships2[j][i] > 0:95color = "red"96if points2[j][i] != -1:97color = "green"98_id = canvas.create_rectangle(size_canvas_x + menu_x + i * step_x, j * step_y,99size_canvas_x + menu_x + i * step_x + step_x, j * step_y + step_y,100fill=color)101list_ids.append(_id)102103104def button_begin_again():105global list_ids106global points1, points2107global boom108global enemy_ships1, enemy_ships2109for el in list_ids:110canvas.delete(el)111list_ids = []112generate_ships_list()113# print(ships_list)114enemy_ships1 = generate_enemy_ships()115enemy_ships2 = generate_enemy_ships()116points1 = [[-1 for i in range(s_x)] for i in range(s_y)]117points2 = [[-1 for i in range(s_x)] for i in range(s_y)]118boom = [[0 for i in range(s_x)] for i in range(s_y)]119120121b0 = Button(tk, text="Показать корабли Игрока №1", command=button_show_enemy1)122b0.place(x=size_canvas_x + 20, y=30)123124b1 = Button(tk, text="Показать корабли Игрока №2", command=button_show_enemy2)125b1.place(x=size_canvas_x + 20, y=70)126127b2 = Button(tk, text="Начать заново!", command=button_begin_again)128b2.place(x=size_canvas_x + 20, y=110)129130131def draw_point(x, y):132# print(enemy_ships1[y][x])133if enemy_ships1[y][x] == 0:134color = "red"135id1 = canvas.create_oval(x * step_x, y * step_y, x * step_x + step_x, y * step_y + step_y, fill=color)136id2 = canvas.create_oval(x * step_x + step_x // 3, y * step_y + step_y // 3, x * step_x + step_x - step_x // 3,137y * step_y + step_y - step_y // 3, fill="white")138list_ids.append(id1)139list_ids.append(id2)140if enemy_ships1[y][x] > 0:141color = "blue"142id1 = canvas.create_rectangle(x * step_x, y * step_y + step_y // 2 - step_y // 10, x * step_x + step_x,143y * step_y + step_y // 2 + step_y // 10, fill=color)144id2 = canvas.create_rectangle(x * step_x + step_x // 2 - step_x // 10, y * step_y,145x * step_x + step_x // 2 + step_x // 10, y * step_y + step_y, fill=color)146list_ids.append(id1)147list_ids.append(id2)148149150def draw_point2(x, y, offset_x=size_canvas_x + menu_x):151# print(enemy_ships1[y][x])152if enemy_ships2[y][x] == 0:153color = "red"154id1 = canvas.create_oval(offset_x + x * step_x, y * step_y, offset_x + x * step_x + step_x, y * step_y + step_y,155fill=color)156id2 = canvas.create_oval(offset_x + x * step_x + step_x // 3, y * step_y + step_y // 3,157offset_x + x * step_x + step_x - step_x // 3,158y * step_y + step_y - step_y // 3, fill="white")159list_ids.append(id1)160list_ids.append(id2)161if enemy_ships2[y][x] > 0:162color = "blue"163id1 = canvas.create_rectangle(offset_x + x * step_x, y * step_y + step_y // 2 - step_y // 10,164offset_x + x * step_x + step_x,165y * step_y + step_y // 2 + step_y // 10, fill=color)166id2 = canvas.create_rectangle(offset_x + x * step_x + step_x // 2 - step_x // 10, y * step_y,167offset_x + x * step_x + step_x // 2 + step_x // 10, y * step_y + step_y,168fill=color)169list_ids.append(id1)170list_ids.append(id2)171172173def check_winner(x, y):174win = False175if enemy_ships1[y][x] > 0:176boom[y][x] = enemy_ships1[y][x]177sum_enemy_ships1 = sum(sum(i) for i in zip(*enemy_ships1))178sum_boom = sum(sum(i) for i in zip(*boom))179# print(sum_enemy_ships1, sum_boom)180if sum_enemy_ships1 == sum_boom:181win = True182return win183184185def check_winner2():186win = True187for i in range(0, s_x):188for j in range(0, s_y):189if enemy_ships1[j][i] > 0:190if points1[j][i] == -1:191win = False192# print(win)193return win194195196def check_winner2_igrok_2():197win = True198for i in range(0, s_x):199for j in range(0, s_y):200if enemy_ships2[j][i] > 0:201if points2[j][i] == -1:202win = False203# print(win)204return win205206207def add_to_all(event):208global points1, points2209_type = 0 # ЛКМ210if event.num == 3:211_type = 1 # ПКМ212# print(_type)213mouse_x = canvas.winfo_pointerx() - canvas.winfo_rootx()214mouse_y = canvas.winfo_pointery() - canvas.winfo_rooty()215# print(mouse_x, mouse_y)216ip_x = mouse_x // step_x217ip_y = mouse_y // step_y218# print(ip_x, ip_y, "_type:", _type)219220# первое игровое поле221if ip_x < s_x and ip_y < s_y:222if points1[ip_y][ip_x] == -1:223points1[ip_y][ip_x] = _type224draw_point(ip_x, ip_y)225# if check_winner(ip_x, ip_y):226if check_winner2():227print("Победа Игрока №2 (Все корабли противника Игрока №1 подбиты)!!!!!")228points1 = [[10 for i in range(s_x)] for i in range(s_y)]229points2 = [[10 for i in range(s_x)] for i in range(s_y)]230# print(len(list_ids))231232# второе игровое поле233if ip_x >= s_x + delta_menu_x and ip_x <= s_x + s_x + delta_menu_x and ip_y < s_y:234# print("ok")235if points2[ip_y][ip_x - s_x - delta_menu_x] == -1:236points2[ip_y][ip_x - s_x - delta_menu_x] = _type237draw_point2(ip_x - s_x - delta_menu_x, ip_y)238# if check_winner(ip_x, ip_y):239if check_winner2_igrok_2():240print("Победа Игрока №1 (Все корабли противника Игрока №2 подбиты)!!!!!")241points1 = [[10 for i in range(s_x)] for i in range(s_y)]242points2 = [[10 for i in range(s_x)] for i in range(s_y)]243244245canvas.bind_all("<Button-1>", add_to_all) # ЛКМ246canvas.bind_all("<Button-3>", add_to_all) # ПКМ247248249def generate_ships_list():250global ships_list251ships_list = []252# генерируем список случайных длин кораблей253for i in range(0, ships):254ships_list.append(random.choice([ship_len1, ship_len2, ship_len3]))255# print(ships_list)256257258def generate_enemy_ships():259global ships_list260enemy_ships = []261262# подсчет суммарной длины кораблей263sum_1_all_ships = sum(ships_list)264sum_1_enemy = 0265266# print("sum: ", sum_1_all_ships)267268while sum_1_enemy != sum_1_all_ships:269# обнуляем массив кораблей врага270enemy_ships = [[0 for i in range(s_x + 1)] for i in271range(s_y + 1)] # +1 для доп. линии справа и снизу, для успешных проверок генерации противника272273for i in range(0, ships):274len = ships_list[i]275horizont_vertikal = random.randrange(1, 3) # 1- горизонтальное 2 - вертикальное276277primerno_x = random.randrange(0, s_x)278if primerno_x + len > s_x:279primerno_x = primerno_x - len280281primerno_y = random.randrange(0, s_y)282if primerno_y + len > s_y:283primerno_y = primerno_y - len284285# print(horizont_vertikal, primerno_x,primerno_y)286if horizont_vertikal == 1:287if primerno_x + len <= s_x:288for j in range(0, len):289try:290check_near_ships = 0291check_near_ships = enemy_ships[primerno_y][primerno_x - 1] + \292enemy_ships[primerno_y][primerno_x + j] + \293enemy_ships[primerno_y][primerno_x + j + 1] + \294enemy_ships[primerno_y + 1][primerno_x + j + 1] + \295enemy_ships[primerno_y - 1][primerno_x + j + 1] + \296enemy_ships[primerno_y + 1][primerno_x + j] + \297enemy_ships[primerno_y - 1][primerno_x + j]298# print(check_near_ships)299if check_near_ships == 0: # записываем в том случае, если нет ничего рядом300enemy_ships[primerno_y][primerno_x + j] = i + 1 # записываем номер корабля301except Exception:302pass303if horizont_vertikal == 2:304if primerno_y + len <= s_y:305for j in range(0, len):306try:307check_near_ships = 0308check_near_ships = enemy_ships[primerno_y - 1][primerno_x] + \309enemy_ships[primerno_y + j][primerno_x] + \310enemy_ships[primerno_y + j + 1][primerno_x] + \311enemy_ships[primerno_y + j + 1][primerno_x + 1] + \312enemy_ships[primerno_y + j + 1][primerno_x - 1] + \313enemy_ships[primerno_y + j][primerno_x + 1] + \314enemy_ships[primerno_y + j][primerno_x - 1]315# print(check_near_ships)316if check_near_ships == 0: # записываем в том случае, если нет ничего рядом317enemy_ships[primerno_y + j][primerno_x] = i + 1 # записываем номер корабля318except Exception:319pass320321# делаем подсчет 1ц322sum_1_enemy = 0323for i in range(0, s_x):324for j in range(0, s_y):325if enemy_ships[j][i] > 0:326sum_1_enemy = sum_1_enemy + 1327328# print(sum_1_enemy)329# print(ships_list)330# print(enemy_ships)331return enemy_ships332333334generate_ships_list()335# print(ships_list)336enemy_ships1 = generate_enemy_ships()337enemy_ships2 = generate_enemy_ships()338# print("****************************")339# print(enemy_ships1)340# print("****************************")341# print(enemy_ships2)342# print("****************************")343344while app_running:345if app_running:346tk.update_idletasks()347tk.update()348time.sleep(0.005)349350351