diff --git a/README.md b/README.md new file mode 100644 index 0000000..b2e3e6a --- /dev/null +++ b/README.md @@ -0,0 +1,9 @@ +# Miner + +This is a minesweeper game in console. With bot. + +Controlls +o m +Open block Mine hare +x 0 or 1 or 2... +y 0 or 1 or 2... \ No newline at end of file diff --git a/build.sh b/build.sh new file mode 100755 index 0000000..170bfac --- /dev/null +++ b/build.sh @@ -0,0 +1 @@ +gcc -o miner miner.c diff --git a/miner.c b/miner.c new file mode 100644 index 0000000..7d015aa --- /dev/null +++ b/miner.c @@ -0,0 +1,204 @@ + +#include +#include +#include + +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() { + for (int d = 0; d < height; d++){ + for (int e = 0; e < width; e++){ + printf("%c",screen[e][d]); + } + printf("\n"); + } + printf("\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]='*'; + } + } + } + printf("GAME OVER!!!\n"); + printmap(); + 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 (marks + unknowns == 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"); + } + if (height > 1024){ + height = 1024; + printf("Error Max Size is 1024"); + } + if (mines > width*height){ + mines = width*height; + printf("Quantity of mines more than quantity of cell's"); + } + 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 ( ): "); + 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"); + } + } + } +}