sphinx2001

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

Nov 28th, 2020
565
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. def on_close_window():
  7.     global flag_run_game
  8.     if messagebox.askokcancel("Морской бой", "Хотите завершить игру?"):
  9.         flag_run_game = False
  10.         game.destroy()
  11.  
  12. def draw_battle_map():
  13.     for i in range(cells_w + 1):
  14.         canvas.create_line(cell_size_w * i, 0, cell_size_w * i, size_width)
  15.     for i in range(cells_h + 1):
  16.         canvas.create_line(0, cell_size_h * i, size_heigh, cell_size_h * i)
  17.  
  18. version = "0.3"
  19.  
  20. size_width = 700
  21. size_heigh = 700
  22. cells_w = cells_h = 10
  23. cell_size_w = size_width // cells_w
  24. cell_size_h = size_heigh // cells_h
  25.  
  26. # ++Часть 2
  27. size_width = cell_size_w * cells_w
  28. size_heigh = cell_size_h * cells_h
  29.  
  30. battle_map = []
  31.  
  32.  
  33. #--Часть 2
  34.  
  35. flag_run_game = True
  36.  
  37. game = tk.Tk()
  38. game.title(f"Игра - Морской бой. Версия. {version}")
  39. game.resizable(0, 0)
  40. game.wm_attributes("-topmost", 1)
  41. game.protocol("WM_DELETE_WINDOW", on_close_window)
  42.  
  43. # ++Часть 2
  44. def generate_battle_map():
  45.     global battle_map
  46.     battle_map = [[0 for x in range(cells_w)] for y in range(cells_h)]
  47.     ships = cells_w // 2
  48.     ships_config = []
  49.     for i in range(ships):
  50.         ships_config.append(random.choice([1, 2, 3]))
  51.  
  52.     sum_all_ships = sum(ships_config)
  53.     sum_enemy = 0
  54.     while sum_enemy != sum_all_ships:
  55.         battle_map = [[0 for x in range(cells_w)] for y in range(cells_h)]
  56.         for i in range(ships):
  57.             ls = ships_config[i] # длина коробля
  58.             horizontal_vertical = random.randint(0, 2) # 0 горизонтали, 1 по вертикали
  59.             pos_x = random.randint(0, cells_w)
  60.             pos_y = random.randint(0, cells_h)
  61.  
  62.             if horizontal_vertical == 0: # по горизонтали
  63.                 if pos_x + ls < cells_w:
  64.                     for j in range(ls):
  65.                         try:
  66.                             check_near_ships = 0
  67.                             check_near_ships = battle_map[pos_y][pos_x - 1] + \
  68.                                 battle_map[pos_y][pos_x + j] + \
  69.                                 battle_map[pos_y][pos_x + j + 1] + \
  70.                                 battle_map[pos_y + 1][pos_x + j + 1] + \
  71.                                 battle_map[pos_y - 1][pos_x + j + 1] + \
  72.                                 battle_map[pos_y + 1][pos_x + j] + \
  73.                                 battle_map[pos_y - 1][pos_x + j]
  74.  
  75.                             if check_near_ships == 0:
  76.                                 battle_map[pos_y][pos_x] = 1
  77.  
  78.                         except Exception:
  79.                             pass
  80.             else: # по вертикали
  81.                 if pos_y + ls < cells_h:
  82.                     for j in range(ls):
  83.                         try:
  84.                             check_near_ships = 0
  85.                             check_near_ships = battle_map[pos_y - 1][pos_x] + \
  86.                                 battle_map[pos_y + j][pos_x] + \
  87.                                 battle_map[pos_y + j + 1][pos_x] + \
  88.                                 battle_map[pos_y + j + 1][pos_x + 1] + \
  89.                                 battle_map[pos_y + j + 1][pos_x - 1] + \
  90.                                 battle_map[pos_y + j][pos_x + 1] + \
  91.                                 battle_map[pos_y + j][pos_x - 1]
  92.                             if check_near_ships == 0:
  93.                                 battle_map[pos_y + j][pos_x] = 1
  94.                         except Exception:
  95.                             pass
  96.  
  97.             sum_enemy = 0
  98.             for row in battle_map:
  99.                 sum_enemy += sum(row)
  100.  
  101.  
  102.  
  103.  
  104.  
  105. def command_show_ships():
  106.     for i in range(cells_w):
  107.         for j in range(cells_h):
  108.             if battle_map[j][i] != 0:
  109.                 canvas.create_rectangle(i * cell_size_w, j * cell_size_h, (i + 1) * cell_size_w, (j + 1) * cell_size_h, fill="red")
  110.  
  111. def command_start():
  112.     canvas.create_rectangle(0, 0, size_width, size_heigh, fill="white")
  113.     draw_battle_map()
  114.     generate_battle_map()
  115.  
  116.  
  117. # canvas = tk.Canvas(game, width=size_width, height=size_heigh, bd=0, highlightthickness=0)
  118. canvas = tk.Canvas(game, width=size_width + 250, height=size_heigh, bd=0, highlightthickness=0)
  119. canvas.create_rectangle(0, 0, size_width, size_heigh, fill="white")
  120. canvas.pack()
  121.  
  122.  
  123. button1 = tk.Button(game, text="Показать корабли", command=command_show_ships)
  124. button2 = tk.Button(game, text="Начать заново", command=command_start)
  125. button1.place(x=size_width+20, y=30)
  126. button2.place(x=size_width+20, y=90)
  127. # --Часть 2
  128.  
  129.  
  130. generate_battle_map()
  131. game.update()
  132. draw_battle_map()
  133. while flag_run_game:
  134.     if flag_run_game:
  135.         game.update_idletasks()
  136.         game.update()
  137.     time.sleep(0.005)
RAW Paste Data