基于C控制台扫雷游戏.docx
- 文档编号:22983775
- 上传时间:2023-04-29
- 格式:DOCX
- 页数:15
- 大小:17.63KB
基于C控制台扫雷游戏.docx
《基于C控制台扫雷游戏.docx》由会员分享,可在线阅读,更多相关《基于C控制台扫雷游戏.docx(15页珍藏版)》请在冰豆网上搜索。
基于C控制台扫雷游戏
扫雷是window自带的经典游戏,而且实现也不是很难:
主要是对递归函数的理解
本文档主要介绍实现扫雷的几个类:
一、Button类(用于控制在控制台界面选取要指定的位置):
1)头文件
#ifndefBUTTON_H_
#defineBUTTON_H_
classButton
{
private:
introw;
intcolumn;
intposX;
intposY;
public:
voidinitButton(intirow,inticolumn);//初始化行列
intgetPosX();//获得选取所在行
intgetPosY();//获得选取所在列
//移动控制
voidtoLeft();
voidtoRight();
voidtoTop();
voidtoBottom();
};
#endif
2)实现
#include"Button.h"
voidButton:
:
initButton(intirow,inticolumn)
{
row=irow;
column=icolumn;
posX=0;
posY=0;
}
voidButton:
:
toLeft()
{
if(posY-1>=0)
posY--;
}
voidButton:
:
toRight()
{
if(posY+1 posY++; } voidButton: : toTop() { if(posX-1>=0) posX--; } voidButton: : toBottom() { if(posX+1 posX++; } intButton: : getPosX() { returnposX; } intButton: : getPosY() { returnposY; } 二、Map类(存在空地和雷区) 1)头文件 #ifndefMAP_H_ #defineMAP_H_ #include"Button.h" classMap { private: int**map;//地图指针 introw;//行; intcolumn;//列; intnum;//布雷数; public: Map(); voidnewMap();//申请存储地图空间 voiddeleteMap();//释放地图内存 voidinitMap();//初始化地图 voidprintMap(Button&);//打印地图 voidprintMine();//打印雷 intgetRow();//得到行数; voidsetRow(int);//设置行数; intgetColumn();//得到列数; voidsetColumn(int);//设置列数; intgetNum();//得到布雷数; voidsetNum(int);//设置布雷数; intgetVal(intx,inty); voidsetVal(intx,inty,intval); boolis_win(); }; voidOpen(int,int,Map&);//打开选取位置 voidSwap(int&,int&); #endif 2)实现 #include"Map.h" #include #include #include usingnamespacestd; Map: : Map() { column=row=num=10; } voidMap: : newMap() { map=newint*[row]; for(inti=0;i *(map+i)=newint[column]; } voidMap: : deleteMap() { for(inti=0;i delete[]*(map+i); delete[]map; } voidMap: : initMap() { intk=0; for(inti=0;i { for(intj=0;j { if(k { *(*(map+i)+j)=-1; k++; } else *(*(map+i)+j)=0; } } srand(time(NULL)); intrandX1,randY1; intrandX2,randY2; for(inti=0;i<1000;i++) { randX1=rand()%row; randY1=rand()%column; randX2=rand()%row; randY2=rand()%column; Swap(*(*(map+randX1)+randY1),*(*(map+randX2)+randY2)); } } voidMap: : printMap(Button&button) { for(inti=0;i { for(intj=0;j { if(i==button.getPosX()&&j==button.getPosY()) { cout<<"☆"; } else { if(*(*(map+i)+j)==-1) cout<<"▉"; elseif(*(*(map+i)+j)==0) cout<<"█"; elseif(*(*(map+i)+j)==1) cout<<"□"; else cout<<""<<*(*(map+i)+j)-1; } } cout< } } voidMap: : printMine() { for(inti=0;i { for(intj=0;j { if(*(*(map+i)+j)==-1) cout<<"●"; elseif(*(*(map+i)+j)==0) cout<<"█"; elseif(*(*(map+i)+j)==1) cout<<"□"; else cout<<""<<*(*(map+i)+j)-1; } cout< } } boolMap: : is_win() { for(inti=0;i { for(intj=0;j if(*(*(map+i)+j)==0) returnfalse; } returntrue; } intMap: : getRow() { returnrow; } voidMap: : setRow(intn) { row=n; } intMap: : getColumn() { returncolumn; } voidMap: : setColumn(intn) { column=n; } intMap: : getNum() { returnnum; } voidMap: : setNum(intn) { num=n; } intMap: : getVal(intx,inty) { return*(*(map+x)+y); } voidMap: : setVal(intx,inty,intval) { *(*(map+x)+y)=val; } voidOpen(intx,inty,Map&myMap) { if(x<0||y<0||x>=myMap.getRow()||y>=myMap.getColumn())//访问越界 return; intcount=0; if(myMap.getVal(x,y)==0) { if((x-1>=0)&&(y-1>=0)&&myMap.getVal(x-1,y-1)==-1)//左上 count++; if((x-1>=0)&&myMap.getVal(x-1,y)==-1)//上 count++; if((x-1>=0)&&(y+1 count++; if((y-1>=0)&&myMap.getVal(x,y-1)==-1)//左 count++; if((y+1 count++; if((x+1 count++; if((x+1 count++; if((x+1 count++; myMap.setVal(x,y,count+1); } if(myMap.getVal(x,y)==1)//若未访问且四周无雷 { if((x-1>=0)&&(y-1>=0)&&myMap.getVal(x-1,y-1)==0)//左上 Open(x-1,y-1,myMap); if((x-1>=0)&&myMap.getVal(x-1,y)==0)//上 Open(x-1,y,myMap); if((x-1>=0)&&(y+1 Open(x-1,y+1,myMap); if((y-1>=0)&&myMap.getVal(x,y-1)==0)//左 Open(x,y-1,myMap); if((y+1 Open(x,y+1,myMap); if((x+1 Open(x+1,y-1,myMap); if((x+1 Open(x+1,y,myMap); if((x+1 Open(x+1,y+1,myMap); } } voidSwap(int&a,int&b) { inttemp=a; a=b; b=temp; } 三、界面及游戏运行(MineClearance) #include"Map.h" #include"Button.h" #include #include #include usingnamespacestd; intmain() { intiRow,iColumn,iNum; charstart,next,direction; MapmyMap; Buttonbutton; while(true) { cout<<"\t**********自定义扫雷************\n\n" <<"\t\t1.游戏开始\n" <<"\t\t2.退出游戏\n" <<"\n\n===========================================\n"; start=getch(); system("cls"); if(start=='2') break; elseif(start=='1') { cout<<"请您输入(<=20)行,(<=30)列和布雷的数目: "; cin>>iRow>>iColumn>>iNum; while(iNum>=iRow*iColumn) { cout<<"您输入的布雷数超了,请重新输入: "; cin>>iRow>>iColumn>>iNum; } system("cls"); button.initButton(iRow,iColumn); myMap.setRow(iRow); myMap.setColumn(iColumn); myMap.setNum(iNum); myMap.newMap(); myMap.initMap(); myMap.printMap(button); while(true) { while(true) { cout<<"\n请输入方位(a左d右w上s下,q打开): "; direction=getch(); system("cls"); if(direction! ='q') { switch(direction) { case'a': case'A': button.toLeft();break; case'd': case'D': button.toRight();break; case's': case'S': button.toBottom();break; case'w': case'W': button.toTop(); } myMap.printMap(button); } else break; } system("cls"); if(myMap.getVal(button.getPosX(),button.getPosY())==-1) { cout<<"很遗憾,您差一点就赢了! \n"; break; } Open(button.getPosX(),button.getPosY(),myMap); myMap.printMap(button); if(myMap.is_win()) { cout<<"恭喜你赢了! \n"; break; } } myMap.printMine(); myMap.deleteMap(); cout<<"\n按任意键返回主菜单\n"; next=getch(); system("cls"); } } return0; }
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 基于C 控制台扫雷游戏 基于 控制台 扫雷 游戏