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