扫雷游戏 控制台版 C++

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

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

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

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

#include <stdio.h>
#include <string.h>
#define SIZE 10
char img_map[SIZE + 2][SIZE + 2];  // the image of a map
int  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.txt
	FILE *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_map
	int 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 map
				num_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 = others
	sumBlock = 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;
}

运行截图:






















评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值