Blob Blame History Raw

#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");
      }
    }
  }
}