IMD's 2048 (Spectrum)

Juego desarrollado en Basic del ZX Spectrum para el concurso de Bytemaniacos 2020.

Para facilitar la tarea de teclear el juego en el ordenador he usado la utilidad Bas2Tap (v2.7) que genera un fichero TAP listo para usarse en emuladores desde un fichero de texto con el código fuente en basic. Para probar el juego he usado el emulador Retro Virtual Machine.

  1. Fichero ZIP: 2048_v1.0.zip
  2. Excel para generar UDG's: UDGs.xlsx (1=pinta)

Tenemos un tablero de 4 x 4 fichas en las que puede haber un número o estar vacías.

La idea es desplazar las fichas a derecha, izquierda, arriba o abajo para intentar unir dos fichas con el mismo número y así sumarlos.

Por ejemplo si unimos dos casillas con 2 y 2, obtenemos una ficha con un 4, y así sucesivamente.

Si el tablero se llena, perdemos.

El objetivo del juego es conseguir en una casilla el número 2048, a base de sumas:

   2 +    2 = 4
   4 +    4 = 8
   8 +    8 = 16
  16 +   16 = 32
  32 +   32 = 64
  64 =   64 = 128
 128 +  128 = 256
 256 +  256 = 512
 512 +  512 = 1024
1024 + 1024 = 2048 !!!!!
pantalla presentación 2048 pantalla información 2048 pantalla juego 2048
#####################################################################
#  IMPORTANTE: Requiere Bas2Tap 2.7 (soporte de comentarios)
10 REM Titulo: 2048
12 REM Version: 1.0
14 REM Programa: Inaki Martinez Diez (C) 2019
16 REM Plataforma: ZX-Spectrum 16k 
18 REM Concurso Basic Bytemaniacos 2019-2020
20 REM Idea original: Gabriele Cirulli (C) 2014

#####################################################################
# GENERANDO UDGs
52 RESTORE 9500
53 FOR N=1 TO 10
54  READ U$
55  FOR U=0 TO 7
56   READ V
57   POKE USR U$+U,V
58  NEXT U
59 NEXT N

# Mejor puntuacion
61 LET MEJOR=0

# CEROS para rellenar los puntos
63 LET C$="000000"

#####################################################################
# Pantalla de presentacion
1005 BORDER 1 : PAPER 1 : INK 7 : CLS
# mostramos 2048
1010 GO SUB 1060
1020 PRINT AT 9,0; "{INK 7}{PAPER 1}Concurso Basic Bytemaniacos 2020"
1021 PRINT AT 10,1; "original: Gabriele Cirulli 2014"
1030 PRINT AT 12,2; "Controles:"
1031 PRINT AT 14,2; "O - IZQUIERDA"
1032 PRINT AT 15,2; "P - DERECHA"
1033 PRINT AT 16,2; "Q - ARRIBA"
1034 PRINT AT 17,2; "A - ABAJO"
1035 PRINT AT 18,2; "I - INFORMACION"
1036 PRINT AT 19,2; "E - EMPEZAR"
# mostramos copyright
1038 GO SUB 1050
1040 LET A$=INKEY$
1041 IF A$="E" OR A$="e" THEN GO TO 1100
1042 IF A$="I" OR A$="i" THEN GO TO 1080
1043 GO TO 1040

#####################################################################
# COPYRIGHT
1051 PRINT #0; AT 0,3; "{(C)} 2019 I{n}aki Mart{i}nez D{i}ez"
1052 PRINT #0; AT 1,0; "https://www.imd.guru/retropedia/"
1053 RETURN

#####################################################################
# 2048 en colores
1060 PRINT AT 0,7; "{FLASH 1}{INK 1}{PAPER 2} {INK 1}{PAPER 2} {INK 1}{PAPER 2} {INK 1}{PAPER 1} {INK 3}{PAPER 1} {INK 3}{PAPER 1} {INK 3}{PAPER 1} {INK 1}{PAPER 1} {INK 1}{PAPER 6} {INK 1}{PAPER 1} {INK 1}{PAPER 6} {INK 1}{PAPER 1} {INK 4}{PAPER 1} {INK 4}{PAPER 1} {INK 4}{PAPER 1} {FLASH 0}"
1061 PRINT AT 1,7; "{FLASH 1}{INK 1}{PAPER 1} {INK 1}{PAPER 1} {INK 1}{PAPER 2} {INK 1}{PAPER 1} {INK 3}{PAPER 1} {INK 1}{PAPER 1} {INK 3}{PAPER 1} {INK 1}{PAPER 1} {INK 1}{PAPER 6} {INK 1}{PAPER 1} {INK 1}{PAPER 6} {INK 1}{PAPER 1} {INK 4}{PAPER 1} {INK 1}{PAPER 1} {INK 4}{PAPER 1} {FLASH 0}"
1062 PRINT AT 2,7; "{FLASH 1}{INK 5}{PAPER 2} {INK 5}{PAPER 2} {INK 5}{PAPER 2} {INK 1}{PAPER 1} {INK 3}{PAPER 4} {INK 1}{PAPER 4} {INK 3}{PAPER 4} {INK 1}{PAPER 1} {INK 2}{PAPER 6} {INK 1}{PAPER 6} {INK 2}{PAPER 6} {INK 1}{PAPER 1} {INK 4}{PAPER 3} {INK 4}{PAPER 3} {INK 4}{PAPER 3} {FLASH 0}"
1063 PRINT AT 3,7; "{FLASH 1}{INK 1}{PAPER 2} {INK 1}{PAPER 1} {INK 5}{PAPER 1} {INK 1}{PAPER 1} {INK 3}{PAPER 4} {INK 1}{PAPER 1} {INK 3}{PAPER 4} {INK 1}{PAPER 1} {INK 2}{PAPER 1} {INK 1}{PAPER 1} {INK 2}{PAPER 6} {INK 1}{PAPER 1} {INK 4}{PAPER 3} {INK 1}{PAPER 1} {INK 4}{PAPER 3} {FLASH 0}"
1064 PRINT AT 4,7; "{FLASH 1}{INK 5}{PAPER 2} {INK 5}{PAPER 2} {INK 5}{PAPER 2} {INK 1}{PAPER 1} {INK 3}{PAPER 4} {INK 3}{PAPER 1} {INK 3}{PAPER 4} {INK 1}{PAPER 1} {INK 2}{PAPER 1} {INK 2}{PAPER 1} {INK 2}{PAPER 6} {INK 1}{PAPER 1} {INK 4}{PAPER 3} {INK 4}{PAPER 3} {INK 4}{PAPER 3} {FLASH 0}"
1065 PRINT AT 5,7; "{FLASH 1}{INK 5}{PAPER 1} {INK 1}{PAPER 1} {INK 1}{PAPER 1} {INK 1}{PAPER 1} {INK 1}{PAPER 4} {INK 1}{PAPER 1} {INK 1}{PAPER 4} {INK 1}{PAPER 1} {INK 1}{PAPER 1} {INK 1}{PAPER 1} {INK 2}{PAPER 1} {INK 1}{PAPER 1} {INK 1}{PAPER 3} {INK 1}{PAPER 1} {INK 1}{PAPER 3} {FLASH 0}"
1066 PRINT AT 6,7; "{FLASH 1}{INK 5}{PAPER 1} {INK 5}{PAPER 1} {INK 5}{PAPER 1} {INK 1}{PAPER 1} {INK 1}{PAPER 4} {INK 1}{PAPER 4} {INK 1}{PAPER 4} {INK 1}{PAPER 1} {INK 1}{PAPER 1} {INK 1}{PAPER 1} {INK 2}{PAPER 1} {INK 1}{PAPER 1} {INK 1}{PAPER 3} {INK 1}{PAPER 3} {INK 1}{PAPER 3} {FLASH 0}"
1067 RETURN

#####################################################################
# Informacion
1080 BORDER 1 : PAPER 1 : INK 7 : CLS
# mostramos 2048
1081 GO SUB 1060
1082 PRINT AT  9,0; "Usa las teclas 'OPQA' para mover"
1083 PRINT AT 10,0; "las fichas. Al juntar dos fichas"
1084 PRINT AT 11,0; "con el mismo numero se suman en"
1085 PRINT AT 12,0; "una sola ficha. Ej: 2 + 2 = 4." 
1086 PRINT AT 13,0; "El objetivo es obtener el numero"
1087 PRINT AT 14,0; "2048 en una sola ficha a base de"
1088 PRINT AT 15,0; "sumas."
1088 PRINT AT 16,0; "Si el tablero se llena, perdemos"
1089 PRINT AT 20,6; "M - REGRESA AL MENU"
# mostramos copyright
1090 GO SUB 1050
1095 LET A$=INKEY$
1096 IF A$="M" OR A$="m" THEN GO TO 1000
1097 GO TO 1095

#####################################################################
# Pantalla de juego
1105 BORDER 1 : PAPER 1 : INK 7 : CLS
# cuadrados blancos
1110 FOR Y=0 TO 2
1111  PRINT AT Y*6,0; "{BRIGHT 0}{INK 1}{PAPER 7}{a}   {b}{PAPER 1} {PAPER 7}{a}   {b}{PAPER 1} {PAPER 7}{a}   {b}{PAPER 1} {PAPER 7}{a}   {b}"
1112  PRINT AT Y*6+1,0; "{BRIGHT 0}{INK 1}{PAPER 7}     {PAPER 1} {PAPER 7}     {PAPER 1} {PAPER 7}     {PAPER 1} {PAPER 7}     "
1113  PRINT AT Y*6+2,0; "{BRIGHT 0}{INK 1}{PAPER 7}     {PAPER 1} {PAPER 7}     {PAPER 1} {PAPER 7}     {PAPER 1} {PAPER 7}     "
1114  PRINT AT Y*6+3,0; "{BRIGHT 0}{INK 1}{PAPER 7}     {PAPER 1} {PAPER 7}     {PAPER 1} {PAPER 7}     {PAPER 1} {PAPER 7}     "
1115  PRINT AT Y*6+4,0; "{BRIGHT 0}{INK 1}{PAPER 7}{c}   {d}{PAPER 1} {PAPER 7}{c}   {d}{PAPER 1} {PAPER 7}{c}   {d}{PAPER 1} {PAPER 7}{c}   {d}"
1116 NEXT Y
# ultimo bloque fuera del for por la linea 22 con AT
1117 PRINT AT 18,0; "{BRIGHT 0}{INK 1}{PAPER 7}{a}   {b}{PAPER 1} {PAPER 7}{a}   {b}{PAPER 1} {PAPER 7}{a}   {b}{PAPER 1} {PAPER 7}{a}   {b}"
1119 PRINT AT 19,0; "{BRIGHT 0}{INK 1}{PAPER 7}     {PAPER 1} {PAPER 7}     {PAPER 1} {PAPER 7}     {PAPER 1} {PAPER 7}     "
1120 PRINT AT 20,0; "{BRIGHT 0}{INK 1}{PAPER 7}     {PAPER 1} {PAPER 7}     {PAPER 1} {PAPER 7}     {PAPER 1} {PAPER 7}     "
1121 PRINT AT 21,0; "{BRIGHT 0}{INK 1}{PAPER 7}     {PAPER 1} {PAPER 7}     {PAPER 1} {PAPER 7}     {PAPER 1} {PAPER 7}     "
1122 PRINT #0;AT 0,0; "{BRIGHT 0}{INK 1}{PAPER 7}{c}   {d}{PAPER 1} {PAPER 7}{c}   {d}{PAPER 1} {PAPER 7}{c}   {d}{PAPER 1} {PAPER 7}{c}   {d}"
# panel derecho
# nombre juego
1125 PRINT AT 0,24; "{BRIGHT 0}{INK 1}{PAPER 5}{a}      {b}"
1126 PRINT AT 1,24; "{BRIGHT 0}{INK 7}{PAPER 5}  2048  "
1127 PRINT AT 2,24; "{BRIGHT 0}{INK 1}{PAPER 5}{c}      {d}"
# barra central verde 
1129 PRINT AT 4,24; "{BRIGHT 0}{INK 1}{PAPER 4}{a}      {b}"
1130 FOR Y=5 TO 19
1131  PRINT AT Y,24; "{BRIGHT 0}{INK 7}{PAPER 4}        "
1132 NEXT Y
1134 PRINT AT 20,24; "{BRIGHT 0}{INK 1}{PAPER 4}{c}      {d}"
1135 PRINT AT 5,25; "{BRIGHT 0}{INK 0}{PAPER 4}PUNTOS"
1136 PRINT AT 10,25; "{BRIGHT 0}{INK 0}{PAPER 4}MEJOR"
1137 PRINT AT 15,25; "{BRIGHT 0}{INK 0}{PAPER 4}O {INK 7}{h}{h}{h}{h}"
1138 PRINT AT 16,25; "{BRIGHT 0}{INK 0}{PAPER 4}P {INK 7}{f}{f}{f}{f}"
1139 PRINT AT 17,25; "{BRIGHT 0}{INK 0}{PAPER 4}Q {INK 7}{g}{g}{g}{g}"
1140 PRINT AT 18,25; "{BRIGHT 0}{INK 0}{PAPER 4}A {INK 7}{h}{h}{h}{h}"
1141 PRINT AT 19,25; "{BRIGHT 0}{INK 0}{PAPER 4}M {INK 7}MENU"
# copyright
1142 PRINT #0;AT 0,24; "{BRIGHT 0}{INK 7}{PAPER 1} {(C)} 2019 "
1143 PRINT #0;AT 1,24; "{BRIGHT 0}{INK 7}{PAPER 1}IMD.GURU"

# Puntos actuales
2011 LET PUNTOS=0

# Indica si es fin de juego
2012 LET FIN=0

# Indica si el tablero esta lleno
2014 LET LLENO=0

# Indica si hemos ganado
2015 LET GANADO=0

# Tablero donde se indican los valores de cada cuadro
2016 DIM T(4,4)

#  Duplicados, guarda donde ha habido suma para no realizar una segunda suma
2018 DIM D(4,4)

# IMPRIME PUNTOS
2036 GO SUB 8000 

# IMPRIME MEJOR
2037 GO SUB 8010

# GENERA NUMERO Y LO MUESTRA
2038 GO SUB 8100

######################################################################
# BUCLE PRINCIPAL
#
# vaciamos duplicados
2101 FOR N=1 TO 4
2102  FOR M=1 TO 4
2103   LET D(N,M)=0
2104  NEXT M
2105 NEXT N
# GENERA NUMERO Y LO MUESTRA
2106 GO SUB 8100
# comprobar si es fin de juego
2107 IF FIN = 1 THEN GO TO 8400
# comprobar si es ganador
2108 GO SUB 8500
# si hemos ganado fin de juego
2109 IF GANADO = 1 THEN GO TO 8550
2110 PRINT #0; AT 1,0; "{BRIGHT 1}MUEVA...{BRIGHT 0}               "
2111 BEEP 0.09,1

2155 LET T$=INKEY$
2250 IF T$="O" OR T$="o" THEN GO TO 2300
2251 IF T$="P" OR T$="p" THEN GO TO 2400
2252 IF T$="Q" OR T$="q" THEN GO TO 2500
2253 IF T$="A" OR T$="a" THEN GO TO 2600
2254 IF T$="M" OR T$="m" THEN GO TO 1000
2255 IF T$="E" OR T$="e" THEN GO TO 1100
2260 GO TO 2155

#####################################################################
# izquierda <<<<<<<<
2301 PRINT #0; AT 1,0; "{BRIGHT 1}{h}{h}{h}{h}{h}{h}{h}{h}{BRIGHT 0}"
2302 FOR A=1 TO 4
2303  FOR B=2 TO 4
#      si esta vacia desplazamos
2304   IF T(A,B) <> 0 THEN GO SUB 2310
2305  NEXT B
2306 NEXT A
2307 GO TO 2100

# desplazamiento izquierda
2315 FOR D=B-1 TO 1 STEP -1
#     si esta vacio movemos izquierda
2320  IF T(A,D) = 0 THEN GO TO 2360
# comprobar si hay que sumar
2327  IF NOT (T(A,D) = T(A,D+1) AND D(A,D) = 0) THEN GO TO 2348
2330  LET D(A,D) = 1 : REM marcamos como ya sumado
2332  LET T(A,D) = T(A,D) * 2
2333  LET PUNTOS = PUNTOS + T(A,D)
# imprime puntos
2334  GO SUB 8000
2335  LET Y = A
2336  LET X = D
# imprime cuadro en x,y
2338  GO SUB 8030
2340  LET T(A,D+1) = 0
2342  LET Y = A
2344  LET X = D+1
# imprime cuadro en x,y
2346  GO SUB 8030
# no continuar mas a la izquierda
2348  LET D = 0
2350  GO TO 2380

# movemos a la izquierda
2362  LET T(A,D) = T(A,D+1)
2364  LET Y = A
2366  LET X = D
# imprime cuadro en x,y
2368  GO SUB 8030
2370  LET T(A,D+1) = 0
2372  LET Y = A
2374  LET X = D+1
# imprime cuadro en x,y
2376  GO SUB 8030

2381 NEXT D
2399 RETURN

#####################################################################
# derecha >>>>>>>>
2401 PRINT #0; AT 1,0; "{BRIGHT 1}{f}{f}{f}{f}{f}{f}{f}{f}{BRIGHT 0}"
2402 FOR A=1 TO 4
2403  FOR B=3 TO 1 STEP -1
#      si esta vacia desplazamos
2404   IF T(A,B) <> 0 THEN GO SUB 2410
2405  NEXT B
2406 NEXT A
2407 GO TO 2100

# desplazamiento derecha
2415 FOR D=B+1 TO 4
#     si esta vacio movemos derecha
2420  IF T(A,D) = 0 THEN GO TO 2460 

2425  REM comprobar si hay que sumar
2427  IF NOT (T(A,D) = T(A,D-1) AND D(A,D) = 0) THEN GO TO 2448
# marcamos como ya sumado
2430  LET D(A,D) = 1
2432  LET T(A,D) = T(A,D) * 2
2433  LET PUNTOS = PUNTOS + T(A,D)
# imprime puntos
2434  GO SUB 8000 
2435  LET Y = A
2436  LET X = D
# imprime cuadro en x,y
2438  GO SUB 8030
2440  LET T(A,D-1) = 0
2442  LET Y = A
2444  LET X = D-1
# imprime cuadro en x,y
2446  GO SUB 8030
# no continuar mas a la derecha
2448  LET D = 5
2450  GO TO 2480

# movemos a la derecha
2462  LET T(A,D) = T(A,D-1)
2464  LET Y = A
2466  LET X = D
# imprime cuadro en x,y
2468  GO SUB 8030
2470  LET T(A,D-1) = 0
2472  LET Y = A
2474  LET X = D-1
# imprime cuadro en x,y
2476  GO SUB 8030

2481 NEXT D
2499 RETURN

#####################################################################
# arriba ^^^^^^^^^^
2501 PRINT #0; AT 1,0; "{BRIGHT 1}{g}{g}{g}{g}{g}{g}{g}{g}{BRIGHT 0}"
2502 FOR B=1 TO 4
2503  FOR A=2 TO 4
#      si esta vacia desplazamos
2504   IF T(A,B) <> 0 THEN GO SUB 2510
2505  NEXT A
2506 NEXT B
2507 GO TO 2100

# desplazamiento arriba
2515 FOR D=A-1 TO 1 STEP -1
#     si esta vacio movemos arriba
2520  IF T(D,B) = 0 THEN GO TO 2560

# comprobar si hay que sumar
2527  IF NOT (T(D,B) = T(D+1,B) AND D(D,B) = 0) THEN GO TO 2548
# marcamos como ya sumado
2530  LET D(D,B) = 1
2532  LET T(D,B) = T(D,B) * 2
2533  LET PUNTOS = PUNTOS + T(D,B)
# imprime puntos
2534  GO SUB 8000
2535  LET Y = D
2536  LET X = B
# imprime cuadro en x,y
2538  GO SUB 8030
2540  LET T(D+1,B) = 0
2542  LET Y = D+1
2544  LET X = B
# imprime cuadro en x,y
2546  GO SUB 8030
2548  LET D = 0 : REM no continuar mas a la arriba
2550  GO TO 2580

# movemos a la arriba
2562  LET T(D,B) = T(D+1,B)
2564  LET Y = D
2566  LET X = B
# imprime cuadro en x,y
2568  GO SUB 8030
2570  LET T(D+1,B) = 0
2572  LET Y = D+1
2574  LET X = B
# imprime cuadro en x,y
2576  GO SUB 8030

2581 NEXT D
2599 RETURN

#####################################################################
# abajo vvvvvvvv
2601 PRINT #0; AT 1,0; "{BRIGHT 1}{e}{e}{e}{e}{e}{e}{e}{e}{BRIGHT 0}"
2602 FOR B=1 TO 4
2603  FOR A=3 TO 1 STEP -1
#      si esta vacia desplazamos
2604   IF T(A,B) <> 0 THEN GO SUB 2610
2605  NEXT A
2606 NEXT B
2607 GO TO 2100

# desplazamiento abajo
2615 FOR D=A+1 TO 4
#     si esta vacio movemos abajo
2620  IF T(D,B) = 0 THEN GO TO 2660

# comprobar si hay que sumar
2627  IF NOT (T(D,B) = T(D-1,B) AND D(D,B) = 0) THEN GO TO 2648
# marcamos como ya sumado
2630  LET D(D,B) = 1
2632  LET T(D,B) = T(D,B) * 2
2633  LET PUNTOS = PUNTOS + T(D,B)
# imprime puntos
2634  GO SUB 8000
2635  LET Y = D
2636  LET X = B
# imprime cuadro en x,y
2638  GO SUB 8030
2640  LET T(D-1,B) = 0
2642  LET Y = D-1
2644  LET X = B
# imprime cuadro en x,y
2646  GO SUB 8030
2648  LET D = 5 : REM no continuar mas abajo
2650  GO TO 2680

# movemos abajo
2662  LET T(D,B) = T(D-1,B)
2664  LET Y = D
2666  LET X = B
# imprime cuadro en x,y
2668  GO SUB 8030
2670  LET T(D-1,B) = 0
2672  LET Y = D-1
2674  LET X = B
# imprime cuadro en x,y
2676  GO SUB 8030

2681 NEXT D
2699 RETURN

#####################################################################
# imprimir puntos
8001 LET P$=STR$ PUNTOS
8002 LET T$=C$( TO 6-LEN P$) + P$
8003 PRINT AT 7,25; "{BRIGHT 1}{INK 7}{PAPER 4}";T$
8004 IF PUNTOS > MEJOR THEN LET MEJOR = PUNTOS : GO SUB 8010
8005 RETURN

#####################################################################
# imprimir mejor puntuacion
8011 LET P$=STR$ MEJOR
8012 LET T$=C$( TO 6-LEN P$) + P$
8013 PRINT AT 12,25; "{BRIGHT 1}{INK 7}{PAPER 4}";T$
8014 RETURN

#####################################################################
# imprime cuadro en x,y
8031 IF T(Y,X) <> 0 THEN GO TO 8034
8032 PRINT AT (Y-1)*6+2,(X-1)*6; "{BRIGHT 0}{INK 0}{PAPER 7}     "
8033 RETURN
8034 LET P$=STR$ T(Y,X)
8035 LET P=4-LEN P$
8036 PRINT AT (Y-1)*6+2,(X-1)*6+P; "{BRIGHT 0}{INK 0}{PAPER 7}";P$
8039 RETURN

#####################################################################
# genera un numero y lo anade al array
#
# Comprueba si el tablero esta lleno
8101 GO SUB 8200
# si el tablero esta lleno no anade mas numeros
8102 IF LLENO = 1 THEN RETURN
8104 PRINT #0; AT 1,0; "{BRIGHT 1}GENERANDO NUMERO...{BRIGHT 0}"
8105 BEEP .009,1
# genera coordenada X e Y
8106 LET X = INT(RND*4)+1
8107 LET Y = INT(RND*4)+1
# si el cuadro tiene valor volvemos a generar X e Y
8108 IF T(Y,X) <> 0 THEN GO TO 8105
# por defecto asignamos valor de 2
8110 LET V = 2
# para complicar un poco mas
# generamos un numero de 1 a 50
8111 LET T = INT(RND*50)+1
# si el numero es mayor o igual a 45 asignamos valor de 4
8112 IF T > 44 THEN LET V = 4
# asignamos el valor de 2 o 4 al cuadro generado
8120 LET T(Y,X) = V
# imprime cuadro en x,y
8125 GO SUB 8030
# Comprueba si el tablero esta lleno
8130 GO SUB 8200
8140 RETURN

#####################################################################
# Comprueba que el tablero si esta lleno
8210 FOR Y = 1 TO 4
8215  FOR X = 1 TO 4
8220   IF T(Y,X) = 0 THEN LET LLENO = 0: RETURN
8225  NEXT X
8230 NEXT Y
8235 LET LLENO = 1
8240 PRINT #0; AT 1,0; "{BRIGHT 1}TABLERO LLENO !!{BRIGHT 0}    "
8245 BEEP 1,0
8250 PAUSE 2

#####################################################################
# Comprueba si es fin de juego
#
# Comprobamos si hay posibilidad de combinacion vertical
8301 FOR X = 1 TO 4
8303  FOR Y = 1 TO 3
8305   IF T(Y,X) = T(Y+1,X) THEN RETURN
8307  NEXT Y
8309 NEXT X
# Comprobamos si hay posibilidad de combinacion horizontal
8311 FOR Y = 1 TO 4
8313  FOR X = 1 TO 3
8315   IF T(Y,X) = T(Y,X+1) THEN RETURN
8317  NEXT X
8319 NEXT Y
# tablero lleno y no hay posibilidad de jugadas
8390 LET FIN = 1
8391 PRINT #0; AT 1,0; "{BRIGHT 1}FIN JUEGO!!{BRIGHT 0}      "
8392 BEEP 1,0
8393 PAUSE 2
8395 RETURN

#####################################################################
# Pantalla fin de juego
8401 BORDER 1 : PAPER 1 : INK 7 : CLS
8402 PRINT AT 7,8; "{BRIGHT 1}{INK 1}{PAPER 3}{a}              {b}"
8403 PRINT AT 8,8; "{BRIGHT 1}{INK 7}{PAPER 3}  FIN DE JUEGO  "
8404 PRINT AT 9,8; "{BRIGHT 1}{INK 7}{PAPER 3}                "
8405 LET P$=STR$ PUNTOS
8406 LET T$=C$( TO 6-LEN P$) + P$
8407 PRINT AT 10,8; "{BRIGHT 1}{INK 7}{PAPER 3} PUNTOS  ";T$;" "
8408 PRINT AT 11,8; "{BRIGHT 1}{INK 7}{PAPER 3}                "
8409 IF PUNTOS >= MEJOR THEN GO TO 8414
8410 LET P$=STR$ MEJOR
8411 LET T$=C$( TO 6-LEN P$) + P$
8412 PRINT AT 12,8; "{BRIGHT 1}{INK 7}{PAPER 3} MEJOR   ";T$;" "
8413 GO TO 8415
8414 PRINT AT 12,8; "{BRIGHT 1}{INK 7}{PAPER 3}  NUEVO RECORD  "
8415 PRINT AT 13,8; "{BRIGHT 1}{INK 1}{PAPER 3}{c}              {d}"
8416 PRINT AT 19,5; "{BRIGHT 1}{INK 7}{PAPER 1}PULSA M PARA IR AL MENU"
8420 LET T$=INKEY$
# salta al menu
8421 IF T$="M" OR T$="m" THEN GO TO 1000
8422 GO TO 8420

#####################################################################
# Comprueba que si hemos obtenido 2048
8510 FOR Y = 1 TO 4
8515  FOR X = 1 TO 4
8520   IF T(Y,X) = 2048 THEN LET GANADO = 1: RETURN
8525  NEXT X
8530 NEXT Y
8540 RETURN

#####################################################################
# Pantalla fin de juego
8551 BORDER 1 : PAPER 1 : INK 7 : CLS
8552 PRINT AT 7,8; "{BRIGHT 1}{INK 1}{PAPER 3}{a}              {b}"
8553 PRINT AT 8,8; "{BRIGHT 1}{INK 7}{PAPER 3}  * GANASTE *   "
8554 PRINT AT 9,8; "{BRIGHT 1}{INK 7}{PAPER 3}                "
8555 GO TO 8405

#####################################################################
# datos de los UDG

# letra esquina redondeada arriba izquierda 
9505 DATA "a",255,240,192,192,128,128,128,128

# letra esquina redondeada arriba derecha
9510 DATA "b",255,15,3,3,1,1,1,1

# letra esquina redondeada abajo izquierda 
9515 DATA "c",128,128,128,128,192,192,240,255

# letra esquina redondeada abajo derecha
9520 DATA "d",1,1,1,1,3,3,15,255

# flechas abajo
9525 DATA "e",0,68,40,16,68,40,16,0

# flechas derecha
9530 DATA "f",0,0,72,36,18,36,72,0

# flechas arriba
9535 DATA "g",0,16,40,68,16,40,68,0

# flechas derecha
9540 DATA "h",0,0,18,36,72,36,18,0

# letra i tilde
9545 DATA "i",8,16,0,48,16,16,56,0

# letra egne
9550 DATA "n",120,0,120,68,68,68,68,0

Retro

Lugares

Redes

Sistemas

Varios