Tälläinen pieni parin illan koodausprojekti, 2048-puzzlepeli qb64:llä.
Tohon voisi lisätä score-systeemiä ja hiiriohjausta jne.
Ei ehkä kovin ammattimaisen näköistä koodia, mutta toimii.
_TITLE "2 0 4 8"
RANDOMIZE TIMER
SCREEN _NEWIMAGE(660, 660, 32)
rootpath$ = ENVIRON$("SYSTEMROOT") 'ladataan fontit
fontfile$ = rootpath$ + "\Fonts\arial.ttf"
f& = _LOADFONT(fontfile$, 60)
pf& = _LOADFONT(fontfile$, 20)
_PRINTMODE _KEEPBACKGROUND
DIM gridxy(4, 4)
DIM r(2048), g(2048), b(2048)
Alku:
voitto$ = "EI TOTTA"
rb = INT(RND * 55) + 20 'arvotaan taustav„rit
gb = INT(RND * 55) + 20
bb = INT(RND * 55) + 20
GOSUB Ruudukko
FOR y = 90 TO 570 'taustan sumennusefekti
FOR x = 90 TO 570
IF POINT(x, y) = _RGB(rb - 10, gb - 10, bb - 10) THEN PSET (x, y), _RGB(10, 10, 10) ELSE PSET (x, y), _RGB(20, 20, 20)
NEXT x
NEXT y
_FONT pf&
Teksti$ = "v.0.2.0": pituus = _PRINTWIDTH(Teksti$)
COLOR _RGB(200, 200, 200): _PRINTSTRING (570 - pituus, 91), Teksti$
_FONT f&
Teksti$ = "2 0 4 8": puolet = _PRINTWIDTH(Teksti$) / 2
COLOR _RGB(200, 200, 200): _PRINTSTRING (330 - puolet, 130), Teksti$
LINE (330 - puolet, 190)-(330 + puolet, 194), _RGB(200, 200, 200), BF
Teksti$ = "Play with wasd": puolet = _PRINTWIDTH(Teksti$) / 2
COLOR _RGB(200, 200, 200): _PRINTSTRING (330 - puolet, 270), Teksti$
Teksti$ = "or arrow keys.": puolet = _PRINTWIDTH(Teksti$) / 2
COLOR _RGB(200, 200, 200): _PRINTSTRING (330 - puolet, 330), Teksti$
Teksti$ = "Enter = Start": puolet = _PRINTWIDTH(Teksti$) / 2
tc = 0: suunta = 1
DO
tc = tc + suunta
IF tc = 155 THEN suunta = -1
IF tc = 0 THEN suunta = 1
COLOR _RGB(100 + tc, 100 + tc, 100 + tc): _PRINTSTRING (330 - puolet, 470), Teksti$ 'vilkkuvaa tekstia
_DELAY .001
ka$ = INKEY$
IF ka$ = CHR$(13) THEN EXIT DO
IF ka$ = CHR$(27) THEN GOTO Loppu
LOOP
GOSUB Ruudukko
GOSUB Varit
FOR z = 1 TO 2
GOSUB Arpa
NEXT z
DO
FOR x = 1 TO 4
FOR y = 1 TO 4
lukko$(x, y) = ""
NEXT y
NEXT x
DO
d$ = "5"
k$ = INKEY$
SELECT CASE k$
CASE CHR$(27): d$ = "0"
CASE CHR$(13): GOTO Alku
CASE CHR$(0) + "K", "a", "A", "4": d$ = "4"
CASE CHR$(0) + "M", "d", "D", "6": d$ = "6"
CASE CHR$(0) + "H", "w", "W", "8": d$ = "8"
CASE CHR$(0) + "P", "s", "S", "2": d$ = "2"
END SELECT
IF d$ <> "5" THEN EXIT DO
LOOP
SELECT CASE d$
CASE "0": EXIT DO
CASE "2": xp = 0: yp = -1: GOSUB Laskenta
CASE "8": xp = 0: yp = 1: GOSUB Laskenta
CASE "6": xp = -1: yp = 0: GOSUB Laskenta
CASE "4": xp = 1: yp = 0: GOSUB Laskenta
END SELECT
IF voitto$ = "TOTTA" THEN
FOR y = 280 TO 380 'taustan sumennusefekti
FOR x = 100 TO 560
IF POINT(x, y) = _RGB(rb - 10, gb - 10, bb - 10) THEN PSET (x, y), _RGB(10, 10, 25) ELSE PSET (x, y), _RGB(10, 10, 50)
NEXT x
NEXT y
tc = 0: suunta = 1
Teksti$ = "VICTORY!": puolet = _PRINTWIDTH(Teksti$) / 2
DO
tc = tc + suunta
IF tc = 155 THEN suunta = -1
IF tc = 0 THEN suunta = 1
COLOR _RGB(10, 10, 100 + tc)
_PRINTSTRING (330 - puolet, 305), Teksti$
_DELAY .001
kv$ = INKEY$
IF kv$ = CHR$(13) THEN GOTO Alku
IF kv$ = CHR$(27) THEN GOTO Loppu
LOOP
END IF
mahtuu = 0
FOR x = 1 TO 4
FOR y = 1 TO 4
IF gridxy(x, y) = 0 THEN mahtuu = 1
NEXT y
NEXT x
IF mahtuu = 1 AND siirto = 1 THEN
GOSUB Arpa 'arvotaan uuden palikan sijanti jos ruudukossa tilaa
ELSE
osuma = 0 'tarkistetaan voiko tehda siirtoja
FOR y = 1 TO 4
FOR x = 1 TO 3
IF gridxy(x, y) = gridxy(x + 1, y) THEN osuma = osuma + 1
NEXT x
NEXT y
FOR x = 1 TO 4
FOR y = 1 TO 3
IF gridxy(x, y) = gridxy(x, y + 1) THEN osuma = osuma + 1
NEXT y
NEXT x
IF osuma = 0 THEN 'game over
FOR y = 280 TO 380 'taustan sumennusefekti
FOR x = 100 TO 560
IF POINT(x, y) = _RGB(rb - 10, gb - 10, bb - 10) THEN PSET (x, y), _RGB(25, 10, 10) ELSE PSET (x, y), _RGB(50, 20, 20)
NEXT x
NEXT y
tc = 0: suunta = 1
Teksti$ = "GAME OVER": puolet = _PRINTWIDTH(Teksti$) / 2
DO
tc = tc + suunta
IF tc = 155 THEN suunta = -1
IF tc = 0 THEN suunta = 1
COLOR _RGB(100 + tc, 10, 10)
_PRINTSTRING (330 - puolet, 305), Teksti$
_DELAY .001
kg$ = INKEY$
IF kg$ = CHR$(13) THEN GOTO Alku
IF kg$ = CHR$(27) THEN GOTO Loppu
LOOP
END IF
END IF
LOOP
Loppu:
_FONT 16
_FREEFONT f&
_FREEFONT pf&
SYSTEM
Ruudukko:
CLS , _RGB(rb - 10, gb - 10, bb - 10)
FOR y = 1 TO 4
FOR x = 1 TO 4
LINE (x * 160 - 140, y * 160 - 140)-(x * 160, y * 160), _RGB(rb, gb, bb), BF
gridxy(x, y) = 0
NEXT x
NEXT y
RETURN
Varit: 'arvotaan palikoiden varit
c = 2
DO
r(c) = INT(RND * 75) + 1
g(c) = INT(RND * 75) + 1
b(c) = INT(RND * 75) + 1
IF c = 2048 THEN EXIT DO
c = c + c
LOOP
c = 2
RETURN
Arpa:
DO
x = INT(RND * 4) + 1
y = INT(RND * 4) + 1
IF gridxy(x, y) = 0 THEN EXIT DO
LOOP
t$ = "2"
gridxy(x, y) = 2
c = 2
GOSUB Animaatio
GOSUB Piirto
RETURN
Laskenta:
siirto = 0
FOR z = 1 TO 3
IF xp = 0 THEN
FOR x = 1 TO 4
IF yp = -1 THEN
FOR y = 4 TO 2 STEP -1
GOSUB Liikuta
NEXT y
ELSE
FOR y = 1 TO 3
GOSUB Liikuta
NEXT y
END IF
NEXT x
ELSE
FOR y = 1 TO 4
IF xp = -1 THEN
FOR x = 4 TO 2 STEP -1
GOSUB Liikuta
NEXT x
ELSE
FOR x = 1 TO 3
GOSUB Liikuta
NEXT x
END IF
NEXT y
END IF
NEXT z
RETURN
Liikuta:
IF gridxy(x, y) = 0 THEN
IF gridxy(x + xp, y + yp) <> 0 THEN
LINE ((x + xp) * 160 - 140, (y + yp) * 160 - 140)-((x + xp) * 160, (y + yp) * 160), _RGB(rb, gb, bb), BF
LINE (x * 160 - 140, y * 160 - 140)-(x * 160, y * 160), _RGB(r(c) + 125, g(c) + 125, b(c) + 125), BF
SWAP gridxy(x, y), gridxy(x + xp, y + yp)
c = gridxy(x, y)
t$ = LTRIM$(STR$(gridxy(x, y)))
GOSUB Piirto
siirto = 1
END IF
ELSE
IF gridxy(x, y) = gridxy(x + xp, y + yp) THEN
gridxy(x, y) = gridxy(x, y) * 2
c = gridxy(x, y)
IF c = 2048 THEN voitto$ = "TOTTA"
gridxy(x + xp, y + yp) = 0
LINE ((x + xp) * 160 - 140, (y + yp) * 160 - 140)-((x + xp) * 160, (y + yp) * 160), _RGB(rb, gb, bb), BF
t$ = LTRIM$(STR$(gridxy(x, y)))
GOSUB Animaatio2
GOSUB Piirto
siirto = 1
END IF
END IF
RETURN
Piirto: 'piirretaan palikka
LINE (x * 160 - 140, y * 160 - 140)-(x * 160, y * 160), _RGB(r(c) + 125, g(c) + 125, b(c) + 125), BF
COLOR _RGB(r(c) + 180, g(c) + 180, b(c) + 180)
l = _PRINTWIDTH(t$) / 2
h = _FONTHEIGHT / 2
_PRINTSTRING (x * 160 - 70 - l, y * 160 - 70 - h), t$
RETURN
Animaatio:
FOR a = 1 TO 70
LINE (x * 160 - 70 - a, y * 160 - 70 - a)-(x * 160 - 70 + a, y * 160 - 70 + a), _RGB(r(c) + 125, g(c) + 125, b(c) + 125), B
_DELAY .0001
NEXT a
RETURN
Animaatio2:
FOR a = 70 TO 1 STEP -1
LINE (x * 160 - 70 - a, y * 160 - 70 - a)-(x * 160 - 70 + a, y * 160 - 70 + a), _RGB(r(c) + 125, g(c) + 125, b(c) + 125), B
_DELAY .0001
NEXT a
RETURNAihe on jo aika vanha, joten et voi enää vastata siihen.