您的位置:首页 > 编程语言 > C语言/C++

没事花一天时间用c++写的扫雷控制台游戏

2010-12-17 15:30 513 查看
还有些功能没实现。。。同时算法也不怎么好,改天有时间再改改,想过段时间以后再用c++封装起来,再做个c的windows版的,再用C#和wpf做个好看的界面版的。。。呵呵,想远了。。。先学习学习吧。。。。







全部代码如下,有点懒,没怎么写注释,不是好习惯,呵呵~~~~欢迎大家给点意见:

/*扫雷游戏
尚未完成功能:
存储和导入个人记录;
残局和继续;
中途结束和重新开始;
等等。。。。。
*/

//符号○●⊙①②③④⑤⑥⑦⑧⑨◎¤★□
//○代表无,●代表有

#include <iostream>
#include<time.h>
#define MINE 30
using namespace std;
bool mine[10][10];//储存雷的状况
int minenum[10][10];//存储周围雷数
int state[10][10];//标记是否显示过,0表示没显示过,1表示显示过数字,2表示显示过★
bool vacant[10][10];//保存是否要显示的空位置
int counter,num,COUNT;
char onceagain;
void statistics();//统计周围雷数
void Output(int number);
void fun1(int r,int l);
void fun2(int r,int l);
void fun3(int r,int l);
void fun4(int r,int l);
//布雷函数
void laymine()
{
COUNT=0;
for (int m=0;m<10;m++)
{
for (int n=0;n<10;n++)
{
cout<<"□";
}
cout<<endl;
}
srand((unsigned)time(0));
for (int m=0;m<10;m++)
{
for (int n=0;n<10;n++)
{
mine[m]
=false;
state[m]
=0;
vacant[m]
=false;
}
}
counter=0;
do
{
int x=rand()%10;
int y=rand()%10;
if(mine[x][y]==false)
{
mine[x][y]=true;
counter++;
if(counter==MINE) {break;}
}
} while (counter<MINE);

num=0;
statistics();
}
void statistics()
{
//统计非边界区域周围雷数
for (int i=1;i<9;i++)
{
for (int j=1;j<9;j++)
{
if (mine[i][j]==false)
{
for (int k=i-1;k<=i+1;k++)
{
for (int t=j-1;t<=j+1;t++)
{
if (mine[k][t]==true)
{
num++;
}
}
}
minenum[i][j]=num;
num=0;
}
}
}
/*边界区域雷数*/
//最上一行
for (int top=1;top<9;top++)
{
if (mine[0][top]==false)
{
for(int r=0;r<=1;r++)
{
for (int t1=top-1;t1<=top+1;t1++)
{
if (mine[r][t1]==true)
{
num++;
}
}
}
minenum[0][top]=num;
num=0;
}
}
//最下一行
for (int buttom=1;buttom<9;buttom++)
{
if (mine[9][buttom]==false)
{
for(int r=8;r<=9;r++)
{
for (int t2=buttom-1;t2<=buttom+1;t2++)
{
if (mine[r][t2]==true)
{
num++;
}
}
}
minenum[9][buttom]=num;
num=0;
}
}
//最左一列
for (int left=1;left<9;left++)
{
if (mine[left][0]==false)
{
for(int l=0;l<=1;l++)
{
for (int t3=left-1;t3<=left+1;t3++)
{
if (mine[t3][l]==true)
{
num++;
}
}
}
minenum[left][0]=num;
num=0;
}
}
//最右一列
for (int right=1;right<9;right++)
{
if (mine[right][9]==false)
{
for(int l=8;l<=9;l++)
{
for (int t4=right-1;t4<=right+1;t4++)
{
if (mine[t4][l]==true)
{
num++;
}
}
}
minenum[right][9]=num;
num=0;
}
}
//四个顶点
if (mine[0][0]==false)
{
minenum[0][0]=mine[0][1]+mine[1][0]+mine[1][1];
}
if (mine[9][9]==false)
{
minenum[9][9]=mine[8][9]+mine[8][8]+mine[9][8];
}
if (mine[0][9]==false)
{
minenum[0][9]=mine[0][8]+mine[1][8]+mine[1][9];
}
if (mine[0][0]==false)
{
minenum[9][0]=mine[8][2]+mine[8][0]+mine[9][1];
}

}
//清屏刷新显示
void refresh()
{
system("cls");
for (int m=0;m<10;m++)
{
for (int n=0;n<10;n++)
{
if (state[m]
==1)
{
Output(minenum[m]
);//显示过的无雷的
}
else if(mine[m]
==true)
{
cout<<"●";//有雷
}
else
{
cout<<"□";
}
}
cout<<endl;
}
}
//输出符号
void Output(int number)
{
switch (number)
{
case 0:cout<<"◎";break;
case 1:cout<<"①";break;
case 2:cout<<"②";break;
case 3:cout<<"③";break;
case 4:cout<<"④";break;
case 5:cout<<"⑤";break;
case 6:cout<<"⑥";break;
case 7:cout<<"⑦";break;
case 8:cout<<"⑧";break;
}
}

void explosion()
{
cout<<"¤ "<<endl;
system("cls");
cout<<"¤A "<<endl;
system("cls");
cout<<"¤A  "<<endl;
system("cls");
cout<<"¤A W "<<endl;
system("cls");
cout<<"¤A Wi "<<endl;
system("cls");
cout<<"¤A Win "<<endl;
system("cls");
cout<<"¤A Winm "<<endl;
system("cls");
cout<<"¤A Winmi "<<endl;
system("cls");
cout<<"¤A Winmin "<<endl;
system("cls");
cout<<"¤A Winmine "<<endl;
system("cls");
cout<<"¤A Winmine G "<<endl;
system("cls");
cout<<"¤A Winmine Ga "<<endl;
system("cls");
cout<<"¤A Winmine Gam "<<endl;
system("cls");
cout<<"¤A Winmine Game  "<<endl;
system("cls");
cout<<"¤A Winmine Game P "<<endl;
system("cls");
cout<<"¤A Winmine Game Pr "<<endl;
system("cls");
cout<<"¤A Winmine Game Pro "<<endl;
system("cls");
cout<<"¤A Winmine Game Prog "<<endl;
system("cls");
cout<<"¤A Winmine Game Progr "<<endl;
system("cls");
cout<<"¤A Winmine Game Progra "<<endl;
system("cls");
cout<<"¤A Winmine Game Program "<<endl;
system("cls");
cout<<"¤A Winmine Game Programm "<<endl;
system("cls");
cout<<"¤A Winmine Game Programme "<<endl;
system("cls");
cout<<"¤A Winmine Game Programmed  "<<endl;
system("cls");
cout<<"¤A Winmine Game Programmed B "<<endl;
system("cls");
cout<<"¤A Winmine Game Programmed By  "<<endl;
system("cls");
cout<<"¤A Winmine Game Programmed By D "<<endl;
system("cls");
cout<<"¤A Winmine Game Programmed By Du "<<endl;
system("cls");
cout<<"¤A Winmine Game Programmed By Dua "<<endl;
system("cls");
cout<<"¤A Winmine Game Programmed By Duan "<<endl;
system("cls");
cout<<"¤A Winmine Game Programmed By Duan C "<<endl;
system("cls");
cout<<"¤A Winmine Game Programmed By Duan Co "<<endl;
system("cls");
cout<<"¤A Winmine Game Programmed By Duan Con "<<endl;
system("cls");
cout<<"¤A Winmine Game Programmed By Duan Cong "<<endl;
system("cls");
cout<<"¤A Winmine Game Programmed By Duan Cong!Enjoy "<<endl;
system("cls");
cout<<"¤A Winmine Game Programmed By Duan Cong!Enjoy Yourself!"<<endl;
system("cls");
cout<<"¤A Winmine Game Programmed By Duan Cong!Enjoy Yourself!¤"<<endl;
system("cls");
}

void fun1(int r,int l)
{
if((mine[r-1][l-2]==false)&&l>1&&r>1)
{
//state[r-1][l-2]=1;
vacant[r-1][l-2]=true;
fun1(r-1,l);
fun2(r-1,l);
fun3(r-1,l);
fun4(r-1,l);
}
}
void fun2(int r,int l)
{
if((mine[r-2][l-1]==false)&&(r>1)&&l>0)
{
//state[r-2][l-1]=1;
vacant[r-2][l-1]=true;
fun2(r,l-1);
}
}
void fun3(int r,int l)
{
if(mine[r][l-1]==false)
{
//state[r][l-1]=1;
vacant[r][l-1]=true;
fun2(r+1,l);
}
}
void fun4(int r,int l)
{
if(mine[r-1][l]==false)
{
//state[r-1][l]=1;
vacant[r-1][l]=true;
fun4(r,l+1);
}
}
int main()
{
//开始计时
clock_t start, finish;
double  duration;
//cout<<"¤¤¤¤¤A Winmine Game Programmed By Duan Cong!Enjoy Yourself!¤¤¤¤¤¤"<<endl<<endl;
explosion();
cout<<"Game Rules:"<<endl;
cout<<"○ means no mine"<<endl;
cout<<"● stands for mine"<<endl;
cout<<"★ is used to mark the known mines"<<endl;
cout<<"□ shows the unsolved ones"<<endl;
cout<<"◎①②③④⑤⑥⑦⑧⑨ represent numbers of mines around"<<endl;
cout<<"Enter (0,0) to begin marking the mines"<<endl<<endl;
int row,line;
//laymine();
onceagain='y';
while(onceagain=='y')
{
loop2: duration = 0.0;
start = clock();
laymine();
loop1: cout<<endl<<"Please putin the number of your line and row :"<<endl;
cin>>row>>line;
if (row==0&&line==0)
{
cout<<endl<<"Enter the row and line to mark the mine!"<<endl;
cin>>row>>line;
system("cls");
for (int m=0;m<10;m++)
{
for (int n=0;n<10;n++)
{
if ((m==row-1)&&(n==line-1))
{
cout<<"★";
state[m]
=2;
if (mine[m]
==true)
{
COUNT++;
if (COUNT==MINE)
{
cout<<"Congratulations! You have finished the mission! Once again?(Enter y/n)"<<endl;
goto end;
}
}
}
else if (state[m]
==1)
{
Output(minenum[m]
);
}
else if (state[m]
==0)
{
cout<<"□";
}
else if (state[m]
==2)
{
cout<<"★";
}
}
cout<<endl;
}
goto loop1;
}
else if(row>=0&&row<11&&line>=0&&line<11)
{
if (mine[row-1][line-1]==false)
{
state[row-1][line-1]=1;
vacant[row-1][line-1]=true;
system("cls");
fun1(row,line);
fun2(row,line);
fun3(row,line);
fun4(row,line);
for (int m=0;m<10;m++)
{
for (int n=0;n<10;n++)
{
if (vacant[m]
==true)
{
if(state[m]
==1)
{
Output(minenum[m]
);
}
else if (state[m]
==2)
{
cout<<"★";
}
else
{
cout<<"○";
state[m]
=1;
}
}
else if (state[m]
==2)
{
cout<<"★";
}
else
{
cout<<"□";
}
}
cout<<endl;
}
goto loop1;
}
else
{
refresh();
cout<<endl<<"You have discovered "<<COUNT<<" mines";
//计时
finish = clock();
duration = (double)(finish - start) / CLOCKS_PER_SEC;
cout<<endl<<"The time you have spend is:"<<duration<<" seconds"<<endl;
//重新开始
cout<<endl<<"Sorry! Game over! Once again? (Enter y/n)"<<endl;
end:   cin>>onceagain;
if (onceagain=='y')
{
system("cls");
goto loop2;
}
else
{
exit(0);
}
}
}
else
{
cout<<endl<<"Attention!Illegal iput!"<<endl;
goto loop1;
}
}
return 0;
}


 
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息