2036 mbed lab4
Dependencies: 4DGL-uLCD-SE PinDetect
Diff: FarkleGame.cc
- Revision:
- 0:bbda88bee65a
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/FarkleGame.cc Mon Mar 28 18:44:30 2022 +0000 @@ -0,0 +1,279 @@ +#include "mbed.h" +#define WHITE 0xFFFFFF +#include <stdlib.h> +#include <time.h> +#include "PinDetect.h" +#define NUM_DICE 6 +#include "FarkleGame.h" + +#include "uLCD_4DGL.h" + +extern uLCD_4DGL uLCD; +void FarkleGame::changeDieArray() +{ + int rollable=0;//keep track of how many dice are in a rollable state + + for(int i=0; i<6; i++) { //determine which die are rollable and increment + if(arr[i].getCurrDieState()==ROLL) { + rollable+=1; + } + } + if(rollable==6) { //these next if statements change the number of rollable die based on how many are currently rollable + for(int i=0; i<6; i++) { + (arr[i].setCurrDieState(REMOVED)); + } + } else if(rollable==5) + for(int i=0; i<6; i++) { + if(arr[i].getCurrDieState()==REMOVED) { + arr[i].setCurrDieState(ROLL); + } + } else if(rollable==4) + for(int i=0; i<6; i++) { + if(arr[i].getCurrDieState()==REMOVED) { + arr[i].setCurrDieState(ROLL); + break; + } + } else if(rollable==3) + for(int i=0; i<6; i++) { + if(arr[i].getCurrDieState()==REMOVED) { + arr[i].setCurrDieState(ROLL); + break; + } + } else if(rollable==2) + for(int i=0; i<6; i++) { + if(arr[i].getCurrDieState()==REMOVED) { + arr[i].setCurrDieState(ROLL); + break; + } + } else if(rollable==1) + for(int i=0; i<6; i++) { + if(arr[i].getCurrDieState()==REMOVED) { + arr[i].setCurrDieState(ROLL); + break; + } + } else if(rollable==0) + for(int i=0; i<6; i++) { + if(arr[i].getCurrDieState()==REMOVED) { + arr[i].setCurrDieState(ROLL); + break; + } + } + + + +} + +void FarkleGame::printScore() //print score function +{ + uLCD.display_control(LANDSCAPE); + uLCD.text_width(2); + uLCD.text_height(2); + uLCD.locate(0,1); + uLCD.printf("Your\n"); + uLCD.printf("Turn\n"); + uLCD.printf("Score\n"); + uLCD.printf("------"); + uLCD.printf("\n%d", score); +} +Die* FarkleGame::getDieArray()//getter for die array +{ + return arr; +} + +int FarkleGame::calcScore(int *numarray) +{ + int rollScore=0;//initialize rollScore to zero + for(int i=1; i<7; i++) { + 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 + rollScore += 3000; + numarray[i]=0; + for(int idx=0; i<6; i++) { + arr[idx].setCurrDieState(REMOVED);//if the dice in the array are part of the score, remove them + } + } + if (numarray[i] == 5) { + rollScore += 2000; + numarray[i]=0; + for(int idx=0; i<6; i++) { + if(arr[idx].getValue()==i) { + arr[idx].setCurrDieState(REMOVED); + } + } + } + if (numarray[i] == 4) { + rollScore += 1000; + numarray[i]=0; + for(int idx=0; idx<6; idx++) { + if(arr[idx].getValue()==i) { + arr[idx].setCurrDieState(REMOVED); + } + } + } + } + int pairCounter=0;//need to count how many pairs and triples + int tripCounter=0; + int flushCounter=0; + for(int i=1; i<7; i++) {//iterate to find pairs and triples + + if (numarray[i] == 3) { + tripCounter+=1; + } + if (tripCounter==2) { + rollScore+=2500; + tripCounter=0; + for(int i=0; i<7; i++) {//this function removes dice that score and resets so dice in triples don't score twice + if(numarray[i]==3) { + numarray[i]=0; + for(int idx=0; idx<6; idx++) { + if(arr[idx].getValue()==i) { + arr[idx].setCurrDieState(REMOVED); + } + } + } + } + } + if (numarray[i] == 2) { + pairCounter+=1; + } + if (pairCounter==3) { + rollScore+=1500; + pairCounter=0; + for(int i=0; i<7; i++) {//extremely similar to the triple counter + if(numarray[i]==2) { + numarray[i]=0; + for(int idx=0; idx<6; idx++) { + if(arr[idx].getValue()==i) { + arr[idx].setCurrDieState(REMOVED); + } + } + } + } + } + if (numarray[i]==1) { + flushCounter+=1; + } + if (flushCounter==6) {//flush counter to determine if all parts of an array keeping track of numbers only have one number each + rollScore+=1500; //indicating one of each number was rolled (flush) + for(int idx=0; idx<6; idx++) { + arr[idx].setCurrDieState(REMOVED);//remove scoring die + } + flushCounter=0; + + + } + } + if(tripCounter==1) { + for(int idx=0; idx<7; idx++) { + if(numarray[idx]==3) {//if there is only one triple, we add the corresponding number of points + if(idx==1) { + rollScore+=1000; + for(int index=0; index<6; index++) { + if(arr[index].getValue()==idx) { + arr[index].setCurrDieState(REMOVED);//remove scoring die + } + } + } else { + rollScore+=idx*100; + for(int index=0; index<6; index++) { + if(arr[index].getValue()==idx) { + arr[index].setCurrDieState(REMOVED); + } + } + } + numarray[idx]=0; + } + } + } + if(pairCounter!=3) { + for(int idx=0; idx<7; idx++) { + if(idx==1) { + if(numarray[idx]==2) { + rollScore+=200;//if there are not three pairs, only add points for 1's and 5's + numarray[idx]=0; + for(int index=0; index<6; index++) { + if(arr[index].getValue()==idx) { + arr[index].setCurrDieState(REMOVED); + } + } + } + if(numarray[idx]==1) { + rollScore+=100; + numarray[idx]=0; + for(int index=0; index<6; index++) { + if(arr[index].getValue()==idx) { + arr[index].setCurrDieState(REMOVED); + } + } + } + + } + if(idx==5) { + if(numarray[idx]==2) { + rollScore+=100; + numarray[idx]=0; + for(int index=0; index<6; index++) { + if(arr[index].getValue()==idx) { + arr[index].setCurrDieState(REMOVED); + } + } + } + if(numarray[idx]==1) { + rollScore+=50; + numarray[idx]=0; + for(int index=0; index<6; index++) { + if(arr[index].getValue()==idx) { + arr[index].setCurrDieState(REMOVED); + } + } + } + + } + } + pairCounter=0; + } + return rollScore; +} + + + + + + + + + + + + + +int FarkleGame::getScore()//setter and getter for score +{ + return score; +} + +void FarkleGame::setScore(int num) +{ + score=num; +} +void FarkleGame::startGame() +{ + uLCD.cls(); + uLCD.display_control(LANDSCAPE); + uLCD.text_width(2); + uLCD.text_height(2); + uLCD.locate(0,1); + uLCD.printf("Shake\n"); + uLCD.printf("Board\n"); + uLCD.printf("------\n"); + uLCD.printf("To\n"); + uLCD.printf("Roll\n"); + int rolling=0; + for(int i=0; i<6; i++) { + 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 + rolling+=1; + } + } + uLCD.printf("%d", rolling); + uLCD.printf(" Dice"); +} +