C++小游戏(原创)——扫雷

 

#include<iostream>
#include<cmath>
#include<ctime>
#include<cstring>
#include<stdio.h>
#include<stdlib.h>
#include<windows.h>
#include<conio.h>
#define KEY_DOWN(VK_NONAME) ((GetAsyncKeyState(VK_NONAME) & 0x8000) ? 1:0)

using namespace std;
int maxn=16;
int maxm=30;
int square[100][100];
bool flag[100][100];
int move_x[8]={0,0,1,-1,1,1,-1,-1};
int move_y[8]={1,-1,0,0,1,-1,1,-1};
int xxx,yyy;
bool gameover=true; 
/*
用dfs鼠标点击的那个点,如果是数字,则直接翻开;如果是空格,则进行搜索。 
*/
void dfs(int x,int y){
	flag[x][y]=false;
	if(square[x][y]==-1) gameover=false;
	if(!gameover) return;
	if(square[x][y]!=0) return;
	for(int i=0;i<8;i++)
	{
		int now_x=move_x[i]+x;
		int now_y=move_y[i]+y;
		if(square[now_x][now_y]!=0){
			flag[now_x][now_y]=false;
		}
	}
	for(int i=0;i<4;i++)
	{
		int now_x=move_x[i]+x;
		int now_y=move_y[i]+y;
		if(flag[now_x][now_y]){
			flag[now_x][now_y]=false;
			dfs(now_x,now_y);
		}
	}
}
/*
数第x,y个格子,周围有多少个雷
*/ 
int count_num(int x,int y)
{
	int sum=0;
	for(int i=x-1;i<=x+1;i++)
		for(int j=y-1;j<=y+1;j++)
			if (square[i][j]==-1) sum++;
	return sum;
}

/*
将下面将要输出的东西改变颜色
*/ 
void SetColor(unsigned short ForeColor=7,unsigned short BackGroundColor=0)
{
	HANDLE hCon=GetStdHandle(STD_OUTPUT_HANDLE);
	SetConsoleTextAttribute(hCon,ForeColor|BackGroundColor);
}

/*
初始化,随机生成一个雷阵 
*/ 
void intt(){
	srand(time(NULL));
	for(int i=0;i<maxn+5;i++)
		for(int j=0;j<maxm+5;j++)
			square[i][j]=9;
	memset(flag,true,sizeof(flag));
	int xx=rand() % maxn+1;
	int yy=rand() % maxm+1;
	int num=1;
	while(num<=99)
	{
		while(square[xx][yy]==-1||xx==xxx&&yy==yyy)
		{
			xx=rand()%maxn+1;
			yy=rand()%maxm+1;
		}
		square[xx][yy]=-1;
		num++;
	}
	for(int i=1;i<=maxn;i++)
		for(int j=1;j<=maxm;j++)
			if(square[i][j]!=-1) square[i][j]=count_num(i,j);
}

/*
打印未被翻开的雷阵 
*/ 
void display(){
	for(int i=1;i<=maxn;i++)
	{
		for(int j=1;j<=maxm;j++)
			if(flag[i][j]==false) 
				if(square[i][j]==-1) {
					SetColor(4);
					cout<<"* ";
					SetColor(15);
				}
				else if (square[i][j]!=0) cout<<square[i][j]<<" ";else cout<<"  ";else cout<<"▇";
		cout<<endl;
	}
}

/*
如果引爆了雷,则翻开所有的雷阵 
*/ 
void display_y(){
	for(int i=1;i<=maxn;i++)
	{
		for(int j=1;j<=maxm;j++)
			if(square[i][j]==-1) 
			{
				SetColor(4);
				cout<<"* ";
				SetColor(15);
			}
				else if (square[i][j]!=0) cout<<square[i][j]<<" ";else cout<<"  ";
		cout<<endl;
	}
}

/*
当鼠标右键点击时,翻开雷阵 
*/ 
void work(){
	while(1)
	{
		POINT p;
		if(KEY_DOWN(MOUSE_EVENT))
			{
				char ch;
				HWND h=GetForegroundWindow();
    			GetCursorPos(&p);
				ScreenToClient(h,&p);
				xxx=p.y/16+1;
				yyy=p.x/16+1;
				dfs(xxx,yyy);
				system("cls");
				display();
			}
		if(gameover==false) 
		{
			system("cls");
			display_y();
			cout<<"GAME OVER!!!"<<endl;
			system("pause"); 
			break;
			
		}
		Sleep(20);

	//	cin>>xxx>>yyy;
	}
}

/*
隐藏光标 
*/ 
void HideCursor()
{
	CONSOLE_CURSOR_INFO cursor_info = {1, 0}; 
	SetConsoleCursorInfo(GetStdHandle(STD_OUTPUT_HANDLE), &cursor_info);
}
int main(){
	system("color 0F");//设置背景颜色 
	system("mode con cols=60 lines=19");//设置黑框大小 
	HideCursor();
	intt();
	display();
	work();
	return 0;
} 

猜你喜欢

转载自blog.csdn.net/Ziwen_/article/details/82930575