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