-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy path92.py
More file actions
267 lines (235 loc) · 7.57 KB
/
92.py
File metadata and controls
267 lines (235 loc) · 7.57 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
"""
附加题二
10*10格子
n条船,且不能重复,不能超出边界
三种类型:1*1(3) 2*2(3) 4*3(1)
10次击中就获得胜利;也可以再尝试玩一局
"""
from random import randint
# 10*10格子
board = []
for i in range(10):
board.append(["O"]*10)
print(board)
def print_board(board_in):
"""
子列表分行打印
:param board_in: 由子列表组成的列表
:return: 子列表
"""
for row in board_in:
# 针对列表中的元素,使用" "(空格)链接
print(" ".join(row))
# board[2][2] = "x"
print_board(board)
def random_row(board_in):
"""
随机行数
:param board_in:列表
:return: 随机行数
"""
# randint(a, b) [a,b]
row = randint(0, len(board_in)-1)
return row
def random_col(board_in):
"""
随机列数
:param board_in:列表
:return: 随机列数
"""
col = randint(0, len(board_in[0])-1)
return col
# 每条船生成的时候不管多大,都只取一个左上角;然后计算剩下的点位置并存储所有点的位置
# 每次生成新的船时,只要检查新船的所有点是否存储过
# 首次生成新船,存储;
# 再次生成新船时,判断之前是否生成过
# 一个格子
def ship(board_in):
"""
1*1 一个格子:一条船或船的左上角
:param board_in: list 地图
:return:一个格子 tuple (row, col)
"""
# row_col = []
row = random_row(board_in)
col = random_col(board_in)
# row_col.append(row)
# row_col.append(col)
return row, col
# 一个船有m*n个格子,不能超出边界
def large_ship(board_in, m, n):
"""
一条船:m*n
:param board_in: list 地图
:param m: 行
:param n: 列
:return: 船所在格子的列表 list 每一个格子用tuple表示
"""
ss = []
# 随机产生一条小船或大船的左上角 tuple
r, c = ship(board_in)
print(r, c)
# 判断是否超出边界
if r + m <= len(board_in) and c + n <= len(board_in):
for i in range(r, r + m):
for j in range(c, c + n):
# s = []
# s.append(i)
# s.append(j)
s = i, j
ss.append(s)
# return ss
else:
print("Notice: There is not enough space for such ship in the map!")
# return ss
return ss
# print(large_ship(board, 4, 3))
# 一条船与集合船是否重复的判断
def is_repeat(t, d):
"""
判断船是否重复,若重复,返回True
:param t:所有船的集合 list
:param d:一条船 list
:return: 标志,True or False
e.g. t = [[(1, 2), (3, 4)], [(5, 6), (7, 8)]]
d = [(4, 2), (3, 4), (5, 6)]
t = []时,返回False
"""
# e是m*n个格子 以船为单位
for e in t:
# a是tuple,一个格子
for a in d:
if a in e:
print("{} in {}".format(a, e))
return True
return False
# 一种类型多条船 且不重复
def ships(board_in, m, n, t):
"""
同种类型 t条船 不重复
:param board_in: list 地图
:param m: 行数
:param n: 列数
:param t: 船数
:return: list 子列表为一条船
"""
sss = []
while len(sss) < t:
single_ship = large_ship(board_in, m, n)
# 当large_ship()中超过界限的时候会返回[],为保证sss中没有空列表
if single_ship:
# 判断船是否有重复
if is_repeat(sss, single_ship):
print("Repeat")
continue
else:
sss.append(single_ship)
# """
# 不需要判断是否首次添加,如果sss=[]时,isrepeat()的结果为False
# # 非首次添加,判断是否重复
# """
# if sss:
# if is_repeat(sss, single_ship):
# # single_ship = large_ship(board_in, m, n)
# # is_repeat(sss, single_ship)
# continue
# # # y是tuple,一个格子
# # for y in single_ship:
# # # x是子列表,m*n个格子 以船为单位
# # for x in sss:
# # # 如果出现重复,需重新生成船;
# # if y in x:
# # print("{} in {}".format(y, x))
# # single_ship = large_ship(board_in, m, n)
# # # 找到立刻当前的退出循环,后面不再进行比较!!!
# # break
#
# # 未出现重复,保存
# else:
# sss.append(single_ship)
# else:
# sss.append(single_ship)
return sss
# 多种类型多条船 不重复
def mul_ships(board_in, a, b, c):
"""
假设已知有三种类型的船,分别是1*1, 2*2, 4*3
:param board_in:
:param a:1*1 船数
:param b:2*2 船数
:param c:4*3 船数
:return:
"""
# 生成第一种类型船的时候,一种类型不重复的船
sss = ships(board_in, 1, 1, a)
print(len(sss))
# 生成第二种类型
while a <= len(sss) < (a + b):
single_ship = large_ship(board_in, 2, 2)
# 当large_ship()中超过界限的时候会返回[],为保证sss中没有空列表
if single_ship:
# 判断船是否有重复
if is_repeat(sss, single_ship):
print("Repeat")
continue
else:
sss.append(single_ship)
# 生成第三种类型
while (a + b) <= len(sss) < (a + b + c):
single_ship = large_ship(board_in, 4, 3)
# 当large_ship()中超过界限的时候会返回[],为保证sss中没有空列表
if single_ship:
# 判断船是否有重复
if is_repeat(sss, single_ship):
print("Repeat")
continue
else:
sss.append(single_ship)
return sss
# print(ship(board))
# print(ships(board, 4, 3, 3))
# print(ships(board, 2, 2, 5))
# print(len(ships(board, 2, 2, 5)))
# print(mul_ships(board, 3, 3, 1))
def game(ships, n):
"""
n次机会 击中战舰
:param ships: 所有的船
:param n: 机会
:return:
"""
count = 1
while count <= n:
print("Round {}".format(count))
# 猜测点类型也要是 [(a, b)],看做是1*1的一条船
guess = []
guess_row = int(input("Please enter the row of the ship:"))
guess_col = int(input("Please enter the column of the ship:"))
guess.append((guess_row, guess_col))
print(guess)
# 猜中
if is_repeat(ships, guess):
print("Congratulations! You got it!")
break
# 未猜中,继续猜
else:
# 情况一:数字范围
if guess_row not in range(10) or \
guess_col not in range(10):
print("Notice: Please enter the number of row ranging from 0 to 9 and col ranging from 0 to 4")
# 情况二:重复猜测
elif board[guess_row][guess_col] == "X":
print("Notice: You have guessed the location! Please try another!")
# 情况三:未猜中
else:
print("You are wrong!")
board[guess_row][guess_col] = "X"
print_board(board)
count += 1
# continue
if count > n:
print("Sorry, you have no chances! Game over! ")
n = 5
ships = mul_ships(board, 3, 3, 1)
print(ships)
game(ships, n)