C++小游戏——扫雷


内容简介

本文介绍了一个作者原创的扫雷小游戏qwq


以下是本篇文章正文内容

一、扫雷规则

鼠标左键点击,右键进行标注。再次右键代表分析。

经典扫雷,经典体验!

每次输入三个正整数x, y, op
要点击的坐标x,y。 op=1 表示鼠标左键,op=2 表示鼠标右键
注意:x ,y 轴如图所示
坐标

二、具体代码实现

1.调试环境

环境为Dev C++ 5.4.0
(有一说一万能头太香了呜呜,VS再见啦。。(bushi

2.代码实现

代码如下:

// 扫雷小游戏 

#include <bits/stdc++.h> //

using namespace std;

const int maxX = 10; // 竖着的 
const int maxY = 15; // 横着的 
const int mineNum=30; // 30  地雷数量.要求小于 maxX*maxY 
using namespace std;

int use[maxX+1][maxY+1]; // 0未使用,1点开,2标记,3问号 
int num[maxX+1][maxY+1]; // 记录周围雷数量 
int has[maxX+1][maxY+1]; // 是否有地雷 
int x,y,op;

int cnt=0; // 打开的数量 
int tabNum=0; // 标记的数目 

struct node{
	int x,y;
};
queue<node> q; // 用于BFS 
int inq[maxX+1][maxY+1]; // 记录是否入队
 

int tX[8]={0,-1,-1,-1,0,1,1,1}; // 
int tY[8]={-1,-1,0,1,1,1,0,-1};


void inni(){
	memset(use,0,sizeof(use));
	memset(num,0,sizeof(num));
	srand((unsigned)time(NULL));
	
	// 随机数布雷 
	int i=1; // 
	while(i<=mineNum){
		int tempx = rand()%maxX+1;
		int tempy = rand()%maxY+1;
		if(has[tempx][tempy]==0){
			has[tempx][tempy]=1;
			i++;
		}
	} 
	
	for(int i=1;i<=maxX;i++){
		for(int j=1;j<=maxY;j++){
			int ans=0;
			if(has[i-1][j-1]==1)ans++;
			if(has[i][j-1]==1)ans++;
			if(has[i-1][j]==1)ans++;
			
			if(i+1<=maxX){
				if(has[i+1][j]==1)ans++;
				if(has[i+1][j-1]==1)ans++;
			}
			if(j+1<=maxY){
				if(has[i-1][j+1]==1)ans++;
				if(has[i][j+1]==1)ans++;
				
				if(i+1<=maxX){
					if(has[i+1][j+1]==1)ans++;
				}
			}
			num[i][j]=ans;
		}
	}
}

void show(){
	printf("   列数:");
	for(int i=2;i<=maxY;i+=2){
		printf("%4d",i);
	} 
	cout<<endl;
	for(int i=1;i<=maxX;i++){
		printf("第%3d 行  ",i);

		for(int j=1;j<=maxY;j++){
			if(use[i][j]==1){ // 点开了 
				cout<<num[i][j];
			} 
			else if(use[i][j]==2){ // 标记 
				putchar('f'); 
			} 
			else if(use[i][j]==3){ // 问号 
				putchar('?'); 
			}
			else{ // use[i][j]==0
				putchar('*'); 
			}
			putchar(' ');
		}
		cout<<endl;
	}
	cout<<"未标记地雷数目: "<<mineNum-tabNum<<endl;
	
	// debug
	// cout<<cnt<<endl;
}


void update(int x,int y){ // DFS更新地图
	if(x<=0 || x>maxX || y<=0 || y>maxY)return; // 越界 
	if(use[x][y]==1)return;  // 点开的不重复点 
	
	
	use[x][y]=1; // 变为点开的状态 
	cnt++; 
	
	if(num[x][y]==0){ // 周围没有地雷,往8个方向延拓 
		for(int i=0;i<8;i++){
			update(x+tX[i],y+tY[i]); 
		}
	}
}


void endUI(){
	// system("cls"); // 清屏 
	
	cout<<"你踩雷了,游戏结束!"<<endl; 
	
	// 输出地雷位置 
	cout<<"地雷位置如下:"<<endl;
	printf("   列数:");
	for(int i=2;i<=maxY;i+=2){
		printf("%4d",i);
	} 
	cout<<endl;
	
	for(int i=1;i<=maxX;i++){
		printf("第%3d 行  ",i);
		for(int j=1;j<=maxY;j++){
			cout<<has[i][j]<<' ';
		}
		cout<<endl;
	}
	cout<<endl;
}

int main() { 
	inni();
	show();
	
	// op==1左键点开  op==2右键标记 
	while(cin>>x>>y>>op){
		
		if(op==1){
			if(use[x][y]==0){ // 以前是未点开的,才有效 
				if(has[x][y]){
					endUI();	
				}
				else{
					update(x,y); //
					
					system("cls"); // 清屏 
					show();
				} 
			}
			if(cnt==maxX*maxY-mineNum){
				cout<<"游戏胜利!!"<<endl;
			} 
			 
		} 
		else{ // op==2
			if(use[x][y]==0){
				use[x][y]=2; // 标记
				tabNum++; 
			}
			else if(use[x][y]==2){
				use[x][y]=3; 
				tabNum--;
			}
			else if(use[x][y]==3){
				use[x][y]=0;
			} 
			system("cls"); // 清屏 
			show();
		}
	}
	
	return 0;
}


3.运行演示

在这里插入图片描述

开始界面


在这里插入图片描述

游戏进行界面


在这里插入图片描述

第二颗雷就失败了555(

胜利
胜利!!!(把地雷数量改成5颗才强行通关的屑作者 (doge


小结

以上就是今天要带来的全部的内容啦,看到这里不点个赞或者一键三连支持一下这个刚刚开始写博客的萌新博主嘛qwq你的关注和支持就是我进步的动力呐~

后续我会继续分享一些有趣的小游戏给大家哦~~
小游戏专栏保持不定期 更新~~qwq

好啦,朋友们下期再见啦!!!

  • 3
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 7
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 7
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值