Path: blob/master/python-igra-morskoy-boy/main_lesson_11.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)]3233# ships_list - список кораблей игрока 1 и игрока 234ships_list = []3536# print(enemy_ships1)3738def on_closing():39global app_running40if messagebox.askokcancel("Выход из игры", "Хотите выйти из игры?"):41app_running = False42tk.destroy()434445tk.protocol("WM_DELETE_WINDOW", on_closing)46tk.title("Игра Морской Бой")47tk.resizable(0, 0)48tk.wm_attributes("-topmost", 1)49canvas = Canvas(tk, width=size_canvas_x + menu_x + size_canvas_x, height=size_canvas_y + menu_y, bd=0,50highlightthickness=0)51canvas.create_rectangle(0, 0, size_canvas_x, size_canvas_y, fill="white")52canvas.create_rectangle(size_canvas_x + menu_x, 0, size_canvas_x + menu_x + size_canvas_x, size_canvas_y,53fill="lightyellow")54canvas.pack()55tk.update()565758def draw_table(offset_x=0):59for i in range(0, s_x + 1):60canvas.create_line(offset_x + step_x * i, 0, offset_x + step_x * i, size_canvas_y)61for i in range(0, s_y + 1):62canvas.create_line(offset_x, step_y * i, offset_x + size_canvas_x, step_y * i)636465draw_table()66draw_table(size_canvas_x + menu_x)6768t0 = Label(tk, text="Игрок №1", font=("Helvetica", 16))69t0.place(x=size_canvas_x // 2 - t0.winfo_reqwidth() // 2, y=size_canvas_y + 3)70t1 = Label(tk, text="Игрок №2", font=("Helvetica", 16))71t1.place(x=size_canvas_x + menu_x + size_canvas_x // 2 - t1.winfo_reqwidth() // 2, y=size_canvas_y + 3)7273t0.configure(bg="red")74t0.configure(bg="#f0f0f0")757677def button_show_enemy1():78for i in range(0, s_x):79for j in range(0, s_y):80if enemy_ships1[j][i] > 0:81color = "red"82if points1[j][i] != -1:83color = "green"84_id = canvas.create_rectangle(i * step_x, j * step_y, i * step_x + step_x, j * step_y + step_y,85fill=color)86list_ids.append(_id)878889def button_show_enemy2():90for i in range(0, s_x):91for j in range(0, s_y):92if enemy_ships2[j][i] > 0:93color = "red"94if points2[j][i] != -1:95color = "green"96_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,97fill=color)98list_ids.append(_id)99100101def button_begin_again():102global list_ids103global points1, points2104global boom105global enemy_ships1, enemy_ships2106for el in list_ids:107canvas.delete(el)108list_ids = []109generate_ships_list()110print(ships_list)111enemy_ships1 = generate_enemy_ships()112enemy_ships2 = generate_enemy_ships()113points1 = [[-1 for i in range(s_x)] for i in range(s_y)]114points2 = [[-1 for i in range(s_x)] for i in range(s_y)]115boom = [[0 for i in range(s_x)] for i in range(s_y)]116117118b0 = Button(tk, text="Показать корабли Игрока №1", command=button_show_enemy1)119b0.place(x=size_canvas_x + 20, y=30)120121b1 = Button(tk, text="Показать корабли Игрока №2", command=button_show_enemy2)122b1.place(x=size_canvas_x + 20, y=70)123124b2 = Button(tk, text="Начать заново!", command=button_begin_again)125b2.place(x=size_canvas_x + 20, y=110)126127128def draw_point(x, y):129# print(enemy_ships1[y][x])130if enemy_ships1[y][x] == 0:131color = "red"132id1 = canvas.create_oval(x * step_x, y * step_y, x * step_x + step_x, y * step_y + step_y, fill=color)133id2 = canvas.create_oval(x * step_x + step_x // 3, y * step_y + step_y // 3, x * step_x + step_x - step_x // 3,134y * step_y + step_y - step_y // 3, fill="white")135list_ids.append(id1)136list_ids.append(id2)137if enemy_ships1[y][x] > 0:138color = "blue"139id1 = canvas.create_rectangle(x * step_x, y * step_y + step_y // 2 - step_y // 10, x * step_x + step_x,140y * step_y + step_y // 2 + step_y // 10, fill=color)141id2 = canvas.create_rectangle(x * step_x + step_x // 2 - step_x // 10, y * step_y,142x * step_x + step_x // 2 + step_x // 10, y * step_y + step_y, fill=color)143list_ids.append(id1)144list_ids.append(id2)145146147def check_winner(x, y):148win = False149if enemy_ships1[y][x] > 0:150boom[y][x] = enemy_ships1[y][x]151sum_enemy_ships1 = sum(sum(i) for i in zip(*enemy_ships1))152sum_boom = sum(sum(i) for i in zip(*boom))153#print(sum_enemy_ships1, sum_boom)154if sum_enemy_ships1 == sum_boom:155win = True156return win157158159def check_winner2():160win = True161for i in range(0, s_x):162for j in range(0, s_y):163if enemy_ships1[j][i] > 0:164if points1[j][i] == -1:165win = False166#print(win)167return win168169170def add_to_all(event):171global points1172_type = 0 # ЛКМ173if event.num == 3:174_type = 1 # ПКМ175# print(_type)176mouse_x = canvas.winfo_pointerx() - canvas.winfo_rootx()177mouse_y = canvas.winfo_pointery() - canvas.winfo_rooty()178# print(mouse_x, mouse_y)179ip_x = mouse_x // step_x180ip_y = mouse_y // step_y181#print(ip_x, ip_y, "_type:", _type)182if ip_x < s_x and ip_y < s_y:183if points1[ip_y][ip_x] == -1:184points1[ip_y][ip_x] = _type185draw_point(ip_x, ip_y)186# if check_winner(ip_x, ip_y):187if check_winner2():188print("Победа!!!!!")189points1 = [[10 for i in range(s_x)] for i in range(s_y)]190#print(len(list_ids))191192193canvas.bind_all("<Button-1>", add_to_all) # ЛКМ194canvas.bind_all("<Button-3>", add_to_all) # ПКМ195196197def generate_ships_list():198global ships_list199ships_list = []200# генерируем список случайных длин кораблей201for i in range(0, ships):202ships_list.append(random.choice([ship_len1, ship_len2, ship_len3]))203# print(ships_list)204205206def generate_enemy_ships():207global ships_list208enemy_ships = []209210# подсчет суммарной длины кораблей211sum_1_all_ships = sum(ships_list)212sum_1_enemy = 0213214print("sum: ", sum_1_all_ships)215216while sum_1_enemy != sum_1_all_ships:217# обнуляем массив кораблей врага218enemy_ships = [[0 for i in range(s_x + 1)] for i in219range(s_y + 1)] # +1 для доп. линии справа и снизу, для успешных проверок генерации противника220221for i in range(0, ships):222len = ships_list[i]223horizont_vertikal = random.randrange(1, 3) # 1- горизонтальное 2 - вертикальное224225primerno_x = random.randrange(0, s_x)226if primerno_x + len > s_x:227primerno_x = primerno_x - len228229primerno_y = random.randrange(0, s_y)230if primerno_y + len > s_y:231primerno_y = primerno_y - len232233# print(horizont_vertikal, primerno_x,primerno_y)234if horizont_vertikal == 1:235if primerno_x + len <= s_x:236for j in range(0, len):237try:238check_near_ships = 0239check_near_ships = enemy_ships[primerno_y][primerno_x - 1] + \240enemy_ships[primerno_y][primerno_x + j] + \241enemy_ships[primerno_y][primerno_x + j + 1] + \242enemy_ships[primerno_y + 1][primerno_x + j + 1] + \243enemy_ships[primerno_y - 1][primerno_x + j + 1] + \244enemy_ships[primerno_y + 1][primerno_x + j] + \245enemy_ships[primerno_y - 1][primerno_x + j]246# print(check_near_ships)247if check_near_ships == 0: # записываем в том случае, если нет ничего рядом248enemy_ships[primerno_y][primerno_x + j] = i + 1 # записываем номер корабля249except Exception:250pass251if horizont_vertikal == 2:252if primerno_y + len <= s_y:253for j in range(0, len):254try:255check_near_ships = 0256check_near_ships = enemy_ships[primerno_y - 1][primerno_x] + \257enemy_ships[primerno_y + j][primerno_x] + \258enemy_ships[primerno_y + j + 1][primerno_x] + \259enemy_ships[primerno_y + j + 1][primerno_x + 1] + \260enemy_ships[primerno_y + j + 1][primerno_x - 1] + \261enemy_ships[primerno_y + j][primerno_x + 1] + \262enemy_ships[primerno_y + j][primerno_x - 1]263# print(check_near_ships)264if check_near_ships == 0: # записываем в том случае, если нет ничего рядом265enemy_ships[primerno_y + j][primerno_x] = i + 1 # записываем номер корабля266except Exception:267pass268269# делаем подсчет 1ц270sum_1_enemy = 0271for i in range(0, s_x):272for j in range(0, s_y):273if enemy_ships[j][i] > 0:274sum_1_enemy = sum_1_enemy + 1275276# print(sum_1_enemy)277# print(ships_list)278# print(enemy_ships)279return enemy_ships280281282generate_ships_list()283print(ships_list)284enemy_ships1 = generate_enemy_ships()285enemy_ships2 = generate_enemy_ships()286# print("****************************")287# print(enemy_ships1)288# print("****************************")289# print(enemy_ships2)290# print("****************************")291292while app_running:293if app_running:294tk.update_idletasks()295tk.update()296time.sleep(0.005)297298299