Connect4 on the uLCD-144-G2
Overview
by Erin Deye and Elza Mathew
We implemented the popular strategy game, Connect Four on the Serial Miniature LCD module from 4D Systems. If you are new to the game you can read more about it on the Wikipedia page, http://en.wikipedia.org/wiki/Connect_Four or play it online here, http://www.coolmath-games.com/0-connectfour/ .Connect Four is a lot like traditional tic-tac-toe, except that you have to get four in a row.
Components used
uLCD-144-G2
We used the microLCD from 4D Systems for this project.
Instructions regarding how to hook up your miniature serial monitor to the mbed board can be found here, http://developer.mbed.org/users/4180_1/notebook/ulcd-144-g2-128-by-128-color-lcd/
Pushbuttons
We used 7 pushbuttons to signify each column of the 6*7 array. By hitting the pushbutton corresponding to a column, the player places his checker in the column he wishes to. Instructions regarding how to hook up the pushbuttons to the mbeb with example code can be found here, http://developer.mbed.org/users/4180_1/notebook/pushbuttons/
Pin Connections
Mbed | uLCD (cable) |
---|---|
5V | +5V |
P10 | RX |
P9 | TX |
GND | GND |
P11 | RES |
Mbed | Pushbuttons (1-7) |
---|---|
GND | GND |
P18 | PB1 |
P12 | PB2 |
P13 | PB3 |
P14 | PB4 |
P15 | PB5 |
P16 | PB6 |
P17 | PB7 |
Video
Code
main.cpp
#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"); } }
Import programConnectFour
Connect Four Mbed Game
Please log in to post comments.