Kirjoittaja: Antti Laaksonen
Kirjoitettu: 23.02.2002 – 22.11.2011
Tagit: pelinteko, koodi näytille, peli, vinkki
Hetken mielijohteesta päätin tehdä yksinkertaisen QBasic-tetriksen. Grafiikka on ASCII:ta ja bugeistakaan ei ole pulaa, joten paranneltavaa riittää. Siitä huolimatta pelistä käynee ilmi tetriksen tekemisen perusasiat.
'QBasic-Tetris ' 'Parissa tunnissa koodattu alkeellinen tetris, jota voi käyttää 'oman pelin pohjana. Tekijä Antti Laaksonen OPTION BASE 1 'taulukot alkavat 1:stä 0:n sijasta CONST LEVEYS = 10 'kentän leveys CONST KORKEUS = 18 'kentän korkeus CONST PALIKAT = 6 'kuinka monta erilaista palikkaa on TYPE arpa x AS INTEGER y AS INTEGER END TYPE TYPE lpalikka muoto AS INTEGER x AS INTEGER y AS INTEGER suunta AS INTEGER END TYPE DIM kentta(LEVEYS + 1, KORKEUS + 1) DIM palikka(PALIKAT, 4, 4, 4) AS INTEGER DIM npalikka AS lpalikka 'palikoiden lukeminen ja suuntien laskeminen FOR i = 1 TO PALIKAT FOR j = 1 TO 4 FOR k = 1 TO 4 READ palikka(i, 1, j, k) NEXT NEXT FOR k = 2 TO 4 FOR j = 1 TO 4 palikka(i, k, 1, j) = palikka(i, k - 1, j, 4) palikka(i, k, 2, j) = palikka(i, k - 1, j, 3) palikka(i, k, 3, j) = palikka(i, k - 1, j, 2) palikka(i, k, 4, j) = palikka(i, k - 1, j, 1) NEXT NEXT NEXT SCREEN 13 LINE (0, 0)-(320, 200), 8, BF COLOR 15 'kehysten piirtäminen LOCATE 1, 1 PRINT "╔"; FOR i = 1 TO LEVEYS PRINT "═"; NEXT PRINT "╗" FOR i = 2 TO KORKEUS + 1 PRINT "║"; LOCATE i, 12 PRINT "║" NEXT PRINT "╚"; FOR i = 1 TO LEVEYS PRINT "═"; NEXT PRINT "╝" uusipala = 1 RANDOMIZE TIMER DO IF uusipala = 1 THEN 'arpoo uuden palan ja kiinnittää vanhan näyttöön IF npalikka.y = 2 THEN GOSUB gameover IF npalikka.muoto <> 0 THEN FOR i = 1 TO 4 FOR j = 1 TO 4 IF palikka(npalikka.muoto, npalikka.suunta, i, j) = 1 THEN kentta(npalikka.x + i - 2, npalikka.y + j - 2) = npalikka.muoto END IF NEXT NEXT END IF npalikka.muoto = INT(RND * 6) + 1 npalikka.x = 5 npalikka.y = 1 npalikka.suunta = 1 uusipala = 0 END IF IF npalikka.y < KORKEUS - 1 THEN npalikka.y = npalikka.y + 1 GOSUB paivita GOSUB tarkistapoisto a = TIMER DO IF TIMER - a > .5 THEN EXIT DO 'hidaste: mitä pienempi sen nopeampi 'näppäimistökäsittely: tässä riittää runsaasti parantelemista, 'sillä koodi ei tarkista, menevätkö siirretyt/käännetyt 'palikat toisten päälle SELECT CASE INKEY$ CASE CHR$(0) + "K" IF npalikka.x > 1 THEN npalikka.x = npalikka.x - 1 CASE CHR$(0) + "M" IF npalikka.x < LEVEYS - 1 THEN npalikka.x = npalikka.x + 1 CASE CHR$(0) + "P" npalikka.y = npalikka.y + 1 CASE CHR$(0) + "H" npalikka.suunta = npalikka.suunta + 1 IF npalikka.suunta = 5 THEN npalikka.suunta = 1 CASE "G", "g" GOSUB gameover CASE CHR$(27) END END SELECT LOOP LOOP paivita: 'päivittää kentän, piirtää ensin pohjan 'ja sitten liikutettavan palikan FOR i = 1 TO LEVEYS FOR j = 1 TO KORKEUS COLOR kentta(i, j) LOCATE j + 1, i + 1: PRINT "█" NEXT NEXT FOR i = 1 TO 4 FOR j = 1 TO 4 IF palikka(npalikka.muoto, npalikka.suunta, i, j) = 1 THEN LOCATE npalikka.y - 1 + j, npalikka.x - 1 + i COLOR npalikka.muoto PRINT "█" IF kentta(npalikka.x + i - 1 - 1, npalikka.y + j - 1) <> 0 THEN uusipala = 1 'LOCATE 1, 20: PRINT : SLEEP IF npalikka.y + j > KORKEUS + 1 THEN uusipala = 1 END IF NEXT NEXT RETURN tarkistapoisto: 'tarkistaa, onko kentällä poistettavia rivejä, ja jos on, 'poistaa ne FOR i = 1 TO KORKEUS joo = 1 FOR j = 1 TO LEVEYS IF kentta(j, i) = 0 THEN joo = 0 NEXT IF joo = 1 THEN FOR j = i TO 2 STEP -1 FOR k = 1 TO LEVEYS kentta(k, j) = kentta(k, j - 1) NEXT NEXT END IF NEXT RETURN gameover: 'tämä löytyy kommenttien kera Ohjelmointiputkasta 'nimellä Neliöpiirtoefekti RANDOMIZE TIMER DIM arv(80 * 2, 50 * 2) AS arpa FOR i = 1 TO 50 * 2 FOR j = 1 TO 80 * 2 arv(j, i).x = j arv(j, i).y = i NEXT NEXT FOR i = 1 TO 50 * 80 * 8 SWAP arv(INT(RND * 80 * 2) + 1, INT(RND * 50 * 2) + 1), arv(INT(RND * 80 * 2) + 1, INT(RND * 50 * 2) + 1) NEXT DEF SEG = &HA000 FOR k = 1 TO 200 STEP 2 FOR h = 1 TO 319 STEP 2 ix = arv(h \ 2 + 1, k \ 2 + 1).x * 2 - 1 iy = arv(h \ 2 + 1, k \ 2 + 1).y * 2 - 1 GOSUB piirrapiste NEXT NEXT DEF SEG CLS COLOR 4 PRINT "G A M E O V E R " COLOR 15 PRINT PRINT "Tämän pelin ja kymmeniä muita QBasic- koodivinkkejä löydät Ohjelmointiputkastaosoitteesta:" PRINT COLOR 9 PRINT "https://www.ohjelmointiputka.net" END RETURN piirrapiste: FOR j = ix TO ix + 1 FOR i = iy TO iy + 1 t$ = CHR$(0) POKE j + (i * 320), ASC(t$) NEXT NEXT RETURN 'tässä ovat pelin käyttämät palikat 'niiden muuttaminen lienee yksinkertaista DATA 0,0,0,0 DATA 0,1,1,0 DATA 0,1,1,0 DATA 0,0,0,0 DATA 0,0,0,0 DATA 0,0,0,0 DATA 1,1,1,1 DATA 0,0,0,0 DATA 0,0,0,0 DATA 1,1,0,0 DATA 0,1,1,0 DATA 0,0,0,0 DATA 0,0,0,0 DATA 0,0,1,1 DATA 0,1,1,0 DATA 0,0,0,0 DATA 0,0,0,0 DATA 0,1,1,1 DATA 0,0,1,0 DATA 0,0,0,0 DATA 0,0,0,0 DATA 0,1,1,1 DATA 0,1,0,0 DATA 0,0,0,0 DATA 0,0,0,0 DATA 1,1,1,0 DATA 0,0,1,0 DATA 0,0,0,0
Eipä ole ihmeellinen!
yhdessä illassa väännetyksi aika helvetillisen hyvä ;)
tosin tökkii ja pökkii ja bugaa mutta se kai kuuluu asiaan ;)
Tosiaan, parissa tunnissa koodatuksi loistavaa työtä, mikäpä ohjelma ei bugittaisi. Oman Delphi-Tetrikseni koodaamiseen meni sentään kolme päivää ;-)
hieno
Aika hienoo koodia vaikka on parissa tunnissa jo koodattu en voi sanoa muuta kuin että osaat hyvin qbasic kieltä nyt myönnän että olen itse paljon huonompi koodaa qbasicilla kuin sä mutta en koodaa niin paljoo qbasicilla varmaan kuin sä kuin kato koodaan visualbasicilla.
Aika paljon bugittaa mutta sehän on ymmärrettävää.
hieno
EDIT:vaikka bugaakin
Kun yritän pudottaa palikkaa nopeammin alaspäin, peli kaatuu kun palikka on alhaalla.
Hmm... Eipä kovin kummoinen, mutta pitää silti kehua, noin lyhyessä ajassa tehty! Tasoja voisi laittaa lisää, ja High-scorekin olisi hyvä. Mutta sitten se olisikin jo hyvä, jos ei ota huomioon bugia, joka laittaa pelin kaatumaan kun pudottaa palikkaa nopeammin alas.
Hieno. Bugien kanssa pitää osata vaan pelata (täyä).