Gyvatėlė

Iš wiki.angis.net.
Jump to navigation Jump to search

Gyvatėlė žaidimas

gyvatėlės žaidimas angies sistemoje

Ši programa demonstruoja, kaip susikurti klasikinį Snake stiliaus žaidimą, kuriame klaviatūra valdoma gyvatėlė, pagauna maistą ir paauga. Tikslas pagauti, kuo daugiau maisto gabaliukų neatsitrenkus į sieną ar save. Kodas dar bus tobulinamas.

Šioje programėlėje panaudoti keli skirtingi vaizdo failai, kurie atsiranda priklausomai nuo atlikto veiksmo. Dalis jų yra angies sistemoje, o dalį galime rasti čia.

Žaisti gyvatėlę

Gyvatėlė žaidimo kodas

reikalinga angis
reikalingas žaidimas
reikalingas random
reikalinga math

žaidimas.duokSceną().fonas('pav/gyvatėlė/fonas.png')

# Gyvatėlės galva
galva = žaidimas.Dekoracija('pav/stat/akmuo2.png', x=100, y=100)
galva.kryptis = "niekur" 
galva.uždelsimas = 100

# Gyvatėlės kūno segmentai
segmentai = []

# Gyvatėlės maistas
maistas = žaidimas.Dekoracija('pav/gyvatėlė/drakono galva 50x50.png', x=200, y=200)

švieslentė = žaidimas.Tekstas("Taškai: 0  Rekordas: 0", x= 150, y=10, spalva=0xFFFFFF, dydis=20)

komanda rodykRezultatą(rezultatas, rekordas):
    švieslentė.tekstas("Taškai: "+str(taškai)+"  Rekordas:" + str(rekordas)) 

# Klaviatūros įvestis
komanda mygtukoWkomanda(mygtukas):
    jeigu galva.kryptis != "žemyn":
        galva.kryptis = "viršun"

komanda mygtukoSkomanda(mygtukas):
    jeigu galva.kryptis != "viršun":
        galva.kryptis = "žemyn"

komanda mygtukoAkomanda(mygtukas):
    jeigu galva.kryptis != "dešinėn":
        galva.kryptis = "kairėn"

komanda mygtukoDkomanda(mygtukas):
    jeigu galva.kryptis != "kairėn":
        galva.kryptis = "dešinėn"

komanda mygtukoQkomanda(mygtukas):
    global žaidimasBaigtas
    žaidimasBaigtas = 'taip'

komanda move():
    x, y = galva.duokKoordinates()

    jeigu galva.kryptis == "viršun":
        galva.atsirask(x, y - 20)

    jeigu galva.kryptis == "žemyn":
        galva.atsirask(x, y + 20)

    jeigu galva.kryptis == "kairėn":
        galva.atsirask(x - 20, y)

    jeigu galva.kryptis == "dešinėn":
        galva.atsirask(x + 20, y)

angis.paspaudus("a", mygtukoAkomanda)
angis.paspaudus("s", mygtukoSkomanda)
angis.paspaudus("d", mygtukoDkomanda)
angis.paspaudus("w", mygtukoWkomanda)
angis.paspaudus("q", mygtukoQkomanda)

# atstumo matavimas tarp dviejų daiktų pagal Pitagoro teoremą
komanda atstumas(aDaiktas, bDaiktas):
    x, y = aDaiktas.duokKoordinates();
    x2, y2 = bDaiktas.duokKoordinates()

    grąžink math.sqrt( (x-x2)*(x-x2) + (y-y2) * (y-y2) ) 

taškai = 0
rekordas = 0

komanda mirk():
    angis.miegok(1000)
    galva.atsirask(300, 300)
    galva.kryptis = "stop"

    # Slepiam kūno segmentus
    kiekvienam segment  segmentai:
        segment.slėpkis()
    
    # Išvalom segmentų sąrašą
    segmentai.clear()

    # Atstatom taškus
    global taškai
    taškai = 0

    # Atstatom delsimą
    galva.uždelsimas = 100

    rodykRezultatą(taškai, rekordas)

# Pagrindinis žaidimo ciklas
žaidimasBaigtas = 'ne'
kol žaidimasBaigtas == 'ne':

    x, y = galva.duokKoordinates()
    # Tikrinamas susidūrimas su kraštu
    jeigu x>560 arba x<0 arba y>570 arba y<0:
        mirk()

    # Tikrinti ar yra susidūrimas su maistu
    jeigu atstumas(galva, maistas) < 30:
        # Maisto atsiradimas, atsitiktinėje vietoje
        x = random.randint(0, 550)
        y = random.randint(0, 570)
        maistas.atsirask(x,y)

        # Pridėti segmentą
        new_segment = žaidimas.Dekoracija('pav/stat/akmuo2.png')
        segmentai.append(new_segment)

        # Sutrumpinti uždelsima
        galva.uždelsimas -= 3

        # Padidinti taškus
        taškai += 10

        jeigu taškai > rekordas:
            rekordas = taškai
        
        rodykRezultatą(taškai, rekordas) 

    # Galinius segmentus perkelti atgaline tvarka
    kiekvienam index  intervalo(len(segmentai)-1, 0, -1):
        x, y = segmentai[index-1].duokKoordinates()
        segmentai[index].atsirask(x, y)

    # Perkelti 0 segmentą ten, kur yra galva
    jeigu len(segmentai) > 0:
        x,y = galva.duokKoordinates()
        segmentai[0].atsirask(x,y)

    move()    

    # Tikrinam, ar galva nesusiduria su kūno segmentais
    kiekvienam segmentas  segmentai: 
        jeigu atstumas(segmentas, galva) < 20:
            mirk() 

    angis.miegok(galva.uždelsimas)