180 lines
7.0 KiB
Python
180 lines
7.0 KiB
Python
from tkinter import *
|
|
from tkinter import messagebox
|
|
import time
|
|
import random
|
|
|
|
tk = Tk()
|
|
app_running = True
|
|
|
|
size_canvas_x = 600
|
|
size_canvas_y = 600
|
|
s_x = s_y = 12 # размер игрового поля
|
|
step_x = size_canvas_x // s_x # шаг по горизонтали
|
|
step_y = size_canvas_y // s_y # шаг по вертикали
|
|
size_canvas_x = step_x * s_x
|
|
size_canvas_y = step_y * s_y
|
|
menu_x = 250
|
|
ships = s_x // 2 # определяем максимальное кол-во кораблей
|
|
ships_len1 = s_x // 3 # длина первого типа корабля
|
|
ships_len2 = s_x // 4 # длина второго типа корабля
|
|
ships_len3 = s_x // 6 # длина третьего типа корабля
|
|
ships_len4 = s_x // 12 # длина четвертого типа корабля
|
|
enemy_ships = [[0 for i in range(s_x + 1)] for i in range(s_y + 1)]
|
|
list_ids = [] # список объектов canvas
|
|
|
|
|
|
# print(enemy_ships)
|
|
|
|
def on_closing():
|
|
global app_running
|
|
if messagebox.askokcancel("Выход из игры", "Хотите выйти из игры?"):
|
|
app_running = False
|
|
tk.destroy()
|
|
|
|
|
|
tk.protocol("WM_DELETE_WINDOW", on_closing)
|
|
tk.title("Игра Морской Бой")
|
|
tk.resizable(0, 0)
|
|
tk.wm_attributes("-topmost", 1)
|
|
canvas = Canvas(tk, width=size_canvas_x + menu_x, height=size_canvas_y, bd=0, highlightthickness=0)
|
|
canvas.create_rectangle(0, 0, size_canvas_x, size_canvas_y, fill="white")
|
|
canvas.pack()
|
|
tk.update()
|
|
|
|
|
|
def draw_table():
|
|
for i in range(0, s_x + 1):
|
|
canvas.create_line(step_x * i, 0, step_x * i, size_canvas_y)
|
|
for i in range(0, s_y + 1):
|
|
canvas.create_line(0, step_y * i, size_canvas_x, step_y * i)
|
|
|
|
|
|
draw_table()
|
|
|
|
|
|
def button_show_enemy():
|
|
for i in range(0, s_x):
|
|
for j in range(0, s_y):
|
|
if enemy_ships[j][i] > 0:
|
|
_id = canvas.create_rectangle(i * step_x, j * step_y, i * step_x + step_x, j * step_y + step_y,
|
|
fill="red")
|
|
list_ids.append(_id)
|
|
|
|
|
|
def button_begin_again():
|
|
global list_ids
|
|
for el in list_ids:
|
|
canvas.delete(el)
|
|
list_ids = []
|
|
generate_enemy_ships()
|
|
|
|
|
|
b0 = Button(tk, text="Показать корабли противника", command=button_show_enemy)
|
|
b0.place(x=size_canvas_x + 20, y=30)
|
|
|
|
b1 = Button(tk, text="Начать заново!", command=button_begin_again)
|
|
b1.place(x=size_canvas_x + 20, y=70)
|
|
|
|
|
|
def add_to_all(event):
|
|
_type = 0 # ЛКМ
|
|
if event.num == 3:
|
|
_type = 1 # ПКМ
|
|
# print(_type)
|
|
mouse_x = canvas.winfo_pointerx() - canvas.winfo_rootx()
|
|
mouse_y = canvas.winfo_pointery() - canvas.winfo_rooty()
|
|
# print(mouse_x, mouse_y)
|
|
ip_x = mouse_x // step_x
|
|
ip_y = mouse_y // step_y
|
|
print(ip_x, ip_y, "_type:", _type)
|
|
|
|
|
|
canvas.bind_all("<Button-1>", add_to_all) # ЛКМ
|
|
canvas.bind_all("<Button-3>", add_to_all) # ПКМ
|
|
|
|
|
|
def generate_enemy_ships():
|
|
global enemy_ships
|
|
ships_list = []
|
|
# генерируем список случайных длин кораблей
|
|
for i in range(0, ships):
|
|
ships_list.append(random.choice([ships_len1, ships_len2, ships_len3, ships_len4]))
|
|
# print(ships_list)
|
|
|
|
# подсчет суммарной длины кораблей
|
|
sum_1_all_ships = sum(ships_list)
|
|
sum_1_enemy = 0
|
|
|
|
while sum_1_enemy != sum_1_all_ships:
|
|
# Обнуляем массив кораблей врага
|
|
# +1 для доп. линии справа и снизу, для успешных проверок генерации противника
|
|
enemy_ships = [[0 for i in range(s_x + 1)] for i in range(s_y + 1)]
|
|
|
|
for i in range(0, ships):
|
|
len = ships_list[i]
|
|
horizont_vertikal = random.randrange(1, 3) # 1- горизонтальное 2 - вертикальное
|
|
|
|
primerno_x = random.randrange(0, s_x)
|
|
if primerno_x + len > s_x:
|
|
primerno_x = primerno_x - len
|
|
|
|
primerno_y = random.randrange(0, s_y)
|
|
if primerno_y + len > s_y:
|
|
primerno_y = primerno_y - len
|
|
|
|
# print(horizont_vertikal, primerno_x,primerno_y)
|
|
if horizont_vertikal == 1:
|
|
if primerno_x + len <= s_x:
|
|
for j in range(0, len):
|
|
try:
|
|
check_near_ships = 0
|
|
check_near_ships = enemy_ships[primerno_x][primerno_y - 1] + \
|
|
enemy_ships[primerno_x][primerno_y + j] + \
|
|
enemy_ships[primerno_x][primerno_y + j + 1] + \
|
|
enemy_ships[primerno_x + 1][primerno_y + j + 1] + \
|
|
enemy_ships[primerno_x - 1][primerno_y + j + 1] + \
|
|
enemy_ships[primerno_x + 1][primerno_y + j] + \
|
|
enemy_ships[primerno_x - 1][primerno_y + j]
|
|
# print(check_near_ships)
|
|
if check_near_ships == 0: # записываем в том случае, если нет ничего рядом
|
|
enemy_ships[primerno_x][primerno_y + j] = i + 1 # записываем номер корабля
|
|
except Exception:
|
|
pass
|
|
if horizont_vertikal == 2:
|
|
if primerno_y + len <= s_y:
|
|
for j in range(0, len):
|
|
try:
|
|
check_near_ships = 0
|
|
check_near_ships = enemy_ships[primerno_x - 1][primerno_y] + \
|
|
enemy_ships[primerno_x + j][primerno_y] + \
|
|
enemy_ships[primerno_x + j + 1][primerno_y] + \
|
|
enemy_ships[primerno_x + j + 1][primerno_y + 1] + \
|
|
enemy_ships[primerno_x + j + 1][primerno_y - 1] + \
|
|
enemy_ships[primerno_x + j][primerno_y + 1] + \
|
|
enemy_ships[primerno_x + j][primerno_y - 1]
|
|
# print(check_near_ships)
|
|
if check_near_ships == 0: # записываем в том случае, если нет ничего рядом
|
|
enemy_ships[primerno_x + j][primerno_y] = i + 1 # записываем номер корабля
|
|
except Exception:
|
|
pass
|
|
|
|
# делаем подсчет 1ц
|
|
sum_1_enemy = 0
|
|
for i in range(0, s_x):
|
|
for j in range(0, s_y):
|
|
if enemy_ships[j][i] > 0:
|
|
sum_1_enemy = sum_1_enemy + 1
|
|
|
|
# print(sum_1_enemy)
|
|
# print(ships_list)
|
|
print(enemy_ships)
|
|
|
|
|
|
generate_enemy_ships()
|
|
|
|
while app_running:
|
|
if app_running:
|
|
tk.update_idletasks()
|
|
tk.update()
|
|
time.sleep(0.005)
|