Kahden pelaajan "Minibiljardi"

Dependencies:   PokittoLib

Revision:
0:89d0cb201659
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/main.cpp	Wed Oct 10 08:00:57 2018 +0000
@@ -0,0 +1,216 @@
+#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();
+    }    
+}
\ No newline at end of file