Path: blob/master/python-igra-morskoy-boy/main_lesson_10.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_ships1 = [[0 for i in range(s_x + 1)] for i in range(s_y + 1)]23enemy_ships2 = [[0 for i in range(s_x + 1)] for i in range(s_y + 1)]24list_ids = [] # список объектов canvas2526# points1 - список куда мы кликнули мышкой27points1 = [[-1 for i in range(s_x)] for i in range(s_y)]28points2 = [[-1 for i in range(s_x)] for i in range(s_y)]2930# boom - список попаданий по кораблям противника31boom = [[0 for i in range(s_x)] for i in range(s_y)]323334# print(enemy_ships1)3536def on_closing():37global app_running38if messagebox.askokcancel("Выход из игры", "Хотите выйти из игры?"):39app_running = False40tk.destroy()414243tk.protocol("WM_DELETE_WINDOW", on_closing)44tk.title("Игра Морской Бой")45tk.resizable(0, 0)46tk.wm_attributes("-topmost", 1)47canvas = Canvas(tk, width=size_canvas_x + menu_x + size_canvas_x, height=size_canvas_y + menu_y, bd=0,48highlightthickness=0)49canvas.create_rectangle(0, 0, size_canvas_x, size_canvas_y, fill="white")50canvas.create_rectangle(size_canvas_x + menu_x, 0, size_canvas_x + menu_x + size_canvas_x, size_canvas_y,51fill="lightyellow")52canvas.pack()53tk.update()545556def draw_table(offset_x=0):57for i in range(0, s_x + 1):58canvas.create_line(offset_x + step_x * i, 0, offset_x + step_x * i, size_canvas_y)59for i in range(0, s_y + 1):60canvas.create_line(offset_x, step_y * i, offset_x + size_canvas_x, step_y * i)616263draw_table()64draw_table(size_canvas_x + menu_x)6566t0 = Label(tk, text="Игрок №1", font=("Helvetica", 16))67t0.place(x=size_canvas_x // 2 - t0.winfo_reqwidth() // 2, y=size_canvas_y + 3)68t1 = Label(tk, text="Игрок №2", font=("Helvetica", 16))69t1.place(x=size_canvas_x + menu_x + size_canvas_x // 2 - t1.winfo_reqwidth() // 2, y=size_canvas_y + 3)7071t0.configure(bg="red")72t0.configure(bg="#f0f0f0")737475def button_show_enemy1():76for i in range(0, s_x):77for j in range(0, s_y):78if enemy_ships1[j][i] > 0:79color = "red"80if points1[j][i] != -1:81color = "green"82_id = canvas.create_rectangle(i * step_x, j * step_y, i * step_x + step_x, j * step_y + step_y,83fill=color)84list_ids.append(_id)858687def button_show_enemy2():88for i in range(0, s_x):89for j in range(0, s_y):90if enemy_ships2[j][i] > 0:91color = "red"92if points2[j][i] != -1:93color = "green"94_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,95fill=color)96list_ids.append(_id)979899def button_begin_again():100global list_ids101global points1, points2102global boom103global enemy_ships1, enemy_ships2104for el in list_ids:105canvas.delete(el)106list_ids = []107enemy_ships1 = generate_enemy_ships()108enemy_ships2 = generate_enemy_ships()109points1 = [[-1 for i in range(s_x)] for i in range(s_y)]110points2 = [[-1 for i in range(s_x)] for i in range(s_y)]111boom = [[0 for i in range(s_x)] for i in range(s_y)]112113114b0 = Button(tk, text="Показать корабли Игрока №1", command=button_show_enemy1)115b0.place(x=size_canvas_x + 20, y=30)116117b1 = Button(tk, text="Показать корабли Игрока №2", command=button_show_enemy2)118b1.place(x=size_canvas_x + 20, y=70)119120b2 = Button(tk, text="Начать заново!", command=button_begin_again)121b2.place(x=size_canvas_x + 20, y=110)122123124def draw_point(x, y):125# print(enemy_ships1[y][x])126if enemy_ships1[y][x] == 0:127color = "red"128id1 = canvas.create_oval(x * step_x, y * step_y, x * step_x + step_x, y * step_y + step_y, fill=color)129id2 = canvas.create_oval(x * step_x + step_x // 3, y * step_y + step_y // 3, x * step_x + step_x - step_x // 3,130y * step_y + step_y - step_y // 3, fill="white")131list_ids.append(id1)132list_ids.append(id2)133if enemy_ships1[y][x] > 0:134color = "blue"135id1 = canvas.create_rectangle(x * step_x, y * step_y + step_y // 2 - step_y // 10, x * step_x + step_x,136y * step_y + step_y // 2 + step_y // 10, fill=color)137id2 = canvas.create_rectangle(x * step_x + step_x // 2 - step_x // 10, y * step_y,138x * step_x + step_x // 2 + step_x // 10, y * step_y + step_y, fill=color)139list_ids.append(id1)140list_ids.append(id2)141142143def check_winner(x, y):144win = False145if enemy_ships1[y][x] > 0:146boom[y][x] = enemy_ships1[y][x]147sum_enemy_ships1 = sum(sum(i) for i in zip(*enemy_ships1))148sum_boom = sum(sum(i) for i in zip(*boom))149print(sum_enemy_ships1, sum_boom)150if sum_enemy_ships1 == sum_boom:151win = True152return win153154155def check_winner2():156win = True157for i in range(0, s_x):158for j in range(0, s_y):159if enemy_ships1[j][i] > 0:160if points1[j][i] == -1:161win = False162print(win)163return win164165166def add_to_all(event):167global points1168_type = 0 # ЛКМ169if event.num == 3:170_type = 1 # ПКМ171# print(_type)172mouse_x = canvas.winfo_pointerx() - canvas.winfo_rootx()173mouse_y = canvas.winfo_pointery() - canvas.winfo_rooty()174# print(mouse_x, mouse_y)175ip_x = mouse_x // step_x176ip_y = mouse_y // step_y177print(ip_x, ip_y, "_type:", _type)178if ip_x < s_x and ip_y < s_y:179if points1[ip_y][ip_x] == -1:180points1[ip_y][ip_x] = _type181draw_point(ip_x, ip_y)182# if check_winner(ip_x, ip_y):183if check_winner2():184print("Победа!!!!!")185points1 = [[10 for i in range(s_x)] for i in range(s_y)]186print(len(list_ids))187188189canvas.bind_all("<Button-1>", add_to_all) # ЛКМ190canvas.bind_all("<Button-3>", add_to_all) # ПКМ191192193def generate_enemy_ships():194enemy_ships = []195ships_list = []196# генерируем список случайных длин кораблей197for i in range(0, ships):198ships_list.append(random.choice([ship_len1, ship_len2, ship_len3]))199# print(ships_list)200201# подсчет суммарной длины кораблей202sum_1_all_ships = sum(ships_list)203sum_1_enemy = 0204205while sum_1_enemy != sum_1_all_ships:206# обнуляем массив кораблей врага207enemy_ships = [[0 for i in range(s_x + 1)] for i in208range(s_y + 1)] # +1 для доп. линии справа и снизу, для успешных проверок генерации противника209210for i in range(0, ships):211len = ships_list[i]212horizont_vertikal = random.randrange(1, 3) # 1- горизонтальное 2 - вертикальное213214primerno_x = random.randrange(0, s_x)215if primerno_x + len > s_x:216primerno_x = primerno_x - len217218primerno_y = random.randrange(0, s_y)219if primerno_y + len > s_y:220primerno_y = primerno_y - len221222# print(horizont_vertikal, primerno_x,primerno_y)223if horizont_vertikal == 1:224if primerno_x + len <= s_x:225for j in range(0, len):226try:227check_near_ships = 0228check_near_ships = enemy_ships[primerno_y][primerno_x - 1] + \229enemy_ships[primerno_y][primerno_x + j] + \230enemy_ships[primerno_y][primerno_x + j + 1] + \231enemy_ships[primerno_y + 1][primerno_x + j + 1] + \232enemy_ships[primerno_y - 1][primerno_x + j + 1] + \233enemy_ships[primerno_y + 1][primerno_x + j] + \234enemy_ships[primerno_y - 1][primerno_x + j]235# print(check_near_ships)236if check_near_ships == 0: # записываем в том случае, если нет ничего рядом237enemy_ships[primerno_y][primerno_x + j] = i + 1 # записываем номер корабля238except Exception:239pass240if horizont_vertikal == 2:241if primerno_y + len <= s_y:242for j in range(0, len):243try:244check_near_ships = 0245check_near_ships = enemy_ships[primerno_y - 1][primerno_x] + \246enemy_ships[primerno_y + j][primerno_x] + \247enemy_ships[primerno_y + j + 1][primerno_x] + \248enemy_ships[primerno_y + j + 1][primerno_x + 1] + \249enemy_ships[primerno_y + j + 1][primerno_x - 1] + \250enemy_ships[primerno_y + j][primerno_x + 1] + \251enemy_ships[primerno_y + j][primerno_x - 1]252# print(check_near_ships)253if check_near_ships == 0: # записываем в том случае, если нет ничего рядом254enemy_ships[primerno_y + j][primerno_x] = i + 1 # записываем номер корабля255except Exception:256pass257258# делаем подсчет 1ц259sum_1_enemy = 0260for i in range(0, s_x):261for j in range(0, s_y):262if enemy_ships[j][i] > 0:263sum_1_enemy = sum_1_enemy + 1264265# print(sum_1_enemy)266# print(ships_list)267# print(enemy_ships)268return enemy_ships269270271enemy_ships1 = generate_enemy_ships()272enemy_ships2 = generate_enemy_ships()273# print("****************************")274# print(enemy_ships1)275# print("****************************")276# print(enemy_ships2)277# print("****************************")278279while app_running:280if app_running:281tk.update_idletasks()282tk.update()283time.sleep(0.005)284285286