/***************************************************************************
* Name: Nathan Shain ID: 206026478 *
*
* Name: Noam Chen ID: 315675934 *
*
* Assignment number: 7
* Exercise number: 1
*
**************************************************************************/
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#define N 10
#define M 15
void newBoard(char board[][N]);
void randomBombs(int bombs[][N]);
int game(char board[][N], int bombs[][N]);
void openSquare(char board[][N], int bombs[][N], int row, int col);
int main()
{
char board[N][N];
int bombs[N][N]={{0}};
int win;
newBoard(board);
printf("\n");
randomBombs(bombs);
win=game(board, bombs);
if (win==0)
printf("Boom!!! You have lost");
else if(win==1)
printf("Congratulations!! You have won!!");
return 0;
}
/*בניית הלוח המוסתר שיוצג למשתמש*/
void newBoard(char board[][N])
{
int i,j;
for (i=0; i<N; i++)
for (j=0; j<N; j++)
board[i][j]=(char)178;
}
/*בניית מערך הפצצות*/
void randomBombs(int bombs[][N])
{
int i,j,bombRow,bombCol,mines=0,b=0;
srand(time(NULL));
while(mines<M)
{
bombRow=rand()%N;
bombCol=rand()%N;
if(bombs[bombRow][bombCol]!=-1)
{
bombs[bombRow][bombCol]=-1;
mines++;
}
}
for(i=0;i<N;i++)
{
for(j=0;j<N;j++)
{
if(bombs[i][j]!=-1)
{
if(i!=0&&j!=0)
{
if(bombs[i-1][j-1]==-1)
b++;
}
if(i!=0)
{
if(bombs[i-1][j]==-1)
b++;
}
if(i!=0&&j<N-1)
{
if(bombs[i-1][j+1]==-1)
b++;
}
if(j!=0)
{
if(bombs[i][j-1]==-1)
b++;
}
if(j<N-1)
{
if(bombs[i][j+1]==-1)
b++;
}
if(i<N-1&&j!=0)
{
if(bombs[i+1][j-1]==-1)
b++;
}
if(i<N-1)
{
if(bombs[i+1][j]==-1)
b++;
}
if(i<N-1&&j<N-1)
{
if(bombs[i+1][j+1]==-1)
b++;
}
bombs[i][j]=b;
b=0;
}
}
}
}
int game(char board[][N],int bombs[][N])
{
int i,j,cMines=M, option, row, col,squares=N*N,temp=0;
for (i=0; i<N; i++)
{
for (j=0; j<N; j++){printf("%c", board[i][j]);}
printf("\n");
}
while(squares>M)
{
printf("There are %d mines left.\nWhat would you like to do now:\n", cMines);
printf("1.Open a new square.\n2.Flag a square as a mine\n");
if(scanf("%d", &option)!=1){printf("Input error\n"); exit(1);}
if (option==1)
{
printf("Please insert row and column number:\n");
if(scanf("%d%d", &row, &col)!=2){printf("Input error\n"); exit(1);}
if(board[row][col]=='F')
{
printf ("square is flagged as a mine. Are you sure you wanted to open it?\n Enter your choice: 1. Yes or 2. No");
scanf("%d", &option);
if (option==1)
{
openSquare(board,bombs,row,col);
if (board[row][col]=='X')
{
return 0;
}
}
}
else if(board[row][col]!=(char)178){printf("These square is already opened\n");}
else
{
openSquare(board,bombs,row,col);
for (i=0; i<N; i++)
{
for (j=0; j<N; j++){printf("%c", board[i][j]);}
printf("\n");
}
if(board[row][col]=='X')
return 0;
}
for(i=0;i<N;i++)
{
for(j=0;j<N;j++)
{
if(board[i][j]==(char)178){temp++;}
}
}
squares-=temp;
temp=0;
}
else
{
printf("Please insert row and column number:\n");
if(scanf("%d%d", &row, &col)!=2){printf("Input error\n"); exit(1);}
if (board[row][col]=='F')
{
board[row][col]=(char)178;
cMines++;
}
else
{
board[row][col]='F';
cMines--;
}
for (i=0; i<N; i++)
{
for (j=0; j<N; j++){printf("%c", board[i][j]);}
printf("\n");
}
}
}
return 1;
}
void openSquare(char board[][N], int bombs[][N], int row, int col)
{
if(row<0||col<0||row>=N||col>=N){return;}
if(bombs[row][col]==-1)
{
board[row][col]='X';
return;
}
else
{
board[row][col]=(char)(bombs[row][col]+'0');
if(board[row][col]=='0')
{
openSquare(board,bombs,row+1,col);
openSquare(board,bombs,row-1,col);
openSquare(board,bombs,row,col+1);
openSquare(board,bombs,row,col-1);
}
}
}