/* compile using: */
/* gcc ./connect4.c -o connect4 */
/* By: Michael K. Pellegrino */
/* Free for public use */
/* Just keep this heading */
#include <stdio.h>
static int board[9][8];
static int fullness[9];
int checkX(int r, int c)
{
int piece=board[r+1][c];
int count;
/* determine bounds */
int upper=r-2;
int lower=r+4;
int left=c-3;
int right=c+3;
if( upper<0 ) upper=0;
if( lower>5 ) lower=5;
if( left<0 ) left=0;
if( right>6 ) right=6;
int Top=upper;
int Bottom=lower;
int Left=left;
int Right=right;
/* check \ */
count=0;
{
int m=Left;
for(int i=Top;i<=Bottom;i++)
{
if( board[i][m++] == piece )
{
count++;
if( count== 4) return(piece);
}
else
{
count=0;
}
}
}
count=0;
/* check / */
int j=Bottom;
int k=Left;
for(int i=1; i<=4; i++ )
{
if( board[j--][k++] == piece )
{
count++;
if( count== 4) return(piece);
}
else
{
count=0;
}
}
count=0;
/* check | */
for( int i=r;i<=Bottom;i++ )
{
if( board[i][c] == piece )
{
count++;
if( count==4) return(piece);
}
else
{
count=0;
}
}
count=0;
/* check - */
for( int i=Left; i<=Right;i++ )
{
if( board[r][i] == piece )
{
count++;
if( count==4) return(piece);
}
else
{
count=0;
}
}
return(-1);
}
void showBoard()
{
char P;
printf( "\n\n\n\n---------------\n 1 2 3 4 5 6 7\n---------------\n" );
for( int r=0;r<6;r++)
{
for( int c=0;c<7;c++ )
{
switch( (int)board[r][c] )
{
case 0:
P=' ';
break;
case 1:
P='X';
break;
default:
P='O';
}
printf( "|%c",P );
}
printf( "|\n" );
}
printf( "---------------\n 1 2 3 4 5 6 7\n---------------\n" );
return;
}
int putPiece( int c, int p)
{
/* c = column, p = player */
if( c<0 || c>6 ) return(-1);
if( fullness[c] < 0 ) return(-1);
board[fullness[c]--][c]=p;
return 0;
}
void initBoard()
{
for( int r=0;r<6;r++)
{
for( int c=0;c<7;c++ )
{
board[r][c]=0;
}
}
return;
}
int main()
{
printf( "* ------------------------------------- *\n" );
printf( "* Connect-4 | By: Michael K. Pellegrino *\n" );
printf( "* *\n" );
printf( "* Play/Distrubute/Modify *\n" );
printf( "* Just keep this header *\n" );
printf( "* ------------------------------------- *\n" );
printf( "\n\n\nEnter Column Number or -1 to end game\n");
int move=0;
int turn=1;
int playing=1;
int w=0;
char again[5]={" "};
int a=1;
while( a )
{
move=0;
turn=1;
playing=1;
w=0;
/* init the board and fullness arrays */
for( int r=0;r<6;r++)
{
for( int c=0;c<7;c++ )
{
board[r][c]=0;
fullness[c]=5;
}
}
/* ------------------- */
while( playing )
{
showBoard();
printf( "Player %d:",turn );
scanf( "%d", &move );
if( move == -1 )
{
playing=0;
break;
}
if( putPiece( move-1, turn ) < 0 )
{
printf( "oops...\n" );
}
else
{
w=checkX(fullness[move-1],move-1);
turn++;
if( turn>2 ) turn=1;
}
if( w > 0 )
{
showBoard();
printf( "Player %d wins!!!!\n\n", w );
playing=0;
}
}
printf( "\n\nWould you like to play again? (y/n)\n" );
scanf( "%s", &again );
if( again[0]=='Y' || again[0]=='y' )
{
a=1;
}
else
{
return(0);
}
}
return(0);
}