He estado haciendo un juego similar al busca minas.Y encontré un problema que si pongo un tablero algo mayor de 10x10 la
función recursiva de buscar limites con otras celdas me da desbordamiento. Cosa que en Gambas3 no ocurre.
La función es esta:
PUBLIC SUB buscalimites(x AS Integer, y AS Integer)
DIM i, j, vecinos AS Integer
FOR i = x - 1 TO x + 1
FOR j = y - 1 TO y + 1
IF (i >= 0) AND (i < maxhor) AND (j >= 0) AND (j < maxver) THEN
IF mapademinas[i, j] = 0 THEN 'Para evitar el problema si estamos en la columna 0
marcavacio(i, j)
contador += 1
vecinos = cuentavecinos(i, j)
IF vecinos = 0 THEN
buscalimites(i, j)
ELSE
Pizarra.Refresh()
Draw.Begin(Pizarra)
Draw.FillColor = Color.Gray
Draw.FillStyle = Fill.Solid
Draw.Rect(i * anchoCelda, j * altoCelda, anchoCelda, altoCelda)
Draw.ForeColor = Color.White
Draw.Font.Size = anchoCelda
Draw.Text(vecinos, i * anchoCelda, j * altoCelda, anchoCelda, altoCelda, Align.Center)
Draw.End
ENDIF
ENDIF
ENDIF
NEXT
NEXT
END
DIM i, j, vecinos AS Integer
FOR i = x - 1 TO x + 1
FOR j = y - 1 TO y + 1
IF (i >= 0) AND (i < maxhor) AND (j >= 0) AND (j < maxver) THEN
IF mapademinas[i, j] = 0 THEN 'Para evitar el problema si estamos en la columna 0
marcavacio(i, j)
contador += 1
vecinos = cuentavecinos(i, j)
IF vecinos = 0 THEN
buscalimites(i, j)
ELSE
Pizarra.Refresh()
Draw.Begin(Pizarra)
Draw.FillColor = Color.Gray
Draw.FillStyle = Fill.Solid
Draw.Rect(i * anchoCelda, j * altoCelda, anchoCelda, altoCelda)
Draw.ForeColor = Color.White
Draw.Font.Size = anchoCelda
Draw.Text(vecinos, i * anchoCelda, j * altoCelda, anchoCelda, altoCelda, Align.Center)
Draw.End
ENDIF
ENDIF
ENDIF
NEXT
NEXT
END
Y aquí la función para ver cuantas celdas vecinas contiene o no una mina.
PUBLIC FUNCTION cuentavecinos(x AS Integer, y AS Integer) AS Integer
DIM i, j AS Integer
DIM vecinosprox AS Integer
vecinosprox = 0
IF mapademinas[x, y] = 1 THEN
vecinosprox = -1
ELSE
FOR i = x - 1 TO x + 1
FOR j = y - 1 TO y + 1
IF (i >= 0) AND (i < maxhor) AND (j >= 0) AND (j < maxver) THEN
IF (mapademinas[i, j] = 1) THEN vecinosprox += 1
ENDIF
NEXT
NEXT
ENDIF
RETURN vecinosprox
END
DIM i, j AS Integer
DIM vecinosprox AS Integer
vecinosprox = 0
IF mapademinas[x, y] = 1 THEN
vecinosprox = -1
ELSE
FOR i = x - 1 TO x + 1
FOR j = y - 1 TO y + 1
IF (i >= 0) AND (i < maxhor) AND (j >= 0) AND (j < maxver) THEN
IF (mapademinas[i, j] = 1) THEN vecinosprox += 1
ENDIF
NEXT
NEXT
ENDIF
RETURN vecinosprox
END
Una imagen, como veis funciona con las dimensiones que puse arriba.
En Gambas3 la función va mejor que en Gambas2:
Saludos.