python字符串实现扫雷
1、使用方法
运行代码后,每次输入一个坐标,输入格式为 【2,3】(注意:不包含【】,表示第二行第三列)
在坐标前输入‘b’,即表示标记该坐标位置,如果该坐标已经标记,则此操作可取消标记
2、展示
运行后输出如下:
输入2,3后回车
输入b1,3后
再次输入b1,3后
代码部分
import numpy as np
import time
#地图边界
L = [10,10]
#地雷数
X = 10
biaoti = ''
for i in range(L[1]):
biaoti = biaoti +str(i+1) +' '
save = np.zeros(L)
dilei = []
while True:
if len(dilei) == X:
break
x = np.random.randint(1, L[0])
y = np.random.randint(1, L[1])
if [x,y] in dilei:
continue
else:
dilei.append([x,y])
for i in dilei:
save[i[0],i[1]] = -999
for i in range(L[0]):
for j in range(L[1]):
S = 0
try:
if save[i, j] == -999:
continue
except:
pass
try:
if save[i - 1, j - 1] == -999:
S = S + 1
except:
pass
try:
if save[i - 1, j] == -999:
S = S + 1
except:
pass
try:
if save[i - 1, j + 1] == -999:
S = S + 1
except:
pass
try:
if save[i, j - 1] == -999:
S = S + 1
except:
pass
try:
if save[i, j + 1] == -999:
S = S + 1
except:
pass
try:
if save[i + 1, j - 1] == -999:
S = S + 1
except:
pass
try:
if save[i + 1, j] == -999:
S = S + 1
except:
pass
try:
if save[i + 1, j + 1] == -999:
S = S + 1
except:
pass
save[i, j] = S
n = '. '*L[1]
new = []
for i in range(L[0]):
new.append(n)
dnew = new.copy()
for i in range(L[0]):
for j in range(L[1]):
if save[i,j] != -999:
dnew[i] = dnew[i][:3 * j] + str(int(save[i, j])) + dnew[i][3 * j + 1:]
def dp(new,dcos):
nnew = new.copy()
for i in dcos:
nnew[i[0]] = nnew[i[0]][:3 * i[1]] + '*' + nnew[i[0]][3 * i[1] + 1:]
nnew.insert(0, '_'*L[1]*3)
nnew.insert(0,biaoti)
for i in range(len(nnew)):
if i<=1:
c = ' '
else:
c = str(i-1)
if i-1<10:
print(c+' |'+nnew[i])
else:
print(c + ' |' + nnew[i])
def pz(save,sin):
id = [sin,[sin[0]-1,sin[1]-1],[sin[0]-1,sin[1]],[sin[0]-1,sin[1]+1],[sin[0],sin[1]-1],[sin[0],sin[1]+1],[sin[0]+1,sin[1]-1],[sin[0]+1,sin[1]],[sin[0]+1,sin[1]+1]]
xid = []
for i in range(len(id)):
if (id[i][0]<0) | (id[i][1]<0) | (id[i][0]>=L[0]) | (id[i][1]>=L[1]):
pass
else:
xid.append(id[i])
id0 = []
for i in xid[1:]:
if save[i[0],i[1]] == 0:
id0.append(i)
for i in xid:
a[i[0],i[1]] = -1
return a,xid,id0
dcos = []
statime = time.time()
while True:
try:
if new == dnew:
print('success !')
print('time: '+str(round(time.time()-statime,2))+' s')
break
dp(new,dcos)
cos = input('\n输入控制坐标:')
if cos[0] == 'b':
cos = eval('[' + cos[1:] + ']')
cos = [cos[0] - 1, cos[1] - 1]
if cos in dcos:
dcos.remove(cos)
else:
dcos.append(cos)
continue
else:
sin = eval('['+cos+']')
sin = [sin[0]-1,sin[1]-1]
if save[sin[0],sin[1]] == -999:
print('bigbong ! ! ! ')
break
elif save[sin[0],sin[1]] == 0:
id00 = [sin]
xidd = []
a = save.copy()
while True:
if len(id00)==0:
break
a,xid,id0 = pz(a,id00[0])
xidd = xidd + xid
id00 = id00 + id0
del id00[0]
xidd = [i for n , i in enumerate(xidd) if i not in xidd[:n]]
for i in xidd:
new[i[0]] = new[i[0]][:3 * i[1]] + str(int(save[i[0], i[1]])) + new[i[0]][3 * i[1] + 1:]
else:
new[sin[0]] = new[sin[0]][:3*sin[1]]+str(int(save[sin[0],sin[1]]))+new[sin[0]][3*sin[1]+1:]
except:
pass