目录
一、扫雷
1.编译器:vs code
2.语言:c++
3.实现的功能
可以随机生成扫雷模式的图,每次玩家可以选择一个模式:
(1).随机模式:最多50*50个格子,最多1000个雷;
(2).简单模式:5*5的地图,一共10个雷;
(3).中等模式:10*10的地图,一共30个雷;
(4).地狱模式:20*20的地图,一共200个雷;
4.用到的算法:bfs+偏移量
5.代码
#include<iostream>
#include<algorithm>
#include<cstring>
#include<cstdio>
#include<stdlib.h>
#include<time.h>
#include<windows.h>
using namespace std;
const int N=1000;
char g[N][N];
int a[N][N];
int st[N][N];
void init(int n,int m)//初始化
{
for(int i=1;i<=n;i++)
for(int j=1;j<=m;j++)
g[i][j]='?';
}
void print(int n,int m)
{
for(int i=1;i<=n;i++)
{
for(int j=1;j<=m;j++)
{
cout<<g[i][j]<<" ";
}
puts("");
}
}
void menu()
{
cout<<"***********欢迎来到扫雷小游戏***********"<<endl;
cout<<"***********1.随机模式 ***********"<<endl;
cout<<"***********2.简单模式 ***********"<<endl;
cout<<"***********3.中等模式 ***********"<<endl;
cout<<"***********4.地狱模式 ***********"<<endl;
cout<<"***********5.游戏说明 ***********"<<endl;
}
void game(int op)
{
int n,m,q;
srand(time(0));//设置随机种子
if(op==1) //随机模式,随缘匹配,最多50*50个格子,最多1000个雷
{
n=rand()%50+1;
m=rand()%50+1;
q=rand()%1000+1;
}
else if(op==2) n=5,m=5,q=10;//简单模式,5*5的地图,一共10个雷
else if(op==3) n=10,m=10,q=30;//中等模式,10*10的地图,一共30个雷
else if(op==4) n=20,m=20,q=200;//地狱模式,20*20的地图,一共200个雷
init(n,m);
//生成随机的雷的坐标
memset(st,0,sizeof st);
for(int i=1;i<=q;i++) //q代表生成雷的个数
{
int x=rand()%n+1;
int y=rand()%m+1;
st[x][y]=1;
}
//对每个位置上进行提示
memset(a,0,sizeof a);
int dx[8]={-1,-1,0,1,1,1,0,-1};
int dy[8]={0,1,1,1,0,-1,-1,-1};
for(int i=1;i<=n;i++)
{
for(int j=1;j<=m;j++)
{
int l,r;
for(int k=0;k<8;k++)
{
l=i+dx[k],r=j+dy[k];
if(l>=1&&l<=n&&r>=1&&r<=m&&st[l][r]==1) a[i][j]++;
}
}
}
int res=0;//判断是否扫完所有的雷
//游戏开始时的操作
while(1)
{
print(n,m);
int X,Y;
cout<<"请您选择一个坐标(中间用空格隔开):";
cin>>X>>Y;
system("cls");
if(st[X][Y]==1) //如果是雷的话
{
//显示所有的雷存在的位置
for(int i=1;i<=n;i++)
{
for(int j=1;j<=m;j++)
{
if(st[i][j]==1) cout<<"Q"<<" ";
else cout<<g[i][j]<<" ";
}
puts("");
}
cout<<"很抱歉,您踩中了雷!"<<endl;
Sleep(10000);//延时10s
system("cls");
return ;
}
else//如果该位置不是雷
{
g[X][Y]=a[X][Y]+'0';
res++;
}
if(res==q)
{
cout<<"恭喜您挑战成功!"<<endl;
return ;
}
}
return ;
}
void pre()
{
cout<<"请自觉安排游戏时间,抵制长期不良游戏!"<<endl;
cout<<"本游戏分为4中不同的模式,下面是各个模式的说明:"<<endl;
cout<<"随机模式:最多50*50个格子,最多1000个雷"<<endl;
cout<<"简单模式:5*5的地图,一共10个雷"<<endl;
cout<<"中等模式:10*10的地图,一共30个雷"<<endl;
cout<<"地狱模式:20*20的地图,一共200个雷"<<endl;
cout<<"祝您生活愉快!----------张先生"<<endl;
}
int main()
{
while(1)
{
menu();
int op;
cout<<"请您选择一个模式:";
cin>>op;
if(op==1) game(1);
else if(op==2) game(2);
else if(op==3) game(3);
else if(op==4) game(4);
else pre();
}
return 0;
}
6.运行结果
界面
测试界面
二、玩转迷宫
- 环境:vs code
- 语言:c++
- 算法:bfs+dfs+迷宫知识
- 游戏要求
(1)玩家可以选择自己走动,每次走动都会有一定的积分
(2)当玩家寻求帮助的时候,应该给出迷宫的最短的那条路径
(3)玩家可以自行判断迷宫的合法性
(4)游戏采用循环制度
(5)自觉安排游戏时间
5.代码
#include<bits/stdc++.h>
#include<iostream>
#include<algorithm>
#include<cstring>
#include<cstdio>
#include<stdlib.h>
using namespace std;
const int N=1100;
typedef pair<int,int> PII;
char g[N][N];
int st[N][N];
int vis[N][N];
int n,m,op;
int dx[4]={-1,0,1,0},dy[4]={0,1,0,-1};
int flag;
int a;
void create(int count,int n,int m)
{
memset(vis,0,sizeof vis);
memset(st,0,sizeof st);
memset(g,0,sizeof g);
srand(time(0));
for(int i=1;i<=count;i++)
{
int x,y;
x=rand()%n+1;
y=rand()%m+1;
vis[x][y]=1;
}
for(int i=1;i<=n;i++)
for(int j=1;j<=m;j++)
if(vis[i][j]==0) g[i][j]='.';
else g[i][j]='#';
}
void menu()
{
cout<<"*********************"<<endl;
cout<<"***欢迎来到迷宫探索**"<<endl;
cout<<"1.创建一个5 * 5的地图"<<endl;
cout<<"2.创建一个10*10的地图"<<endl;
cout<<"3.创建一个20*20的地图"<<endl;
cout<<"*********************"<<endl;
}
void print()
{
for(int i=1;i<=n;i++)
{
for(int j=1;j<=m;j++)
{
cout<<g[i][j]<<" ";
}
puts("");
}
}
void dfs(int x,int y)
{
if(x==n&&y==m) flag=1;
st[x][y]=1;
for(int i=0;i<4;i++)
{
int l=x+dx[i],r=y+dy[i];
if(l>=1&&l<=n&&r>=1&&r<=m&&!st[l][r]&&g[l][r]!='#')
{
dfs(l,r);
}
}
}
void bfs(int l,int r)
{
memset(st,0,sizeof st);
PII q[100],pre[100][100];
int hh=0,tt=-1;
q[++tt]={l,r};
st[l][r]=1;
while(hh<=tt)
{
auto t=q[hh++];
for(int i=0;i<4;i++)
{
int x=t.first+dx[i],y=t.second+dy[i];
if(x>=1&&x<=n&&y>=1&&y<=m&&!st[x][y]&&!vis[x][y])
{
pre[x][y]=t;
q[++tt]={x,y};
st[x][y]=1;
if(x==n&&y==m) flag=1;
}
}
}
if(!flag)
{
puts("迷宫不合法,请重新生成!");
system("pause");
system("cls");
return ;
}
int x=n,y=m;
hh=0,tt=-1;
while(1)
{
if(x==1&&y==1) break;
q[++tt]={x,y};
auto t=pre[x][y];
x=t.first,y=t.second;
}
print();
system("pause");
system("cls");
g[l][r]='.';
for(int i=tt;i>=0;i--)
{
auto t=q[i];
x=t.first,y=t.second;
g[x][y]='@';
print();
system("pause");
system("cls");
puts("");
g[x][y]='.';
}
}
void game(int op)
{
srand(time(0));
int count;
if(op==1) n=5,m=5,count=12;
else if(op==2) n=10,m=10,count=50;
else if(op==3) n=20,m=20,count=150;
flag=0;
create(count,n,m);
dfs(1,1);
puts("迷宫正在生成中,请您耐心等待...");
while(1)
{
if(flag&&g[1][1]=='.'&&g[n][m]=='.') break;
create(count,n,m);
dfs(1,1);
}
int x=1,y=1,ans=0;
g[1][1]='@';
while(1)
{
print();
if(x==n&&y==m)
{
printf("挑战成功!您的分数是%d",ans);
return ;
}
char q;
cout<<"是否寻求帮助?(y/n):";
cin>>q;
if(q=='y'||q=='Y')
{
flag=0;
bfs(x,y);
return ;
}
else
{
int l=x,r=y;
cout<<"请输入一个坐标:";
cin>>x>>y;
while(vis[x][y])
{
cout<<"该坐标是墙,请重新输入:";
cin>>x>>y;
}
ans++;
g[l][r]='.';
g[x][y]='@';
}
}
}
int main()
{
while(1)
{
menu();
int op;
cin>>op;
switch (op)
{
case 1:game(op);break;
case 2:game(op);break;
case 3:game(op);break;
default:cout<<"序号错误!"<<endl;break;
}
}
return 0;
}
6.桌面效果