Code:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <conio.h>
#include <ctype.h>
#define BOARD_PTRS char *tl, char *tc, char *tr, char *ml,char *mc,char *mr,char *bl,char *bc,char *br
/*BOARD_PTS is to be used in function headers*/
#define BOARD tl,tc,tr,ml,mc,mr,bl,bc,br
/*BOARD is to be used when passing values to a function*/
#define PLAYER char ply1[20],char ply2[20]
/*PLAYER is to be used in function headers*/
#define PLAYERS ply1, ply2
/*PLAYERS is to be used when passing values to a function*/
/*Functions*/
void play_game(BOARD_PTRS,PLAYER);
char options (PLAYER);
void exit_game (void);
int win_condition(BOARD_PTRS);
void draw_grid(BOARD_PTRS);
void play1(BOARD_PTRS,char ply1[20]);
void play2(BOARD_PTRS,char ply2[20]);
int main(void)
{
int option = 0;
char *tl,*tc,*tr,*ml,*mc,*mr,*bl,*bc,*br;
char ply1[20] = "Player 1", ply2[20] = "Player 2";
char grid [3][3] = {{0,0,0},
{0,0,0},
{0,0,0}};
tl = &grid[0][0];
tc = &grid[1][0];
tr = &grid[2][0];
ml = &grid[0][1];
mc = &grid[1][1];
mr = &grid[2][1];
bl = &grid[0][2];
bc = &grid[1][2];
br = &grid[2][2];
while(option != 4)
{
clrscr();
printf("\n\n\t\t\t Noughts and Crosses");
printf("\n\t\t\t by Adam Leach\n");
printf("\n\n\t\t\t Select an option:");
printf("\n\t\t\t 1. Play game");
printf("\n\t\t\t 2. Options");
printf("\n\t\t\t 3. Exit game");
printf("\n\t\t\t -> ");
scanf ("%d", &option);
while( getchar() != '\n' );
switch(option)
{
case 1:play_game(BOARD,PLAYERS);
break;
case 2:options(PLAYERS);
break;
case 3:printf("\n\n\t\t\t Exiting Game");
getch();
break;
default: ;
}
}
}
/* Function definations*/
void play_game(BOARD_PTRS,PLAYER)
{
while(!win_condition(BOARD))
{
clrscr();
printf("\n\n\t\t\t NOUGHTS AND CROSSES\n\n\n");
draw_grid(BOARD);
printf("\n\n\t When entering the grid-reference enter the number first,\n\t then"
" the letter, e.g. 1A, 2C, etc");
play1(BOARD,ply1);
clrscr();
printf("\n\n\t\t\t NOUGHTS AND CROSSES\n\n\n");
draw_grid(BOARD);
printf("\n\n\t When entering the grid-reference enter the number first,\n\t then"
" the letter, e.g. 1A, 2C, etc");
play2(BOARD,ply2);
}
getch();
}
char options (PLAYER)
{
int select = 0;
while (select != 3)
{
clrscr();
printf("\n\n\t\t\t\tOPTIONS\n\n\n");
printf("\n1. Change Player 1 name - currently %s\n", ply1);
printf("\n2. Change Player 2 name - currently %s\n", ply2);
printf("\n3. Back to the main menu");
printf("\n>> ");
scanf("%d", &select);
while( getchar() != '\n' );
switch(select)
{
case 1:printf("\n\tEnter new name for Player 1: ");
fgets(ply1, 20, stdin);
break;
case 2:printf("\n\tEnter new name for Player 2: ");
fgets(ply2, 20, stdin);
break;
case 3:printf("Returning to the main menu");
getch();
break;
default:;
}
}
return(ply1[0],ply2[0]);
}
void draw_grid(BOARD_PTRS)
{
printf("\t\t\t 1 2 3 \n");
printf("\t\t\t | | \n");
printf("\t\t\tA %c | %c | %c \n", *tl,*tc,*tr);
printf("\t\t\t ______|______|______\n");
printf("\t\t\t | | \n");
printf("\t\t\tB %c | %c | %c \n", *ml,*mc,*mr);
printf("\t\t\t ______|______|______\n");
printf("\t\t\t | | \n");
printf("\t\t\tC %c | %c | %c \n", *bl,*bc,*br);
printf("\t\t\t | | \n");
}
int win_condition(BOARD_PTRS)
{
if((*tl && *tc && *tr != 'X') && (*tl && *tc && *tr == 'O'))
return 1;
if((*tl && *ml && *bl != 'X') && (*tl && *ml && *bl == 'O'))
return 1;
if((*tr && *mr && *br != 'X') && (*tr && *mr && *br == 'O'))
return 1;
else
return 0;
}
void play1(BOARD_PTRS,char ply1[20])
{
int acrs;
char vert;
printf("\n\n\t %s\n\t Where would you like to go? ", ply1);
scanf("%d%c", &acrs, &vert);
vert = toupper(vert);
while( getchar() != '\n' );
switch(acrs)
{
case 1:
switch(vert)
{
case 'A': *tl = 'X';
break;
case 'B': *ml = 'X';
break;
case 'C': *bl = 'X';
break;
default :;
}
break;
case 2:switch(vert)
{
case 'A': *tc = 'X';
break;
case 'B': *mc = 'X';
break;
case 'C': *bc = 'X';
break;
default :;
}
break;
case 3:switch(vert)
{
case 'A': *tr = 'X';
break;
case 'B': *mr = 'X';
break;
case 'C': *br = 'X';
break;
default :;
}
break;
default :;
}
}
void play2(BOARD_PTRS,char ply2[20])
{
int acrs;
char vert;
printf("\n\n\t %s\n\t Where would you like to go? ", ply2);
scanf("%d%c", &acrs, &vert);
vert = toupper(vert);
while( getchar() != '\n' );
switch(acrs)
{
case 1:
switch(vert)
{
case 'A': *tl = 'O';
break;
case 'B': *ml = 'O';
break;
case 'C': *bl = 'O';
break;
default :;
}
break;
case 2:switch(vert)
{
case 'A': *tc = 'O';
break;
case 'B': *mc = 'O';
break;
case 'C': *bc = 'O';
break;
default :;
}
break;
case 3:switch(vert)
{
case 'A': *tr = 'O';
break;
case 'B': *mr = 'O';
break;
case 'C': *br = 'O';
break;
default :;
}
break;
default :;
}
}