Advertisement
sphinx2001

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

Nov 30th, 2020
773
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Python 6.81 KB | None | 0 0
  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()
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement