A Card Matching Game using uLCD and Touchpad
Dependencies: 4DGL-uLCD-SE mbed-rtos mbed
Diff: match.cpp
- Revision:
- 0:d77e1909cdc7
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/match.cpp Wed Oct 22 00:12:42 2014 +0000 @@ -0,0 +1,360 @@ +#include "mbed.h" +//#include "cstdlib.h" +//#include "rtos.h" +#include "uLCD_4DGL.h" +#include <string> +#include <list> +#include <mpr121.h> + +#define YELLOW 0xFFFF00 +#define PURPLE 0x800080 +#define ORANGE 0xFFA500 +#define Color1 RED +#define Color2 BLUE +#define Color3 ORANGE +#define Color4 GREEN +#define Color5 PURPLE +#define Color6 YELLOW + + +uLCD_4DGL uLCD(p28, p27, p29); // create a global lcd object + +DigitalOut led1(LED1); +DigitalOut led2(LED2); +DigitalOut led3(LED3); +DigitalOut led4(LED4); + + +// Create the interrupt receiver object on pin 26 +InterruptIn interrupt(p26); + +// Setup the Serial to the PC for debugging +//Serial pc(USBTX, USBRX); + +// Setup the i2c bus on pins 28 and 27 +I2C i2c(p9, p10); + +// Setup the Mpr121: +// constructor(i2c object, i2c address of the mpr121) +Mpr121 mpr121(&i2c, Mpr121::ADD_VSS); + +volatile int keypress; + +void fallInterrupt() { + int key_code=0; + int i=0; + int value=mpr121.read(0x00); + value +=mpr121.read(0x01)<<8; + // LED demo mod by J. Hamblen + //pc.printf("MPR value: %x \r\n", value); + i=0; + // puts key number out to LEDs for demo + for (i=0; i<12; i++) { + if (((value>>i)&0x01)==1) key_code=i+1; + } + // led4=key_code & 0x01; + // led3=(key_code>>1) & 0x01; + // led2=(key_code>>2) & 0x01; + // led1=(key_code>>3) & 0x01; + keypress = key_code; + +} + + +typedef struct Card +{ + int Color; + int x; + int y; + int Matched; +}Card; + +typedef struct Deck +{ + Card Cards[12]; +}Deck; + + + +int Score1,Score2; +int Used[] = {255,255,255,255,255,255,255,255,255,255,255,255}; + +int RColor(){ + return rand()%16777215; +} + +void Print_Card(int x, int y, int Color){ + uLCD.filled_rectangle(x,y,x+15,y+20,Color); + uLCD.rectangle(x,y,x+15,y+20,DGREY); + //wait(.07); +} + + +void Shuffle(int count){ + for(int i = 0; i<count; i++){ + Print_Card(16,32,RColor()); + Print_Card(43,32,RColor()); + Print_Card(70,32,RColor()); + Print_Card(97,32,RColor()); + Print_Card(16,64,RColor()); + Print_Card(43,64,RColor()); + Print_Card(70,64,RColor()); + Print_Card(97,64,RColor()); + Print_Card(16,96,RColor()); + Print_Card(43,96,RColor()); + Print_Card(70,96,RColor()); + Print_Card(97,96,RColor()); + wait(.25); + } +} + +int ColorAssigner(int i){ + int color = (i%6)+1; + if(color == 6) return Color6; + if(color == 1) return Color1; + if(color == 2) return Color2; + if(color == 3) return Color3; + if(color == 4) return Color4; + if(color == 5) return Color5; + return BLACK; + } + + +void Setup(){ + Score1 = 0; + Score2 = 0; + uLCD.filled_rectangle(0,20,127,127,LGREY); + uLCD.filled_rectangle(0,0,127,19,DGREY); + uLCD.color(PURPLE); + uLCD.locate(1,0); + uLCD.printf("Turns = %d ", Score1); + uLCD.color(ORANGE); + uLCD.locate(1,1); + uLCD.printf("Matchs = %d ", Score2); + Shuffle((rand()%5)); + Shuffle(1); + Print_Card(16,32,LGREY); + Print_Card(43,32,LGREY); + Print_Card(70,32,LGREY); + Print_Card(97,32,LGREY); + Print_Card(16,64,LGREY); + Print_Card(43,64,LGREY); + Print_Card(70,64,LGREY); + Print_Card(97,64,LGREY); + Print_Card(16,96,LGREY); + Print_Card(43,96,LGREY); + Print_Card(70,96,LGREY); + Print_Card(97,96,LGREY); + +} + +void Update_Score(){ + uLCD.color(PURPLE); + uLCD.locate(1,0); + uLCD.printf("Turns = %d ", Score1); + uLCD.color(ORANGE); + uLCD.locate(1,1); + uLCD.printf("Matchs = %d ", Score2); +// uLCD.color(GREEN); +// uLCD.locate(1,4); +// uLCD.printf("Key Code %d ", keypress); +} + +volatile int count = 0; + +void Flush(){ + for(int i = 0; i<12; i++){ + Used[i] = 255; + } + srand(count); +} + +Deck Deal(Deck deck){ +int temp; +int tempc; +Flush(); +tempc = rand(); +//go = 1; + for(int i = 0; i<12; i++){ + srand(tempc*count); + tempc = tempc + rand(); + temp = rand()%12; + for(int k = i; k>=0; k--){ + if(temp == Used[k]){ + temp = rand()%12; + k = i; + } + } + Used[i] = temp; + } + for(int c = 0; c<12; c++){ + deck.Cards[c].Color = ColorAssigner(Used[c]+1); +// uLCD.color(RED); + // uLCD.locate(2,c+2); + // uLCD.printf( "%d",Used[c]+1 ); + // uLCD.color(BLUE); + //uLCD.locate(5,c+2); + //uLCD.printf( "%d",((Used[c]+1)%6)+1 ); + + + + } + deck.Cards[0].x = 16; + deck.Cards[0].y = 32; + deck.Cards[0].Matched = 0; + deck.Cards[1].x = 43; + deck.Cards[1].y = 32; + deck.Cards[1].Matched = 0; + deck.Cards[2].x = 70; + deck.Cards[2].y = 32; + deck.Cards[2].Matched = 0; + deck.Cards[3].x = 97; + deck.Cards[3].y = 32; + deck.Cards[3].Matched = 0; + deck.Cards[4].x = 16; + deck.Cards[4].y = 64; + deck.Cards[4].Matched = 0; + deck.Cards[5].x = 43; + deck.Cards[5].y = 64; + deck.Cards[5].Matched = 0; + deck.Cards[6].x = 70; + deck.Cards[6].y = 64; + deck.Cards[6].Matched = 0; + deck.Cards[7].x = 97; + deck.Cards[7].y = 64; + deck.Cards[7].Matched = 0; + deck.Cards[8].x = 16; + deck.Cards[8].y = 96; + deck.Cards[8].Matched = 0; + deck.Cards[9].x = 43; + deck.Cards[9].y = 96; + deck.Cards[9].Matched = 0; + deck.Cards[10].x = 70; + deck.Cards[10].y = 96; + deck.Cards[10].Matched = 0; + deck.Cards[11].x = 97; + deck.Cards[11].y = 96; + deck.Cards[11].Matched = 0; +return deck; +} + + +//Deck New_deck; + + +int main() { + + interrupt.fall(&fallInterrupt); + interrupt.mode(PullUp); + uLCD.baudrate(3000000); + + + int Turn = 0; + int Reset = 0; + Deck deck; + int showing = 0; + int show1 = 0; + int show2 = 0; + int tempress = 0; + while(1) { + + if(Turn == 0 | Reset == 1){ + + Setup(); + Turn =0; + } + if(Turn == 0){ + + deck = Deal(deck); + Turn++; + } + + if (Score2 == 6 and keypress != 0) {count=count+Turn; Turn = 0; Score2 = 0;} + if (Score2 <6){ + Score1 = Turn; + Update_Score(); + // if(Turn == 5){ + // for(int i = 0; i < 12; i++){ + // if(deck.Cards[0].Matched == 0){ + // Print_Card(deck.Cards[i].x,deck.Cards[i].y,deck.Cards[i].Color); + + // } + // }wait(3);} + + // uLCD.color(PURPLE); + // uLCD.locate(1,14); +//uLCD.printf("%d,%d,%d,%d,%d,%d,%d,%d,%d,%d,%d,%d", Used[0],Used[1],Used[2],Used[3],Used[4],Used[5],Used[6],Used[7],Used[8],Used[9],Used[10],Used[11]); + //while(1); +//Score2 = Turn/3; + + /* uLCD.color(GREEN); + uLCD.locate(1,7); + uLCD.printf( "%d", showing); + // wait(.5); + uLCD.locate(1,8); + uLCD.printf( "%d", show1); + // wait(.5); + uLCD.locate(1,9); + uLCD.printf( "%d", show2); + // wait(.5); */ + /* uLCD.color(GREEN); + uLCD.locate(1,11); + uLCD.printf( "show 1 %d",show1 ); + uLCD.locate(1,12); + uLCD.printf( "show 2 %d",show2 ); + uLCD.locate(1,13); + uLCD.printf( "showing %d",showing ); + uLCD.locate(1,10); + uLCD.printf( "Key %d",keypress ); + uLCD.locate(1,9); + uLCD.printf( "Last Key %d",tempress ); + */ + + + + if(showing < 2 and tempress != keypress){ + if(keypress !=0 ){ + if(deck.Cards[keypress-1].Matched == 0){ + if (show1 != keypress){ + Print_Card(deck.Cards[keypress-1].x,deck.Cards[keypress-1].y,deck.Cards[keypress-1].Color); + showing++; + if(show1 != 0 ) show2 = keypress; + if(show1 == 0 )show1 = keypress; + Update_Score(); + } + } + } + } + + + + // Update_Score(); + if(showing == 2){ + wait(.3); + if(deck.Cards[show1-1].Color == deck.Cards[show2-1].Color){ + deck.Cards[show1-1].Matched = 1; + deck.Cards[show2-1].Matched = 1; + Print_Card(deck.Cards[show1-1].x,deck.Cards[show1-1].y,DGREY); + wait(.1); + Print_Card(deck.Cards[show2-1].x,deck.Cards[show2-1].y,DGREY); + Score2++; + }else{ + Print_Card(deck.Cards[show1-1].x,deck.Cards[show1-1].y,LGREY); + wait(.1); + Print_Card(deck.Cards[show2-1].x,deck.Cards[show2-1].y,LGREY); + } + show1 = 0; + show2 = 0; + showing = 0; + Turn++; + Update_Score(); + wait(.3); + } + + //if(Turn== 25)Turn=0; + //uLCD.filled_rectangle(4,4,19,24,DGREY); + tempress=keypress; + count++; + }else Shuffle(rand()%3); + } +}