本文實例為大家分享了C++實現(xiàn)簡易掃雷游戲的具體代碼,供大家參考,具體內(nèi)容如下
我們提供的服務(wù)有:成都網(wǎng)站設(shè)計、做網(wǎng)站、微信公眾號開發(fā)、網(wǎng)站優(yōu)化、網(wǎng)站認證、東蘭ssl等。為數(shù)千家企事業(yè)單位解決了網(wǎng)站和推廣的問題。提供周到的售前咨詢和貼心的售后服務(wù),是有科學管理、有技術(shù)的東蘭網(wǎng)站制作公司
難點:
點擊一次清理出一大片區(qū)域的功能,我采用的是先把點擊的那一塊的坐標存到一個隊列里,然后取出里面的一個元素,再把這個元素周圍的8塊放進隊列里,重復的不放,就可以對規(guī)定的區(qū)域做大面積清理了,另外為了右滑界面也加了不少代碼比如一些顏色屬性時鐘移動效果還有光標之類的,實際上要想做一個簡單的出來200行綽綽有余了,只要將程序模塊化,一個函數(shù)解決一個問題,思路還是很清晰的。
此外,在寫這個東西的幾天里也學到了很多經(jīng)驗,終于明白了命名的重要性,不然在幾天之后再重新看自己的代碼恐怕自己都不知道原來寫的ABC是啥意思了,只要邏輯結(jié)構(gòu)層次清晰了之后找bug也容易了很多,省了不少時間,再在原來的基礎(chǔ)上添加別的功能和優(yōu)化的時候也會少走很多彎路,簡而言之就是一句話:良好的代碼習慣非常重要!
運行效果圖:
代碼:
#include#include #include #include #include #include #include #define A 17 //地圖的高 #define B 17 //地圖的寬 #define C 30 //雷的總數(shù) using namespace std; //全局變量 DWORD a,b; char map[A][B],news,spare; int BoomTotalNum,floatx,floaty,flag[A][B],flagnum,mode,slect[A][B],game; //顏色屬性 const WORD FORE_BLUE = FOREGROUND_BLUE; //藍色文本屬性 const WORD FORE_GREEN = FOREGROUND_GREEN; //綠色文本屬性 const WORD FORE_RED = FOREGROUND_RED; //紅色文本屬性 //開墾地圖結(jié)構(gòu)體 struct node { int x; int y; }; queue dui; //打印位置 void position(int x,int y) { COORD pos={x,y}; HANDLE Out=GetStdHandle(STD_OUTPUT_HANDLE); SetConsoleCursorPosition(Out,pos); } //隱藏光標 void Hide() { HANDLE handle = GetStdHandle(STD_OUTPUT_HANDLE); CONSOLE_CURSOR_INFO CursorInfo; GetConsoleCursorInfo(handle, &CursorInfo);//獲取控制臺光標信息 CursorInfo.bVisible = false; //隱藏控制臺光標 SetConsoleCursorInfo(handle, &CursorInfo);//設(shè)置控制臺光標狀態(tài) } //初始化 void Beginning() { while(!dui.empty()) { dui.pop(); } game=1; //BoomTotalNum=C; floatx=A/2; floaty=B/2; flagnum=0; BoomTotalNum=C; mode=0; HANDLE handle_out = GetStdHandle(STD_OUTPUT_HANDLE); //獲得標準輸出設(shè)備句柄 CONSOLE_SCREEN_BUFFER_INFO csbi; //定義窗口緩沖區(qū)信息結(jié)構(gòu)體 GetConsoleScreenBufferInfo(handle_out, &csbi); //獲得窗口緩沖區(qū)信息 int x,y; srand((unsigned)time(0)); for(int i=0;i=0)&&(yy-1>=0)&&(map[xx-1][yy-1]=='@')) num++; if((xx-1>=0)&&(yy+0>=0)&&(map[xx-1][yy]=='@')) num++; if((xx-1>=0)&&(yy+1=0)&&(yy-1>=0)&&(map[xx][yy-1]=='@')) num++; if((xx+0>=0)&&(yy+1=0) &&(map[xx+1][yy-1]=='@')) num++; if((xx+1=0) &&(map[xx+1][yy]=='@')) num++; if((xx+1=0)&&(c.y-1>=0)&&(map[c.x-1][c.y-1]==' ')&&(slect[c.x-1][c.y-1]==0)) { d.x=c.x-1; d.y=c.y-1; dui.push(d); slect[d.x][d.y]=1; } if((c.x-1>=0)&&(c.y-0>=0)&&(map[c.x-1][c.y]==' ')&&(slect[c.x-1][c.y]==0)) { d.x=c.x-1; d.y=c.y-0; dui.push(d); slect[d.x][d.y]=1; } if((c.x-1>=0)&&(c.y+1=0)&&(c.y-1>=0)&&(map[c.x][c.y-1]==' ')&&(slect[c.x][c.y-1]==0)) { d.x=c.x-0; d.y=c.y-1; dui.push(d); slect[d.x][d.y]=1; } if((c.x-0>=0)&&(c.y+1=0)&&(map[c.x+1][c.y-1]==' ')&&(slect[c.x+1][c.y-1]==0)) { d.x=c.x+1; d.y=c.y-1; dui.push(d); slect[d.x][d.y]=1; } if((c.x+1=0)&&(map[c.x+1][c.y]==' ')&&(slect[c.x+1][c.y]==0)) { d.x=c.x+1; d.y=c.y-0; dui.push(d); slect[d.x][d.y]=1; } if((c.x+1'0'&&map[floatx][floaty]<'9')) continue; //跳過 //插旗 if(flag[floatx][floaty]==0) { flagnum++; flag[floatx][floaty]=1; position(floaty*2,floatx); SetConsoleTextAttribute(handle_out, FORE_BLUE); Lump(floatx,floaty); } //拔旗 else { flagnum--; flag[floatx][floaty]=0; position(floaty*2,floatx); SetConsoleTextAttribute(handle_out, FORE_BLUE); Lump(floatx,floaty); } } } //按空格 if(spare==' ') Mode(); //切換模式 //按方向鍵 if(spare==-32) { news=getch(); Move(); //移動光標 } for(int i=0;i'0'&&map[i][j]<'9')) game++; if(game==A*B-C+1) break; else game=1; SetConsoleTextAttribute(handle_out, FORE_RED); position(44,5); printf("剩余雷數(shù):%d ",C-flagnum); } else Sleep(10); b=GetTickCount(); SetConsoleTextAttribute(handle_out, FORE_RED); position(44,7); printf("用時:"); //用時 if((b-a)/60000<10) printf("0"); printf("%d:",(b-a)/60000); if(((b-a)/1000)%60<10) printf("0"); printf("%d:",((b-a)/1000)%60); if(((b-a)/10)%100<10) printf("0"); printf("%d",((b-a)/10)%100); } SetConsoleTextAttribute(handle_out, FORE_RED); position(5,5); if(game==1) printf("游戲結(jié)束!"); else printf("恭喜通關(guān)!"); position(5,8); printf("任意鍵重玩"); scanf("%c%c",&spare,&spare); system("cls"); position(0,0); goto Relife; }
注釋很多,理解起來應(yīng)該不難,可以自己嘗試著更改一些東西來摸索每一句的作用,Dev-C++上可以直接編譯運行(我一直用的這個)
更多精彩游戲小代碼,請點擊《游戲?qū)n}》閱讀
以上就是本文的全部內(nèi)容,希望對大家的學習有所幫助,也希望大家多多支持創(chuàng)新互聯(lián)。