Kahden pelaajan "Minibiljardi"

Dependencies:   PokittoLib

Committer:
Pokitto
Date:
Wed Oct 10 08:00:57 2018 +0000
Revision:
0:89d0cb201659
Alku

Who changed what in which revision?

UserRevisionLine numberNew contents of line
Pokitto 0:89d0cb201659 1 #include "Pokitto.h" // Lisää Pokitto-kirjasto
Pokitto 0:89d0cb201659 2 #include "GameObject.h" // Lisää GameObject -oliot
Pokitto 0:89d0cb201659 3
Pokitto 0:89d0cb201659 4 Pokitto::Core mygame; // Luo Pokitto -peliolio (siis pelimoottori)
Pokitto 0:89d0cb201659 5
Pokitto 0:89d0cb201659 6 #define MAX_PALLOT 7 // pallojen maksimimäärä
Pokitto 0:89d0cb201659 7
Pokitto 0:89d0cb201659 8 GameObject pallot[MAX_PALLOT]; // Taulukko (array) palloja, eli monta palloa
Pokitto 0:89d0cb201659 9 GameObject pelaaja; // Pelaaja-objekti (tähtäystä varten)
Pokitto 0:89d0cb201659 10 GameObject laidat[4]; // Pöydän neljä laitaa
Pokitto 0:89d0cb201659 11 GameObject taskut[4]; // Pöydän kulmataskut
Pokitto 0:89d0cb201659 12
Pokitto 0:89d0cb201659 13 enum PeliTilanne { Aloitus, Tahtays, Lyonti, Voitto }; // Pelin eri tilat
Pokitto 0:89d0cb201659 14
Pokitto 0:89d0cb201659 15 /** Pelin käyttämät globaalit (eli joka paikasta käytettävät) muuttujat **/
Pokitto 0:89d0cb201659 16 PeliTilanne pt = Aloitus;
Pokitto 0:89d0cb201659 17 int pallotmukana = 7; // montako palloa on alussa mukana pelissä, saa olla korkeintaan sama kuin MAX_PALLOT
Pokitto 0:89d0cb201659 18 int pelaaja1pisteet = 0;
Pokitto 0:89d0cb201659 19 int pelaaja2pisteet = 0;
Pokitto 0:89d0cb201659 20 int pelivuoro = 1; //kumman pelaajan vuoro
Pokitto 0:89d0cb201659 21
Pokitto 0:89d0cb201659 22 // apufunktio, joka asettelee pelipallot alkupaikoilleen
Pokitto 0:89d0cb201659 23 void aloitusPallot(){
Pokitto 0:89d0cb201659 24 pallot[0].x = -30; pallot[0].y = 0; pallot[0].active = true; pallot[0].visible = true; pallot[0].setColor(1);
Pokitto 0:89d0cb201659 25 pallot[1].x = 10; pallot[1].y = 0; pallot[1].active = true; pallot[1].visible = true; pallot[1].setColor(7);
Pokitto 0:89d0cb201659 26 pallot[2].x = 10; pallot[2].y = 10; pallot[2].active = true; pallot[2].visible = true; pallot[2].setColor(4);
Pokitto 0:89d0cb201659 27 pallot[3].x = 10; pallot[3].y = -10; pallot[3].active = true; pallot[3].visible = true; pallot[3].setColor(4);
Pokitto 0:89d0cb201659 28 pallot[4].x = 20; pallot[4].y = -10; pallot[4].active = true; pallot[4].visible = true; pallot[4].setColor(7);
Pokitto 0:89d0cb201659 29 pallot[5].x = 20; pallot[5].y = 0; pallot[5].active = true; pallot[5].visible = true; pallot[5].setColor(4);
Pokitto 0:89d0cb201659 30 pallot[6].x = 20; pallot[6].y = 10; pallot[6].active = true; pallot[6].visible = true; pallot[6].setColor(7);
Pokitto 0:89d0cb201659 31 }
Pokitto 0:89d0cb201659 32
Pokitto 0:89d0cb201659 33 /** MAIN on kohta josta KAIKKI C++ ohjelmat alkavat suorittamaan koodia **/
Pokitto 0:89d0cb201659 34
Pokitto 0:89d0cb201659 35 int main () {
Pokitto 0:89d0cb201659 36 mygame.begin(); // Käynnistä Pokitton moottori (näyttö, näppäimet, jne)
Pokitto 0:89d0cb201659 37 mygame.display.setFont(fontTiny); // Pikkuruinen fontti käyttöön
Pokitto 0:89d0cb201659 38 mygame.display.bgcolor = 13; // Taustaväri tummanvihreäksi
Pokitto 0:89d0cb201659 39 mygame.display.invisiblecolor = 13; // Tekstin taustaväri pois (eli läpinäkyväksi)
Pokitto 0:89d0cb201659 40
Pokitto 0:89d0cb201659 41 /** OHJELMALOOPPI ... pyörii koko ohjelman elämän ajan,
Pokitto 0:89d0cb201659 42 eli niin kauan, kun mygame.isRunning() antaa vastaukseksi tosi (true) **/
Pokitto 0:89d0cb201659 43
Pokitto 0:89d0cb201659 44 while (mygame.isRunning()) {
Pokitto 0:89d0cb201659 45
Pokitto 0:89d0cb201659 46 // Piirrä pöydän reunat
Pokitto 0:89d0cb201659 47 for (int i=0; i<4; i++) laidat[i].draw();
Pokitto 0:89d0cb201659 48 // Piirrä pöydän taskut
Pokitto 0:89d0cb201659 49 for (int i=0; i<4; i++) taskut[i].draw();
Pokitto 0:89d0cb201659 50 // Laske pallojen törmäykset pöydän laitojen kanssa
Pokitto 0:89d0cb201659 51 for (int i=0; i<pallotmukana; i++) {
Pokitto 0:89d0cb201659 52 for (int j=0; j<4; j++) {
Pokitto 0:89d0cb201659 53 if (pallot[i].checkCollision(laidat[j]) && pt != Aloitus) {
Pokitto 0:89d0cb201659 54 pallot[i].doCollision(laidat[j]);
Pokitto 0:89d0cb201659 55 }
Pokitto 0:89d0cb201659 56 }
Pokitto 0:89d0cb201659 57 }
Pokitto 0:89d0cb201659 58
Pokitto 0:89d0cb201659 59 // laske pallojen törmäykset toisten pallojen kanssa
Pokitto 0:89d0cb201659 60 for (int i=0; i<pallotmukana; i++) {
Pokitto 0:89d0cb201659 61 for (int j=0; j<pallotmukana; j++) {
Pokitto 0:89d0cb201659 62 if (i != j) { //älä katso pallon törmäystä itsensä kanssa !!!
Pokitto 0:89d0cb201659 63 if (pallot[i].checkCollision(pallot[j]) && pt != Aloitus) {
Pokitto 0:89d0cb201659 64 pallot[i].doCollision(pallot[j]);
Pokitto 0:89d0cb201659 65 }
Pokitto 0:89d0cb201659 66 }
Pokitto 0:89d0cb201659 67 }
Pokitto 0:89d0cb201659 68 }
Pokitto 0:89d0cb201659 69
Pokitto 0:89d0cb201659 70 // laske pallojen törmäykset taskujen kanssa
Pokitto 0:89d0cb201659 71 for (int i=0; i<pallotmukana; i++) {
Pokitto 0:89d0cb201659 72 for (int j=0; j<4; j++) {
Pokitto 0:89d0cb201659 73 if (pallot[i].checkCollision(taskut[j]) && pt != Aloitus) {
Pokitto 0:89d0cb201659 74 // Pallo meni pussiin!
Pokitto 0:89d0cb201659 75 pallot[i].remove(); // poista pallo kentältä
Pokitto 0:89d0cb201659 76 if (pallot[i].color == 7) pelaaja1pisteet++; // punaisista palloista 1 piste pelaaja ykköselle
Pokitto 0:89d0cb201659 77 if (pallot[i].color == 4) pelaaja2pisteet++; // keltaisista palloista 1 piste pelaaja kakkoselle
Pokitto 0:89d0cb201659 78 if (pallot[i].color == 1) {
Pokitto 0:89d0cb201659 79 // valkoinen pallo meni taskuun, vuorossa oleva pelaaja hävisi
Pokitto 0:89d0cb201659 80 if (pelivuoro==1) { pelaaja1pisteet=0; pelaaja2pisteet = (pallotmukana-1)/2; } //pelaaja 2 voitti
Pokitto 0:89d0cb201659 81 else { pelaaja1pisteet = (pallotmukana-1)/2; pelaaja2pisteet = 0;} //pelaaja 1 voitti
Pokitto 0:89d0cb201659 82 }
Pokitto 0:89d0cb201659 83 if (pelaaja1pisteet == (pallotmukana-1)/2 || pelaaja2pisteet == (pallotmukana-1)/2) pt = Voitto;
Pokitto 0:89d0cb201659 84 }
Pokitto 0:89d0cb201659 85 }
Pokitto 0:89d0cb201659 86 }
Pokitto 0:89d0cb201659 87
Pokitto 0:89d0cb201659 88 /** UPDATE looppi, jossa päivitetään näyttö pelitilanteen mukaan **/
Pokitto 0:89d0cb201659 89 if (mygame.update()) {
Pokitto 0:89d0cb201659 90 int pallotseis = 0; // tämän avulla lasketaan moniko pallo on vielä liikkeessä
Pokitto 0:89d0cb201659 91 // Piirrä pallot
Pokitto 0:89d0cb201659 92 for (int i=0; i<pallotmukana; i++) pallot[i].draw();
Pokitto 0:89d0cb201659 93 // Palautetaan tekstiä varten valkoinen väri
Pokitto 0:89d0cb201659 94 mygame.display.color = 1;
Pokitto 0:89d0cb201659 95 switch (pt) {
Pokitto 0:89d0cb201659 96 case Aloitus:
Pokitto 0:89d0cb201659 97 /** case Aloitus ... Tässä pelitilassa asetetaan alkuarvot pelille **/
Pokitto 0:89d0cb201659 98 mygame.display.print(16,8,"Minibiljardi");
Pokitto 0:89d0cb201659 99 mygame.display.print(16,16,"Paina A");
Pokitto 0:89d0cb201659 100
Pokitto 0:89d0cb201659 101 // Nollataan pelitilanne
Pokitto 0:89d0cb201659 102 pelaaja1pisteet = 0;
Pokitto 0:89d0cb201659 103 pelaaja2pisteet = 0;
Pokitto 0:89d0cb201659 104 pelivuoro = 1;
Pokitto 0:89d0cb201659 105
Pokitto 0:89d0cb201659 106 // Laitetaan pelipallot aloituspaikoilleen
Pokitto 0:89d0cb201659 107 aloitusPallot();
Pokitto 0:89d0cb201659 108
Pokitto 0:89d0cb201659 109 /** Pöytä **/
Pokitto 0:89d0cb201659 110 // Pöydän yläreuna paikalleen
Pokitto 0:89d0cb201659 111 laidat[0].x = 0; laidat[0].y = -49; laidat[0].width = 110; laidat[0].height=20;
Pokitto 0:89d0cb201659 112 laidat[0].setColor(5);
Pokitto 0:89d0cb201659 113 // Pöydän alareuna paikalleen
Pokitto 0:89d0cb201659 114 laidat[1].x = 0; laidat[1].y = 49; laidat[1].width = 110; laidat[1].height=20;
Pokitto 0:89d0cb201659 115 laidat[1].setColor(5);
Pokitto 0:89d0cb201659 116 // Pöydän vasen reuna paikalleen
Pokitto 0:89d0cb201659 117 laidat[2].x = -59; laidat[2].y = 0; laidat[2].width = 20; laidat[2].height=88;
Pokitto 0:89d0cb201659 118 laidat[2].setColor(5);
Pokitto 0:89d0cb201659 119 // Pöydän oikea reuna paikalleen
Pokitto 0:89d0cb201659 120 laidat[3].x = 59; laidat[3].y = 0; laidat[3].width = 20; laidat[3].height=88;
Pokitto 0:89d0cb201659 121 laidat[3].setColor(5);
Pokitto 0:89d0cb201659 122 // Kaikki pöydän reunat muutetaan kiinteiksi
Pokitto 0:89d0cb201659 123 laidat[0].movable = laidat[1].movable = laidat[2].movable = laidat[3].movable = false;
Pokitto 0:89d0cb201659 124
Pokitto 0:89d0cb201659 125 /** Taskut **/
Pokitto 0:89d0cb201659 126 // Vasen ylätasku paikalleen
Pokitto 0:89d0cb201659 127 taskut[0].x = -59; taskut[0].y = -49; taskut[0].width = 30; taskut[0].height=30;
Pokitto 0:89d0cb201659 128 taskut[0].setColor(0);
Pokitto 0:89d0cb201659 129 // Oikea ylätasku paikalleen
Pokitto 0:89d0cb201659 130 taskut[1].x = 59; taskut[1].y = -49; taskut[1].width = 30; taskut[1].height=30;
Pokitto 0:89d0cb201659 131 taskut[1].setColor(0);
Pokitto 0:89d0cb201659 132 // Oikea alatasku paikalleen
Pokitto 0:89d0cb201659 133 taskut[2].x = 59; taskut[2].y = 49; taskut[2].width = 30; taskut[2].height=30;
Pokitto 0:89d0cb201659 134 taskut[2].setColor(0);
Pokitto 0:89d0cb201659 135 // Vasen alatasku paikalleen
Pokitto 0:89d0cb201659 136 taskut[3].x = -59; taskut[3].y = 49; taskut[3].width = 30; taskut[3].height=30;
Pokitto 0:89d0cb201659 137 taskut[3].setColor(0);
Pokitto 0:89d0cb201659 138 // Kaikki taskut muutetaan kiinteiksi
Pokitto 0:89d0cb201659 139 laidat[0].movable = taskut[1].movable = taskut[2].movable = taskut[3].movable = false;
Pokitto 0:89d0cb201659 140
Pokitto 0:89d0cb201659 141 // Jos on painettu A, siirrytään peliin!
Pokitto 0:89d0cb201659 142 if (mygame.buttons.released(BTN_A)) {
Pokitto 0:89d0cb201659 143 pelaaja.x = pallot[0].x; pelaaja.y = pallot[0].y;
Pokitto 0:89d0cb201659 144 pt = Tahtays;
Pokitto 0:89d0cb201659 145 }
Pokitto 0:89d0cb201659 146 break;
Pokitto 0:89d0cb201659 147 case Tahtays:
Pokitto 0:89d0cb201659 148 /** case Tähtäys ... Tässä pelitilassa asetetaan suunta ja voima valkoiselle pallolle **/
Pokitto 0:89d0cb201659 149 if (pelivuoro == 1) {
Pokitto 0:89d0cb201659 150 mygame.display.color = 7; // punainen väri
Pokitto 0:89d0cb201659 151 mygame.display.print(16,8,"Pelaaja 1 vuoro");
Pokitto 0:89d0cb201659 152 } else {
Pokitto 0:89d0cb201659 153 mygame.display.color = 4; // keltainen väri
Pokitto 0:89d0cb201659 154 mygame.display.print(16,8,"Pelaaja 2 vuoro");
Pokitto 0:89d0cb201659 155 }
Pokitto 0:89d0cb201659 156
Pokitto 0:89d0cb201659 157 // piirrä tähtäysviiva pelaajan ja pallon välille
Pokitto 0:89d0cb201659 158 mygame.display.setColor(1); // väri 1 = valkoinen
Pokitto 0:89d0cb201659 159 mygame.display.drawLine(pelaaja.centerX,pelaaja.centerY,pallot[0].centerX,pallot[0].centerY);
Pokitto 0:89d0cb201659 160 // tsekkaa näppäinpainallukset
Pokitto 0:89d0cb201659 161 if (mygame.buttons.rightBtn()) pelaaja.moveX(1);
Pokitto 0:89d0cb201659 162 if (mygame.buttons.leftBtn()) pelaaja.moveX(-1);
Pokitto 0:89d0cb201659 163 if (mygame.buttons.upBtn()) pelaaja.moveY(-1);
Pokitto 0:89d0cb201659 164 if (mygame.buttons.downBtn()) pelaaja.moveY(1);
Pokitto 0:89d0cb201659 165 // jos painetaan A, lyönti lähtee
Pokitto 0:89d0cb201659 166 if (mygame.buttons.released(BTN_A)) {
Pokitto 0:89d0cb201659 167 // kopautetaan vauhtia valkoiselle nollapallolle (pelaaja)
Pokitto 0:89d0cb201659 168 pallot[0].vx = (pelaaja.x - pallot[0].x) * pallot[0].acceleration; // lyönnin X voimakkuus
Pokitto 0:89d0cb201659 169 pallot[0].vy = (pelaaja.y - pallot[0].y) * pallot[0].acceleration; // lyönnin Y voimakkuus
Pokitto 0:89d0cb201659 170 pt = Lyonti; // siirry seuraavaan pelitilaan
Pokitto 0:89d0cb201659 171 }
Pokitto 0:89d0cb201659 172 break;
Pokitto 0:89d0cb201659 173 case Lyonti:
Pokitto 0:89d0cb201659 174 // jos kaikki pallot ovat pysähtynyt, siirry taas tähtäämään
Pokitto 0:89d0cb201659 175 for (int i=0; i < pallotmukana; i++) {
Pokitto 0:89d0cb201659 176 //jos pallo ei enää liiku tai on jo poistettu
Pokitto 0:89d0cb201659 177 if (pallot[i].isMoving() == false || pallot[i].active == false) {
Pokitto 0:89d0cb201659 178 pallotseis++; //lasketaan pysähtyneet yhteen
Pokitto 0:89d0cb201659 179 }
Pokitto 0:89d0cb201659 180 }
Pokitto 0:89d0cb201659 181 if (pallotseis == pallotmukana) {
Pokitto 0:89d0cb201659 182 // kaikki pallot ovat seis tai jo pussitettu, aloita taas tähtääminen
Pokitto 0:89d0cb201659 183 pelaaja.x = pallot[0].x; pelaaja.y = pallot[0].y;
Pokitto 0:89d0cb201659 184 if (pelivuoro == 1) pelivuoro = 2;
Pokitto 0:89d0cb201659 185 else pelivuoro = 1; // vaihdetaan pelivuoroa
Pokitto 0:89d0cb201659 186 pt = Tahtays;
Pokitto 0:89d0cb201659 187 }
Pokitto 0:89d0cb201659 188 break;
Pokitto 0:89d0cb201659 189 case Voitto:
Pokitto 0:89d0cb201659 190 /** case Voitto ... pelaaja 1 tai 2 voitti **/
Pokitto 0:89d0cb201659 191 if (pelaaja1pisteet > pelaaja2pisteet) {
Pokitto 0:89d0cb201659 192 mygame.display.color = 7; // punainen väri
Pokitto 0:89d0cb201659 193 mygame.display.print(16,8,"Pelaaja 1 VOITTI!");
Pokitto 0:89d0cb201659 194 } else {
Pokitto 0:89d0cb201659 195 mygame.display.color = 4; // keltainen väri
Pokitto 0:89d0cb201659 196 mygame.display.print(16,8,"Pelaaja 2 VOITTI!");
Pokitto 0:89d0cb201659 197 }
Pokitto 0:89d0cb201659 198 mygame.display.color = 1; // valkoinen väri
Pokitto 0:89d0cb201659 199 mygame.display.print(16,16,"Paina A");
Pokitto 0:89d0cb201659 200 // jos painetaan A, peli alkaa alusta
Pokitto 0:89d0cb201659 201 if (mygame.buttons.released(BTN_A)) {
Pokitto 0:89d0cb201659 202 pt = Aloitus;
Pokitto 0:89d0cb201659 203 }
Pokitto 0:89d0cb201659 204 break;
Pokitto 0:89d0cb201659 205
Pokitto 0:89d0cb201659 206 }
Pokitto 0:89d0cb201659 207 }
Pokitto 0:89d0cb201659 208 // Kappaleiden liikkeet lasketaan koko ajan (tarkempi)
Pokitto 0:89d0cb201659 209 // siirrä palloa lasketun liikken mukaan
Pokitto 0:89d0cb201659 210 for (int i = 0; i< pallotmukana; i++) pallot[i].move();
Pokitto 0:89d0cb201659 211 // päivitetään pelaajan paikka (tähtäysviivaa varten)
Pokitto 0:89d0cb201659 212 pelaaja.move();
Pokitto 0:89d0cb201659 213 // piirretään valkoinen pallo aina (tulee "vauhtijuova")
Pokitto 0:89d0cb201659 214 pallot[0].draw();
Pokitto 0:89d0cb201659 215 }
Pokitto 0:89d0cb201659 216 }