2036 mbed lab4
Dependencies: 4DGL-uLCD-SE PinDetect
FarkleGame.cc@0:bbda88bee65a, 2022-03-28 (annotated)
- Committer:
- lhanks02
- Date:
- Mon Mar 28 18:44:30 2022 +0000
- Revision:
- 0:bbda88bee65a
lab4
Who changed what in which revision?
User | Revision | Line number | New contents of line |
---|---|---|---|
lhanks02 | 0:bbda88bee65a | 1 | #include "mbed.h" |
lhanks02 | 0:bbda88bee65a | 2 | #define WHITE 0xFFFFFF |
lhanks02 | 0:bbda88bee65a | 3 | #include <stdlib.h> |
lhanks02 | 0:bbda88bee65a | 4 | #include <time.h> |
lhanks02 | 0:bbda88bee65a | 5 | #include "PinDetect.h" |
lhanks02 | 0:bbda88bee65a | 6 | #define NUM_DICE 6 |
lhanks02 | 0:bbda88bee65a | 7 | #include "FarkleGame.h" |
lhanks02 | 0:bbda88bee65a | 8 | |
lhanks02 | 0:bbda88bee65a | 9 | #include "uLCD_4DGL.h" |
lhanks02 | 0:bbda88bee65a | 10 | |
lhanks02 | 0:bbda88bee65a | 11 | extern uLCD_4DGL uLCD; |
lhanks02 | 0:bbda88bee65a | 12 | void FarkleGame::changeDieArray() |
lhanks02 | 0:bbda88bee65a | 13 | { |
lhanks02 | 0:bbda88bee65a | 14 | int rollable=0;//keep track of how many dice are in a rollable state |
lhanks02 | 0:bbda88bee65a | 15 | |
lhanks02 | 0:bbda88bee65a | 16 | for(int i=0; i<6; i++) { //determine which die are rollable and increment |
lhanks02 | 0:bbda88bee65a | 17 | if(arr[i].getCurrDieState()==ROLL) { |
lhanks02 | 0:bbda88bee65a | 18 | rollable+=1; |
lhanks02 | 0:bbda88bee65a | 19 | } |
lhanks02 | 0:bbda88bee65a | 20 | } |
lhanks02 | 0:bbda88bee65a | 21 | if(rollable==6) { //these next if statements change the number of rollable die based on how many are currently rollable |
lhanks02 | 0:bbda88bee65a | 22 | for(int i=0; i<6; i++) { |
lhanks02 | 0:bbda88bee65a | 23 | (arr[i].setCurrDieState(REMOVED)); |
lhanks02 | 0:bbda88bee65a | 24 | } |
lhanks02 | 0:bbda88bee65a | 25 | } else if(rollable==5) |
lhanks02 | 0:bbda88bee65a | 26 | for(int i=0; i<6; i++) { |
lhanks02 | 0:bbda88bee65a | 27 | if(arr[i].getCurrDieState()==REMOVED) { |
lhanks02 | 0:bbda88bee65a | 28 | arr[i].setCurrDieState(ROLL); |
lhanks02 | 0:bbda88bee65a | 29 | } |
lhanks02 | 0:bbda88bee65a | 30 | } else if(rollable==4) |
lhanks02 | 0:bbda88bee65a | 31 | for(int i=0; i<6; i++) { |
lhanks02 | 0:bbda88bee65a | 32 | if(arr[i].getCurrDieState()==REMOVED) { |
lhanks02 | 0:bbda88bee65a | 33 | arr[i].setCurrDieState(ROLL); |
lhanks02 | 0:bbda88bee65a | 34 | break; |
lhanks02 | 0:bbda88bee65a | 35 | } |
lhanks02 | 0:bbda88bee65a | 36 | } else if(rollable==3) |
lhanks02 | 0:bbda88bee65a | 37 | for(int i=0; i<6; i++) { |
lhanks02 | 0:bbda88bee65a | 38 | if(arr[i].getCurrDieState()==REMOVED) { |
lhanks02 | 0:bbda88bee65a | 39 | arr[i].setCurrDieState(ROLL); |
lhanks02 | 0:bbda88bee65a | 40 | break; |
lhanks02 | 0:bbda88bee65a | 41 | } |
lhanks02 | 0:bbda88bee65a | 42 | } else if(rollable==2) |
lhanks02 | 0:bbda88bee65a | 43 | for(int i=0; i<6; i++) { |
lhanks02 | 0:bbda88bee65a | 44 | if(arr[i].getCurrDieState()==REMOVED) { |
lhanks02 | 0:bbda88bee65a | 45 | arr[i].setCurrDieState(ROLL); |
lhanks02 | 0:bbda88bee65a | 46 | break; |
lhanks02 | 0:bbda88bee65a | 47 | } |
lhanks02 | 0:bbda88bee65a | 48 | } else if(rollable==1) |
lhanks02 | 0:bbda88bee65a | 49 | for(int i=0; i<6; i++) { |
lhanks02 | 0:bbda88bee65a | 50 | if(arr[i].getCurrDieState()==REMOVED) { |
lhanks02 | 0:bbda88bee65a | 51 | arr[i].setCurrDieState(ROLL); |
lhanks02 | 0:bbda88bee65a | 52 | break; |
lhanks02 | 0:bbda88bee65a | 53 | } |
lhanks02 | 0:bbda88bee65a | 54 | } else if(rollable==0) |
lhanks02 | 0:bbda88bee65a | 55 | for(int i=0; i<6; i++) { |
lhanks02 | 0:bbda88bee65a | 56 | if(arr[i].getCurrDieState()==REMOVED) { |
lhanks02 | 0:bbda88bee65a | 57 | arr[i].setCurrDieState(ROLL); |
lhanks02 | 0:bbda88bee65a | 58 | break; |
lhanks02 | 0:bbda88bee65a | 59 | } |
lhanks02 | 0:bbda88bee65a | 60 | } |
lhanks02 | 0:bbda88bee65a | 61 | |
lhanks02 | 0:bbda88bee65a | 62 | |
lhanks02 | 0:bbda88bee65a | 63 | |
lhanks02 | 0:bbda88bee65a | 64 | } |
lhanks02 | 0:bbda88bee65a | 65 | |
lhanks02 | 0:bbda88bee65a | 66 | void FarkleGame::printScore() //print score function |
lhanks02 | 0:bbda88bee65a | 67 | { |
lhanks02 | 0:bbda88bee65a | 68 | uLCD.display_control(LANDSCAPE); |
lhanks02 | 0:bbda88bee65a | 69 | uLCD.text_width(2); |
lhanks02 | 0:bbda88bee65a | 70 | uLCD.text_height(2); |
lhanks02 | 0:bbda88bee65a | 71 | uLCD.locate(0,1); |
lhanks02 | 0:bbda88bee65a | 72 | uLCD.printf("Your\n"); |
lhanks02 | 0:bbda88bee65a | 73 | uLCD.printf("Turn\n"); |
lhanks02 | 0:bbda88bee65a | 74 | uLCD.printf("Score\n"); |
lhanks02 | 0:bbda88bee65a | 75 | uLCD.printf("------"); |
lhanks02 | 0:bbda88bee65a | 76 | uLCD.printf("\n%d", score); |
lhanks02 | 0:bbda88bee65a | 77 | } |
lhanks02 | 0:bbda88bee65a | 78 | Die* FarkleGame::getDieArray()//getter for die array |
lhanks02 | 0:bbda88bee65a | 79 | { |
lhanks02 | 0:bbda88bee65a | 80 | return arr; |
lhanks02 | 0:bbda88bee65a | 81 | } |
lhanks02 | 0:bbda88bee65a | 82 | |
lhanks02 | 0:bbda88bee65a | 83 | int FarkleGame::calcScore(int *numarray) |
lhanks02 | 0:bbda88bee65a | 84 | { |
lhanks02 | 0:bbda88bee65a | 85 | int rollScore=0;//initialize rollScore to zero |
lhanks02 | 0:bbda88bee65a | 86 | for(int i=1; i<7; i++) { |
lhanks02 | 0:bbda88bee65a | 87 | if (numarray[i] == 6) {//search for 6 of a kind, code is very similar for 5 and 4 of a kind except for point difference |
lhanks02 | 0:bbda88bee65a | 88 | rollScore += 3000; |
lhanks02 | 0:bbda88bee65a | 89 | numarray[i]=0; |
lhanks02 | 0:bbda88bee65a | 90 | for(int idx=0; i<6; i++) { |
lhanks02 | 0:bbda88bee65a | 91 | arr[idx].setCurrDieState(REMOVED);//if the dice in the array are part of the score, remove them |
lhanks02 | 0:bbda88bee65a | 92 | } |
lhanks02 | 0:bbda88bee65a | 93 | } |
lhanks02 | 0:bbda88bee65a | 94 | if (numarray[i] == 5) { |
lhanks02 | 0:bbda88bee65a | 95 | rollScore += 2000; |
lhanks02 | 0:bbda88bee65a | 96 | numarray[i]=0; |
lhanks02 | 0:bbda88bee65a | 97 | for(int idx=0; i<6; i++) { |
lhanks02 | 0:bbda88bee65a | 98 | if(arr[idx].getValue()==i) { |
lhanks02 | 0:bbda88bee65a | 99 | arr[idx].setCurrDieState(REMOVED); |
lhanks02 | 0:bbda88bee65a | 100 | } |
lhanks02 | 0:bbda88bee65a | 101 | } |
lhanks02 | 0:bbda88bee65a | 102 | } |
lhanks02 | 0:bbda88bee65a | 103 | if (numarray[i] == 4) { |
lhanks02 | 0:bbda88bee65a | 104 | rollScore += 1000; |
lhanks02 | 0:bbda88bee65a | 105 | numarray[i]=0; |
lhanks02 | 0:bbda88bee65a | 106 | for(int idx=0; idx<6; idx++) { |
lhanks02 | 0:bbda88bee65a | 107 | if(arr[idx].getValue()==i) { |
lhanks02 | 0:bbda88bee65a | 108 | arr[idx].setCurrDieState(REMOVED); |
lhanks02 | 0:bbda88bee65a | 109 | } |
lhanks02 | 0:bbda88bee65a | 110 | } |
lhanks02 | 0:bbda88bee65a | 111 | } |
lhanks02 | 0:bbda88bee65a | 112 | } |
lhanks02 | 0:bbda88bee65a | 113 | int pairCounter=0;//need to count how many pairs and triples |
lhanks02 | 0:bbda88bee65a | 114 | int tripCounter=0; |
lhanks02 | 0:bbda88bee65a | 115 | int flushCounter=0; |
lhanks02 | 0:bbda88bee65a | 116 | for(int i=1; i<7; i++) {//iterate to find pairs and triples |
lhanks02 | 0:bbda88bee65a | 117 | |
lhanks02 | 0:bbda88bee65a | 118 | if (numarray[i] == 3) { |
lhanks02 | 0:bbda88bee65a | 119 | tripCounter+=1; |
lhanks02 | 0:bbda88bee65a | 120 | } |
lhanks02 | 0:bbda88bee65a | 121 | if (tripCounter==2) { |
lhanks02 | 0:bbda88bee65a | 122 | rollScore+=2500; |
lhanks02 | 0:bbda88bee65a | 123 | tripCounter=0; |
lhanks02 | 0:bbda88bee65a | 124 | for(int i=0; i<7; i++) {//this function removes dice that score and resets so dice in triples don't score twice |
lhanks02 | 0:bbda88bee65a | 125 | if(numarray[i]==3) { |
lhanks02 | 0:bbda88bee65a | 126 | numarray[i]=0; |
lhanks02 | 0:bbda88bee65a | 127 | for(int idx=0; idx<6; idx++) { |
lhanks02 | 0:bbda88bee65a | 128 | if(arr[idx].getValue()==i) { |
lhanks02 | 0:bbda88bee65a | 129 | arr[idx].setCurrDieState(REMOVED); |
lhanks02 | 0:bbda88bee65a | 130 | } |
lhanks02 | 0:bbda88bee65a | 131 | } |
lhanks02 | 0:bbda88bee65a | 132 | } |
lhanks02 | 0:bbda88bee65a | 133 | } |
lhanks02 | 0:bbda88bee65a | 134 | } |
lhanks02 | 0:bbda88bee65a | 135 | if (numarray[i] == 2) { |
lhanks02 | 0:bbda88bee65a | 136 | pairCounter+=1; |
lhanks02 | 0:bbda88bee65a | 137 | } |
lhanks02 | 0:bbda88bee65a | 138 | if (pairCounter==3) { |
lhanks02 | 0:bbda88bee65a | 139 | rollScore+=1500; |
lhanks02 | 0:bbda88bee65a | 140 | pairCounter=0; |
lhanks02 | 0:bbda88bee65a | 141 | for(int i=0; i<7; i++) {//extremely similar to the triple counter |
lhanks02 | 0:bbda88bee65a | 142 | if(numarray[i]==2) { |
lhanks02 | 0:bbda88bee65a | 143 | numarray[i]=0; |
lhanks02 | 0:bbda88bee65a | 144 | for(int idx=0; idx<6; idx++) { |
lhanks02 | 0:bbda88bee65a | 145 | if(arr[idx].getValue()==i) { |
lhanks02 | 0:bbda88bee65a | 146 | arr[idx].setCurrDieState(REMOVED); |
lhanks02 | 0:bbda88bee65a | 147 | } |
lhanks02 | 0:bbda88bee65a | 148 | } |
lhanks02 | 0:bbda88bee65a | 149 | } |
lhanks02 | 0:bbda88bee65a | 150 | } |
lhanks02 | 0:bbda88bee65a | 151 | } |
lhanks02 | 0:bbda88bee65a | 152 | if (numarray[i]==1) { |
lhanks02 | 0:bbda88bee65a | 153 | flushCounter+=1; |
lhanks02 | 0:bbda88bee65a | 154 | } |
lhanks02 | 0:bbda88bee65a | 155 | if (flushCounter==6) {//flush counter to determine if all parts of an array keeping track of numbers only have one number each |
lhanks02 | 0:bbda88bee65a | 156 | rollScore+=1500; //indicating one of each number was rolled (flush) |
lhanks02 | 0:bbda88bee65a | 157 | for(int idx=0; idx<6; idx++) { |
lhanks02 | 0:bbda88bee65a | 158 | arr[idx].setCurrDieState(REMOVED);//remove scoring die |
lhanks02 | 0:bbda88bee65a | 159 | } |
lhanks02 | 0:bbda88bee65a | 160 | flushCounter=0; |
lhanks02 | 0:bbda88bee65a | 161 | |
lhanks02 | 0:bbda88bee65a | 162 | |
lhanks02 | 0:bbda88bee65a | 163 | } |
lhanks02 | 0:bbda88bee65a | 164 | } |
lhanks02 | 0:bbda88bee65a | 165 | if(tripCounter==1) { |
lhanks02 | 0:bbda88bee65a | 166 | for(int idx=0; idx<7; idx++) { |
lhanks02 | 0:bbda88bee65a | 167 | if(numarray[idx]==3) {//if there is only one triple, we add the corresponding number of points |
lhanks02 | 0:bbda88bee65a | 168 | if(idx==1) { |
lhanks02 | 0:bbda88bee65a | 169 | rollScore+=1000; |
lhanks02 | 0:bbda88bee65a | 170 | for(int index=0; index<6; index++) { |
lhanks02 | 0:bbda88bee65a | 171 | if(arr[index].getValue()==idx) { |
lhanks02 | 0:bbda88bee65a | 172 | arr[index].setCurrDieState(REMOVED);//remove scoring die |
lhanks02 | 0:bbda88bee65a | 173 | } |
lhanks02 | 0:bbda88bee65a | 174 | } |
lhanks02 | 0:bbda88bee65a | 175 | } else { |
lhanks02 | 0:bbda88bee65a | 176 | rollScore+=idx*100; |
lhanks02 | 0:bbda88bee65a | 177 | for(int index=0; index<6; index++) { |
lhanks02 | 0:bbda88bee65a | 178 | if(arr[index].getValue()==idx) { |
lhanks02 | 0:bbda88bee65a | 179 | arr[index].setCurrDieState(REMOVED); |
lhanks02 | 0:bbda88bee65a | 180 | } |
lhanks02 | 0:bbda88bee65a | 181 | } |
lhanks02 | 0:bbda88bee65a | 182 | } |
lhanks02 | 0:bbda88bee65a | 183 | numarray[idx]=0; |
lhanks02 | 0:bbda88bee65a | 184 | } |
lhanks02 | 0:bbda88bee65a | 185 | } |
lhanks02 | 0:bbda88bee65a | 186 | } |
lhanks02 | 0:bbda88bee65a | 187 | if(pairCounter!=3) { |
lhanks02 | 0:bbda88bee65a | 188 | for(int idx=0; idx<7; idx++) { |
lhanks02 | 0:bbda88bee65a | 189 | if(idx==1) { |
lhanks02 | 0:bbda88bee65a | 190 | if(numarray[idx]==2) { |
lhanks02 | 0:bbda88bee65a | 191 | rollScore+=200;//if there are not three pairs, only add points for 1's and 5's |
lhanks02 | 0:bbda88bee65a | 192 | numarray[idx]=0; |
lhanks02 | 0:bbda88bee65a | 193 | for(int index=0; index<6; index++) { |
lhanks02 | 0:bbda88bee65a | 194 | if(arr[index].getValue()==idx) { |
lhanks02 | 0:bbda88bee65a | 195 | arr[index].setCurrDieState(REMOVED); |
lhanks02 | 0:bbda88bee65a | 196 | } |
lhanks02 | 0:bbda88bee65a | 197 | } |
lhanks02 | 0:bbda88bee65a | 198 | } |
lhanks02 | 0:bbda88bee65a | 199 | if(numarray[idx]==1) { |
lhanks02 | 0:bbda88bee65a | 200 | rollScore+=100; |
lhanks02 | 0:bbda88bee65a | 201 | numarray[idx]=0; |
lhanks02 | 0:bbda88bee65a | 202 | for(int index=0; index<6; index++) { |
lhanks02 | 0:bbda88bee65a | 203 | if(arr[index].getValue()==idx) { |
lhanks02 | 0:bbda88bee65a | 204 | arr[index].setCurrDieState(REMOVED); |
lhanks02 | 0:bbda88bee65a | 205 | } |
lhanks02 | 0:bbda88bee65a | 206 | } |
lhanks02 | 0:bbda88bee65a | 207 | } |
lhanks02 | 0:bbda88bee65a | 208 | |
lhanks02 | 0:bbda88bee65a | 209 | } |
lhanks02 | 0:bbda88bee65a | 210 | if(idx==5) { |
lhanks02 | 0:bbda88bee65a | 211 | if(numarray[idx]==2) { |
lhanks02 | 0:bbda88bee65a | 212 | rollScore+=100; |
lhanks02 | 0:bbda88bee65a | 213 | numarray[idx]=0; |
lhanks02 | 0:bbda88bee65a | 214 | for(int index=0; index<6; index++) { |
lhanks02 | 0:bbda88bee65a | 215 | if(arr[index].getValue()==idx) { |
lhanks02 | 0:bbda88bee65a | 216 | arr[index].setCurrDieState(REMOVED); |
lhanks02 | 0:bbda88bee65a | 217 | } |
lhanks02 | 0:bbda88bee65a | 218 | } |
lhanks02 | 0:bbda88bee65a | 219 | } |
lhanks02 | 0:bbda88bee65a | 220 | if(numarray[idx]==1) { |
lhanks02 | 0:bbda88bee65a | 221 | rollScore+=50; |
lhanks02 | 0:bbda88bee65a | 222 | numarray[idx]=0; |
lhanks02 | 0:bbda88bee65a | 223 | for(int index=0; index<6; index++) { |
lhanks02 | 0:bbda88bee65a | 224 | if(arr[index].getValue()==idx) { |
lhanks02 | 0:bbda88bee65a | 225 | arr[index].setCurrDieState(REMOVED); |
lhanks02 | 0:bbda88bee65a | 226 | } |
lhanks02 | 0:bbda88bee65a | 227 | } |
lhanks02 | 0:bbda88bee65a | 228 | } |
lhanks02 | 0:bbda88bee65a | 229 | |
lhanks02 | 0:bbda88bee65a | 230 | } |
lhanks02 | 0:bbda88bee65a | 231 | } |
lhanks02 | 0:bbda88bee65a | 232 | pairCounter=0; |
lhanks02 | 0:bbda88bee65a | 233 | } |
lhanks02 | 0:bbda88bee65a | 234 | return rollScore; |
lhanks02 | 0:bbda88bee65a | 235 | } |
lhanks02 | 0:bbda88bee65a | 236 | |
lhanks02 | 0:bbda88bee65a | 237 | |
lhanks02 | 0:bbda88bee65a | 238 | |
lhanks02 | 0:bbda88bee65a | 239 | |
lhanks02 | 0:bbda88bee65a | 240 | |
lhanks02 | 0:bbda88bee65a | 241 | |
lhanks02 | 0:bbda88bee65a | 242 | |
lhanks02 | 0:bbda88bee65a | 243 | |
lhanks02 | 0:bbda88bee65a | 244 | |
lhanks02 | 0:bbda88bee65a | 245 | |
lhanks02 | 0:bbda88bee65a | 246 | |
lhanks02 | 0:bbda88bee65a | 247 | |
lhanks02 | 0:bbda88bee65a | 248 | |
lhanks02 | 0:bbda88bee65a | 249 | int FarkleGame::getScore()//setter and getter for score |
lhanks02 | 0:bbda88bee65a | 250 | { |
lhanks02 | 0:bbda88bee65a | 251 | return score; |
lhanks02 | 0:bbda88bee65a | 252 | } |
lhanks02 | 0:bbda88bee65a | 253 | |
lhanks02 | 0:bbda88bee65a | 254 | void FarkleGame::setScore(int num) |
lhanks02 | 0:bbda88bee65a | 255 | { |
lhanks02 | 0:bbda88bee65a | 256 | score=num; |
lhanks02 | 0:bbda88bee65a | 257 | } |
lhanks02 | 0:bbda88bee65a | 258 | void FarkleGame::startGame() |
lhanks02 | 0:bbda88bee65a | 259 | { |
lhanks02 | 0:bbda88bee65a | 260 | uLCD.cls(); |
lhanks02 | 0:bbda88bee65a | 261 | uLCD.display_control(LANDSCAPE); |
lhanks02 | 0:bbda88bee65a | 262 | uLCD.text_width(2); |
lhanks02 | 0:bbda88bee65a | 263 | uLCD.text_height(2); |
lhanks02 | 0:bbda88bee65a | 264 | uLCD.locate(0,1); |
lhanks02 | 0:bbda88bee65a | 265 | uLCD.printf("Shake\n"); |
lhanks02 | 0:bbda88bee65a | 266 | uLCD.printf("Board\n"); |
lhanks02 | 0:bbda88bee65a | 267 | uLCD.printf("------\n"); |
lhanks02 | 0:bbda88bee65a | 268 | uLCD.printf("To\n"); |
lhanks02 | 0:bbda88bee65a | 269 | uLCD.printf("Roll\n"); |
lhanks02 | 0:bbda88bee65a | 270 | int rolling=0; |
lhanks02 | 0:bbda88bee65a | 271 | for(int i=0; i<6; i++) { |
lhanks02 | 0:bbda88bee65a | 272 | if(arr[i].getCurrDieState()==ROLL) {//count how many die are in a rollable state and use that to display how many dice the user will roll |
lhanks02 | 0:bbda88bee65a | 273 | rolling+=1; |
lhanks02 | 0:bbda88bee65a | 274 | } |
lhanks02 | 0:bbda88bee65a | 275 | } |
lhanks02 | 0:bbda88bee65a | 276 | uLCD.printf("%d", rolling); |
lhanks02 | 0:bbda88bee65a | 277 | uLCD.printf(" Dice"); |
lhanks02 | 0:bbda88bee65a | 278 | } |
lhanks02 | 0:bbda88bee65a | 279 |