Kirjoittaja: ZcMander
Kirjoitettu: 10.12.2009 – 06.12.2011
Tagit: pelinteko, koodi näytille, peli, vinkki
Päätin jakaa nopeasti kyhäämäni version matopelistä. Koodin pitäisi olla suhteellisen hyvin kommentoitu, mutta jos jokin askarruttaa, niin kysykää kommenteissa.
Const TILE_LEVEYS = 12 ' Yhden tilen leveys pikseleinä
Const TILE_KORKEUS = 12 ' Yhden tilen korkeus pikseleinä
Const KENTTA_LEVEYS = 24 ' Kentän leveys tileinä
Const KENTTA_KORKEUS = 24 ' Kentän korkeus tileinä
Const VALI = 1 ' Monta pikseliä tile:jen välissä on väliä
Const MATO_MAX_PITUUS = 60 ' Madon maksimipituus
Const MATO_ALOITUS_PITUUS = 3 ' Madon aloituspituus
Global havisit As Integer ' Kertoo onko hävitty, 0 = ei ole hävitty
' 1 = osuit seinään, 2 = osuttiin matoon
Global kasvataMatoa As Byte ' Lippu jos halutaan matoa kasvattaa
Dim matoSuunta (2) ' Suunta mihin mato liikkuu
Dim mato (MATO_MAX_PITUUS, 3) ' Taulukko johon mato tallenetaan
Dim kentta (KENTTA_LEVEYS, KENTTA_KORKEUS) ' Kenttä, jos 1 = seinä
Dim namu (2) ' Kertoo namun sijainin
' Piirtää Tilen ruudulle
Function PiirraTILE(x, y, r, g, b)
Dim pixX As Integer
Dim pixY As Integer
' Lasketaan laatikon paikka
pixX = x*TILE_LEVEYS + x*VALI
pixY = y*TILE_KORKEUS + y*VALI
' Asetetaan väri ja piirretään laatikko haluttuun paikkaan
Color r, g, b
Box pixX, pixY, TILE_LEVEYS, TILE_KORKEUS
EndFunction
' Alustaa kentän ja lisää siihen reunat
Function AlustaKentta ()
Dim x As Integer
Dim y As Integer
For x = 0 To KENTTA_LEVEYS
For y = 0 To KENTTA_KORKEUS
kentta (x,y) = 0 ' Oletuksena ei ole seinää
' Luo väliseinän
If x = 5 And y < KENTTA_KORKEUS - 5 And y > 5 Then
kentta (x,y) = 1
EndIf
' Luo ruudulle reunat
If x = 0 Or x = KENTTA_LEVEYS Then
kentta (x,y) = 1
EndIf
If y = 0 Or y = KENTTA_KORKEUS Then
kentta (x,y) = 1
EndIf
Next y
Next x
EndFunction
' Piirtää kentän
Function PiirraKentta ()
Dim x As Integer
Dim y As Integer
For x = 0 To KENTTA_LEVEYS
For y = 0 To KENTTA_KORKEUS
' Piirretään vain jos kyseessä on seinä
If kentta (x, y) = 1 Then
PiirraTILE(x,y,255,255,255)
EndIf
Next y
Next x
EndFunction
Function AlustaMato ()
Dim i As Integer
Dim y As Integer
Dim aloitusX As Integer
Dim aloitusY As Integer
' Aloitus paikka
aloitusX = 12
aloitusY = 12
' Alustetaan matoon liittyvät muuttujat
matoSuunta(0) = 0
matoSuunta(1) = -1
kasvataMatoa = 0
' Alustetaan mato
For i = 0 To MATO_MAX_PITUUS
If i < MATO_ALOITUS_PITUUS
mato(i, 0) = aloitusX
mato(i, 1) = aloitusY + i
mato(i, 2) = 1
Else
mato(i, 2) = 0
EndIf
Next i
EndFunction
' Piirtää madon ruudulle
Function PiirraMato()
Dim i As Integer
Dim x As Integer
Dim y As Integer
' Käy kaikki madon osat läpi ja piirtää ruudulle
For i = 1 To MATO_MAX_PITUUS
If mato(i, 2) = 1
x = mato(i, 0)
y = mato(i, 1)
PiirraTILE(x,y,0,255,0)
EndIf
Next i
PiirraTILE(mato(0,0),mato(0,1),0,150,0)
EndFunction
Function LiikutaMato()
Dim i As Integer
Dim loyty As Byte
Dim vanha (2)
' Tarkistetaan törmääkö madon seuraava paikka kenttään
If kentta(mato(0,0) + matoSuunta(0), mato(0,1) + matoSuunta(1)) = 1 Then
havisit = 1
Return 0
EndIf
' Pään vanha sijainti talteen
vanha(0) = mato(0, 0)
vanha(1) = mato(0, 1)
' Siirretään päätä madon suuntaan päin
mato(0, 0) = mato(0,0) + matoSuunta(0)
mato(0, 1) = mato(0,1) + matoSuunta(1)
' Kun kasvatetaan matoa, varmistetaan ettei kasvateta kuin 1 kerrallaan
loyty = 0
' Liikutetaan muitakin osia, ja lisätään perään yks lisää jos tarvii
For i = 1 To MATO_MAX_PITUUS
' Vaihdetaan nykyisen madon pätkän paikkaa edellisen paikkaan ja
' laitetaan nykyinen paikka talteen
If mato(i, 2) = 1 Then
Dim uusVanha (2)
uusVanha(0) = mato(i, 0)
uusVanha(1) = mato(i, 1)
mato(i, 0) = vanha(0)
mato(i, 1) = vanha(1)
vanha(0) = uusVanha(0)
vanha(1) = uusVanha(1)
' Madon kasvatus
ElseIf kasvataMatoa = 1 And loyty = 0 Then
loyty = 1
kasvataMatoa = 0
mato(i, 2) = 1
mato(i, 0) = vanha(0)
mato(i, 1) = vanha(1)
EndIf
Next i
' Tarkitetaan törmääkö mato itseensä
For i = 1 To MATO_MAX_PITUUS
If mato(i, 2) = 1 And mato(i, 0) = mato(0,0) And mato(i, 1) = mato(0,1) Then
havisit = 2
EndIf
Next i
' Tarkistetaan osuuko mato namuun
If mato(0, 0) = namu(0) And mato(0, 1) = namu(1) Then
KasvataMato()
ArvoNamu()
EndIf
EndFunction
' Asettaa lipun, että seuraavalla päivityksella kasvatetaan matoa
Function KasvataMato()
kasvataMatoa = 1
EndFunction
' Arpoo namille paikan
Function ArvoNamu()
Dim i As Integer
Dim x As Integer
Dim y As Integer
Dim eiLoytyny As Byte
' Arvotaan paikkaa niin kauan kunnes löytyy paikkaa joka ei ole varattu
eiLoytyny = 1
While eiLoytyny = 1
x = Rand(0, KENTTA_LEVEYS)
y = Rand(0, KENTTA_KORKEUS)
eiLoytyny = 0
' Tarkistetaan meneekö kartan kanssa päälle
If kentta(x,y) = 1 Then
eiLoytyny = 1
EndIf
' Tarkistetaan ettei mennyt madon päälle
For i = 0 To MATO_MAX_PITUUS
If mato(i, 2) = 1 And mato(i, 0) = x And mato(i, 1) Then
eiLoytyny = 1
EndIf
Next i
Wend
namu(0) = x
namu(1) = y
EndFunction
' Piirtää namun ruudulle
Function PiirraNamu()
PiirraTILE(namu(0),namu(1),255,0,0)
EndFunction
' Pääohjelma
Function Main()
Dim peliPaalla As Byte
Dim paivitysAika As Integer
Dim seuraavaSuunta (2)
' Alustaa satunnaislukugeneraattorin
Randomize(Timer())
' Asetaan otsikko
SetWindow "CBMatopeli"
' Asettaa ikkunan koon vastaamaan kentän kokoa
SCREEN TILE_LEVEYS*KENTTA_LEVEYS + VALI*KENTTA_LEVEYS + TILE_LEVEYS, TILE_KORKEUS*KENTTA_KORKEUS + VALI*KENTTA_KORKEUS + TILE_KORKEUS
' Alustetaan osat
AlustaKentta()
AlustaMato()
ArvoNamu()
' Säätö, että liikkumisen tarkistus toimii
seuraavaSuunta(0) = matoSuunta(0)
seuraavaSuunta(1) = matoSuunta(1)
havisit = 0 ' Ei vielä ole hävitty
peliPaalla = True ' Poistutaanko ohjelmasta
paivitysAika = Timer() ' Päivitykseen
While peliPaalla
' Suljetaan jos painetaan esc
If KeyDown(1) = True
peliPaalla = False
EndIf
' Tarkistetaan että käännytään (ettei mennä taaksepäin)
If matoSuunta(0) = 0 Then
If LeftKey() Then
seuraavaSuunta(0) = -1
seuraavaSuunta(1) = 0
EndIf
If RightKey() Then
seuraavaSuunta(0) = 1
seuraavaSuunta(1) = 0
EndIf
Else
If UpKey() Then
seuraavaSuunta(0) = 0
seuraavaSuunta(1) = -1
EndIf
If DownKey() Then
seuraavaSuunta(0) = 0
seuraavaSuunta(1) = 1
EndIf
EndIf
' Madon kasvatus DEBUG
'If KeyDown(44) Then
' KasvataMato()
'EndIf
' Päivitys 100ms välein
If Timer() > paivitysAika+100 And havisit = 0 Then
matoSuunta(0) = seuraavaSuunta(0)
matoSuunta(1) = seuraavaSuunta(1)
LiikutaMato()
paivitysAika = Timer()
EndIf
' Jos hävittiin asetetaan otsikko sen mukaseksi
If havisit = 1 Then
SetWindow "CBMatopeli - Osuit seinään!"
ElseIf havisit = 2 Then
SetWindow "CBMatopeli - Söit itsesi!"
EndIf
' Piirretään tausta
Color 50,50,50
Box 0,0, TILE_LEVEYS*KENTTA_LEVEYS + VALI*KENTTA_LEVEYS, TILE_KORKEUS*KENTTA_KORKEUS + VALI*KENTTA_KORKEUS
' Piirretään loput
PiirraKentta()
PiirraNamu()
PiirraMato()
DrawScreen
Wend
EndFunction
' Kutsutaan pääfunktiota
Main()Hyvä koodi. Kommenttien puutteesta ei voi valittaa (siis koodissa). Tähän voisi kyllä lisätä silleen, että kun on hävinnyt, voi aloittaa uudelleen käynnistämättä peliä uudelleen.
Jätettäköön se kotitehtäväksi, sillä se kuitenki olisi todella helppo lisäys koodiin.
Tossahan vois käyttää melkein vbkoodi tageja :D
Hieno peli! Itsekin olen siirtynyt CoolBasicilla koodaamaan.
Siis onko tossa sitten matopeli näyttää aika monimutkaselta X)
tai ko ton luki niin kyllähän siitä älys mitä nuo kaikki meinaa mutta mitä tolle sitten tehhään et siitä saa pelattavan
Vaihda CBsi uudempaan mut miten windows pikku ikoni vaihdetaan näytössä tai piilotetaan?