#include <time.h>
#include <stdio.h>
#include <stdlib.h>
int map[1024][1024];
char screen[1024][1024];
int end = 0;
int botState = 0;
int botx = 0;
int boty = 0;
int botMines = 0;
int bolocks = 0;
char botCom[1];
int width = 8;
int height = 8;
int mines = 10;
void generatemap() {
end = 0;
for (int a = 0; a < width; a++) {
for (int c = 0; c < height; c++) {
screen[a][c]='-';
}
}
for (int b = 0; b < mines; b++) {
int x = rand()%width;
int y = rand()%height;
if (map[x][y] != 1){
map[x][y] = 1;
}else{
b--;
}
}
}
void printmap() {
printf("\e[1;1H\e[2J");
for (int d = 0; d < height; d++){
for (int e = 0; e < width; e++){
if(screen[e][d] == '-'){
printf("\x1b[90;47m\033[%d;%dH%c",e,d,screen[e][d]);
}
if(screen[e][d] == '0'){
printf("\x1b[90;47m\033[%d;%dH%c",e,d,screen[e][d]);
}
if(screen[e][d] == '1'){
printf("\x1b[94;47m\033[%d;%dH%c",e,d,screen[e][d]);
}
if(screen[e][d] == '2'){
printf("\x1b[32;47m\033[%d;%dH%c",e,d,screen[e][d]);
}
if(screen[e][d] == '3'){
printf("\x1b[91;47m\033[%d;%dH%c",e,d,screen[e][d]);
}
if(screen[e][d] == '4'){
printf("\x1b[34;47m\033[%d;%dH%c",e,d,screen[e][d]);
}
if(screen[e][d] == '5'){
printf("\x1b[31;47m\033[%d;%dH%c",e,d,screen[e][d]);
}
if(screen[e][d] == '6'){
printf("\x1b[36;47m\033[%d;%dH%c",e,d,screen[e][d]);
}
if(screen[e][d] == '7'){
printf("\x1b[30;47m\033[%d;%dH%c",e,d,screen[e][d]);
}
if(screen[e][d] == '8'){
printf("\x1b[90;47m\033[%d;%dH%c",e,d,screen[e][d]);
}
if(screen[e][d] == '^'){
printf("\x1b[91;47m\033[%d;%dH%c",e,d,screen[e][d]);
}
if(screen[e][d] == '*'){
printf("\x1b[30;47m\033[%d;%dH%c",e,d,screen[e][d]);
}
}
//printf("\n");
}
printf("\x1b[0m\n");
}
void gameover() {
for (int a = 0; a < width; a++) {
for (int c = 0; c < height; c++) {
if (map[a][c] == 1) {
screen[a][c]='*';
}
}
}
printmap();
printf("GAME OVER!!!\n");
end=1;
}
void opencell(int x,int y){
if (screen[x][y] != '-') return;
if (map[x][y] != 1) {
int miness = 0;
for (int f = -1; f <= 1; f++){
for (int g = -1; g <= 1; g++){
if (x+f < 0 || x+f >= width || y+g < 0 || y+g >= height) continue;
if (map[x+f][y+g])miness++;
}
}
screen[x][y] = '0' + miness;
if (miness == 0) {
for (int f = -1; f <= 1; f++){
for (int g = -1; g <= 1; g++){
if (x+f < 0 || x+f >= width || y+g < 0 || y+g >= height) continue;
opencell(x+f, y+g);
}
}
}
}else{
gameover();
}
}
void bot(){
botx = 0;
boty = 0;
botMines = 0;
bolocks = 0;
botCom[1] = 0;
for(int x = 0; x < width; x++){
for(int y = 0; y < height; y++){
int j = screen[x][y] - '0';
if (j < 0 || j > 8) continue;
int marks = 0;
int unknowns = 0;
for(int xx = x-1; xx <= x+1; xx++){
for (int yy = y-1; yy <= y+1; yy++){
if (xx < 0 || xx >= width || yy < 0 || yy >= height) continue;
if (screen[xx][yy] == '-') {
++unknowns;
botx = xx;
boty = yy;
}
if (screen[xx][yy] == '^') ++marks;
}
}
if (unknowns == 0) continue;
if (unknowns+marks == j){
botCom[0] = 'm';
return;
}
if (marks == j) {
botCom[0] = 'o';
return;
}
}
}
printf("random!\n");
botCom[0] = 'o';
while(1) {
botx = rand()%width;
boty = rand()%height;
if (screen[botx][boty] == '-') break;
}
}
int main(){
srand(time(NULL));
printf("Width, Height, Quantity of mines: ");
scanf("%d %d %d",&width, &height, &mines);
if (width > 1024){
width = 1024;
printf("Error Max Size is 1024\n");
}
if (height > 1024){
height = 1024;
printf("Error Max Size is 1024\n");
}
if (mines > width*height){
mines = width*height;
printf("Quantity of mines more than quantity of cell's\n");
}
generatemap();
printf("On Bot(0/1)?: ");
scanf("%d",&botState);
end = 0;
while(end == 0){
printmap();
char cmd[100] = {};
int x = 0, y = 0;
if (botState == 0){
printf("enter command (<o|m> <x> <y>): ");
scanf("%s %d %d", cmd, &y, &x);
}else{
bot();
cmd[0] = botCom[0];
y = boty;
x = botx;
printf("%s %d %d\n", cmd, x, y);
}
if (x < 0 || x >= width || y < 0 || y >= height) {
printf("bad coordinates\n");
} else
if (cmd[0] == 'm'){
if (screen[x][y] == '^') break;
screen[x][y] = '^';
} else
if (cmd[0] == 'o'){
if (screen[x][y] != '-') break;
opencell(x,y);
} else {
printf("unknown command\n");
break;
}
if (end == 0) {
end = 1;
for(int x = 0; x < 8; ++x) {
for(int y = 0; y < 8; ++y) {
if (screen[x][y] == '-') end = 0;
if (map[x][y] && screen[x][y] != '^') end = 0;
if (!map[x][y] && screen[x][y] == '^') end = 0;
}
}
if (end) {
printmap();
printf("WIN!\n");
}
}
}
}