高中生初学C++不久,算法和数据结构学了一些
算法方面感觉就是搜索写得熟一些了。
之前AC了一道关于扫雷的题:
但是呢,这个题只是输入第一步,然后给出触摸后的盘面;
所以我就有了个想法把这个写成一个完整的扫雷,
于是课余时间就堆出了这个扫雷,个人感觉蛮好哈哈哈
先放几张图片:
好了就这样了,其实我是想做成那种用一个字符表示当前位置的,
但是对于键盘按键的检测我还没学到,
所以姑且只能靠输入坐标了。
总之不多废话,上代码:
#include<bits/stdc++.h>//这是一个万能(也不能说是吧)头文件,总之它包含了许许多多的头文件,我这个懒人就用这个了,这个头文件DEV C++支持的。
#include <windows.h>
using namespace std;
int touchnum,mapsize,minenum,leftblank;
int dir[8][2]={{1,-1},{1,0},{1,1},{0,-1},{0,1},{-1,-1},{-1,0},{-1,1}};
int opened[20][20];
char sysmap[20][20],plrmap[20][20];
int touchx,touchy;
void GameLoad()
{
SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE), FOREGROUND_INTENSITY|FOREGROUND_RED|FOREGROUND_GREEN);
printf("--------------------------------------------------------------------------------");
printf("\n\t\t\t欢迎游玩扫雷2.0!\n\n");
printf("--------------------------------------------------------------------------------\n");
SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE), 7);
}
void GameRule()
{
SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE), FOREGROUND_INTENSITY|FOREGROUND_RED|FOREGROUND_GREEN);
printf("--------------------------------------------------------------------------------");
SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE), FOREGROUND_INTENSITY|FOREGROUND_GREEN);
printf("\n\t\t\t自个儿百度去!\t\t 6\n");
SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE), FOREGROUND_INTENSITY|FOREGROUND_RED|FOREGROUND_GREEN);
printf("--------------------------------------------------------------------------------\n");
SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE), FOREGROUND_INTENSITY);
printf("\t\t\t输入0返回~\n\t\t\t");
P:
{
char x;
cin>>x;
if(x=='0')
return;
else if(x=='6')
{
PP:
{
SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE), FOREGROUND_INTENSITY|FOREGROUND_GREEN|FOREGROUND_RED);
printf("\n\t\t\tAuthor:你真的想知道?(y/n)\n\t\t\t");
cin>>x;
if(x=='n')
{
SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE), FOREGROUND_INTENSITY|FOREGROUND_GREEN);
printf("\n\t\t\tOK,撒由那拉~");
return;
}
else if(x=='y')
{
SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE), FOREGROUND_INTENSITY|FOREGROUND_GREEN);
printf("\n\t\t\t好吧,就告诉你吧:\n\t\t\t扫雷这款经典的游戏其实很简单。\n");
printf("\t\t\t选择一个未翻开的位置(.)\n");
printf("\t\t\t翻开后格子上显示的数字表示周围一圈有几个地雷。\n");
printf("\t\t\t所以如果点到地雷(#),你就输了哟~\n");
printf("\t\t\t当你剩下的格子都是地雷的时候,你就赢了!\n");
SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE), 7);
}
else
{
SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE), FOREGROUND_INTENSITY|FOREGROUND_RED);
printf("\n别瞎按!");
goto PP;
}
}
}
else
{
printf("别瞎按!\n");
goto P;
}
}
return;
}
int GameChoose()
{
long long choose;
L:
{
SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE), FOREGROUND_INTENSITY|FOREGROUND_RED|FOREGROUND_GREEN);
printf("\n--------------------------------------------------------------------------------\n");
SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE), FOREGROUND_INTENSITY|FOREGROUND_BLUE|FOREGROUND_GREEN);
printf("\n\t\t\t 1-新游戏\n\t\t\t 2-游戏规则\n\t\t\t 3-退出\n\n");
SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE), FOREGROUND_INTENSITY|FOREGROUND_GREEN);
printf("\n\t\t你的选择是:");
SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE), 7);
cin>>choose;
if(choose==1){
SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE), FOREGROUND_INTENSITY|FOREGROUND_RED|FOREGROUND_GREEN);
printf("\n--------------------------------------------------------------------------------\n");
return 1;
}
else if(choose==2){
SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE), FOREGROUND_INTENSITY|FOREGROUND_RED|FOREGROUND_GREEN);
printf("\n--------------------------------------------------------------------------------\n");
return 2;
}
else if(choose==3){
SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE), FOREGROUND_INTENSITY|FOREGROUND_RED|FOREGROUND_GREEN);
printf("\n--------------------------------------------------------------------------------\n");
return 3;
}
else if(choose==9261225){
SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE), FOREGROUND_INTENSITY|FOREGROUND_RED|FOREGROUND_GREEN);
printf("\n--------------------------------------------------------------------------------\n");
return 9261225;
}
else
{
SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE), FOREGROUND_INTENSITY|FOREGROUND_RED);
printf("\n选择输入错误,请重新输入!\n");
goto L;
}
}
}
void CreatMap(int x,int y)
{
memset(sysmap,'.',sizeof sysmap);
memset(plrmap,'.',sizeof plrmap);
memset(opened,0,sizeof opened);
touchnum=0;
leftblank=mapsize*mapsize;
time_t t;
srand((unsigned) time (&t));
for(int i=0;i<minenum;i++)
{
int minex,miney;
L:
{
minex = rand() % (mapsize-1);
miney = rand() % (mapsize-1);
if(sysmap[minex][miney]=='#')
goto L;
}
sysmap[minex][miney]='#';
}
}
void LoadMap()
{
SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE), FOREGROUND_INTENSITY|FOREGROUND_RED|FOREGROUND_GREEN);
printf("\n--------------------------------------------------------------------------------");
SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE), 7);
printf("\n\t\t\t ");for(int i=1;i<=mapsize;i++){printf("%2d",i);} cout<<endl<<endl;
for(int i=0;i<mapsize;i++)
{
printf("\t\t\t %2d ",i+1);
for(int j=0;j<mapsize;j++)
{
if(plrmap[i][j]>'0' && plrmap[i][j]<'9')
SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE), FOREGROUND_INTENSITY|FOREGROUND_RED|FOREGROUND_GREEN);
else if(plrmap[i][j]=='~')
SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE), FOREGROUND_INTENSITY);
else if(plrmap[i][j]=='.')
SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE), 7);
if(i==touchx && j==touchy)
SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE), FOREGROUND_INTENSITY|FOREGROUND_BLUE|FOREGROUND_GREEN);
cout<<plrmap[i][j]<<" ";
SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE), 7);
}
cout<<endl;
}
SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE), FOREGROUND_INTENSITY|FOREGROUND_RED|FOREGROUND_GREEN);
printf("\n--------------------------------------------------------------------------------");
}
bool check(int xx,int yy)
{
return xx>=0 && xx<mapsize && yy>=0 && yy<mapsize;
}
void MineDFS(int x,int y)
{
opened[x][y]=1;
leftblank--;
int mnum=0;
for(int i=0;i<8;i++)
{
int xx=x+dir[i][0];
int yy=y+dir[i][1];
if(check(xx,yy) && sysmap[xx][yy]=='#')
{
mnum++;
}
}
if(mnum!=0)
{
char mine=mnum+'0';
plrmap[x][y]=mine;
}
else
{
plrmap[x][y]='~';
for(int i=0;i<8;i++)
{
int xx=x+dir[i][0];
int yy=y+dir[i][1];
if(check(xx,yy) && opened[xx][yy]==0)
{
MineDFS(xx,yy);
}
}
}
}
void win()
{
SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE), FOREGROUND_INTENSITY|FOREGROUND_RED|FOREGROUND_GREEN);
printf("\n--------------------------------------------------------------------------------");
printf("\n--------------------------------------------------------------------------------");
SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE), 7);
printf("\n\t\t\t ");for(int i=1;i<=mapsize;i++){printf("%2d",i);} cout<<endl<<endl;
for(int i=0;i<mapsize;i++)
{
printf("\t\t\t %2d ",i+1);
for(int j=0;j<mapsize;j++)
{
if(sysmap[i][j]=='#')
{
plrmap[i][j]='#';
SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE),FOREGROUND_INTENSITY|FOREGROUND_GREEN);
}
else if(plrmap[i][j]=='~')
{
SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE),FOREGROUND_INTENSITY);
}
else
{
SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE),FOREGROUND_INTENSITY|FOREGROUND_RED|FOREGROUND_GREEN);
}
cout<<plrmap[i][j]<<" ";
SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE), 7);
}
cout<<endl;
}
SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE), FOREGROUND_INTENSITY|FOREGROUND_BLUE|FOREGROUND_GREEN);
printf("\n\t\t\t 你赢了,共计打开了%d个格子!",touchnum);
SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE), FOREGROUND_INTENSITY|FOREGROUND_RED|FOREGROUND_GREEN);
printf("\n--------------------------------------------------------------------------------");
printf("\n--------------------------------------------------------------------------------");
}
void lose()
{
SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE), FOREGROUND_INTENSITY|FOREGROUND_RED|FOREGROUND_GREEN);
printf("\n--------------------------------------------------------------------------------");
printf("\n--------------------------------------------------------------------------------");
SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE), 7);
printf("\n\t\t\t ");for(int i=1;i<=mapsize;i++){printf("%2d",i);} cout<<endl<<endl;
for(int i=0;i<mapsize;i++)
{
printf("\t\t\t %2d ",i+1);
for(int j=0;j<mapsize;j++)
{
if(sysmap[i][j]=='#')
{
plrmap[i][j]='#';
SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE), FOREGROUND_INTENSITY|FOREGROUND_GREEN);
}
if(plrmap[i][j]=='~')
{
SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE), FOREGROUND_INTENSITY);
}
else if(plrmap[i][j]>'0' && plrmap[i][j]<'9')
{
SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE), FOREGROUND_INTENSITY|FOREGROUND_GREEN|FOREGROUND_RED);
}
if(i==touchx && j==touchy)
SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE),FOREGROUND_INTENSITY|FOREGROUND_RED);
cout<<plrmap[i][j]<<" ";
SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE), 7);
}
cout<<endl;
}
SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE), FOREGROUND_INTENSITY|FOREGROUND_RED);
printf("\n\n\t\t\t Boom!恭喜你炸了~\n");
SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE), FOREGROUND_INTENSITY|FOREGROUND_RED|FOREGROUND_GREEN);
printf("\n--------------------------------------------------------------------------------");
printf("\n--------------------------------------------------------------------------------");
}
void Gaming()
{
SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE), FOREGROUND_INTENSITY|FOREGROUND_RED|FOREGROUND_GREEN);
printf("\n--------------------------------------------------------------------------------");
A:
{
SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE), FOREGROUND_INTENSITY|FOREGROUND_BLUE|FOREGROUND_GREEN);
printf("\n请输入扫雷地图的范围(3~15):");
scanf("%d",&mapsize);
if(mapsize<3 || mapsize>15)
{
SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE), FOREGROUND_INTENSITY|FOREGROUND_RED);
printf("\n非法输入,请重输!");
goto A;
}
}
int a = (mapsize*mapsize-1)/2;
B:
{
SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE), FOREGROUND_INTENSITY|FOREGROUND_BLUE|FOREGROUND_GREEN);
printf("\n请输入地雷数目(1~%d):",a);
scanf("%d",&minenum);
if(minenum<1 || minenum>a)
{
SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE), FOREGROUND_INTENSITY|FOREGROUND_RED);
printf("\n非法输入,请重输!");
goto B;
}
}
CreatMap(mapsize,minenum);
touchx=50;touchy=50;
while(1)
{
if(leftblank==minenum)
{
win();
break;
}
LoadMap();
SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE), FOREGROUND_INTENSITY|FOREGROUND_BLUE|FOREGROUND_GREEN);
printf("\n请输入你要点击的位置(先输入横行坐标,输入竖列坐标,以空格分隔):\n");
int con;
C:
{
con=scanf("%d %d",&touchx,&touchy);
touchx--;touchy--;
}
if(con!=2 || touchx<0 || touchx>=mapsize || touchy<0 || touchy>=mapsize)
{
SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE), FOREGROUND_INTENSITY|FOREGROUND_RED);
printf("\n输入了数据不足或者越界!请重新输入:");
goto C;
}
else if(opened[touchx][touchy]==1)
{
SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE), FOREGROUND_INTENSITY|FOREGROUND_RED);
printf("\n该位置已被打开,操作无效!请重新输入:");
goto C;
}
else
{
touchnum++;
if(sysmap[touchx][touchy]=='#')
{
lose();
break;
}
else
{
MineDFS(touchx,touchy);
}
}
}
return;
}
int main()
{
GameLoad();
while(1)
{
int node = GameChoose();
if(node==1)
{
Gaming();
}
else if(node==2)
{
GameRule();
}
else if(node==3)
{
SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE), FOREGROUND_INTENSITY|FOREGROUND_RED|FOREGROUND_GREEN);
printf("\n\n--------------------------------------------------------------------------------\n");
printf("\t\t\t感谢游玩!\n");
printf("--------------------------------------------------------------------------------\n");
system("pause");
return 0;
}
else if(node==9261225)
{
SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE), FOREGROUND_INTENSITY|FOREGROUND_RED|FOREGROUND_GREEN);
printf("\n\n--------------------------------------------------------------------------------\n");
printf("\t\t\t制作人:王某人 感谢游玩!\n");
printf("--------------------------------------------------------------------------------\n\n");
}
}
}