sphinx2001

морской бой. 2 группа. часть 3

Nov 30th, 2020
542
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. import tkinter as tk
  2. from tkinter import messagebox
  3. import time
  4. import random
  5.  
  6.  
  7. def generate_battle_map():
  8.     global battle_map
  9.     ships = cells_w // 2 # общее количество кораблей
  10.     ships_config = [] # сколько и какого типа кораблей мы будем создавать
  11.     for i in range(ships):
  12.         ships_config.append(random.choice([1, 2, 3]))
  13.  
  14.     sum_all_ships = sum(ships_config) # количество заполненное кораблями
  15.     sum_enemy = 0
  16.     while sum_enemy != sum_all_ships:
  17.         battle_map = [[0 for x in range(cells_w)] for y in range(cells_h)]
  18.         for i in range(ships):
  19.             ls = ships_config[i] # длина коробля
  20.             horizontal_vertical = random.randint(0, 2) # 0 горизонтали, 1 по вертикали
  21.             pos_x = random.randint(0, cells_w) # стартовая позиция корабля по оси x
  22.             pos_y = random.randint(0, cells_h) # стартовая позиция корабля по оси y
  23.  
  24.             if horizontal_vertical == 0: # по горизонтали
  25.                 if pos_x + ls < cells_w:
  26.                     for j in range(ls):
  27.                         try:
  28.                             check_near_ships = 0
  29.                             check_near_ships = battle_map[pos_y][pos_x - 1] + \
  30.                                 battle_map[pos_y][pos_x + j] + \
  31.                                 battle_map[pos_y][pos_x + j + 1] + \
  32.                                 battle_map[pos_y + 1][pos_x + j + 1] + \
  33.                                 battle_map[pos_y - 1][pos_x + j + 1] + \
  34.                                 battle_map[pos_y + 1][pos_x + j] + \
  35.                                 battle_map[pos_y - 1][pos_x + j]
  36.  
  37.                             if check_near_ships == 0:
  38.                                 battle_map[pos_y][pos_x] = 1
  39.  
  40.                         except Exception:
  41.                             pass
  42.             else: # по вертикали
  43.                 if pos_y + ls < cells_h:
  44.                     for j in range(ls):
  45.                         try:
  46.                             check_near_ships = 0
  47.                             check_near_ships = battle_map[pos_y - 1][pos_x] + \
  48.                                 battle_map[pos_y + j][pos_x] + \
  49.                                 battle_map[pos_y + j + 1][pos_x] + \
  50.                                 battle_map[pos_y + j + 1][pos_x + 1] + \
  51.                                 battle_map[pos_y + j + 1][pos_x - 1] + \
  52.                                 battle_map[pos_y + j][pos_x + 1] + \
  53.                                 battle_map[pos_y + j][pos_x - 1]
  54.                             if check_near_ships == 0:
  55.                                 battle_map[pos_y + j][pos_x] = 1
  56.                         except Exception:
  57.                             pass
  58.  
  59.             sum_enemy = 0
  60.             for row in battle_map:
  61.                 sum_enemy += sum(row)
  62.  
  63.  
  64. def on_click_canvas(event):
  65.     _button = 0
  66.     if event.num == 3:
  67.         _button = 1
  68.     mouse_x = canvas.winfo_pointerx() - canvas.winfo_rootx()
  69.     mouse_y = canvas.winfo_pointery() - canvas.winfo_rooty()
  70.  
  71.     if 0 <= mouse_x <= size_w and 0 <= mouse_y <= size_h:
  72.         map_x = mouse_x // cell_size_w
  73.         map_y = mouse_y // cell_size_h
  74.  
  75.         print(f"Click button {_button} x:{mouse_x}, y:{mouse_y} cell({map_x},{map_y})")
  76.  
  77.  
  78. def command_new_game():
  79.     for el in canvas_elements:
  80.         canvas.delete(el)   # очистка холста
  81.  
  82.     draw_game_map() # перерисуем разметку
  83.     generate_battle_map()
  84.  
  85.  
  86. def command_debug_show_ships():
  87.     # battle_map[0][1] = 1
  88.     # battle_map[cells_h - 1][cells_w - 1] = 1
  89.     for i in range(cells_w):
  90.         for j in range(cells_h):
  91.             if battle_map[j][i] != 0:
  92.                 cid = canvas.create_rectangle(i * cell_size_w, j * cell_size_h, (i + 1) * cell_size_w, (j + 1) * cell_size_h, fill="red")
  93.                 canvas_elements.append(cid)
  94.  
  95. def on_close_window():
  96.     global run_app
  97.     if messagebox.askokcancel("Морской бой", "Завершить работу программы?"):
  98.         run_app = False
  99.         game.destroy()
  100.  
  101. def draw_game_map():
  102.     cid = canvas.create_rectangle(0, 0, size_w, size_h, fill="white")
  103.     canvas_elements.append(cid)
  104.  
  105.     cid = canvas.create_rectangle(size_w + menu_x, 0, size_w*2+menu_x, size_h, fill="white")
  106.     canvas_elements.append(cid)
  107.  
  108.     for i in range(cells_w + 1):
  109.         cid = canvas.create_line(cell_size_w * i, 0, cell_size_w * i, size_h)
  110.         canvas_elements.append(cid)
  111.  
  112.     for i in range(cells_h + 1):
  113.         cid = canvas.create_line(0, cell_size_h * i, size_w, cell_size_h * i)
  114.         canvas_elements.append(cid)
  115.  
  116.     o = size_w + menu_x # смещение по оси x для второго игорового поля
  117.  
  118.     for i in range(cells_w + 1):
  119.         cid = canvas.create_line(o + cell_size_w * i, 0, o+cell_size_w * i, size_h)
  120.         canvas_elements.append(cid)
  121.  
  122.     for i in range(cells_h + 1):
  123.         cid = canvas.create_line(o, cell_size_h * i, o + size_w, cell_size_h * i)
  124.         canvas_elements.append(cid)
  125.  
  126. size_w = 400
  127. size_h = 400
  128. cells_w = 10
  129. cells_h = 10
  130. cell_size_w = size_w // cells_w
  131. cell_size_h = size_h // cells_h
  132. size_w = cells_w * cell_size_w
  133. size_h = cells_h * cell_size_h
  134. menu_x = 200
  135. menu_y = 50
  136. battle_map = [[0 for _ in range(cells_w)] for _ in range(cells_h)]
  137. print(battle_map)
  138. # 0 - пустая ячейка
  139. # 1 - корабль (палуба)
  140. # 2 - промах
  141. # 3 - попадание
  142.  
  143. canvas_elements = [] # отрисованные элементы.
  144.  
  145. _version = "0.1"
  146. run_app = True
  147. game = tk.Tk()
  148. game.protocol("WM_DELETE_WINDOW", on_close_window)
  149. game.resizable(0, 0) # Запрет изменения размеров окна
  150. game.wm_attributes("-topmost", 1) # окно приложение всегда на первом плане.
  151. game.title(f"Игра морской бой. Версия {_version}")
  152. canvas = tk.Canvas(game, width=2*size_w+menu_x, height=size_h+menu_y, bd=0, highlightthickness=0)
  153. canvas.pack()
  154.  
  155. button1 = tk.Button(game, text="Начать новую игру", command=command_new_game)
  156. button2 = tk.Button(game, text="Показать корабли (отладка)", command=command_debug_show_ships)
  157. button1.place(x=size_w+10, y=10, width=menu_x-20, height=30)
  158. button2.place(x=size_w+10, y=50, width=menu_x-20, height=30)
  159.  
  160. canvas.bind_all("<Button-1>", func=on_click_canvas) # обработка нажатия левой кнопки мыши
  161. canvas.bind_all("<Button-3>", func=on_click_canvas) # обработка нажатия правой кнопки мыши
  162.  
  163. draw_game_map()
  164. generate_battle_map()
  165.  
  166. while run_app:
  167.     if run_app:
  168.         game.update_idletasks()
  169.         game.update()
RAW Paste Data