创作声明:
- 我只学了几个月的C++
- 学的js,没有学过游戏创作
- 我不会用rand(),有大佬教教我吗
- 我不会清屏或者在原输出上做更改,所以只能用换行
游戏名称:
扫雷1.0版本(4*4,5个雷,属于一次性游戏QWQ)
游戏玩法:
每次输入一个坐标(x,y),表示选择当前这个点。
剩余玩法请参照Windows的扫雷······
创作分析:
略······
看代码应该就能看懂吧,很容易懂的~~~
代码以及解析:
结构体:
我们将1看做雷,0看做空地,“x”看做没有扫过的区域。
struct aa{
int lei,fan;//雷,周围雷的个数
char chu; //输出的字符
}a[15][15];
初始化:
在寻找周围的雷的数量时,我们只需找:
(感觉)即可
void dingyi()
{
for(int i=0;i<=4;i++)
{
for(int j=0;j<=4;j++)
{
a[i][j].chu='x';//初始输出的字符
}
}
for(int i=1;i<=4;i++)//0表示不是雷,1表示是雷
{
for(int j=1;j<=4;j++)
{
a[i][j].lei=rand()%2;//随机生成雷
if(ans==5)//如果雷已经有5个,其他的都定义为0
{
a[i][j].lei=0;
}
if(a[i][j].lei==1)//如果是雷,ans++
{
ans++;
}
}
}
//a[1][1].lei=a[10][10].lei=1;
for(int i=1;i<=4;i++)//范围
{
for(int j=1;j<=4;j++)
{
//if(a[i][j].lei==1)
// {
// sum++;
// }
// else
// {
if(a[i-1][j].lei==1)//寻找周围雷的数量
{
a[i][j].fan++;
}
if(a[i][j-1].lei==1)
{
a[i][j].fan++;
}
if(a[i+1][j].lei==1)
{
a[i][j].fan++;
}
if(a[i][j+1].lei==1)
{
a[i][j].fan++;
}
if(a[i-1][j-1].lei==1)
{
a[i][j].fan++;
}
if(a[i+1][j+1].lei==1)
{
a[i][j].fan++;
}
if(a[i+1][j-1].lei==1)
{
a[i][j].fan++;
}
if(a[i-1][j+1].lei==1)
{
a[i][j].fan++;
}
//}
}
}
}//可改进
初始输出:
void shuchu()
{
for(int i=1;i<=4;i++)
{
for(int j=1;j<=4;j++)
{
cout<<a[i][j].chu;//输出原始字符
}
cout<<endl;
}
}
输入坐标寻找:
void xunzhao(int x,int y)
{
bo=0;
if(a[x][y].lei==1)//如果踩到雷
{
for(int i=1;i<=4;i++)
{
for(int j=1;j<=4;j++)
{
cout<<a[i][j].lei;//输出所有的位置的情况
}
cout<<endl;
}
cout<<"\nQWQ";
bo=1;//bo变为1
return ;//返回
}
else
{
if(a[x][y].lei==0)//不是雷
{
for(int i=1;i<=4;i++)
{
for(int j=1;j<=4;j++)
{
if(i==x&&j==y)
{
cout<<a[i][j].fan;//输出它周围雷的数量
}
else
{
cout<<a[i][j].chu;
}
}
cout<<endl;
}
a[x][y].chu=a[x][y].fan+'0';//将该坐标初始字符改为周围雷的数量
ans--;
if(ans==0)//如果只剩下雷(在主函数里ans会被16减一下,表示空地的数量)
{
cout<<"win";//胜利
return;
}
}
}
}
主函数:
int main()
{
cout<<"\n\n\n\n\n\n\n\n";
dingyi();
shuchu();
int x,y;
ans=16-ans;//初始化空地的数量
while(bo==0)//只要没踩到雷就循环
{
cin>>x>>y;//输入坐标
cout<<"\n\n\n\n\n\n\n\n";//清屏
xunzhao(x,y);//寻找
if(bo==1)//如果踩到雷,结束
{
return 0;
}
}
return 0;
}
总代码:
#include<bits/stdc++.h>
using namespace std;
struct aa{
int lei,fan;//雷,初始,范围
char chu;
}a[15][15];
int bo,ans;//雷的数量
void dingyi()
{
for(int i=0;i<=4;i++)
{
for(int j=0;j<=4;j++)
{
a[i][j].chu='x';//初始
}
}
for(int i=1;i<=4;i++)
{
for(int j=1;j<=4;j++)
{
a[i][j].lei=rand()%2;//雷
if(ans==5)
{
a[i][j].lei=0;
}
if(a[i][j].lei==1)
{
ans++;
}
}
}
//a[1][1].lei=a[10][10].lei=1;
for(int i=1;i<=4;i++)//范围
{
for(int j=1;j<=4;j++)
{
//if(a[i][j].lei==1)
// {
// sum++;
// }
// else
// {
if(a[i-1][j].lei==1)
{
a[i][j].fan++;
}
if(a[i][j-1].lei==1)
{
a[i][j].fan++;
}
if(a[i+1][j].lei==1)
{
a[i][j].fan++;
}
if(a[i][j+1].lei==1)
{
a[i][j].fan++;
}
if(a[i-1][j-1].lei==1)
{
a[i][j].fan++;
}
if(a[i+1][j+1].lei==1)
{
a[i][j].fan++;
}
if(a[i+1][j-1].lei==1)
{
a[i][j].fan++;
}
if(a[i-1][j+1].lei==1)
{
a[i][j].fan++;
}
//}
}
}
}
void shuchu()
{
for(int i=1;i<=4;i++)
{
for(int j=1;j<=4;j++)
{
cout<<a[i][j].chu;
}
cout<<endl;
}
}
void xunzhao(int x,int y)
{
bo=0;
if(a[x][y].lei==1)//踩到雷
{
for(int i=1;i<=4;i++)
{
for(int j=1;j<=4;j++)
{
cout<<a[i][j].lei;
}
cout<<endl;
}
cout<<"\nQWQ";
bo=1;
return ;
}
else
{
if(a[x][y].lei==0)
{
for(int i=1;i<=4;i++)
{
for(int j=1;j<=4;j++)
{
if(i==x&&j==y)
{
cout<<a[i][j].fan;
}
else
{
cout<<a[i][j].chu;
}
}
cout<<endl;
}
a[x][y].chu=a[x][y].fan+'0';
ans--;
if(ans==0)
{
cout<<"win";
}
}
}
}
int main()
{
cout<<"\n\n\n\n\n\n\n\n";
dingyi();
shuchu();
int x,y;
ans=16-ans;
while(bo==0)
{
cin>>x>>y;
cout<<"\n\n\n\n\n\n\n\n";
xunzhao(x,y);
if(bo==1)
{
return 0;
}
}
return 0;
}
结束啦~~~
(预计在8.21以后更新扫雷2.0版本)