QBasicilla tehty Space Invanders, oma suomennokseni Avaruusmönkijöiden Hyökkäys. Kaikki varmaankin tuntevat tuon klassikkopelin, mutta selitetään sen yksinkertainen idea joka tapauksessa. Eli pelaaja on tykki, ja ylhäällä on avaruusmönkijöitä. Mönkijät pommittavat ja lähestyvät jatkuvasti. Jos mönkijän pommi osuu tykkiin, pelaaja menettää yhden elämän. Ja jos mönkijät pääsevät liian lähelle tykkiä, koko peli loppuu. Versio on lähes kokonaan bugikorjattu, mutta joitakin bugeja jäi vielä. Jos saan joskus täysin bugivapaan version rakennettua exe-tiedostoksi, se on ladattavissa osoitteessa:
www.freewebs.com/chaosmakergames/
'*** MONKIJAT.BAS
'*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*
'I www.freewebs.com/chaosmakergames I
'* www.ohjelmointiputka.net *
'I Koodin suunnittelija: Petri Kokko I
'* Bugikorjaus: Chaosworm *
'I Grafiikka: Chaosworm I
'* Koodaaja: Chaosworm *
'I Žäniefektit: Chaosworm I
'* Bugikorjatun version julkaisija: Chaosmaker Games 2007 *
'I Koodia saa käyttää vapaasti ja levittää vapaasti I
'*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*
SCREEN 12 'Asetetaan näyttötila sopivaksi
leveys = 75 'Kentän leveys on 75 (isoin mahdollinen)
korkeus = 20 'Kentän korkeus on 20 (aika hyvä näin)
maxmonkijoita = 26 'mönkijöitä voi olla maksimissaan 26
maxammuksia = 10 'ammuksia voi olla ruudulla kerallaan 10
maxpommeja = 50 'pommeja voi olla ruudulla kerrallaan 50
tykkeja = 3 'kolme elämää alussa
uusitykki = 5000 'uusi elämä 5k pisteen välein
monkija$ = "<o>" 'mönkijä on ton näkönen
tykki$ = "olo" 'tykki on tollanen
Rajahdys$ = "#" 'räjähdykseen printataan risuaita
ammus$ = "*" 'ja ammus näyttää tähdeltä
pommi$ = "%" 'pommi on tollane.
tyhja$ = " " 'tyhjä on tollane
vasemmalle$ = CHR$(0) + "K" 'ja vasemmalle mennään vasemmasta nuolesta
oikealle$ = CHR$(0) + "M" 'oikeelle oikeesta nuolesta
Ammu$ = " " 'Space ampuu
Lopeta$ = CHR$(27)
hidastus = 550000 'Hidastetaan peliä. Mitä pienempi, sen vaikeampi peli.
'DIMit on sellasia jänniä
'en oikeestaan tiiä että mitä ne tekee, mutta
'tiiän että niitä pitää laittaa
DIM mx(maxmonkijoita)
DIM my(maxmonkijoita)
DIM ax(maxammuksia)
DIM ay(maxammuksia)
DIM px(maxpommeja)
DIM py(maxpommeja)
WHILE 1 'Pääohjelma
GOSUB Alkuruutu 'GOSUBeja ei liene tarpeellista
WHILE tykkeja > 0 'kommentoida.
GOSUB AsetaMuodostelma
WHILE tykkeja > 0 AND monkijoita > 0
GOSUB SiirraMonkijoita
GOSUB SiirraPommeja
GOSUB SiirraTykkia
GOSUB SiirraAmmuksia
GOSUB TilanneTiedotus
FOR i = 1 TO hidastus
NEXT i
WEND
WEND
WEND
END
Alkuruutu:
CLS 'Puhdistetaan näyttö kaikesta vanhasta sonnasta
COLOR 15 'Väri valkoseks
LOCATE 5, 10
PRINT "Avaruusmönkijöiden hyökkäys!"
LOCATE 7, 10
PRINT "Tuhoa inhat avaruusmönkijät ennen kuin ne ";
PRINT "tuhoavat sinut."
LOCATE 8, 10
PRINT "Onnea vaaralliseen tehtävään!"
LOCATE 9, 10
PRINT "Tykki:";
COLOR 2 'Väri vihreeks että saadaan tykin värinen tykki
PRINT tykki$ 'printataan tykki
COLOR 15 'ja väri takas valkoseks
LOCATE 10, 10
PRINT "Mönkijä:";
COLOR 9 'väri siniseks että saadaan mönkijän värinen mänkijä
PRINT monkija$ 'printataan mönkijä
COLOR 15 'Ja väri valkoseks
LOCATE 13, 10
PRINT "Uusi tykki(elämä) "; uusitykki; " pisteen välein"
LOCATE 16, 10
PRINT "Vasemmalle: <- Oikealle: -> "
LOCATE 17, 10
PRINT "Ammu: Space"
a$ = "" '_ niin kauan
WHILE a$ = "" ' l kunnekka
a$ = INKEY$ ' l painetaa jotai
WEND '_l niin pysytään tässä kohdassa
RETURN 'ja mennään takasin pääohjelmaan
AsetaMuodostelma:
monkijoita = maxmonkijoita 'mönkijöitä on niin paljon kun niitä voi olla.
taso = taso + 1 'asetetaan leveli kohdalleen
ammuksia = 0 'ammuksia ja pommeja on nolla
pommeja = 0
tx = INT(leveys / 2) 'tykki sijaitsee leveyden puolessa välissä
CLS 'tyhjennetään ruutu
mx(1) = 1 'ja yhen mönkijän sijaintiX
my(1) = 1 'ja saman mönkijän sijaintiY
FOR i = 2 TO monkijoita '_ja sitte tungetaan niitä mönkijöitä sinne
mx(i) = mx(i - 1) + 4 ' l
my(i) = my(i - 1) '_l
IF (mx(i) > leveys) THEN ' ja jos mönkijä meinaa mennä ruudusta ulos ni
mx(i) = 1 'sitten laitetaan rivin alkuun
my(i) = my(i) + 1 'ja toiselle riville se mönkijä.
END IF 'lopetetaan if
NEXT i 'tekee niitä mönkijöitä lisää kai
LOCATE korkeus, tx 'jaa sitten laitetaan tykki paikalleen
COLOR 2 'vihreänä
PRINT tykki$ 'ja printataan se
COLOR 15 'ja väri valkoseks
RETURN
TilanneTiedotus:
LOCATE 22, 1
FOR i = 1 TO tykkeja '\ tähän kohtaan tulee hieno elämätaulukko
PRINT tykki$; " "; ' >
NEXT i '/
PRINT tyhja$;
PRINT tyhja$; 'kumitetaan
PRINT tyhja$
LOCATE 23, 1
PRINT "Taso:"; taso; " Pisteet"; pisteet; " " 'ja levelit ja pisteetkin näytetään
RETURN
SiirraMonkijoita: 'Tää on kiva juttu
FOR i = 1 TO monkijoita 'laitetaan siis jotain mönkijöitä sinne
LOCATE my(i), mx(i) + 2 '\
PRINT tyhja$ ' l
LOCATE my(i), mx(i) + 1 ' > Laitetaan mönkijän tilalle tyhjää
PRINT tyhja$ ' l
LOCATE my(i), mx(i) ' l
PRINT tyhja$ '/
mx(i) = mx(i) + 1 'siirretään mönkijää
IF mx(i) > leveys THEN 'ja jos se menee ulos ruudusta niin laitetaan
mx(i) = 1 'se rivin alkuun
my(i) = my(i) + 1 'ja seuraavalle riville
END IF 'lopetetaan if
IF my(i) > korkeus THEN END 'ja jos yksikään mönkijä tulee liian lähelle, niin peli loppuu
LOCATE my(i), mx(i) 'ja otetaan mönkijän uusi sijainti
COLOR 9 'ja sinisenä
PRINT monkija$ 'piirrämme mönkijän skriinille hillumaan
COLOR 15 'ja väri vaihtuu valkoiseksi
IF RND * 100 < taso THEN GOSUB Pommita 'ja mönkijä pommittaa välillä, riippuen levelistä
NEXT i 'ja tehdään taas se next i
RETURN 'ja palataan pääohjelmaan
SiirraTykkia:
a$ = INKEY$ 'a$ on näppäimen painallus
IF a$ <> "" THEN 'jos a$ on jotakin niiiiiin
LOCATE korkeus, tx 'kaiken varalta tehään tyhjää sinne
PRINT " " 'sen tykin tilalle
LOCATE korkeus, tx + 2
PRINT " "
IF a$ = vasemmalle$ THEN tx = tx - 1 'ja jos painetaan menemään vasemmalle, niin tykki tottelee kiltisti
IF a$ = oikealle$ THEN tx = tx + 1 'oikealle, samahomma
IF a$ = Ammu$ THEN GOSUB Ammu 'jos painetaan ampumisnämiskää, niin ammutaan
IF a$ = Lopeta$ THEN END 'jos painetaan poistumista ni lopetetaan
IF tx > leveys THEN tx = leveys 'ja jos tykin sijainti on suurempi kuin leveys, se on leveys
IF tx < 1 THEN tx = 1 'ja jos tykin sijainti on pienempi kuin yksi, niin se on yksi
LOCATE korkeus, tx 'ja tykin paikalle
COLOR 2 'heitetään sininen
PRINT tykki$ 'tykki
COLOR 15 'ja vaihdetaan väri valkoiseksi
END IF 'lopetetaan if
RETURN 'palataan pääohjelmaan
SiirraAmmuksia:
FOR i = 1 TO ammuksia 'tää kohta toimii kuin mönkijöiden siirrossa
LOCATE ay(i), ax(i)
PRINT tyhja$
ay(i) = ay(i) - 1
IF ay(i) < 1 THEN
ax(i) = ax(ammuksia)
ay(i) = ay(ammuksia)
ammuksia = ammuksia - 1
END IF 'tähän asti
FOR j = 1 TO monkijoita
IF ay(i) = my(i) AND ax(i) >= mx(j) AND ax(i) <= mx(j) + 2 THEN 'jos se osuu mönkijään niin
x = mx(j) 'x on mönkijän sijainti
y = my(j) 'y on mönkijän sijainti
GOSUB Rajahdys 'mennään räjäytykseen
pisteet = pisteet + 10 'morescore
IF pisteet / uusitykki = INT(pisteet / uusitykki) THEN 'ja jos pisteet ylittää uuden elmään rajat niin saa uuden elämän
tykki = tykki + 1 'lisätään se elämä
END IF 'lopetetaan if
mx(j) = mx(monkijoita) 'hmm...
my(j) = my(monkijoita) 'se on siis se yks tietty mönkijä
monkijoita = monkijoita - 1 'ja poistetaan se mönkijä
ax(i) = ax(ammuksia) 'jaa ja nää sitte on että se on
ay(i) = ay(ammuksia) 'se tietty ammus joka
ammuksia = ammuksia - 1 'poistetaan
END IF 'lopetetaan if
NEXT j
IF i <= ammuksia THEN 'jos i on suurempi kun ammuksien määrä,
LOCATE ay(i), ax(i) 'niin sinne heitetään se ammus
COLOR 14 'keltasena
PRINT ammus$ 'nyt
COLOR 15 'ja väri valkoseks
END IF
NEXT i
RETURN
SiirraPommeja: 'sama juttu kuin äsköses
FOR i = 1 TO pommeja 'juu, kyllä, IHAN kokonaan sama
LOCATE py(i), px(i)
PRINT " "
py(i) = py(i) + 1
IF py(i) = korkeus AND px(i) >= tx AND px(i) <= tx + 2 THEN
x = tx
y = korkeus
GOSUB Rajahdys
tykkeja = tykkeja - 1
LOCATE korkeus, tx
PRINT tykki$
IF tykkeja < 1 THEN GOTO Lopetus
END IF
IF py(i) > korkeus THEN
px(i) = px(pommeja)
py(i) = py(pommeja)
pommeja = pommeja - 1
END IF
IF i <= pommeja THEN
LOCATE py(i), px(i)
COLOR 14
PRINT pommi$
COLOR 15
END IF
NEXT i
RETURN
Ammu:
IF ammuksia < maxammuksia THEN 'jos ammuksia mahtuu vielä niin
ammuksia = ammuksia + 1 'tulee yksi lisää
SOUND 300, 1
SOUND 298, 1 'hienoja ääniefektejä
SOUND 295, 1
ax(ammuksia) = tx + 1 'ja se sijaitsee tykin yläpuolella
ay(ammuksia) = korkeus - 1
END IF
RETURN
Pommita:
IF pommeja < maxpommeja THEN 'jos pommeja mahtuu vielä, niin
pommeja = pommeja + 1 'tulee yksi lisää
SOUND 100, 1
SOUND 98, 1
SOUND 96, 1
px(pommeja) = mx(i) + 1 'ja se sijaitsee mönkihän alapuolella
py(pommeja) = my(i) + 1
END IF
RETURN
Rajahdys:
LOCATE y, x 'kohteen sijainti
COLOR 4 'punainen räjähdys
PRINT Rajahdys$ 'ja printataan se
SOUND 50, 1
SOUND 900, 1 'näitä mahtavia piipperiääniä taas
SOUND 400, 1
COLOR 15 'ja väri takaisin valkoiseksi
FOR k = 1 TO hidastus * 10 'ja hidastusta laitetaan lisää että
NEXT k 'peli pysähtyy hetkeksi
LOCATE y, x + 1 'ja printataan sitten
PRINT tyhja$ 'kohteen päälle tyhjäää
LOCATE y, x + 2
PRINT tyhja$
LOCATE y, x
PRINT tyhja$
RETURN 'palataan kohtaan, josta tänne tultiin
Lopetus:
CLS
COLOR 4
LOCATE 3, 10
PRINT "MAAPALLO TUHOUTUI!"
LOCATE 5, 10
PRINT "Et saanut mönkijöitä pysäytettyä."
LOCATE 6, 10
PRINT "Parempi onni ensi keralla."
SLEEP
'*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*
'www.freewebs.com/chaosmakergames
'www.ohjelmointiputka.net
'Koodin suunnittelija: Petri Kokko
'Bugikorjaus: Chaosworm
'Grafiikanmuuntelu: Chaosworm
'Koodaaja: Chaosworm
'Žäniefektit: Chaosworm
'Bugikorjatun version julkaisija: Chaosmaker Games 2007
'Koodia saa käyttää vapaasti ja levittää vapaasti
'*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*Space Invaders.
Ihan sama.
Aihe on jo aika vanha, joten et voi enää vastata siihen.