内容简介
本文介绍了一个作者原创的扫雷小游戏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
好啦,朋友们下期再见啦!!!