Kirjautuminen

Haku

Tehtävät

Koodit: CoolBasic: Matopeli

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()

Kommentit

Horny The Horrible [21.01.2010 07:35:59]

#

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.

ZcMander [08.02.2010 21:17:08]

#

Jätettäköön se kotitehtäväksi, sillä se kuitenki olisi todella helppo lisäys koodiin.

JussiR [29.03.2010 10:12:35]

#

Tossahan vois käyttää melkein vbkoodi tageja :D

ErroR++ [21.11.2011 13:55:38]

#

Hieno peli! Itsekin olen siirtynyt CoolBasicilla koodaamaan.

Aerower [30.12.2011 02:36:13]

#

Siis onko tossa sitten matopeli näyttää aika monimutkaselta X)

Aerower [30.12.2011 02:39:38]

#

tai ko ton luki niin kyllähän siitä älys mitä nuo kaikki meinaa mutta mitä tolle sitten tehhään et siitä saa pelattavan

freepc [18.01.2015 09:43:05]

#

Vaihda CBsi uudempaan mut miten windows pikku ikoni vaihdetaan näytössä tai piilotetaan?

Kirjoita kommentti

Muista lukea kirjoitusohjeet.
Tietoa sivustosta