【扫雷游戏】

不用说,先上代码,简单易懂。

#include<windows.h>
#include<iostream>
#include<cstdlib>
#include<conio.h>
#include<ctime>
using namespace std;
const int m=10;char c;
short int dirx[8]{-1,0,1,-1,1,-1,0,1},diry[8]{1,1,1,0,0,-1,-1,-1};//方向 
bool dirz[8]{0,1,0,1,1,0,1,0};									  //1为横竖 2为斜 
char map[m][m];bool flag[m][m],dis[m][m];int zx,zy;int n=m*m;//map 本身  flag 标记  dis 显示 
int random(int x){
	return rand()%x+0;
}
void print(){					//打印 
	system("cls");
	printf("扫雷游戏\n");
	for(int i=0;i<m;i++){
		for(int j=0;j<m;j++){
			if(flag[i][j])
				printf("P");
			else if(dis[i][j])
				printf("%c",map[i][j]);
			else printf("#");
			if(i==zx&&j==zy)
				printf("<");
			else printf(" ");
		}	
		printf("\n");
	}
	printf("w上 s下 a左 d右 空格点击 回车标记雷"); 
	return;
}
void init(){		//初始化 
	srand(time(0));
	for(int i=0;i<m;i++){
		for(int j=0;j<m;j++)
			map[i][j]='0';
		map[i][random(m-1)]='*';
	}
	for(int i=0;i<m;i++)
		for(int j=0;j<m;j++)
			if(map[i][j]=='0')
				for(int z=0;z<8;z++)
					if(map[i+dirx[z]][j+diry[z]]=='*')
						map[i][j]++; 
	print();
	return;
}
void dfs0(int x,int y){//点到了0(递归) 
	dis[x][y]=true;n--;
	if(map[x][y]=='0')
		for(int i=0;i<8;i++)
			if( map[x+dirx[i]][y+diry[i]]!='*' && x+dirx[i]>=0 && y+diry[i]>=0 && y+diry[i]<m && x+dirx[i]<m && dis[x+dirx[i]][y+diry[i]]==false){
				if(dirz[i])dfs0(x+dirx[i],y+diry[i]);
				else if(map[x+dirx[i]][y+diry[i]]!='0'){
					dis[x+dirx[i]][y+diry[i]]=true;n--;
				}
			}
				
	return;
}
void luse(){//输了 
	system("cls");
	printf("你输了!\n");
	for(int i=0;i<m;i++){
		for(int j=0;j<m;j++)
			printf("%c ",map[i][j]);
		printf("\n");
	}
	printf("(点击离开)");
	getch();
	return;
}
void win(){//赢了 
	system("cls");
	printf("你赢了!\n");
	for(int i=0;i<m;i++){
		for(int j=0;j<m;j++)
			printf("%c ",map[i][j]);
		printf("\n");
	}
	printf("(点击离开)");
	getch();
	return;
}
int main(){
	//system("color 7A");//白色 
	init();
	while(n>0){
		c=getch();
		if(c=='s'&&zx<m-1)zx++;
		else if(c=='w'&&zx>0)zx--;
		else if(c=='d'&&zy<m-1)zy++;
		else if(c=='a'&&zy>0)zy--;//方向 
		else if(c==13){//标记 
			if(flag[zx][zy]){
				flag[zx][zy]=false;
				if(map[zx][zy]=='*')n++;
			}
			else {
				flag[zx][zy]=true;
				if(map[zx][zy]=='*')n--;
			}
		}
		else if(c==' '){//点击 
			if(map[zx][zy]=='0')
				dfs0(zx,zy);
			else if(map[zx][zy]=='*'){
				luse();
				Sleep(100);
				return 0;
			}
			else {
				dis[zx][zy]=1;
				n--;
			}
		}
		print();
	}
	win();
	return 0;
}

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值