Hangman game

Dependencies:   4DGL-uLCD-SE SDFileSystem mbed wave_player

Revision:
0:d55363159a7b
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/main.cpp	Tue Mar 15 21:53:35 2016 +0000
@@ -0,0 +1,494 @@
+#include "mbed.h"
+#include <string>
+#include "mbed.h"
+#include "uLCD_4DGL.h"
+#include <string>
+#include <ctype.h>
+#include "SDFileSystem.h"
+#include "wave_player.h"
+RawSerial  dev(p28,p27);//bluetooth
+SDFileSystem sd(p5, p6, p7, p8, "sd"); // the pinout on the mbed Cool Components workshop board
+AnalogOut DACout(p18);//speaker
+wave_player waver(&DACout);//wave player
+int x1=0;
+int y1=11;
+//nav switch class for joystick
+class Nav_Switch
+{
+public:
+    Nav_Switch(PinName up,PinName down,PinName left,PinName right,PinName fire);
+    int read();
+//boolean functions to test each switch
+    bool up();
+    bool down();
+    bool left();
+    bool right();
+    bool fire();
+    
+//automatic read on RHS
+    operator int ();
+//index to any switch array style
+    bool operator[](int index) {
+        return _pins[index];
+    };
+private:
+    BusIn _pins;
+ 
+};
+Nav_Switch::Nav_Switch (PinName up,PinName down,PinName left,PinName right,PinName fire):
+    _pins(up, down, left, right, fire)
+{
+    _pins.mode(PullUp); //needed if pullups not on board or a bare nav switch is used - delete otherwise
+    wait(0.001); //delays just a bit for pullups to pull inputs high
+}
+//sets up navigation switch
+inline bool Nav_Switch::up()
+{
+    
+    return !(_pins[0]);
+}
+inline bool Nav_Switch::down()
+{
+     
+    return !(_pins[1]);
+}
+inline bool Nav_Switch::left()
+{
+    
+    return !(_pins[2]);
+}
+inline bool Nav_Switch::right()
+{
+     
+    return !(_pins[3]);
+}
+inline bool Nav_Switch::fire()
+{
+     
+    return !(_pins[4]);
+}
+inline int Nav_Switch::read()
+{
+    return _pins.read();
+}
+inline Nav_Switch::operator int ()
+{
+    return _pins.read();
+}
+ 
+Nav_Switch myNav( p26, p23, p24, p22, p25); //pin order on Sparkfun breakout
+
+
+uLCD_4DGL uLCD(p9,p10,p11); // serial tx, serial rx, reset pin;
+int alphabet[26];
+int x=0;
+int category;
+int word; 
+string word1;//string  of word
+string category1;//category
+string words;
+string words1;
+int numletters=0;//num letters in the phrase/word
+char letter;
+string chosenLetters;//string of chosen letters
+int lives=6;//you get 6 lives
+
+
+//device receive. this is so the device receives instructions
+void dev_recv()
+{
+    
+    if(x>0&&x<3){
+        
+        
+        if(x==1){//x ==1 refers to phase 1 where you get category
+            
+            category=dev.getc();//used to get category
+            if(category==10)//this is to show end line
+            {
+             x=2;//move on to next phase
+             }
+             else{
+             category1=category1+char(category);//appends letter for category
+           
+          }
+
+         }
+            
+        
+        else//refers to phase 2 where you get the word/phase
+            {
+              
+                  
+            word=dev.getc();//gets word/phrase from device
+            if(word==10)//end line
+            {
+             x=3;
+             }
+             else{
+             word1=word1+char(word);//append characters
+        
+          }
+                  
+                  
+                  
+                  
+  
+                }
+            
+    }
+}
+//prints the sentence/word/phrase using _ 
+void printSentence()
+{
+    string space=" ";
+    numletters=word1.length();
+    for(int i=0;i<word1.length();i++)
+    {
+        
+        if(int(word1[i])!=32)
+        {
+        words=words+"_ ";
+        words1=words1+word1[i]+" ";
+
+        }
+        else
+        {
+            words=words+"\n";
+            words1=words1+"\n";
+            numletters--;//if space, decrease num letters
+            }
+        
+        //words1=words1+word1[i]+" ";
+        }
+        uLCD.locate(0,3);
+        uLCD.printf("%s",words);
+
+    }
+
+//this is if you win
+void youWon()
+{
+    uLCD.cls();
+    uLCD.printf("You Win! \n");
+    uLCD.printf("The word/phrase \nwas:\n%s",word1);
+    mkdir("/sd/mydir", 0777);
+    
+    FILE *fp = fopen("/sd/win.wav", "r");
+    if(fp == NULL) {
+        error("Could not open file for write\n");
+    }
+    //fprintf(fp, "Hello fun SD Card World!");
+    waver.play(fp);
+    fclose(fp); 
+    while(1)
+    {
+        wait(.1);
+        }
+    }
+    //this is if you lose
+    void youLose()
+    {
+    uLCD.cls();
+    uLCD.printf("You Lose! \n");
+    uLCD.printf("The word/phrase \nwas:\n%s",word1);
+    mkdir("/sd/mydir", 0777);
+    
+    FILE *fp = fopen("/sd/lose.wav", "r");
+    if(fp == NULL) {
+        error("Could not open file for write\n");
+    }
+    //fprintf(fp, "Hello fun SD Card World!");
+    waver.play(fp);
+    fclose(fp); 
+    while(1)
+    {
+        wait(.1);
+        }
+    
+        }
+        
+//draws hangman. draws more parts depending on number lives left
+void drawHangman()
+{
+ 
+uLCD.line(93, 127, 127, 127, 0xFF0000);
+uLCD.line(103, 127, 103, 90, 0xFF0000);
+uLCD.line(103, 90, 115, 90, 0xFF0000);
+uLCD.line(115, 90, 115, 94, 0xFF0000);
+if(lives==5){
+uLCD.circle(115, 99, 5, RED);uLCD.circle(115, 99, 5, RED);}//head
+else if(lives==4){
+ uLCD.line(115, 104, 115, 119, 0xFF0000);}//body
+ else if(lives==3){
+ uLCD.line(107, 107, 115, 111, 0xFF0000);}//arm
+ else if(lives==2){
+ uLCD.line(123, 107, 115, 111, 0xFF0000);}//arm2
+ else if(lives==1){
+uLCD.line(107, 125, 115, 119, 0xFF0000);}//leg
+else if(lives==0){
+ uLCD.line(123, 125, 115, 119, 0xFF0000);//leg2
+ youLose();//calls youlose if you lost
+ }
+    }
+
+//this is when the person chooses a letter.  
+void chooseLetter(char y)
+{           //puts the letter in the alphabet array equal to a space so we know it has been used
+            if(y1==11){
+            alphabet[(y1-11)*x1+x1]=32;
+            }
+         else{
+             alphabet[(y1-12)*x1+x1+13]=32;
+             }
+             
+    
+    bool isThere=false;//checks if the letter is there
+    for(int i=0;i<words1.length();i++)
+    {
+        
+        if(int(y)==tolower(int(words1[i])))//changes letters to lower case
+        {
+            isThere=true;
+            numletters--;
+            words[i]=words1[i];
+            
+            }
+            
+        
+        }
+                uLCD.locate(0,3);
+        uLCD.printf("%s",words);//prints _ for each letter now with filled in letters
+        if(numletters==0)
+        {
+           youWon();//if no more letters, you win
+        }
+        chosenLetters= chosenLetters+y;//this is the list of letters you already chose 
+    //this is for setting up the already chosen list
+    uLCD.locate(0,14);
+    int yc=14;
+    for(int i=0;i<chosenLetters.length();i++)
+    {
+        
+    if(i>12)
+    {
+        yc=15;
+    }
+        
+    uLCD.locate((i%13),yc);
+    uLCD.printf("%c",chosenLetters[i]);//prints out letters you already chose
+    
+}
+if(isThere==false)//if the letter isnt there, lose a life, redraw hangman
+{lives--;
+ drawHangman();
+ 
+}
+            //this puts the white space on a different letter
+            if(x1==12){
+                x1=0;
+                if(y1==11){
+                y1=12;}
+                else
+                    y1=11;
+                }
+            else {
+                x1++;}
+                
+
+   
+    }
+    
+
+//this sets the joystick movement up
+void joystick()
+{
+        int i;
+      
+        i = ~(myNav); //update leds with nav switch direction inputs
+        i=i+32;
+        
+        //this makes the chosen letter up
+        if(i==1)
+        {
+            if(y1==12)
+                y1=11;
+            else
+                y1=12;
+                
+            }
+            
+            
+        //goes down
+        else if(i==2)
+        {
+            if(y1==11)
+                y1=12;
+            else
+                y1=11;
+            
+            }
+        //goes left
+        else if(i==4)
+        {
+            if(x1==0){
+                x1=12;
+                }
+            else{
+                x1--;
+            }
+
+                
+            }
+        //goes right
+        else if(i==8)
+        {
+            if(x1==12)
+                x1=0;
+            else 
+                x1++;
+
+        }
+        //select letter
+        else if(i==16)
+        {
+                //following code basically to choose if you will check if the letter is there or not(if you already chose the letter before, you cant choose again)
+                uLCD.locate(0,10);
+                
+    uLCD.color(WHITE);
+    bool done=true;
+    int choose;
+    if(chosenLetters.length()>0){
+    for(int i=0;i<chosenLetters.length();i++){
+        if(y1==11){
+            choose=(y1-11)*x1+x1+97;
+                if(char((y1-11)*x1+x1+97)==chosenLetters[i])
+                {    
+                     done=false;
+                    }
+                    
+                    }
+        else
+            {
+            choose=(y1-12)*x1+x1+97+13;
+            if(char((y1-12)*x1+x1+97+13)==chosenLetters[i])
+                {
+                    done=false;}
+            }
+            }
+            if(done)
+            {
+                chooseLetter(char(choose));
+            }
+                
+      }      
+        else
+        {
+            if(y1==11)
+            chooseLetter(char((y1-11)*x1+x1+97));
+            else
+             chooseLetter(char((y1-11)*x1+x1+97+13));
+            }
+            }
+            
+        uLCD.locate(0,0);
+
+        wait(0.05);
+        
+}
+//this draws the letters that you can choose from and letters chosen
+void drawLetters()
+{ 
+    //sets up location 
+    uLCD.locate(0,10);
+    uLCD.printf("Choose one:");
+    uLCD.locate(0,13);
+    uLCD.printf("Chosen:");
+    uLCD.locate(0,11);
+    
+    int ya=11;
+        for(int i=0;i<26;i++)
+    {
+        
+    if(i>12)
+    {
+        ya=12;
+    }
+    //makes background black and letter white if not chosen
+    if(ya==y1&&((i%13)==x1)){
+    uLCD.textbackground_color(WHITE);
+    uLCD.color(BLACK);
+    }
+    //makes background white and letter black if chosen
+    else
+    {
+        uLCD.textbackground_color(BLACK);
+         uLCD.color(WHITE);
+        }
+    //prints the alphabet
+    uLCD.locate((i%13),ya);
+    uLCD.printf("%c",alphabet[i]);
+            uLCD.textbackground_color(BLACK);
+         uLCD.color(WHITE);
+    }
+
+    }
+int main()
+{
+    //clears screan
+uLCD.cls();
+       
+        
+    uLCD.color(WHITE);
+    for(int i=0;i<26;i++)
+    {
+        alphabet[i]=i+97;
+        }
+
+
+    uLCD.baudrate(3000000); //jack up baud rate to max for fast display
+    
+    dev.baud(9600); 
+    dev.attach(&dev_recv, Serial::RxIrq);
+    //tells player with mbed to start game
+    uLCD.printf("You are now starting a game of Hangman. Your friend is choosing a category and phrase");
+    x=1;
+   //tells player with device to start game
+    dev.printf("You are now starting a game of Hangman with your friend \n");
+    wait(.1);
+    //tells player with device to choose category
+    dev.printf("Please enter a category and press enter");
+     
+      //phase 1(choose category) waiting
+    while((x==1)){
+        wait(.1);
+        }
+        
+        //clear lcd
+     uLCD.cls();
+     //draw hangman
+      drawHangman();
+    uLCD.printf("Category/Hint:\n%s",category1);
+    //tells player with device to choose word/phrase
+    dev.printf("Please enter a word/phrase and press enter");
+
+   
+    //phase 2(choose word) 
+    while(x==2) {
+   wait(.1);     
+    }
+    //print sentence
+    printSentence();
+    //loop
+    while(1){
+    
+    //draws letters 
+    drawLetters();
+        //check joystick
+    joystick();
+    }
+    //chooseLetter('a');
+    //joystick();
+
+     
+}