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