Connect Four Mbed Game
Dependencies: 4DGL-uLCD-SE PinDetect mbed
main.cpp
- Committer:
- emathew92
- Date:
- 2014-10-22
- Revision:
- 0:b3a0e0ee149d
File content as of revision 0:b3a0e0ee149d:
#include "mbed.h" #include "PinDetect.h" #include "uLCD_4DGL.h" #define YELLOW 0xFFFF00 uLCD_4DGL uLCD(p9, p10, p11); DigitalOut myled(LED1); PinDetect pb1(p18); PinDetect pb2(p12); PinDetect pb3(p13); PinDetect pb4(p14); PinDetect pb5(p15); PinDetect pb6(p16); PinDetect pb7(p17); // Global column variable int volatile col_value=0; //Declaration of function that prints the coin on the board void print_coin(int column); //Declaration of function that prints the board on the uLCD void display_board(void); //Declaration of function that checks if we have a winner void check_winner(int, int); //Declaration of function that outputs the identity of the winner void display_winner(char); //Declaration of function that initializes the board - 2D array to a value of x void init_board(void); int player=0; int array_x=0; int array_y=0; int row_calc[7]; //holds the no of coins already dropped into a column int circle_x=0; int circle_y=0; char board[6][7];//2D array that stores the status of the board on every move int count=0; char check='x'; // Callback routine is interrupt activated by a debounced pb1 hit void pb1_hit_callback (void) { myled=!myled; col_value=1; } // Callback routine is interrupt activated by a debounced pb2 hit void pb2_hit_callback (void) { myled=!myled; col_value=2; } // Callback routine is interrupt activated by a debounced pb3 hit void pb3_hit_callback (void) { myled=!myled; col_value=3; } // Callback routine is interrupt activated by a debounced pb4 hit void pb4_hit_callback (void) { myled=!myled; col_value=4; } // Callback routine is interrupt activated by a debounced pb5 hit void pb5_hit_callback (void) { myled=!myled; col_value=5; } // Callback routine is interrupt activated by a debounced pb6 hit void pb6_hit_callback (void) { myled=!myled; col_value=6; } // Callback routine is interrupt activated by a debounced pb7 hit void pb7_hit_callback (void) { myled=!myled; col_value=7; } int main() { uLCD.baudrate(3000000); pb1.mode(PullUp); pb2.mode(PullUp); pb3.mode(PullUp); pb4.mode(PullUp); pb5.mode(PullUp); pb6.mode(PullUp); pb7.mode(PullUp); wait(0.04); // Setup Interrupt callback functions for a given pb hit pb1.attach_deasserted(&pb1_hit_callback); pb2.attach_deasserted(&pb2_hit_callback); pb3.attach_deasserted(&pb3_hit_callback); pb4.attach_deasserted(&pb4_hit_callback); pb5.attach_deasserted(&pb5_hit_callback); pb6.attach_deasserted(&pb6_hit_callback); pb7.attach_deasserted(&pb7_hit_callback); // Start sampling pb inputs using interrupts pb1.setSampleFrequency(); pb2.setSampleFrequency(); pb3.setSampleFrequency(); pb4.setSampleFrequency(); pb5.setSampleFrequency(); pb6.setSampleFrequency(); pb7.setSampleFrequency(); init_board(); display_board(); while(1) { print_coin(col_value); } } void init_board(void) { for(int i=0;i<6;i++) { for(int j=0;j<7;j++) { board[i][j]='x'; } } } void display_board(void) { uLCD.filled_rectangle(0, 0 , 128, 108, BLUE) ; for(int j=0; j<6; j++)//This loop will be executed for each row once { circle_y=9+j*18; for(int i=0; i<7; i++) //This loop will be executed 7 times for each row { circle_x=9+i*18; uLCD.filled_circle(circle_x, circle_y , 8, BLACK) ; } } } void print_coin(int column) { if(0<column && column<8) { circle_x=9+(column-1)*18; circle_y=(99-((row_calc[column-1])*18)); array_x=(5-(row_calc[column-1])); array_y=(column-1); if(player%2==0) { uLCD.filled_circle(circle_x, circle_y , 8, RED) ; board[array_x][array_y]='r';//check } else { uLCD.filled_circle(circle_x, circle_y , 8, YELLOW) ; board[array_x][array_y]='y';//check } row_calc[column-1]+=1; player++; check_winner(array_x,array_y); wait(5); } } void check_winner(int a, int b) { for(int i=0;i<4;i++) { if(board[a][i]==board[a][i+1] && board[a][i+1]==board[a][i+2] && board[a][i+2]==board[a][i+3]) { uLCD.locate(0,15); if(board[a][i]=='r' || board[a][i]=='y'){ uLCD.printf("row hit %c%c%c%c",board[a][i],board[a][i+1],board[a][i+2],board[a][i+3] ); display_winner(board[a][i]); while(1) { } } } } /* To check if we have 4 similar coins in a particular column*/ for(int i=0;i<3;i++) { if(board[i][b]==board[i+1][b] && board[i+1][b]==board[i+2][b] && board[i+2][b]==board[i+3][b]) { uLCD.locate(0,15); if(board[i][b]=='r' || board[i][b]=='y'){ uLCD.printf("col hit %c%c%c%c",board[i][b],board[i+1][b],board[i+2][b]==board[i+3][b] ); display_winner(board[i][b]); while(1) { } } } } //To check if we have 4 similar coins in the forward diagonal int left_bottom_x=a; int left_bottom_y=b; while(left_bottom_x<5 && left_bottom_y>0) { left_bottom_x++; left_bottom_y--; } while((((left_bottom_x)-3)>(-1)) && (((left_bottom_y)+3)<7)) { if((board[left_bottom_x][left_bottom_y]==board[left_bottom_x-1][left_bottom_y+1]) && (board[left_bottom_x][left_bottom_y]==board[left_bottom_x-2][left_bottom_y+2]) && (board[left_bottom_x][left_bottom_y]==board[left_bottom_x-3][left_bottom_y+3]) ) { if(board[left_bottom_x][left_bottom_y]=='r'||board[left_bottom_x][left_bottom_y]=='y'){ display_winner(board[left_bottom_x][left_bottom_y]); while(1) { } } } left_bottom_x--; left_bottom_y++; } //To check if we have 4 similar coins in the backward diagonal int right_bottom_x=a; int right_bottom_y=b; while((right_bottom_x<5) && (right_bottom_y<6)) { right_bottom_x++; right_bottom_y++; } while((((right_bottom_x)-3)>(-1)) && (((right_bottom_y)-3)>(-1))) { if((board[right_bottom_x][right_bottom_y]==board[right_bottom_x-1][right_bottom_y-1]) && (board[right_bottom_x][right_bottom_y]==board[right_bottom_x-2][right_bottom_y-2]) && (board[right_bottom_x][right_bottom_y]==board[right_bottom_x-3][right_bottom_y-3]) ) { uLCD.locate(0,15); if(board[right_bottom_x][right_bottom_y]=='r'||board[right_bottom_x][right_bottom_y]=='y'){ uLCD.printf("bdi hit %c%c%c%c",board[right_bottom_x][right_bottom_y],board[right_bottom_x-1][right_bottom_y-1],board[right_bottom_x-2][right_bottom_y-2],board[right_bottom_x-3][right_bottom_y-3] ); display_winner(board[right_bottom_x][right_bottom_y]); while(1) { } } } right_bottom_x--; right_bottom_y--; } } void display_winner(char a) { if(a=='r' || a=='y') { wait(2); uLCD.cls(); uLCD.locate(4,6); if(a=='r') uLCD.printf("RED WINS"); else uLCD.printf("YELLOW WINS"); } }