Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
wiseplat
GitHub Repository: wiseplat/python-code
Path: blob/master/python-igra-morskoy-boy/main_lesson_12.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 = 500
10
size_canvas_y = 500
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
delta_menu_x = 4
18
menu_x = step_x * delta_menu_x # 250
19
menu_y = 40
20
ships = s_x // 2 # определяем максимальное кол-во кораблей
21
ship_len1 = s_x // 5 # длина первого типа корабля
22
ship_len2 = s_x // 3 # длина второго типа корабля
23
ship_len3 = s_x // 2 # длина третьего типа корабля
24
enemy_ships1 = [[0 for i in range(s_x + 1)] for i in range(s_y + 1)]
25
enemy_ships2 = [[0 for i in range(s_x + 1)] for i in range(s_y + 1)]
26
list_ids = [] # список объектов canvas
27
28
# points1 - список куда мы кликнули мышкой
29
points1 = [[-1 for i in range(s_x)] for i in range(s_y)]
30
points2 = [[-1 for i in range(s_x)] for i in range(s_y)]
31
32
# boom - список попаданий по кораблям противника
33
boom = [[0 for i in range(s_x)] for i in range(s_y)]
34
35
# ships_list - список кораблей игрока 1 и игрока 2
36
ships_list = []
37
38
# print(enemy_ships1)
39
40
def on_closing():
41
global app_running
42
if messagebox.askokcancel("Выход из игры", "Хотите выйти из игры?"):
43
app_running = False
44
tk.destroy()
45
46
47
tk.protocol("WM_DELETE_WINDOW", on_closing)
48
tk.title("Игра Морской Бой")
49
tk.resizable(0, 0)
50
tk.wm_attributes("-topmost", 1)
51
canvas = Canvas(tk, width=size_canvas_x + menu_x + size_canvas_x, height=size_canvas_y + menu_y, bd=0,
52
highlightthickness=0)
53
canvas.create_rectangle(0, 0, size_canvas_x, size_canvas_y, fill="white")
54
canvas.create_rectangle(size_canvas_x + menu_x, 0, size_canvas_x + menu_x + size_canvas_x, size_canvas_y,
55
fill="lightyellow")
56
canvas.pack()
57
tk.update()
58
59
60
def draw_table(offset_x=0):
61
for i in range(0, s_x + 1):
62
canvas.create_line(offset_x + step_x * i, 0, offset_x + step_x * i, size_canvas_y)
63
for i in range(0, s_y + 1):
64
canvas.create_line(offset_x, step_y * i, offset_x + size_canvas_x, step_y * i)
65
66
67
draw_table()
68
draw_table(size_canvas_x + menu_x)
69
70
t0 = Label(tk, text="Игрок №1", font=("Helvetica", 16))
71
t0.place(x=size_canvas_x // 2 - t0.winfo_reqwidth() // 2, y=size_canvas_y + 3)
72
t1 = Label(tk, text="Игрок №2", font=("Helvetica", 16))
73
t1.place(x=size_canvas_x + menu_x + size_canvas_x // 2 - t1.winfo_reqwidth() // 2, y=size_canvas_y + 3)
74
75
t0.configure(bg="red")
76
t0.configure(bg="#f0f0f0")
77
78
79
def button_show_enemy1():
80
for i in range(0, s_x):
81
for j in range(0, s_y):
82
if enemy_ships1[j][i] > 0:
83
color = "red"
84
if points1[j][i] != -1:
85
color = "green"
86
_id = canvas.create_rectangle(i * step_x, j * step_y, i * step_x + step_x, j * step_y + step_y,
87
fill=color)
88
list_ids.append(_id)
89
90
91
def button_show_enemy2():
92
for i in range(0, s_x):
93
for j in range(0, s_y):
94
if enemy_ships2[j][i] > 0:
95
color = "red"
96
if points2[j][i] != -1:
97
color = "green"
98
_id = canvas.create_rectangle(size_canvas_x + menu_x + i * step_x, j * step_y, size_canvas_x + menu_x + i * step_x + step_x, j * step_y + step_y,
99
fill=color)
100
list_ids.append(_id)
101
102
103
def button_begin_again():
104
global list_ids
105
global points1, points2
106
global boom
107
global enemy_ships1, enemy_ships2
108
for el in list_ids:
109
canvas.delete(el)
110
list_ids = []
111
generate_ships_list()
112
# print(ships_list)
113
enemy_ships1 = generate_enemy_ships()
114
enemy_ships2 = generate_enemy_ships()
115
points1 = [[-1 for i in range(s_x)] for i in range(s_y)]
116
points2 = [[-1 for i in range(s_x)] for i in range(s_y)]
117
boom = [[0 for i in range(s_x)] for i in range(s_y)]
118
119
120
b0 = Button(tk, text="Показать корабли Игрока №1", command=button_show_enemy1)
121
b0.place(x=size_canvas_x + 20, y=30)
122
123
b1 = Button(tk, text="Показать корабли Игрока №2", command=button_show_enemy2)
124
b1.place(x=size_canvas_x + 20, y=70)
125
126
b2 = Button(tk, text="Начать заново!", command=button_begin_again)
127
b2.place(x=size_canvas_x + 20, y=110)
128
129
130
def draw_point(x, y):
131
# print(enemy_ships1[y][x])
132
if enemy_ships1[y][x] == 0:
133
color = "red"
134
id1 = canvas.create_oval(x * step_x, y * step_y, x * step_x + step_x, y * step_y + step_y, fill=color)
135
id2 = canvas.create_oval(x * step_x + step_x // 3, y * step_y + step_y // 3, x * step_x + step_x - step_x // 3,
136
y * step_y + step_y - step_y // 3, fill="white")
137
list_ids.append(id1)
138
list_ids.append(id2)
139
if enemy_ships1[y][x] > 0:
140
color = "blue"
141
id1 = canvas.create_rectangle(x * step_x, y * step_y + step_y // 2 - step_y // 10, x * step_x + step_x,
142
y * step_y + step_y // 2 + step_y // 10, fill=color)
143
id2 = canvas.create_rectangle(x * step_x + step_x // 2 - step_x // 10, y * step_y,
144
x * step_x + step_x // 2 + step_x // 10, y * step_y + step_y, fill=color)
145
list_ids.append(id1)
146
list_ids.append(id2)
147
148
149
def draw_point2(x, y, offset_x=size_canvas_x + menu_x):
150
# print(enemy_ships1[y][x])
151
if enemy_ships2[y][x] == 0:
152
color = "red"
153
id1 = canvas.create_oval(offset_x + x * step_x, y * step_y, offset_x + x * step_x + step_x, y * step_y + step_y, fill=color)
154
id2 = canvas.create_oval(offset_x + x * step_x + step_x // 3, y * step_y + step_y // 3, offset_x + x * step_x + step_x - step_x // 3,
155
y * step_y + step_y - step_y // 3, fill="white")
156
list_ids.append(id1)
157
list_ids.append(id2)
158
if enemy_ships2[y][x] > 0:
159
color = "blue"
160
id1 = canvas.create_rectangle(offset_x + x * step_x, y * step_y + step_y // 2 - step_y // 10, offset_x + x * step_x + step_x,
161
y * step_y + step_y // 2 + step_y // 10, fill=color)
162
id2 = canvas.create_rectangle(offset_x + x * step_x + step_x // 2 - step_x // 10, y * step_y,
163
offset_x + x * step_x + step_x // 2 + step_x // 10, y * step_y + step_y, fill=color)
164
list_ids.append(id1)
165
list_ids.append(id2)
166
167
168
def check_winner(x, y):
169
win = False
170
if enemy_ships1[y][x] > 0:
171
boom[y][x] = enemy_ships1[y][x]
172
sum_enemy_ships1 = sum(sum(i) for i in zip(*enemy_ships1))
173
sum_boom = sum(sum(i) for i in zip(*boom))
174
#print(sum_enemy_ships1, sum_boom)
175
if sum_enemy_ships1 == sum_boom:
176
win = True
177
return win
178
179
180
def check_winner2():
181
win = True
182
for i in range(0, s_x):
183
for j in range(0, s_y):
184
if enemy_ships1[j][i] > 0:
185
if points1[j][i] == -1:
186
win = False
187
#print(win)
188
return win
189
190
191
def add_to_all(event):
192
global points1, points2
193
_type = 0 # ЛКМ
194
if event.num == 3:
195
_type = 1 # ПКМ
196
# print(_type)
197
mouse_x = canvas.winfo_pointerx() - canvas.winfo_rootx()
198
mouse_y = canvas.winfo_pointery() - canvas.winfo_rooty()
199
# print(mouse_x, mouse_y)
200
ip_x = mouse_x // step_x
201
ip_y = mouse_y // step_y
202
print(ip_x, ip_y, "_type:", _type)
203
if ip_x < s_x and ip_y < s_y:
204
if points1[ip_y][ip_x] == -1:
205
points1[ip_y][ip_x] = _type
206
draw_point(ip_x, ip_y)
207
# if check_winner(ip_x, ip_y):
208
if check_winner2():
209
print("Победа!!!!!")
210
points1 = [[10 for i in range(s_x)] for i in range(s_y)]
211
#print(len(list_ids))
212
213
if ip_x >= s_x + delta_menu_x and ip_x <= s_x + s_x + delta_menu_x and ip_y < s_y:
214
# print("ok")
215
if points2[ip_y][ip_x - s_x - delta_menu_x] == -1:
216
points2[ip_y][ip_x - s_x - delta_menu_x] = _type
217
draw_point2(ip_x - s_x - delta_menu_x, ip_y)
218
# if check_winner(ip_x, ip_y):
219
if check_winner2():
220
print("Победа!!!!!")
221
points2 = [[10 for i in range(s_x)] for i in range(s_y)]
222
223
224
canvas.bind_all("<Button-1>", add_to_all) # ЛКМ
225
canvas.bind_all("<Button-3>", add_to_all) # ПКМ
226
227
228
def generate_ships_list():
229
global ships_list
230
ships_list = []
231
# генерируем список случайных длин кораблей
232
for i in range(0, ships):
233
ships_list.append(random.choice([ship_len1, ship_len2, ship_len3]))
234
# print(ships_list)
235
236
237
def generate_enemy_ships():
238
global ships_list
239
enemy_ships = []
240
241
# подсчет суммарной длины кораблей
242
sum_1_all_ships = sum(ships_list)
243
sum_1_enemy = 0
244
245
# print("sum: ", sum_1_all_ships)
246
247
while sum_1_enemy != sum_1_all_ships:
248
# обнуляем массив кораблей врага
249
enemy_ships = [[0 for i in range(s_x + 1)] for i in
250
range(s_y + 1)] # +1 для доп. линии справа и снизу, для успешных проверок генерации противника
251
252
for i in range(0, ships):
253
len = ships_list[i]
254
horizont_vertikal = random.randrange(1, 3) # 1- горизонтальное 2 - вертикальное
255
256
primerno_x = random.randrange(0, s_x)
257
if primerno_x + len > s_x:
258
primerno_x = primerno_x - len
259
260
primerno_y = random.randrange(0, s_y)
261
if primerno_y + len > s_y:
262
primerno_y = primerno_y - len
263
264
# print(horizont_vertikal, primerno_x,primerno_y)
265
if horizont_vertikal == 1:
266
if primerno_x + len <= s_x:
267
for j in range(0, len):
268
try:
269
check_near_ships = 0
270
check_near_ships = enemy_ships[primerno_y][primerno_x - 1] + \
271
enemy_ships[primerno_y][primerno_x + j] + \
272
enemy_ships[primerno_y][primerno_x + j + 1] + \
273
enemy_ships[primerno_y + 1][primerno_x + j + 1] + \
274
enemy_ships[primerno_y - 1][primerno_x + j + 1] + \
275
enemy_ships[primerno_y + 1][primerno_x + j] + \
276
enemy_ships[primerno_y - 1][primerno_x + j]
277
# print(check_near_ships)
278
if check_near_ships == 0: # записываем в том случае, если нет ничего рядом
279
enemy_ships[primerno_y][primerno_x + j] = i + 1 # записываем номер корабля
280
except Exception:
281
pass
282
if horizont_vertikal == 2:
283
if primerno_y + len <= s_y:
284
for j in range(0, len):
285
try:
286
check_near_ships = 0
287
check_near_ships = enemy_ships[primerno_y - 1][primerno_x] + \
288
enemy_ships[primerno_y + j][primerno_x] + \
289
enemy_ships[primerno_y + j + 1][primerno_x] + \
290
enemy_ships[primerno_y + j + 1][primerno_x + 1] + \
291
enemy_ships[primerno_y + j + 1][primerno_x - 1] + \
292
enemy_ships[primerno_y + j][primerno_x + 1] + \
293
enemy_ships[primerno_y + j][primerno_x - 1]
294
# print(check_near_ships)
295
if check_near_ships == 0: # записываем в том случае, если нет ничего рядом
296
enemy_ships[primerno_y + j][primerno_x] = i + 1 # записываем номер корабля
297
except Exception:
298
pass
299
300
# делаем подсчет 1ц
301
sum_1_enemy = 0
302
for i in range(0, s_x):
303
for j in range(0, s_y):
304
if enemy_ships[j][i] > 0:
305
sum_1_enemy = sum_1_enemy + 1
306
307
# print(sum_1_enemy)
308
# print(ships_list)
309
# print(enemy_ships)
310
return enemy_ships
311
312
313
generate_ships_list()
314
# print(ships_list)
315
enemy_ships1 = generate_enemy_ships()
316
enemy_ships2 = generate_enemy_ships()
317
# print("****************************")
318
# print(enemy_ships1)
319
# print("****************************")
320
# print(enemy_ships2)
321
# print("****************************")
322
323
while app_running:
324
if app_running:
325
tk.update_idletasks()
326
tk.update()
327
time.sleep(0.005)
328
329