Important changes to repositories hosted on mbed.com
Mbed hosted mercurial repositories are deprecated and are due to be permanently deleted in July 2026.
To keep a copy of this software download the repository Zip archive or clone locally using Mercurial.
It is also possible to export all your personal repositories from the account settings page.
Dependencies: mbed 4DGL-uLCD-SE PinDetect
FarkleGame.cpp@0:7d8ffdfdb16e, 2021-10-22 (annotated)
- Committer:
- ashi31
- Date:
- Fri Oct 22 03:57:47 2021 +0000
- Revision:
- 0:7d8ffdfdb16e
Lab4
Who changed what in which revision?
| User | Revision | Line number | New contents of line |
|---|---|---|---|
| ashi31 | 0:7d8ffdfdb16e | 1 | #include "Die.h" |
| ashi31 | 0:7d8ffdfdb16e | 2 | #include "FarkleGame.h" |
| ashi31 | 0:7d8ffdfdb16e | 3 | |
| ashi31 | 0:7d8ffdfdb16e | 4 | #include <string> |
| ashi31 | 0:7d8ffdfdb16e | 5 | #include <iostream> |
| ashi31 | 0:7d8ffdfdb16e | 6 | #include <sstream> |
| ashi31 | 0:7d8ffdfdb16e | 7 | |
| ashi31 | 0:7d8ffdfdb16e | 8 | using namespace std; |
| ashi31 | 0:7d8ffdfdb16e | 9 | |
| ashi31 | 0:7d8ffdfdb16e | 10 | //Constructors |
| ashi31 | 0:7d8ffdfdb16e | 11 | FarkleGame::FarkleGame(){ |
| ashi31 | 0:7d8ffdfdb16e | 12 | Die Dice[6]; |
| ashi31 | 0:7d8ffdfdb16e | 13 | int DiceVals[6]; |
| ashi31 | 0:7d8ffdfdb16e | 14 | |
| ashi31 | 0:7d8ffdfdb16e | 15 | int turnScore = 0; |
| ashi31 | 0:7d8ffdfdb16e | 16 | int rollScore = 0; |
| ashi31 | 0:7d8ffdfdb16e | 17 | int farkles = 0; |
| ashi31 | 0:7d8ffdfdb16e | 18 | } |
| ashi31 | 0:7d8ffdfdb16e | 19 | |
| ashi31 | 0:7d8ffdfdb16e | 20 | //Method |
| ashi31 | 0:7d8ffdfdb16e | 21 | void FarkleGame::dispIntro(uLCD_4DGL& scr, int nd){ |
| ashi31 | 0:7d8ffdfdb16e | 22 | scr.cls(); |
| ashi31 | 0:7d8ffdfdb16e | 23 | scr.display_control(PORTRAIT); |
| ashi31 | 0:7d8ffdfdb16e | 24 | |
| ashi31 | 0:7d8ffdfdb16e | 25 | scr.text_width(2); |
| ashi31 | 0:7d8ffdfdb16e | 26 | scr.text_height(2); |
| ashi31 | 0:7d8ffdfdb16e | 27 | scr.locate(0,1); |
| ashi31 | 0:7d8ffdfdb16e | 28 | scr.printf("Shake\n"); |
| ashi31 | 0:7d8ffdfdb16e | 29 | scr.printf("Board\n"); |
| ashi31 | 0:7d8ffdfdb16e | 30 | scr.printf("------\n"); |
| ashi31 | 0:7d8ffdfdb16e | 31 | scr.printf("To\n"); |
| ashi31 | 0:7d8ffdfdb16e | 32 | scr.printf("Roll\n"); |
| ashi31 | 0:7d8ffdfdb16e | 33 | scr.printf("%d Dice", nd); |
| ashi31 | 0:7d8ffdfdb16e | 34 | } |
| ashi31 | 0:7d8ffdfdb16e | 35 | |
| ashi31 | 0:7d8ffdfdb16e | 36 | void FarkleGame::init(){ |
| ashi31 | 0:7d8ffdfdb16e | 37 | turnScore = 0; |
| ashi31 | 0:7d8ffdfdb16e | 38 | rollScore = 0; |
| ashi31 | 0:7d8ffdfdb16e | 39 | farkles = 0; |
| ashi31 | 0:7d8ffdfdb16e | 40 | } |
| ashi31 | 0:7d8ffdfdb16e | 41 | |
| ashi31 | 0:7d8ffdfdb16e | 42 | void FarkleGame::rollDice(){ |
| ashi31 | 0:7d8ffdfdb16e | 43 | for(int i = 0; i < 6; i++){ |
| ashi31 | 0:7d8ffdfdb16e | 44 | Dice[i].rollDie(); |
| ashi31 | 0:7d8ffdfdb16e | 45 | } |
| ashi31 | 0:7d8ffdfdb16e | 46 | } |
| ashi31 | 0:7d8ffdfdb16e | 47 | |
| ashi31 | 0:7d8ffdfdb16e | 48 | void FarkleGame::displayDice(uLCD_4DGL& scr, int nd){ |
| ashi31 | 0:7d8ffdfdb16e | 49 | |
| ashi31 | 0:7d8ffdfdb16e | 50 | scr.cls(); |
| ashi31 | 0:7d8ffdfdb16e | 51 | scr.display_control(PORTRAIT); |
| ashi31 | 0:7d8ffdfdb16e | 52 | |
| ashi31 | 0:7d8ffdfdb16e | 53 | for(int i = 0; i < nd; i++){ |
| ashi31 | 0:7d8ffdfdb16e | 54 | Dice[i].displayDie(i+1, scr); |
| ashi31 | 0:7d8ffdfdb16e | 55 | } |
| ashi31 | 0:7d8ffdfdb16e | 56 | |
| ashi31 | 0:7d8ffdfdb16e | 57 | } |
| ashi31 | 0:7d8ffdfdb16e | 58 | |
| ashi31 | 0:7d8ffdfdb16e | 59 | void FarkleGame::loadVals(int nd){ |
| ashi31 | 0:7d8ffdfdb16e | 60 | for(int i = 0; i < 6; i++){ |
| ashi31 | 0:7d8ffdfdb16e | 61 | DiceVals[i] = 0; |
| ashi31 | 0:7d8ffdfdb16e | 62 | } |
| ashi31 | 0:7d8ffdfdb16e | 63 | for(int i = 0; i < nd; i++){ |
| ashi31 | 0:7d8ffdfdb16e | 64 | if(Dice[i].getVal() == 1){ |
| ashi31 | 0:7d8ffdfdb16e | 65 | DiceVals[0]++; |
| ashi31 | 0:7d8ffdfdb16e | 66 | }else if(Dice[i].getVal() == 2){ |
| ashi31 | 0:7d8ffdfdb16e | 67 | DiceVals[1]++; |
| ashi31 | 0:7d8ffdfdb16e | 68 | }else if(Dice[i].getVal() == 3){ |
| ashi31 | 0:7d8ffdfdb16e | 69 | DiceVals[2]++; |
| ashi31 | 0:7d8ffdfdb16e | 70 | }else if(Dice[i].getVal() == 4){ |
| ashi31 | 0:7d8ffdfdb16e | 71 | DiceVals[3]++; |
| ashi31 | 0:7d8ffdfdb16e | 72 | }else if(Dice[i].getVal() == 5){ |
| ashi31 | 0:7d8ffdfdb16e | 73 | DiceVals[4]++; |
| ashi31 | 0:7d8ffdfdb16e | 74 | }else if(Dice[i].getVal() == 6){ |
| ashi31 | 0:7d8ffdfdb16e | 75 | DiceVals[5]++; |
| ashi31 | 0:7d8ffdfdb16e | 76 | } |
| ashi31 | 0:7d8ffdfdb16e | 77 | } |
| ashi31 | 0:7d8ffdfdb16e | 78 | } |
| ashi31 | 0:7d8ffdfdb16e | 79 | |
| ashi31 | 0:7d8ffdfdb16e | 80 | int FarkleGame::calcScore(){ |
| ashi31 | 0:7d8ffdfdb16e | 81 | //Scores will be checked in descending order of value |
| ashi31 | 0:7d8ffdfdb16e | 82 | |
| ashi31 | 0:7d8ffdfdb16e | 83 | //check for 6 |
| ashi31 | 0:7d8ffdfdb16e | 84 | for(int i = 0; i < 6; i++){ |
| ashi31 | 0:7d8ffdfdb16e | 85 | if(DiceVals[i] == 6){ |
| ashi31 | 0:7d8ffdfdb16e | 86 | return 3000; |
| ashi31 | 0:7d8ffdfdb16e | 87 | } |
| ashi31 | 0:7d8ffdfdb16e | 88 | } |
| ashi31 | 0:7d8ffdfdb16e | 89 | |
| ashi31 | 0:7d8ffdfdb16e | 90 | //check for 2triplets |
| ashi31 | 0:7d8ffdfdb16e | 91 | int tripCount = 0; |
| ashi31 | 0:7d8ffdfdb16e | 92 | for(int i = 0; i < 6; i++){ |
| ashi31 | 0:7d8ffdfdb16e | 93 | if(DiceVals[i] == 3) tripCount++; |
| ashi31 | 0:7d8ffdfdb16e | 94 | } |
| ashi31 | 0:7d8ffdfdb16e | 95 | if(tripCount == 2){ |
| ashi31 | 0:7d8ffdfdb16e | 96 | return 2500; |
| ashi31 | 0:7d8ffdfdb16e | 97 | } |
| ashi31 | 0:7d8ffdfdb16e | 98 | |
| ashi31 | 0:7d8ffdfdb16e | 99 | //check for 5 |
| ashi31 | 0:7d8ffdfdb16e | 100 | for(int i = 0; i < 6; i++){ |
| ashi31 | 0:7d8ffdfdb16e | 101 | if(DiceVals[i] == 5){ |
| ashi31 | 0:7d8ffdfdb16e | 102 | return 2000; |
| ashi31 | 0:7d8ffdfdb16e | 103 | } |
| ashi31 | 0:7d8ffdfdb16e | 104 | } |
| ashi31 | 0:7d8ffdfdb16e | 105 | |
| ashi31 | 0:7d8ffdfdb16e | 106 | //check for 123456 |
| ashi31 | 0:7d8ffdfdb16e | 107 | int singCount = 0; |
| ashi31 | 0:7d8ffdfdb16e | 108 | for(int i = 0; i < 6; i++){ |
| ashi31 | 0:7d8ffdfdb16e | 109 | if(DiceVals[i] == 1) singCount++; |
| ashi31 | 0:7d8ffdfdb16e | 110 | } |
| ashi31 | 0:7d8ffdfdb16e | 111 | if(singCount == 6){ |
| ashi31 | 0:7d8ffdfdb16e | 112 | return 1500; |
| ashi31 | 0:7d8ffdfdb16e | 113 | } |
| ashi31 | 0:7d8ffdfdb16e | 114 | |
| ashi31 | 0:7d8ffdfdb16e | 115 | //check for 3doubs |
| ashi31 | 0:7d8ffdfdb16e | 116 | int doubCount = 0; |
| ashi31 | 0:7d8ffdfdb16e | 117 | for(int i = 0; i < 6; i++){ |
| ashi31 | 0:7d8ffdfdb16e | 118 | if(DiceVals[i] == 2) doubCount++; |
| ashi31 | 0:7d8ffdfdb16e | 119 | } |
| ashi31 | 0:7d8ffdfdb16e | 120 | if(doubCount == 3){ |
| ashi31 | 0:7d8ffdfdb16e | 121 | return 1500; |
| ashi31 | 0:7d8ffdfdb16e | 122 | } |
| ashi31 | 0:7d8ffdfdb16e | 123 | |
| ashi31 | 0:7d8ffdfdb16e | 124 | //check for 4 |
| ashi31 | 0:7d8ffdfdb16e | 125 | for(int i = 0; i < 6; i++){ |
| ashi31 | 0:7d8ffdfdb16e | 126 | if(DiceVals[i] == 4){ |
| ashi31 | 0:7d8ffdfdb16e | 127 | return 1000; |
| ashi31 | 0:7d8ffdfdb16e | 128 | } |
| ashi31 | 0:7d8ffdfdb16e | 129 | } |
| ashi31 | 0:7d8ffdfdb16e | 130 | |
| ashi31 | 0:7d8ffdfdb16e | 131 | //check trips |
| ashi31 | 0:7d8ffdfdb16e | 132 | if(tripCount == 1){ |
| ashi31 | 0:7d8ffdfdb16e | 133 | if(DiceVals[0] == 3){ |
| ashi31 | 0:7d8ffdfdb16e | 134 | return 1000; |
| ashi31 | 0:7d8ffdfdb16e | 135 | }else if(DiceVals[5] == 3){ |
| ashi31 | 0:7d8ffdfdb16e | 136 | return 600; |
| ashi31 | 0:7d8ffdfdb16e | 137 | } |
| ashi31 | 0:7d8ffdfdb16e | 138 | else if(DiceVals[4] == 3){ |
| ashi31 | 0:7d8ffdfdb16e | 139 | return 500; |
| ashi31 | 0:7d8ffdfdb16e | 140 | }else if(DiceVals[3] == 3){ |
| ashi31 | 0:7d8ffdfdb16e | 141 | return 400; |
| ashi31 | 0:7d8ffdfdb16e | 142 | }else if(DiceVals[2] == 3){ |
| ashi31 | 0:7d8ffdfdb16e | 143 | return 300; |
| ashi31 | 0:7d8ffdfdb16e | 144 | }else if(DiceVals[1] == 3){ |
| ashi31 | 0:7d8ffdfdb16e | 145 | return 200; |
| ashi31 | 0:7d8ffdfdb16e | 146 | } |
| ashi31 | 0:7d8ffdfdb16e | 147 | } |
| ashi31 | 0:7d8ffdfdb16e | 148 | |
| ashi31 | 0:7d8ffdfdb16e | 149 | //check 1 |
| ashi31 | 0:7d8ffdfdb16e | 150 | if(DiceVals[0] != 0){ |
| ashi31 | 0:7d8ffdfdb16e | 151 | return 100; |
| ashi31 | 0:7d8ffdfdb16e | 152 | } |
| ashi31 | 0:7d8ffdfdb16e | 153 | |
| ashi31 | 0:7d8ffdfdb16e | 154 | //check 5 |
| ashi31 | 0:7d8ffdfdb16e | 155 | if(DiceVals[4] != 0){ |
| ashi31 | 0:7d8ffdfdb16e | 156 | return 50; |
| ashi31 | 0:7d8ffdfdb16e | 157 | } |
| ashi31 | 0:7d8ffdfdb16e | 158 | |
| ashi31 | 0:7d8ffdfdb16e | 159 | farkles++; |
| ashi31 | 0:7d8ffdfdb16e | 160 | |
| ashi31 | 0:7d8ffdfdb16e | 161 | return 0; |
| ashi31 | 0:7d8ffdfdb16e | 162 | } |
| ashi31 | 0:7d8ffdfdb16e | 163 | |
| ashi31 | 0:7d8ffdfdb16e | 164 | void FarkleGame::updateScores(){ |
| ashi31 | 0:7d8ffdfdb16e | 165 | rollScore = calcScore(); |
| ashi31 | 0:7d8ffdfdb16e | 166 | turnScore += rollScore; |
| ashi31 | 0:7d8ffdfdb16e | 167 | if(farkles > 0){ |
| ashi31 | 0:7d8ffdfdb16e | 168 | turnScore = 0; |
| ashi31 | 0:7d8ffdfdb16e | 169 | } |
| ashi31 | 0:7d8ffdfdb16e | 170 | } |
| ashi31 | 0:7d8ffdfdb16e | 171 | |
| ashi31 | 0:7d8ffdfdb16e | 172 | void FarkleGame::dispFarkle(uLCD_4DGL& scr){ |
| ashi31 | 0:7d8ffdfdb16e | 173 | scr.text_width(2); |
| ashi31 | 0:7d8ffdfdb16e | 174 | scr.text_height(2); |
| ashi31 | 0:7d8ffdfdb16e | 175 | scr.locate(0,6); |
| ashi31 | 0:7d8ffdfdb16e | 176 | |
| ashi31 | 0:7d8ffdfdb16e | 177 | scr.printf("FARKLE!"); |
| ashi31 | 0:7d8ffdfdb16e | 178 | } |
| ashi31 | 0:7d8ffdfdb16e | 179 | |
| ashi31 | 0:7d8ffdfdb16e | 180 | void FarkleGame::dispScore(uLCD_4DGL& scr){ |
| ashi31 | 0:7d8ffdfdb16e | 181 | scr.text_width(1); |
| ashi31 | 0:7d8ffdfdb16e | 182 | scr.text_height(1); |
| ashi31 | 0:7d8ffdfdb16e | 183 | scr.locate(0,11); |
| ashi31 | 0:7d8ffdfdb16e | 184 | |
| ashi31 | 0:7d8ffdfdb16e | 185 | scr.printf("\nThis Turn: %d\n", turnScore); |
| ashi31 | 0:7d8ffdfdb16e | 186 | scr.printf("\nThis Roll: %d\n", rollScore); |
| ashi31 | 0:7d8ffdfdb16e | 187 | //scr.printf("Val Counts: %d %d %d %d %d %d", DiceVals[0], DiceVals[1], DiceVals[2], DiceVals[3], DiceVals[4], DiceVals[5]); |
| ashi31 | 0:7d8ffdfdb16e | 188 | } |
| ashi31 | 0:7d8ffdfdb16e | 189 | |
| ashi31 | 0:7d8ffdfdb16e | 190 | void FarkleGame::dispTurn(uLCD_4DGL& scr){ |
| ashi31 | 0:7d8ffdfdb16e | 191 | scr.cls(); |
| ashi31 | 0:7d8ffdfdb16e | 192 | scr.display_control(PORTRAIT); |
| ashi31 | 0:7d8ffdfdb16e | 193 | |
| ashi31 | 0:7d8ffdfdb16e | 194 | scr.text_width(2); |
| ashi31 | 0:7d8ffdfdb16e | 195 | scr.text_height(2); |
| ashi31 | 0:7d8ffdfdb16e | 196 | scr.locate(0,1); |
| ashi31 | 0:7d8ffdfdb16e | 197 | scr.printf("Your\n"); |
| ashi31 | 0:7d8ffdfdb16e | 198 | scr.printf("Turn\n"); |
| ashi31 | 0:7d8ffdfdb16e | 199 | scr.printf("Score\n"); |
| ashi31 | 0:7d8ffdfdb16e | 200 | scr.printf("-----\n"); |
| ashi31 | 0:7d8ffdfdb16e | 201 | scr.printf("%d\n", turnScore); |
| ashi31 | 0:7d8ffdfdb16e | 202 | } |
| ashi31 | 0:7d8ffdfdb16e | 203 | |
| ashi31 | 0:7d8ffdfdb16e | 204 | void FarkleGame::scrnWipe(uLCD_4DGL& scr){ |
| ashi31 | 0:7d8ffdfdb16e | 205 | scr.cls(); |
| ashi31 | 0:7d8ffdfdb16e | 206 | } |
| ashi31 | 0:7d8ffdfdb16e | 207 | |
| ashi31 | 0:7d8ffdfdb16e | 208 | bool FarkleGame::checkRoll(MMA8452& a){ |
| ashi31 | 0:7d8ffdfdb16e | 209 | double x = 0; |
| ashi31 | 0:7d8ffdfdb16e | 210 | double y = 0; |
| ashi31 | 0:7d8ffdfdb16e | 211 | double z = 0; |
| ashi31 | 0:7d8ffdfdb16e | 212 | |
| ashi31 | 0:7d8ffdfdb16e | 213 | a.readXYZGravity(&x,&y,&z); |
| ashi31 | 0:7d8ffdfdb16e | 214 | |
| ashi31 | 0:7d8ffdfdb16e | 215 | return (x > 0.5 || x < -0.5 || y > 0.5 || y < -0.5); |
| ashi31 | 0:7d8ffdfdb16e | 216 | } |
| ashi31 | 0:7d8ffdfdb16e | 217 | |
| ashi31 | 0:7d8ffdfdb16e | 218 | //S&G |
| ashi31 | 0:7d8ffdfdb16e | 219 | void FarkleGame::setDieVal(int pos, int v){ |
| ashi31 | 0:7d8ffdfdb16e | 220 | Dice[pos-1].setVal(v); |
| ashi31 | 0:7d8ffdfdb16e | 221 | } |
| ashi31 | 0:7d8ffdfdb16e | 222 | |
| ashi31 | 0:7d8ffdfdb16e | 223 | int FarkleGame::getDieVal(int pos){ |
| ashi31 | 0:7d8ffdfdb16e | 224 | return Dice[pos-1].getVal(); |
| ashi31 | 0:7d8ffdfdb16e | 225 | } |