C++扫雷游戏 C++实现扫雷游戏(控制台版)
yangshuolll 人气:0需要开一个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; }
运行截图:
更多精彩游戏小代码,请点击《游戏专题》阅读
加载全部内容