Kirjautuminen

Haku

Tehtävät

Keskustelu: Koodit: QB: Space Invanders

Chaosworm [04.03.2007 17:23:29]

#

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
'*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*

tsuriga [06.03.2007 12:07:02]

#

Space Invaders.

Chaosworm [11.03.2007 15:08:01]

#

Ihan sama.

Vastaus

Aihe on jo aika vanha, joten et voi enää vastata siihen.

Tietoa sivustosta