Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
wiseplat
GitHub Repository: wiseplat/python-code
Path: blob/master/python-igra-morskoy-boy/main_lesson_5.py
5918 views
1
from tkinter import *
2
from tkinter import messagebox
3
import time
4
import random
5
6
tk = Tk()
7
app_running = True
8
9
size_canvas_x = 600
10
size_canvas_y = 600
11
s_x = s_y = 8 # размер игрового поля
12
s_y = 8
13
step_x = size_canvas_x // s_x # шаг по горизонтали
14
step_y = size_canvas_y // s_y # шаг по вертикали
15
size_canvas_x = step_x * s_x
16
size_canvas_y = step_y * s_y
17
menu_x = 250
18
ships = s_x // 2 # определяем максимальное кол-во кораблей
19
ship_len1 = s_x // 5 # длина первого типа корабля
20
ship_len2 = s_x // 3 # длина второго типа корабля
21
ship_len3 = s_x // 2 # длина третьего типа корабля
22
enemy_ships = [[0 for i in range(s_x + 1)] for i in range(s_y + 1)]
23
list_ids = [] # список объектов canvas
24
25
26
# print(enemy_ships)
27
28
def on_closing():
29
global app_running
30
if messagebox.askokcancel("Выход из игры", "Хотите выйти из игры?"):
31
app_running = False
32
tk.destroy()
33
34
35
tk.protocol("WM_DELETE_WINDOW", on_closing)
36
tk.title("Игра Морской Бой")
37
tk.resizable(0, 0)
38
tk.wm_attributes("-topmost", 1)
39
canvas = Canvas(tk, width=size_canvas_x + menu_x, height=size_canvas_y, bd=0, highlightthickness=0)
40
canvas.create_rectangle(0, 0, size_canvas_x, size_canvas_y, fill="white")
41
canvas.pack()
42
tk.update()
43
44
45
def draw_table():
46
for i in range(0, s_x + 1):
47
canvas.create_line(step_x * i, 0, step_x * i, size_canvas_y)
48
for i in range(0, s_y + 1):
49
canvas.create_line(0, step_y * i, size_canvas_x, step_y * i)
50
51
52
draw_table()
53
54
55
def button_show_enemy():
56
for i in range(0, s_x):
57
for j in range(0, s_y):
58
if enemy_ships[j][i] > 0:
59
_id = canvas.create_rectangle(i * step_x, j * step_y, i * step_x + step_x, j * step_y + step_y,
60
fill="red")
61
list_ids.append(_id)
62
63
64
def button_begin_again():
65
global list_ids
66
for el in list_ids:
67
canvas.delete(el)
68
list_ids = []
69
generate_enemy_ships()
70
71
72
b0 = Button(tk, text="Показать корабли противника", command=button_show_enemy)
73
b0.place(x=size_canvas_x + 20, y=30)
74
75
b1 = Button(tk, text="Начать заново!", command=button_begin_again)
76
b1.place(x=size_canvas_x + 20, y=70)
77
78
79
def add_to_all(event):
80
_type = 0 # ЛКМ
81
if event.num == 3:
82
_type = 1 # ПКМ
83
# print(_type)
84
mouse_x = canvas.winfo_pointerx() - canvas.winfo_rootx()
85
mouse_y = canvas.winfo_pointery() - canvas.winfo_rooty()
86
# print(mouse_x, mouse_y)
87
ip_x = mouse_x // step_x
88
ip_y = mouse_y // step_y
89
print(ip_x, ip_y, "_type:", _type)
90
91
92
canvas.bind_all("<Button-1>", add_to_all) # ЛКМ
93
canvas.bind_all("<Button-3>", add_to_all) # ПКМ
94
95
96
def generate_enemy_ships():
97
global enemy_ships
98
ships_list = []
99
# генерируем список случайных длин кораблей
100
for i in range(0, ships):
101
ships_list.append(random.choice([ship_len1, ship_len2, ship_len3]))
102
# print(ships_list)
103
104
# подсчет суммарной длины кораблей
105
sum_1_all_ships = sum(ships_list)
106
sum_1_enemy = 0
107
108
while sum_1_enemy != sum_1_all_ships:
109
# обнуляем массив кораблей врага
110
enemy_ships = [[0 for i in range(s_x + 1)] for i in
111
range(s_y + 1)] # +1 для доп. линии справа и снизу, для успешных проверок генерации противника
112
113
for i in range(0, ships):
114
len = ships_list[i]
115
horizont_vertikal = random.randrange(1, 3) # 1- горизонтальное 2 - вертикальное
116
117
primerno_x = random.randrange(0, s_x)
118
if primerno_x + len > s_x:
119
primerno_x = primerno_x - len
120
121
primerno_y = random.randrange(0, s_y)
122
if primerno_y + len > s_y:
123
primerno_y = primerno_y - len
124
125
# print(horizont_vertikal, primerno_x,primerno_y)
126
if horizont_vertikal == 1:
127
if primerno_x + len <= s_x:
128
for j in range(0, len):
129
try:
130
check_near_ships = 0
131
check_near_ships = enemy_ships[primerno_y][primerno_x - 1] + \
132
enemy_ships[primerno_y][primerno_x + j] + \
133
enemy_ships[primerno_y][primerno_x + j + 1] + \
134
enemy_ships[primerno_y + 1][primerno_x + j + 1] + \
135
enemy_ships[primerno_y - 1][primerno_x + j + 1] + \
136
enemy_ships[primerno_y + 1][primerno_x + j] + \
137
enemy_ships[primerno_y - 1][primerno_x + j]
138
# print(check_near_ships)
139
if check_near_ships == 0: # записываем в том случае, если нет ничего рядом
140
enemy_ships[primerno_y][primerno_x + j] = i + 1 # записываем номер корабля
141
except Exception:
142
pass
143
if horizont_vertikal == 2:
144
if primerno_y + len <= s_y:
145
for j in range(0, len):
146
try:
147
check_near_ships = 0
148
check_near_ships = enemy_ships[primerno_y - 1][primerno_x] + \
149
enemy_ships[primerno_y + j][primerno_x] + \
150
enemy_ships[primerno_y + j + 1][primerno_x] + \
151
enemy_ships[primerno_y + j + 1][primerno_x + 1] + \
152
enemy_ships[primerno_y + j + 1][primerno_x - 1] + \
153
enemy_ships[primerno_y + j][primerno_x + 1] + \
154
enemy_ships[primerno_y + j][primerno_x - 1]
155
# print(check_near_ships)
156
if check_near_ships == 0: # записываем в том случае, если нет ничего рядом
157
enemy_ships[primerno_y + j][primerno_x] = i + 1 # записываем номер корабля
158
except Exception:
159
pass
160
161
# делаем подсчет 1ц
162
sum_1_enemy = 0
163
for i in range(0, s_x):
164
for j in range(0, s_y):
165
if enemy_ships[j][i] > 0:
166
sum_1_enemy = sum_1_enemy + 1
167
168
# print(sum_1_enemy)
169
# print(ships_list)
170
print(enemy_ships)
171
172
173
generate_enemy_ships()
174
175
while app_running:
176
if app_running:
177
tk.update_idletasks()
178
tk.update()
179
time.sleep(0.005)
180
181