Buscar las minas en un tablero
Python
Actualizado el 3 de Febrero del 2021 por Joel (150 códigos) (Publicado el 4 de Noviembre del 2020)
19.478 visualizaciones desde el 4 de Noviembre del 2020
Este código muestra una manera de contar las bombas dadas alrededor de una posición de una cuadricula creada con una lista de listas.
1
2
3
4
5
6
7
8
9
10
11
tablero=[
[' ', 'x', ' ', 'x'],
['x', ' ', ' ', ' '],
[' ', 'x', 'x', ' '],
['x', ' ', ' ', 'x'],
]
buscaminas(tablero, 0,0) # 2
buscaminas(tablero, 1,1) # 4
buscaminas(tablero, 2,2) # 3
buscaminas(tablero, 6,6) # 0
Comentarios sobre la versión: 1 (14)
Con tablero =
buscaminas(tablero, i, j) debió entregar 2, pero entregó 0
Vuelve a intentarlo!
Vuelve a intentarlo!
]
buscaminas(tablero, 0,0) # 1
buscaminas(tablero, 1,1) # 0
Con tablero =
[X | | | | | | X | | | | ]
[ | | | X | | X | | | | X | ]
[ | | | | X | | | X | X | | ]
[ | | | X | | | X | | | | ]
[ | | | | X | | | | X | | ]
[ | X | | | | X | | X | | | X]
[ | | | X | X | | X | | | X | X]
[ | | X | X | | X | | | | X | ]
[ | | | | | | | X | | | X]
[ | X | | | | | X | | | | ]
[ | | X | | | X | X | | | | ]
y la posición (10,0)
buscaminas(tablero, i, j) debió entregar 1, pero entregó 0
Vuelve a intentarlo!
en resumen:
tablero = [[' ', 'X', ' ', 'X'],['X', ' ', ' ', ' '],[' ', 'X', 'X', ' '],['X', ' ', ' ', 'X']]
def buscaminas(tablero, fil, col):
if tablero[fil][col] != 'X': #esto es para que no cuente en el caso de que elija una mina
minas = 0
for i in [fil-1, fil+1]: # aqui se resume la fila anterior, media y superior a la coordenada elejida.
for j in [col-1, col+1]: # lo mismo pero en columna, asi cubrimos todos los recuadros alrededor.
if i<0 or i>(len(tablero)-1) or j<0 or j>(len(tablero)-1): #esta condición es para no salirnos de los márgenes del tablero
if tablero[i][j]=='X':
minas+=1
return minas
Aún así, para buscaminas(tablero,1,1) me da 0 y para (0,2) me da 1.
Alguien me ayudaría a identificar el error?
tablero = [[' ', 'X', ' ', 'X'],['X', ' ', ' ', ' '],[' ', 'X', 'X', ' '],['X', ' ', ' ', 'X']]
def buscaminas(tablero, fil, col):
(*) if tablero [fil][col] != "X" # esto es opcional, en caso de que quieran que no sea X el recuadro en el que caen
minas = 0
for i in range (fil-1, fil+2): # la funcion recorre desde la linea anterior (-1) hasta la posterior (+1), pero al no considerar el rango final se escribe como (+2)
for j in range (col-1, col+2): #lo mismo en columna, así mapeamos todo alrededor (incluido el recuadro en el que caimos)
if i<0 or i>(len(tablero)-1) or j<0 or j>(len(tablero)-1): #esto nos impide elegir recuadros de los margenes.
continue
if tablero[i][j]=='X':
minas = minas+1
(*) if tablero [fil][col] == "X" minas=minas-1 ésto es opcional en caso de que no quieran contar la X del recuedro en el que cayeron, pero si no se los piden no lo pongan.
return minas
print(buscaminas(tablero,1,1)) = 4
print(buscaminas(tablero,0,2)) = 2
print(buscaminas(tablero,2,2)) = 3
Alguno ha visto como considerar los recuadros de los márgenes? tendría que reescribir el "in range" para 4 condiciones (4 margenes)?
Saludos y gracias.
Pudiste resolver el problema?
[' ', 'X', ' ', 'X'],
['X', ' ', ' ', ' '],
[' ', 'X', 'X', ' '],
['X', ' ', ' ', 'X'],
]
def buscaminas(tablero, i, j):
minas=0
for h in range(i-1, i+2):
for v in range(j-1, j+2):
if h<0 or h>len(tablero[0])-1 or v<0 or v>len(tablero)-1:
continue
if tablero[h][v]=="X":
minas = minas+1
return minas
print(buscaminas(tablero, 0,0)) # 2
print(buscaminas(tablero, 1,1)) # 4
print(buscaminas(tablero, 2,2)) # 3
print(buscaminas(tablero, 6,6)) # 0
minas = 0
for f in range(i-1, i+2):
for c in range(j-1, j+2):
if 0 <= f < len(tablero)-1 and 0 <= c < len(tablero[f])-1:
if tablero[f][c] == "x" or tablero[f][c] == "X":
minas = minas + 1
return minas
minas = 0