1 player Black jack for mbed
Dependencies: 4DGL-uLCD-SE PinDetect mbed
main.cpp
- Committer:
- jayvpoddar
- Date:
- 2015-03-12
- Revision:
- 0:d2e6b3ce6988
File content as of revision 0:d2e6b3ce6988:
#include "mbed.h" #include "uLCD_4DGL.h" #include <string> #define PURPLE 0x800080 #define ORANGE 0xFFA500 #include "deck.h" #include <mpr121.h> #include "PinDetect.h" uLCD_4DGL uLCD(p28, p27, p30); PinDetect pb1(p8); PinDetect pb2(p11); DigitalOut led1(LED1); DigitalOut led2(LED2); DigitalOut led3(LED3); DigitalOut led4(LED4); // Setup the i2c bus on pins 9 and 10 I2C i2c(p9, p10); // Setup the Mpr121: // constructor(i2c object, i2c address of the mpr121) Mpr121 mpr121(&i2c, Mpr121::ADD_VSS); //InterruptIn interrupt(p26); Deck gameDeck; Card playerHand[10]; Card dealerHand[10]; int playerCount=2; int dealerCount=2; bool isPlayer=true; int playerPoints; int dealerPoints; int money = 1000; int bet=100; int sumHand(Card[]); void printPoints(int points) { if(points>21) { uLCD.printf("Pts=bust"); } else { uLCD.printf("Pts=%d",points); } } void initialDeal() { playerCount=2; dealerCount=2; playerHand[0]= gameDeck.cards[0]; dealerHand[0]=gameDeck.cards[1]; playerHand[1] = gameDeck.cards[2]; dealerHand[1] = gameDeck.cards[3]; uLCD.locate(1,8); uLCD.printf("%s%s",playerHand[0].convertRank(),playerHand[0].convertSuit()); uLCD.locate(4,8); uLCD.printf("%s%s",playerHand[1].convertRank(),playerHand[1].convertSuit()); uLCD.locate(1,3); uLCD.printf("%s%s",dealerHand[0].convertRank(),dealerHand[1].convertSuit()); uLCD.locate(6,10); playerPoints = sumHand(playerHand); printPoints(playerPoints); } void hit() { if(isPlayer) { playerHand[playerCount]=gameDeck.cards[playerCount+dealerCount]; playerCount++; uLCD.locate((playerCount-1)*3+1,8); uLCD.printf("%s%s",playerHand[playerCount-1].convertRank(),playerHand[playerCount-1].convertSuit()); uLCD.locate(6,10); playerPoints = sumHand(playerHand); printPoints(playerPoints); wait(1); } else { dealerHand[dealerCount] = gameDeck.cards[playerCount+dealerCount]; dealerCount++; uLCD.locate((dealerCount-1)*3+1,3); uLCD.printf("%s%s",dealerHand[dealerCount-1].convertRank(),dealerHand[dealerCount-1].convertSuit()); uLCD.locate(6,6.5); dealerPoints = sumHand(dealerHand); printPoints(dealerPoints); wait(1); } } void getBet() { uLCD.cls(); uLCD.printf("How much will you bet?\n(10-500)"); int len=0; int amount=0; while(len<3) { int key=0; int i=0; int value=mpr121.read(0x00); value +=mpr121.read(0x01)<<8; // LED demo mod i=0; // puts key number out to LEDs for demo for (i=0; i<12; i++) { if (((value>>i)&0x01)==1) key=i+1; } if(key != 0 ) { if(key>10) { break; } else { len++; amount*=10; amount+=key-1; uLCD.printf("%d",key-1); wait(.25); } } } bet=max(min(amount,500),10); bet = min(bet,money); uLCD.printf("\nBet = %d",bet); } void setup() { uLCD.color(ORANGE); getBet(); uLCD.cls(); uLCD.locate(6,0.5); uLCD.printf("Dealer"); uLCD.locate(6,7.5); uLCD.printf("Player"); uLCD.filled_rectangle(0,112,127,148,DGREY); gameDeck.shuffleDeck(); initialDeal(); } // Callback routine is interrupt activated by a debounced pb1 hit void pb1_hit_callback (void) { hit(); } // Callback routine is interrupt activated by a debounced pb2 hit void pb2_hit_callback (void) { isPlayer=false; } void walletSize() { uLCD.cls(); uLCD.printf("NOTE:\nEnter input on pad followed by key 10\n\n"); uLCD.printf("top pushbutton is hit and bottom is stand"); wait(5); uLCD.cls(); uLCD.printf("How much will you start with?\n(1000-10000)"); int len=0; int amount=0; while(len<5) { int key=0; int i=0; int value=mpr121.read(0x00); value +=mpr121.read(0x01)<<8; // LED demo mod i=0; // puts key number out to LEDs for demo for (i=0; i<12; i++) { if (((value>>i)&0x01)==1) key=i+1; } if(key != 0 ) { if(key>10) { break; } else { len++; amount*=10; amount+=key-1; uLCD.printf("%d",key-1); wait(.25); } } } money=max(min(amount,50000),1000); uLCD.printf("\nWallet = %d",money); } void game(); int main() { pb1.mode(PullUp); pb2.mode(PullUp); // Delay for initial pullup to take effect wait(.01); // Setup Interrupt callback functions for a pb hit pb1.attach_deasserted(&pb1_hit_callback); pb2.attach_deasserted(&pb2_hit_callback); // Start sampling pb inputs using interrupts pb1.setSampleFrequency(); pb2.setSampleFrequency(); //uLCD.color(ORANGE); //uLCD.printf("How much money to play with?(minimum bet $10)"); walletSize(); game(); } int sumHand(Card[]); void result(int); void dealerTurn(); void game() { while(money>=100) { isPlayer = true; setup(); uLCD.locate(0,14); uLCD.printf("Cash=%d",money); uLCD.locate(10,14); uLCD.printf("Bet=%d",bet); while(isPlayer) { if(sumHand(playerHand)>21) { result(2); } } dealerTurn(); } while(1) { uLCD.cls(); uLCD.locate(3,7); uLCD.printf("GAME OVER"); wait(1); } } void result(int outcome) { uLCD.cls(); if(outcome == 0) { uLCD.locate(6,7); uLCD.printf("Player Won "); money += bet; } else if(outcome == 1) { uLCD.locate(6,7); uLCD.printf("Game Draw"); } else if(outcome == 2) { uLCD.locate(6,7); uLCD.printf("Player Lost "); money -=bet; } wait(1); game(); } void dealerTurn() { isPlayer = false; uLCD.locate(4,3); uLCD.printf("%s%s",dealerHand[1].convertRank(),dealerHand[1].convertSuit()); uLCD.locate(6,6.5); dealerPoints = sumHand(dealerHand); printPoints(dealerPoints); wait(1); while(dealerPoints<17) { hit(); } if(dealerPoints>21) { result(0); } else if(playerPoints>dealerPoints) { result(0); } else if(playerPoints<dealerPoints) { result(2); } else { result(1); } } int sumHand(Card hand[]) { int sum=0; int aces=0; int count= isPlayer? playerCount:dealerCount; for(int i=0; i<count; i++) { Card card = hand[i]; if(card._rank==1) { sum+=11; aces++; } else if(card._rank < 11) { sum+=card._rank; } else { sum+=10; } } if(sum>21) { if(aces>0) { if(isPlayer) { while(aces>0 && sum > 21) { sum-=10; aces--; } } else { if(sum>=27) { while(aces>0 && sum > 21) { sum-=10; aces--; } } } } } return sum; }