DEFINT A-Z: REM Declara enteras las variables
SCREEN 0: REM Pantalla de texto
WIDTH 40: REM 40 columnas
COLOR 15, 1: REM Tinta blanca, fondo azul
DIM A(80), B(80): REM 81 casillas y casillas fijas
DIM Y1(80), Y2(80), Y3(80): REM Agrupando casillas
DIM X1(81), X2(81), X3(81): REM Control de ocupacion
CLS: REM Limpiar pantalla
PRINT: REM Dibujar cuadricula con caracteres ASCII
PRINT , "ÚÄÄÄÄÄÂÄÄÄÄÄÂÄÄÄÄÄ¿"
PRINT , "³ ³ ³ ³"
PRINT , "³ ³ ³ ³"
PRINT , "³ ³ ³ ³"
PRINT , "³ ³ ³ ³"
PRINT , "³ ³ ³ ³"
PRINT , "ÃÄÄÄÄÄÅÄÄÄÄÄÅÄÄÄÄÄ´"
PRINT , "³ ³ ³ ³"
PRINT , "³ ³ ³ ³"
PRINT , "³ ³ ³ ³"
PRINT , "³ ³ ³ ³"
PRINT , "³ ³ ³ ³"
PRINT , "ÃÄÄÄÄÄÅÄÄÄÄÄÅÄÄÄÄÄ´"
PRINT , "³ ³ ³ ³"
PRINT , "³ ³ ³ ³"
PRINT , "³ ³ ³ ³"
PRINT , "³ ³ ³ ³"
PRINT , "³ ³ ³ ³"
PRINT , "ÀÄÄÄÄÄÁÄÄÄÄÄÁÄÄÄÄÄÙ"
10 COLOR 1, 0: REM Tinta azul, fondo negro simulando cursor
A = A(N): REM Valor de casilla (0,9)
GOSUB 300: REM Ir a rutina de plasmar valor
COLOR 0, 1: REM Tinta negra, fondo azul
IF a$ = " " OR VAL(a$) > 0 OR a$ = "0" THEN a$ = " M": GOTO 30
REM Si el ultimo valor fue valido avanzar una casilla
20 a$ = INKEY$: REM Lectura de teclado
IF a$ = "" GOTO 20: REM Si es nulo volver
IF a$ = CHR$(27) THEN END: REM Si es ESCAPE salir
IF a$ = CHR$(13) GOTO 40: REM Si es INTRO iniciar resolucion
30 A = A(N): REM Valor de casilla (0,9)
GOSUB 300: REM Ir a rutina de plasmar valor
A = VAL(a$): REM Valor de tecla pulsada
a$ = RIGHT$(a$, 1): REM Caracter derecho
REM Las teclas de direccion devuelven dos caracteres)
IF a$ = "M" AND N < 80 THEN N = N + 1: REM Flecha derecha
IF a$ = "K" AND N > 0 THEN N = N - 1: REM Flecha izquierda
IF a$ = "P" AND N < 72 THEN N = N + 9: REM Flecha abajo
IF a$ = "H" AND N > 8 THEN N = N - 9: REM Flecha arriba
IF A = 0 AND LEN(a$) < 2 AND a$ <> " " AND a$ <> "0" GOTO 10
REM Si el caracter no es valido volver a cursor
A(N) = A: REM Asignar valor pulsado a la casilla actual
GOTO 10: REM Volver a cursor
40 N = 0: REM Casilla inicial
REM Inicio de agrupamiento
FOR V = 0 TO 2
FOR W = 0 TO 2
FOR X = 0 TO 2
FOR Y = 0 TO 2
Y1(N) = 27 * V + 9 * W: REM Puntero fila (0,72)
Y2(N) = 27 * X + 9 * Y: REM Puntero columna (0,72)
Y3(N) = 27 * V + 9 * X: REM Puntero zona (0,72)
N = N + 1: REM Siguiente casilla
NEXT Y, X, W, V: REM Fin agrupamiento
50 FOR N = 0 TO 80: REM Inicio control de casillas ocupadas
A = A(N): REM Obtener valor de casilla
IF A = 0 GOTO 60: REM Si es "0" saltar
Y1 = Y1(N) + A: REM Puntero de fila mas valor
Y2 = Y2(N) + A: REM Puntero de columna mas valor
Y3 = Y3(N) + A: REM Puntero de zona mas valor
IF X1(Y1) + X2(Y2) + X3(Y3) THEN A(N) = 0: GOTO 60
REM Si valor ya esta en uso saltar
B(N) = 1: REM Establecer casilla ocupada
X1(Y1) = 1: REM Establecer valor en uso para fila
X2(Y2) = 1: REM Establecer valor en uso para columna
X3(Y3) = 1: REM Establecer valor en uso para zona
60 NEXT: REM Fin control de ocupacion
N = -1: REM Inicio rutina de resolucion
70 N = N + 1: REM Siguiente casilla
IF N = 81 GOTO 200: REM Si supera el limite saltar a resuelto
IF B(N) GOTO 70: REM Si es fijo ir a siguiente
80 A = A(N): REM Valor de casilla (0,9)
Y1 = Y1(N) + A: REM Puntero de fila mas valor
Y2 = Y2(N) + A: REM Puntero de columna mas valor
Y3 = Y3(N) + A: REM Puntero de zona mas valor
IF A THEN X1(Y1) = 0: X2(Y2) = 0: X3(Y3) = 0
REM Si el valor no es "0" establecer sin uso
90 A = A + 1: REM Siguiente numero en casilla
IF A > 9 GOTO 100: REM Si era le nueve saltar a rebase
Y1 = Y1 + 1: REM Puntero de fila mas 1
Y2 = Y2 + 1: REM Puntero de columna mas 1
Y3 = Y3 + 1: REM Puntero de zona mas 1
IF X1(Y1) + X2(Y2) + X3(Y3) GOTO 90
REM Si valor ya esta en uso volver a siguiente
X1(Y1) = 1: REM Establecer valor en uso para fila
X2(Y2) = 1: REM Establecer valor en uso para columna
X3(Y3) = 1: REM Establecer valor en uso para zona
A(N) = A: REM Asignar nuevo valor
GOTO 70: REM Volver a siguiente
100 A(N) = 0: REM Asignar "0" por rebase
110 N = N - 1: REM Casilla anterior
IF N < 0 THEN RUN: REM No hay mas soluciones reiniciar
IF B(N) GOTO 110: REM Si es fijo ir a anterior
GOTO 80: REM Volver a obtener casilla
200 Z = Z + 1: REM Imprimir solucion en pantalla
LOCATE 1, 1: REM
PRINT , " **"; Z; "**"
LOCATE 22, 18
COLOR 1, 15
PRINT " Pulsar INTRO "
FOR N = 0 TO 80
A = A(N)
COLOR 15 - 15 * B(N), 1
GOSUB 300
NEXT
210 IF INKEY$ <> "" GOTO 210
220 a$ = INKEY$
IF a$ = "" GOTO 220
IF a$ = CHR$(27) THEN RUN
GOTO 110: REM Si no se pulsa ESCAPE buscar mas soluciones
300 LOCATE 2 * INT(N / 9) + 3, 2 * (N - 9 * INT(N / 9)) + 16
PRINT CHR$(A - 48 * (A > 0) - 32 * (A = 0))
RETURN
Comentarios sobre la versión: SDKQB64 (4)
Quería poner el ejecutable para que fuera más fácil probarlo.