Hi All.. i want to implent the AI player of the Famous http://en.wikipedia.org/wiki/SameGame a matrix containg integer ranging b/w 1 and 3. 1 for red colour 2 for green colour 3 for yello colour the AI player should delete all the adjacent blocks of same colours untill no adjacent blocks are remaing and put 0 at deleted indexs to represent that it is deleted. matrix sample is given below and each integer represent a specific colour. can anyone please help me with some initial code or data structure? thanks. text.txt. 1111111111 2323333132 1131123222 2222222113 1111111111 1111111111 1111111111 1111111111 the Human player code is.. Code: #include<stdio.h> #define TRUE 1 #define FALSE 0 #define BONUS 1000 #define NROWS 8 #define NCOLS 8 #define NBLOCKS (NROWS * NCOLS) typedef enum Direction { UP, DOWN, LEFT, RIGHT }Direction; int GameBoard[NROWS][NCOLS]; // Board Size // function prototypes int DeleteBlocks(int row, int col); int DeleteNeighborBlocks(int row, int col, int color,Direction direction); void test33(); void printBoard(); void CompactBoard(void); int IsGameOver(void) ; int main(int argc,char *argv[]) { int row = 0,col = 0; int ndeleted,gameover; int points; int ntotaldeleted; test33(); system("clear"); printBoard(); points = 0; ntotaldeleted = 0; do { printf("enter Row\n"); fscanf(stdin,"%d",&row); printf("enter Coloumn\n"); fscanf(stdin,"%d",&col); ndeleted = DeleteBlocks(row,col); if(ndeleted > 0) { CompactBoard(); ntotaldeleted += ndeleted; points += (ndeleted * ndeleted); system("clear"); printBoard(); gameover = IsGameOver(); } }while(!gameover); if(ntotaldeleted == NBLOCKS) points += BONUS; fprintf(stdout,"Points Scored:%d",points); fprintf(stdout,"\n----------------------------------Game Over-----------------------------------\n"); return 0; } // initializes GameBoard[NROWS][NCOLS] from input file specified void test33() { int row=0,col=0; int c; FILE *fp; fp = fopen("text.txt","r"); if(fp == NULL)return; while ( !feof(fp) ) { c = fgetc(fp); if(c >= '0' && c <= '9') { GameBoard[row][col] = c-'0'; col++; if (col > (NCOLS - 1)) // row is filled to NCOLS { col = 0; row++; if (row > (NROWS - 1)) // NROWS have been filled { fclose(fp); return; } } } } } // prints GameBoard[NROWS][NCOLS] to stdout void printBoard() { int row,col; fprintf(stdout,"--------------------------------------------------------------------------------\n"); fprintf(stdout,"\t\t 0 1 2 3 4 5 6 7\n"); fprintf(stdout,"--------------------------------------------------------------------------------\n"); for(row = 0;row < NROWS;row++) { fprintf(stdout,"\t%d\t|",row); for (col = 0; col < NCOLS; col++) { fprintf(stdout,"%d|",GameBoard[row][col]); } fprintf(stdout,"\n"); //fprintf(stdout,"\n--------------------------------------------------------------------------------\n"); } } int IsGameOver(void) { int row = 0,col = 0,nColor; // Go column by column, left to right for(col = 0; col < NCOLS; col++) { // Row by row, bottom to top for(row = (NROWS - 1); row >= 0; row--) { nColor = GameBoard[row][col]; // Once we hit background, this column is done if(nColor == 0) break; else { // Check above and right if(row - 1 >= 0 &&GameBoard[row - 1][col] == nColor) return 0; else if(col + 1 < NCOLS && GameBoard[row][col + 1] == nColor) return 0; } } } // No two found adjacent return 1; } int DeleteBlocks(int row, int col) { int nColor,nCount; // Make sure that the row and column are valid if(row < 0 || row >= NROWS || col < 0 || col >= NCOLS) return -1; // Can't delete background blocks nColor = GameBoard[row][col]; if(nColor == 0) return -1; // First check if there are any of the adjacent sides // with the same color nCount = -1; if((row - 1 >= 0 && GameBoard[row - 1][col] == nColor) ||(row + 1 < NROWS && GameBoard[row + 1][col] == nColor) || (col - 1 >= 0 && GameBoard[row][col - 1] == nColor) || (col + 1 < NCOLS && GameBoard[row][col + 1] == nColor)) { // Then call the recursive function to eliminate all // other touching blocks with same color GameBoard[row][col] = 0; nCount = 1; // Recursive call for up nCount += DeleteNeighborBlocks(row - 1, col, nColor, DOWN); // Recursive call for down nCount += DeleteNeighborBlocks(row + 1,col, nColor, UP); // Recursive call for left nCount += DeleteNeighborBlocks(row, col - 1, nColor, RIGHT); // Recursive call for right nCount += DeleteNeighborBlocks(row, col + 1, nColor, LEFT); } // Return the total number of pieces deleted return nCount; } int DeleteNeighborBlocks(int row, int col, int color,Direction direction) { // Check if it is on the board if(row < 0 || row >= NROWS || col < 0 || col >= NCOLS) return 0; // Check if it has the same color if(GameBoard[row][col] != color) return 0; int nCount = 1; GameBoard[row][col] = 0; // If we weren't told to not go back up, check up if(direction != UP) nCount +=DeleteNeighborBlocks(row - 1, col, color, DOWN); // If we weren't told to not go back down, check down if(direction != DOWN) nCount +=DeleteNeighborBlocks(row + 1, col, color, UP); // If we weren't told to not go back left, check left if(direction != LEFT) nCount +=DeleteNeighborBlocks(row, col - 1, color, RIGHT); // If we weren't told to not go back right, check right if(direction != RIGHT) nCount +=DeleteNeighborBlocks(row, col + 1, color, LEFT); // Return the total number of pieces deleted return nCount; } void CompactBoard(void) { int row,col; int nNextEmptyRow,nNextOccupiedRow; int nNextEmptyCol,nNextOccupiedCol; // First move everything down for(col = 0; col < NCOLS; col++) { nNextEmptyRow = NROWS - 1; nNextOccupiedRow = nNextEmptyRow; while(nNextOccupiedRow >= 0 && nNextEmptyRow >= 0) { // First find the next empty row while(nNextEmptyRow >= 0 && GameBoard[nNextEmptyRow][col] != 0) nNextEmptyRow--; if(nNextEmptyRow >= 0) { // Then find the next occupied row from the next empty row nNextOccupiedRow = nNextEmptyRow - 1; while(nNextOccupiedRow >= 0 && GameBoard[nNextOccupiedRow][col] == 0) nNextOccupiedRow--; if(nNextOccupiedRow >= 0) { // Now move the block from occupied to empty GameBoard[nNextEmptyRow][col] = GameBoard[nNextOccupiedRow][col]; GameBoard[nNextOccupiedRow][col] = 0; } } } } // Then move everything from right to left nNextEmptyCol = 0; nNextOccupiedCol = nNextEmptyCol; while(nNextEmptyCol < NCOLS && nNextOccupiedCol < NCOLS) { // First find the next empty column while(nNextEmptyCol < NCOLS && GameBoard[NROWS - 1][nNextEmptyCol] != 0) nNextEmptyCol++; if(nNextEmptyCol < NCOLS) { // Then find the next column with something in it nNextOccupiedCol++; while(nNextOccupiedCol < NCOLS && GameBoard[NROWS - 1][nNextOccupiedCol] == 0) nNextOccupiedCol++; if(nNextOccupiedCol < NCOLS) { // Move entire column to the left for(row = 0; row < NROWS; row++) { GameBoard[row][nNextEmptyCol] = GameBoard[row][nNextOccupiedCol]; GameBoard[row][nNextOccupiedCol] = 0; } } } } }