Advertisement

c++ 控制台版 扫雷游戏

阅读量:

白天看了一天书看累了,晚上瞅见扫雷游戏,就自己琢磨着做一个呗。想了一会,也没看别人怎么做的,大概1个多小时完成了这个简单版本的扫雷游戏,由于没怎么学过c#,界面的事情可能迟几天再做,明天要回家啦,哈哈!

先说思路,其实挺简单的。

(1) 随机生成10个雷,标记到二维数组里,然后计算八个方向的雷的总数记录下来,这是预处理阶段。

(2)输入要翻开的位置的坐标,如果是数字直接显示,是空白的话,这里采用bfs 即宽度优先搜索解决,搜到最外层是数字(仅一层)时结束,具体详见代码。

复制代码
 // 扫雷程序

    
 #include <iostream>
    
 #include <string>
    
 #include <queue>
    
 #include <cstring>
    
 #include <ctime>
    
 using namespace std;
    
 int grid[100][100];
    
 int randMark[100][100];
    
 char showUs[100][100];
    
 int vis[100][100];
    
 int dir[8][2]={{-1,0},{1,0},{0,1},{0,-1},{-1,-1},{-1,1},{1,-1},{1,1}};//方向数组 
    
 int res; 
    
 struct node
    
 {
    
 	int x;
    
 	int y;
    
 };
    
 void bfs(int nx,int ny) //处理点击空白 
    
 {
    
 	queue <node> q;
    
 	node temp;
    
 	node t;
    
 	t.x=nx,t.y=ny;
    
 	q.push(t);
    
 	vis[nx][ny]=1;
    
 	while(!q.empty())
    
 	{
    
 		res++;
    
 		temp=q.front();
    
 		showUs[temp.x][temp.y]=grid[temp.x][temp.y]+'0';
    
 		q.pop();
    
 		for(int i=0;i<8;i++)
    
 		{
    
 			int xx=temp.x+dir[i][0];
    
 			int yy=temp.y+dir[i][1];
    
 			if(xx>=0&&xx<10&&yy>=0&&yy<10)
    
 			{
    
 				if(!vis[xx][yy]&&grid[xx][yy]==0)
    
 				{
    
 				   t.x=xx,t.y=yy;
    
 				   vis[xx][yy]=1;
    
 				   showUs[xx][yy]=grid[xx][yy]+'0';
    
 				   q.push(t);   	
    
 				}
    
 				if(!vis[xx][yy]&&grid[xx][yy]>0&&grid[temp.x][temp.y]==0)
    
 				{
    
 				   t.x=xx,t.y=yy;
    
 				   vis[xx][yy]=1;
    
 				   showUs[xx][yy]=grid[xx][yy]+'0';
    
 				   q.push(t);   	
    
 				}
    
 			}
    
 		}
    
 	}
    
 }
    
 int main()
    
 {
    
 	memset(grid,0,sizeof(grid));
    
 	memset(randMark,0,sizeof(randMark));
    
 	memset(vis,0,sizeof(vis));
    
 	for(int i=0;i<10;i++)
    
 	for(int j=0;j<10;j++)
    
 	showUs[i][j]='*';
    
 	srand(unsigned(time(NULL)));
    
 	int sum=0;
    
 	while(1)
    
 	{
    
 		int x=rand()%10;
    
 		int y=rand()%10;
    
 		if(randMark[x][y]!=1)
    
 		{
    
 			randMark[x][y]=1;//有雷
    
 			sum++;	
    
 		}
    
 		if(sum==10)
    
 		break;
    
 		 
    
 	}
    
     res=0;
    
 	for(int i=0;i<10;i++)
    
 	for(int j=0;j<10;j++)
    
 	{
    
 		if(randMark[i][j])
    
 		grid[i][j]=-1;
    
 	} 
    
 	for(int i=0;i<10;i++)
    
 	for(int j=0;j<10;j++)
    
 	{
    
 		if(grid[i][j]!=-1)
    
 		{
    
 			for(int k=0;k<8;k++)
    
 			{
    
 				int x=i+dir[k][0];
    
 				int y=j+dir[k][1];
    
 				if(x>=0&&x<10&&y>=0&&y<10&&grid[x][y]==-1)
    
 				{
    
 				   grid[i][j]++;	
    
 				}
    
 			}
    
 		}
    
 	}
    
 	for(int i=0;i<10;i++)
    
 	{
    
 		for(int j=0;j<10;j++)
    
 		cout<<showUs[i][j]<<" ";
    
 		cout<<endl;
    
 	}
    
 	
    
 	cout<<"请输入要翻开的位置的坐标:"<<endl;
    
 	int x,y;
    
 	while(1)
    
 	{
    
 		if(res==90)
    
 		cout<<"恭喜您胜利啦,排雷成功!"<<endl; 
    
 		cin>>x>>y;
    
 		if(grid[x][y]==-1)
    
 		{
    
 			cout<<"您中雷啦!"<<endl;
    
 			break;
    
 		}
    
 		else if(!vis[x][y]&&grid[x][y]>0)
    
 		{
    
 			res++;
    
 			vis[x][y]=1;
    
 			showUs[x][y]=grid[x][y]+'0';
    
 			system("cls");
    
 			for(int i=0;i<10;i++)
    
 	        {
    
 	        	for(int j=0;j<10;j++)
    
 	     	    cout<<showUs[i][j]<<" ";
    
 	        	cout<<endl;
    
      	}
    
      	cout<<"请输入要翻开的位置的坐标:"<<endl;
    
 		}
    
 		else if(!vis[x][y]&&grid[x][y]==0)
    
 		{
    
 			bfs(x,y);
    
 			system("cls");
    
 			for(int i=0;i<10;i++)
    
 	        {
    
 	        	for(int j=0;j<10;j++)
    
 	     	    cout<<showUs[i][j]<<" ";
    
 	        	cout<<endl;
    
      	}
    
      	cout<<"请输入要翻开的位置的坐标:"<<endl;
    
 		}
    
 	}
    
 	return 0;
    
 } 
    
    
    
    

全部评论 (0)

还没有任何评论哟~