Kahden pelaajan "Minibiljardi"

Dependencies:   PokittoLib

main.cpp

Committer:
Pokitto
Date:
2018-10-10
Revision:
0:89d0cb201659

File content as of revision 0:89d0cb201659:

#include "Pokitto.h"    // Lisää Pokitto-kirjasto
#include "GameObject.h" // Lisää GameObject -oliot

Pokitto::Core mygame; // Luo Pokitto -peliolio (siis pelimoottori)

#define MAX_PALLOT 7 // pallojen maksimimäärä

GameObject pallot[MAX_PALLOT]; // Taulukko (array) palloja, eli monta palloa
GameObject pelaaja;   // Pelaaja-objekti (tähtäystä varten)
GameObject laidat[4]; // Pöydän neljä laitaa
GameObject taskut[4]; // Pöydän kulmataskut

enum PeliTilanne { Aloitus, Tahtays, Lyonti, Voitto }; // Pelin eri tilat

/** Pelin käyttämät globaalit (eli joka paikasta käytettävät) muuttujat **/
PeliTilanne pt = Aloitus; 
int pallotmukana = 7; // montako palloa on alussa mukana pelissä, saa olla korkeintaan sama kuin MAX_PALLOT
int pelaaja1pisteet = 0; 
int pelaaja2pisteet = 0;
int pelivuoro = 1; //kumman pelaajan vuoro

// apufunktio, joka asettelee pelipallot alkupaikoilleen
void aloitusPallot(){
    pallot[0].x = -30; pallot[0].y =   0; pallot[0].active = true; pallot[0].visible = true; pallot[0].setColor(1); 
    pallot[1].x = 10; pallot[1].y =   0; pallot[1].active = true; pallot[1].visible = true; pallot[1].setColor(7);
    pallot[2].x = 10; pallot[2].y =  10; pallot[2].active = true; pallot[2].visible = true; pallot[2].setColor(4); 
    pallot[3].x = 10; pallot[3].y = -10; pallot[3].active = true; pallot[3].visible = true; pallot[3].setColor(4); 
    pallot[4].x = 20; pallot[4].y = -10; pallot[4].active = true; pallot[4].visible = true; pallot[4].setColor(7); 
    pallot[5].x = 20; pallot[5].y =   0; pallot[5].active = true; pallot[5].visible = true; pallot[5].setColor(4);
    pallot[6].x = 20; pallot[6].y =  10; pallot[6].active = true; pallot[6].visible = true; pallot[6].setColor(7);     
} 

/** MAIN on kohta josta KAIKKI C++ ohjelmat alkavat suorittamaan koodia **/

int main () { 
    mygame.begin(); // Käynnistä Pokitton moottori (näyttö, näppäimet, jne)
    mygame.display.setFont(fontTiny); // Pikkuruinen fontti käyttöön
    mygame.display.bgcolor = 13; // Taustaväri tummanvihreäksi
    mygame.display.invisiblecolor = 13; // Tekstin taustaväri pois (eli läpinäkyväksi)
    
    /** OHJELMALOOPPI ... pyörii koko ohjelman elämän ajan, 
    eli niin kauan, kun mygame.isRunning() antaa vastaukseksi tosi (true) **/
    
    while (mygame.isRunning()) {
        
        // Piirrä pöydän reunat
        for (int i=0; i<4; i++) laidat[i].draw();
        // Piirrä pöydän taskut
        for (int i=0; i<4; i++) taskut[i].draw();
        // Laske pallojen törmäykset pöydän laitojen kanssa
        for (int i=0; i<pallotmukana; i++) {
            for (int j=0; j<4; j++) {
             if (pallot[i].checkCollision(laidat[j]) && pt != Aloitus) {
                    pallot[i].doCollision(laidat[j]);        
                 }
            }
        }
        
        // laske pallojen törmäykset toisten pallojen kanssa
        for (int i=0; i<pallotmukana; i++) {
            for (int j=0; j<pallotmukana; j++) {
             if (i != j) { //älä katso pallon törmäystä itsensä kanssa !!!
                    if (pallot[i].checkCollision(pallot[j]) && pt != Aloitus) {
                        pallot[i].doCollision(pallot[j]);        
                    }
                }
            }
        }
        
        // laske pallojen törmäykset taskujen kanssa
        for (int i=0; i<pallotmukana; i++) {
            for (int j=0; j<4; j++) {
                if (pallot[i].checkCollision(taskut[j]) && pt != Aloitus) {
                    // Pallo meni pussiin! 
                    pallot[i].remove(); // poista pallo kentältä
                    if (pallot[i].color == 7) pelaaja1pisteet++; // punaisista palloista 1 piste pelaaja ykköselle
                    if (pallot[i].color == 4) pelaaja2pisteet++; // keltaisista palloista 1 piste pelaaja kakkoselle
                    if (pallot[i].color == 1) {
                        // valkoinen pallo meni taskuun, vuorossa oleva pelaaja hävisi
                        if (pelivuoro==1) { pelaaja1pisteet=0; pelaaja2pisteet = (pallotmukana-1)/2; } //pelaaja 2 voitti
                        else { pelaaja1pisteet = (pallotmukana-1)/2; pelaaja2pisteet = 0;} //pelaaja 1 voitti 
                    }
                    if (pelaaja1pisteet == (pallotmukana-1)/2 || pelaaja2pisteet == (pallotmukana-1)/2) pt = Voitto;
                }
            }
        }
        
        /** UPDATE looppi, jossa päivitetään näyttö pelitilanteen mukaan **/
        if (mygame.update()) {  
            int pallotseis = 0; // tämän avulla lasketaan moniko pallo on vielä liikkeessä
            // Piirrä pallot 
            for (int i=0; i<pallotmukana; i++) pallot[i].draw();
            // Palautetaan tekstiä varten valkoinen väri
            mygame.display.color = 1; 
            switch (pt) {
            case Aloitus:
                /** case Aloitus ... Tässä pelitilassa asetetaan alkuarvot pelille **/
                mygame.display.print(16,8,"Minibiljardi");
                mygame.display.print(16,16,"Paina A");
                
                // Nollataan pelitilanne
                pelaaja1pisteet = 0; 
                pelaaja2pisteet = 0;
                pelivuoro = 1;
                
                // Laitetaan pelipallot aloituspaikoilleen
                aloitusPallot();
                
                /** Pöytä **/
                // Pöydän yläreuna paikalleen
                laidat[0].x = 0; laidat[0].y = -49; laidat[0].width = 110; laidat[0].height=20; 
                laidat[0].setColor(5); 
                // Pöydän alareuna paikalleen
                laidat[1].x = 0; laidat[1].y = 49; laidat[1].width = 110; laidat[1].height=20; 
                laidat[1].setColor(5); 
                // Pöydän vasen reuna paikalleen
                laidat[2].x = -59; laidat[2].y = 0; laidat[2].width = 20; laidat[2].height=88; 
                laidat[2].setColor(5); 
                // Pöydän oikea reuna paikalleen
                laidat[3].x = 59; laidat[3].y = 0; laidat[3].width = 20; laidat[3].height=88; 
                laidat[3].setColor(5); 
                // Kaikki pöydän reunat muutetaan kiinteiksi 
                laidat[0].movable = laidat[1].movable = laidat[2].movable = laidat[3].movable = false;        
                
                /** Taskut **/
                // Vasen ylätasku paikalleen
                taskut[0].x = -59; taskut[0].y = -49; taskut[0].width = 30; taskut[0].height=30; 
                taskut[0].setColor(0); 
                // Oikea ylätasku paikalleen
                taskut[1].x = 59; taskut[1].y = -49; taskut[1].width = 30; taskut[1].height=30; 
                taskut[1].setColor(0); 
                // Oikea alatasku paikalleen
                taskut[2].x = 59; taskut[2].y = 49; taskut[2].width = 30; taskut[2].height=30; 
                taskut[2].setColor(0); 
                // Vasen alatasku paikalleen
                taskut[3].x = -59; taskut[3].y = 49; taskut[3].width = 30; taskut[3].height=30; 
                taskut[3].setColor(0); 
                // Kaikki taskut muutetaan kiinteiksi 
                laidat[0].movable = taskut[1].movable = taskut[2].movable = taskut[3].movable = false; 
                
                // Jos on painettu A, siirrytään peliin!
                if (mygame.buttons.released(BTN_A)) {
                    pelaaja.x = pallot[0].x; pelaaja.y = pallot[0].y;
                    pt = Tahtays;
                    }
                break;
            case Tahtays:
                /** case Tähtäys ... Tässä pelitilassa asetetaan suunta ja voima valkoiselle pallolle **/
                if (pelivuoro == 1) {
                   mygame.display.color = 7; // punainen väri
                   mygame.display.print(16,8,"Pelaaja 1 vuoro");   
                } else {
                   mygame.display.color = 4; // keltainen väri
                   mygame.display.print(16,8,"Pelaaja 2 vuoro");  
                }
    
                // piirrä tähtäysviiva pelaajan ja pallon välille
                mygame.display.setColor(1); // väri 1 = valkoinen
                mygame.display.drawLine(pelaaja.centerX,pelaaja.centerY,pallot[0].centerX,pallot[0].centerY);
                // tsekkaa näppäinpainallukset
                if (mygame.buttons.rightBtn()) pelaaja.moveX(1);
                if (mygame.buttons.leftBtn()) pelaaja.moveX(-1);
                if (mygame.buttons.upBtn()) pelaaja.moveY(-1);
                if (mygame.buttons.downBtn()) pelaaja.moveY(1);
                // jos painetaan A, lyönti lähtee
                if (mygame.buttons.released(BTN_A)) {
                    // kopautetaan vauhtia valkoiselle nollapallolle (pelaaja)
                    pallot[0].vx = (pelaaja.x - pallot[0].x) * pallot[0].acceleration; // lyönnin X voimakkuus
                    pallot[0].vy = (pelaaja.y - pallot[0].y) * pallot[0].acceleration; // lyönnin Y voimakkuus
                    pt = Lyonti; // siirry seuraavaan pelitilaan
                }
                break;
            case Lyonti:
                // jos kaikki pallot ovat pysähtynyt, siirry taas tähtäämään
                for (int i=0; i < pallotmukana; i++) {
                    //jos pallo ei enää liiku tai on jo poistettu
                    if (pallot[i].isMoving() == false || pallot[i].active == false) { 
                         pallotseis++; //lasketaan pysähtyneet yhteen
                    }
                }
                if (pallotseis == pallotmukana) {
                    // kaikki pallot ovat seis tai jo pussitettu, aloita taas tähtääminen
                    pelaaja.x = pallot[0].x; pelaaja.y = pallot[0].y;
                    if (pelivuoro == 1) pelivuoro = 2;
                    else pelivuoro = 1; // vaihdetaan pelivuoroa
                    pt = Tahtays;
                }
                break;
            case Voitto:
                /** case Voitto ... pelaaja 1 tai 2 voitti **/
                if (pelaaja1pisteet > pelaaja2pisteet) {
                   mygame.display.color = 7; // punainen väri
                   mygame.display.print(16,8,"Pelaaja 1 VOITTI!");   
                } else {
                   mygame.display.color = 4; // keltainen väri
                   mygame.display.print(16,8,"Pelaaja 2 VOITTI!");  
                }
                mygame.display.color = 1; // valkoinen väri
                mygame.display.print(16,16,"Paina A");
                // jos painetaan A, peli alkaa alusta
                if (mygame.buttons.released(BTN_A)) {
                    pt = Aloitus;
                }
                break;
                
            }          
        } 
        // Kappaleiden liikkeet lasketaan koko ajan (tarkempi)
        // siirrä palloa lasketun liikken mukaan
        for (int i = 0; i< pallotmukana; i++) pallot[i].move();
        // päivitetään pelaajan paikka (tähtäysviivaa varten)
        pelaaja.move();
        // piirretään valkoinen pallo aina (tulee "vauhtijuova")
        pallot[0].draw();
    }    
}