linux使用gcc实现扫雷,C++实现扫雷游戏(控制台版)

本文实例为大家分享了C++实现扫雷游戏的具体代码,供大家参考,具体内容如下

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

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

**********

**********

**x*******

**********

**********

**********

**********

**********

**********

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

#include

#include

#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;

}

运行截图:

caac077d4bd9d291a2bb934f8ac9dea3.png

1dcc00c779e53927464fb14308f0e1de.png

更多精彩游戏小代码,请点击《游戏专题》阅读

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持我们。

时间: 2020-03-17

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值