扫雷游戏 控制台版 C++

来源:互联网 发布:末世之变种崛起下载知 编辑:程序博客网 时间:2024/05/16 05:35

需要开一个map.txt  写入地图

地图中 *表示空地   ; x表示地雷

**********
**********
**x*******
**********
**********
**********
**********
**********
**********

然后就是扫雷的控制台代码了,只简单的检测了一下

#include <stdio.h>#include <string.h>#define SIZE 10char img_map[SIZE + 2][SIZE + 2];  // the image of a mapint  num_map[SIZE + 2][SIZE + 2];  // calculate the total number of mine in one block.int open_map[SIZE + 2][SIZE + 2];  // which img shoud user open.int sumMine = 0;int sumBlock = 0;int dir[8][2] = {{1,0},{1,-1},{0,-1},{-1,-1},{-1,0},{-1,1},{0,1},{1,1}};int beyond_board (int x,int y){  // judge whether the step is out of board;if( x < 0 || x >= SIZE || y < 0 || y >= SIZE ){   return 1;   // beyond board return 1;}return 0;}void read_img_map(){             // get data from map.txtFILE *p_file = fopen("map.txt","r");int i = 0,j;for (i = 0;i < SIZE;i++){fread(img_map[i],sizeof(char),SIZE+1,p_file);    }/*for (i = 0;i < SIZE;i++){    for (j = 0;j < SIZE;j++){    if(img_map[i][j] == '*'){img_map[i][j] = ' ';}}}*/}void write_num_map(){           // transfer img_map to num_mapint i = 0,j = 0,k = 0;for (i = 0;i < SIZE;i++){for (j = 0;j < SIZE;j++){if (img_map[i][j] == 'x'){ sumMine++;          // the total number of mine in the mapnum_map[i][j] = 9;  // 9 represent a mine here   continue;}for (k = 0;k < 8;k++){    int stepx = i + dir[k][0],stepy = j + dir[k][1];if ( !beyond_board (stepx,stepy) ){   if (img_map[stepx][stepy] == 'x'){      num_map[i][j] += 1;   }}}}}/*for (i = 0;i < SIZE;i++){for (j = 0;j < SIZE;j++){        printf("%d",num_map[i][j]);}printf("\n");} */}void show_all_mine(){    //  在地图中显示所有的地雷的位置    int i,j;for (i = 0;i < SIZE;i++){    for (j = 0;j < SIZE;j++){if (num_map[i][j] == 9) {    open_map[i][j] = 1;    // 找到地雷后在 openmap 中标记 }}}}void show_all_map(){    int i,j;for (i = 0;i < SIZE;i++){    for (j = 0;j < SIZE;j++){   if(open_map[i][j]){      if(num_map[i][j] == 9){     printf("X");        // x represetn mine  }  else{      printf("%d",num_map[i][j]);   // show the number has been opened  }   }   else{          printf("*");           // the block is coverd;   }}printf("\n");    }}void find_empty(int x,int y){                //搜索算法  //  printf("x = %d y = %d\n",x,y);  //show_all_map();if (beyond_board(x,y)){ return ;     } if (open_map[x][y]){    return ;     } if (!num_map[x][y]){   // 遇到零时还要继续翻上下左右    open_map[x][y] = 1; }else if(num_map[x][y] != 9){  // 遇到数字了即搜索停止open_map[x][y] = 1;    return ; } //else {                //****遇到雷时搜索停止 //   return ;// }     int i; for (i = 0 ;i < 8;i++){ find_empty(x + dir[i][0],y + dir[i][1]); }}int sum_one_open_map(){   int i,j;   int s = 0;   for (i = 0;i < SIZE;i++){       for ( j = 0;j < SIZE;j++)   if (open_map[i][j]){      s++;   }   }    return s;}int main(){read_img_map();    write_num_map();show_all_map();memset(open_map,0,sizeof(open_map)); // reset the open_map.int x,y;     // empty = 0 , mine = 9, number = otherssumBlock = SIZE * SIZE - sumMine;int sum = 0;while(sumBlock != sum){   printf("please input the postion x,y: ");   scanf("%d %d",&x,&y);   scanf("%*[^\n]");    //clean the buffer   scanf("%*c");       x--;   y--;   if(beyond_board(x,y)){  // the position is beyond the board      printf("beyond the board and please input the position again:");  continue;   }   if(!num_map[x][y]){    //is empty           find_empty(x,y);              show_all_map(x,y);      }else if(num_map[x][y] == 9){  // is mine      show_all_mine();  show_all_map();  break;   }else{                         // is number      open_map[x][y] = 1;  show_all_map();   }       sum = sum_one_open_map();}if (sum==sumBlock) printf("YOU WIN! \n");else {    printf("YOU LOSE!\n");}return 0;}

运行截图:






















0 0