The functions used for console graphics have been discussed in a previous article:
#include<stdio.h> #include"GRAPH_LIB.h" /*--------------DATA TYPES--------------*/ typedef struct Player { char *name;//player's name char *symbol;//player's symbol on the table char *colour;//player's colour on the table struct Player *next;//pointer to the next element of the list } player; typedef struct Matrix { char *symbol;//symbol placed int column; int row; struct Matrix *next;//pointer to the next element of the list }matrix; /*----------------GLOBALS----------------*/ player *firstP = NULL;//pointer to the first element of a singly linked list //containing elements of type player matrix *firstM = NULL;//pointer to the first element of a singly linked list //containing elements of type matrix int rows = 0, columns = 0;//number of rows and column of the table int numberOfPlayers = 0;//the number of players int symbolsToWin = 0;//the number of symbols required for victory //arrays for the eight directions int directionsX[] = {0,0,-1,1,-1,1,-1,1}; int directionsY[] = {-1,1,0,0,-1,-1,1,1}; /*---------------PROTOTYPES---------------*/ /* * Description: * Prints the banner at the top */ void Header(void); /* * Description: * Adds a element of type player to a singly linked list * Parameters: * first - pointer to the first element of a singly linked list containing elemnts of type player * name - pointer to the player's to be added name * symbol - pointer to the player's to be added symbol * colour - pointer to the player's to be added colour */ player *AddPlayer(player *first, char *name, char *symbol, char *colour); /* * Description: * Adds a element of type matrix to a singly linked list * Parameters: * first - pointer to the first element of a singly linked list containing elemnts of type matrix * symbol - pointer to the element of the matrix's symbol * row - number of row from the matrix * column - number of column from the matrix */ matrix *AddToMatrix(matrix *first, char *symbol, int row, int column); /* * Description: * Sets all the elements of matrix structure used as table to "-" */ void InitialiseTable(void); /* * Description: * Decides the colour for each box of the table * Parameters: * symbol - symbol * colour - pointer to the colour to be painted */ void DecideColour(char symbol[], char *colour); /* * Description: * Displays the table * Parameters: * horizontalCoordinate - horizontal starting pint of the table * vericalCoordinate - vertical starting point of the table */ void PrintTable(int horizontalCoordinate, int verticalCoordinate); /* * Description: * Selecting game properties regarding the players */ void CustomizePlayers(void); /* * Description: * Selecting game properties regarding the table */ void CustomizeTable(void); /* * Description: * Checks if the game won won by one of the players * Parameters: * p - pointer to the first element of a singly linked list containing elements of type player * Returns: * 0 - none of the players hasn't won * 1 - one of the players has won the game */ int CheckForWin(player *p); /* * Description: * Checks if there are any positions left unccupied on the table * Returns: * 0 - there is at least one position on the table left unoccupied * 1 - all the positions on the table are occupied */ int FullTable(void); /* * Description: * Contains the game's logic */ void Gameplay(void); /* * Description: * Starts the game */ void Launcher(void); /*-------------IMPLEMENTATION-------------*/ void Header(void) { DrawRectangle(0,0,60,5,"cyan"); GoTo(23,1); Colour("cyan","white"); printf(" TIC TAC TOE"); GoTo(24,2); printf(" July 2012"); GoTo(21,3); printf(" %cVINTAGE CODING",64); } player *AddPlayer(player *first, char *name, char *symbol, char *colour) { player *p, *q; p = (player*)malloc(sizeof(player)); p->name = (char*)malloc(strlen(name)+1); p->symbol = (char*)malloc(strlen(symbol)+1); p->colour = (char*)malloc(strlen(symbol)+1); p->next = NULL; strcpy(p->name,name); strcpy(p->symbol,symbol); strcpy(p->colour,colour); if(p == NULL || p->name == NULL || p->symbol == NULL || p->colour == NULL) { return 0; } else if (first == NULL) { return p; } else { q = first; while(q->next != NULL) { q = q->next; } q->next = p; return first; } } matrix *AddToMatrix(matrix *first, char *symbol, int row, int column) { matrix *p, *q; p = (matrix*)malloc(sizeof(matrix)); p->symbol = (char*)malloc(sizeof(matrix)); p->next = NULL; strcpy(p->symbol,symbol); p->row = row; p->column = column; if(p == NULL || p->symbol == NULL) { return 0; } else if (first == NULL) { return p; } else { q = first; while(q->next != NULL) { q = q->next; } q->next = p; return first; } } void InitialiseTable(void) { int i = 0, j = 0, k = 0; char *string = NULL; char row[3], column[3]; string = (char*)malloc(7*sizeof(char)); for(j=0; j<rows; j++) { for(i=0; i<columns; i++) { *string = NULL; itoa(i+1,column,10); itoa(j+1,row,10); strcpy(string,column); strcat(string,"-"); strcat(string,row); firstM=AddToMatrix(firstM,string,j,i); } } } void DecideColour(char symbol[], char *colour) { int ok=0; player *p; p = firstP; while(p != NULL) { if(strcmp(p->symbol,symbol) == 0) { strcpy(colour,p->colour); ok=1; } p = p->next; } if(ok == 0) { strcpy(colour,"white"); } } void PrintTable(int horizontalCoordinate, int verticalCoordinate) { unsigned int i = 0, j = 0; char colour[20]; matrix *p = NULL; DrawGrid(horizontalCoordinate,verticalCoordinate,3,3,columns,rows,"black"); for(j=0; j<rows; j++) { p=firstM; for(i=0; i<columns; i++) { p = firstM; while(p != NULL) { if((i == p->column) && (j == p->row)) { DecideColour(p->symbol,colour); DrawRectangle(1+horizontalCoordinate+i+3*i, 1+verticalCoordinate+j+3*j,3,3,colour); GoTo(1+horizontalCoordinate+i+3*i+(3-strlen(p->symbol))/2, 1+verticalCoordinate+j+3*j+1); Colour(colour,"dark gray"); puts(p->symbol); break; } else { p = p->next; } } } } } void CustomizePlayers(void) { int i = 0; char name[12], symbol[3], colour[20]; Header(); GoTo(14,7); Colour("dark blue","gray"); printf("Enter the number of players: "); scanf("%d",&numberOfPlayers); if(numberOfPlayers < 0) numberOfPlayers=1; if(numberOfPlayers > 5) numberOfPlayers=5; for(i=0; i<numberOfPlayers; i++) { DrawRectangle(18,10+i*3+i*3,22,4,"dark blue"); GoTo(18,10+i*3+i*3); Colour("dark blue","gray"); printf(" Player %d",i+1); GoTo(18,10+i*3+i*3+1); printf(" Name : "); scanf("%s",name); GoTo(18,10+i*3+i*3+2); printf(" Symbol: "); scanf("%s",symbol); GoTo(18,10+i*3+i*3+3); printf(" Colour: "); scanf("%s",colour); firstP = AddPlayer(firstP,name,symbol,colour); fflush(stdin); } } void CustomizeTable(void) { int i = 0; int orizontalCoordinate = 0; Header(); GoTo(12,15); Colour("dark blue","gray"); printf(" Enter the number of rows : "); scanf("%d",&rows); if(rows>5) rows = 5; GoTo(12,17); printf(" Enter the number of columns : "); scanf("%d",&columns); if(columns>5) columns = 5; orizontalCoordinate = (60-(rows*3+rows))/2; InitialiseTable(); GoTo(12,19); printf(" Enter the number of symbols to win: "); scanf("%d",&symbolsToWin); } int CheckForWin(player *p) { int i = 0, j = 0, k = 0; int counter = 0; int x = 0, y = 0; matrix *q = firstM; matrix *m = NULL; while(q != NULL) { if(strcmp(q->symbol,p->symbol) == 0) { counter = 1; for(k=0; k<8; k++) { m=firstM; while(counter != symbolsToWin && m != NULL) { x = q->column+directionsX[k]*counter; y = q->row+directionsY[k]*counter; if(m->column == x && m->row == y && strcmp(m->symbol,p->symbol)==0 && x<columns && y<rows) { counter++; if(counter == symbolsToWin) return 1; else m = firstM; } m = m->next; } counter = 1; } } q = q->next; } return 0; } int FullTable(void) { matrix *p = firstM; char row[3], column[3]; char *string = NULL; int ok = 0; string = (char*)malloc(7*sizeof(char)); while(p != NULL) { *string = NULL; itoa(p->row+1,row,10); itoa(p->column+1,column,10); strcpy(string,column); strcat(string,"-"); strcat(string,row); if(strcmp(string,p->symbol) == 0) { return 0; } p = p->next; } return 1; } void Gameplay(void) { int i = 0, j = 0, k = 0; int ok = -1; int full = -1; int row = 0, column = 0; char r[3], c[3]; char *string = NULL; char *buff = NULL; char c1, c2; player *p = firstP; matrix *q = firstM; string = (char*)malloc(7*sizeof(char)); buff = (char*)malloc(7*sizeof(char)); while(ok != 1 || full != 1) { ConsoleColours("dark gray","white"); Header(); PrintTable((60-(rows*3+rows))/2,8); full = FullTable(); if(full == 0) { GoTo((60-strlen(p->name)-3)/2,rows*3+rows+3+5+4); Colour("dark blue","gray"); printf("%s's turn",p->name); GoTo(10,rows*3+rows+4+5+4+2); printf("Enter your coordinates of choice (x-y): "); scanf("%s",buff); column = atoi(strtok(buff,"-")); column--; row = atoi(strtok(NULL," ")); row--; for(j=0; j<rows; j++) { for(i=0; i<columns; i++) { q = firstM; while(q != NULL) { *string = NULL; itoa(q->row+1,r,10); itoa(q->column+1,c,10); strcpy(string,c); strcat(string,"-"); strcat(string,r); if((q->row == row) && (q->column == column) && (strcmp(q->symbol,string) == 0)) { strcpy(q->symbol,p->symbol); break; } else { q = q->next; } } } } ok = CheckForWin(p); if(ok == 1) { system("cls"); ConsoleColours("dark gray","white"); Header(); PrintTable((60-(rows*3+rows))/2,8); GoTo((60-strlen(p->name)-3)/2,30); Colour("green","white"); printf(" %s WON!!! ",p->name); GoTo(25,32); Colour("dark purple","gray"); getch(); puts("GAME OVER"); break; } else if (ok == 0) { if(p->next !=NULL) { p = p->next; } else { p = firstP; } GoTo(16,rows*3+rows+17); Colour("red","gray"); printf("Press any key to continue..."); getch(); system("cls"); } } else if(full == 1) { Colour("dark purple","gray"); GoTo(5,rows*3+rows+15); puts("There are no more positions available on the board."); GoTo(25,rows*3+rows+16); puts("GAME OVER"); GoTo(17,rows*3+rows+17); puts("Neither player hasn't won!"); GoTo(16,rows*3+rows+18); puts("Press any key to continue..."); break; } } } void Launcher(void) { char newGame[4]; int ok = 1; system("title http://vintagecoding.blogspot.com TicTacToe"); ConsoleDimensions(60,40); ConsoleColours("dark gray","white"); CustomizePlayers(); system("cls"); ConsoleColours("dark gray","white"); CustomizeTable(); system("cls"); ConsoleColours("dark gray","white"); while(ok == 1) { Gameplay(); getch(); system("cls"); ConsoleColours("dark gray","white"); Header(); DrawRectangle(8,10,43,5,"dark purple"); GoTo(9,12); Colour("dark purple","gray"); puts("Do you want to start a new game? [yes/no]"); GoTo(9,13); scanf("%s",newGame); if(strcmp(newGame,"yes") == 0) { ok = 1; firstM = NULL; InitialiseTable(); system("cls"); } else { ok = 0; } } } int main(void) { Launcher(); getch(); return 0; }
Error in #include"GRAPH_LIB.h"
ReplyDeletebro!!! same here
DeleteCan anyone please help how to solve error in #INCLUDE"Graph_LIB.h"
ReplyDelete