本文目錄一覽:
如何用C++寫掃雷?????????????
用VC++編寫掃雷遊戲
用VC++編寫掃雷遊戲
王洪亞
本文從分析windows掃雷遊戲的功能特點開始,應用面向對象的可視化編程語言visual c++給出了個功能模塊的具體實現方法,並提供了編寫小遊戲程序的一般方法和visual c++的一些使用技巧。
首先分析掃雷的最基本功能。
點擊滑鼠左鍵於未知區域,如果未知區域有雷,遊戲停止,顯示所有的地雷。如果沒雷,則顯示周圍雷數,如果周圍沒雷,則再查看周圍八個區域是否有雷直到有雷為止並顯示,這其實是一個遞歸過程。
點擊滑鼠右鍵於未知區域,則將其置為有雷而不管是否真的有雷。可選擇初、中、高三級並可自定義雷數和區域大小。
雷區上部左側顯示總雷數減被標明有雷區域的數目。
雷區上部中間位置顯示一按鈕用於開局和顯示滑鼠動作的結果。
雷區上部右側顯示掃雷的時間。
將雷全部掃清後,則顯示一對話框將你的姓名記入排行榜。以時間排序。
為完成上述功能,應用visual c++的具體技術細節如下:
1. 應用appwizard創建基於sdi的應用程序cbombapp,去除列印和狀態條支持,在資源編輯器中修改菜單和相應的加速鍵,使其與windows掃雷遊戲一致。具體為開局(id-game-begin)、初級(id-game-junior)、中級(id-game-middle)、高級(id-game-senior)、自定義(id-game-custom)、顏色(id-game-color)、英雄榜(id-game-sort)、退出(id-game-exit)、幫助(id-help)。
2. 在資源編輯器中對應於雷區的每個小區域的13個屬性。用畫筆或其他繪圖工具繪製出相對應的13個10乘10的16色小點陣圖,三個對應於小人表情的20乘20的16色小點陣圖,供更換顏色時使用的一套與前16個對應的單色點陣圖,顯示時間和雷數的0~9十個數字點陣圖(底色為黑色)。
定製customer對話框,內含三個靜態文本控制項和三個編輯控制項,三個編輯控制項分別對應成員m_irownum,m_icolumnnum,m_ibombnum。該對話框用於定製雷數,行列數,其相應的mfc類為ccustomer。定製sort對話框,內含九個靜態文本控制項,其中六個顯示排行榜的姓名和時間,其對應的mfc類為csort。定製input對話框,內含一個靜態文本控制項和一個編輯控制項,編輯控制項用於在遊戲成功結束時輸入姓名,其對應的mfc類為cinput。
3. 定義類bomb,封裝每顆雷的相關屬性。
class bomb
{
public:
int isbomb;//決定初始時是否是雷
bool issel; //判斷區域是否被處理過且周圍有雷
bool isdone;//判斷遞歸時是否被處理過
int num; //周圍雷數
bool findbomb; //排雷者認為是雷時置一(但是不一定真是雷)
} ;
4. 重載cmainframe中precreatewindow,並設置相應屬性,使其窗體大小固定,這樣就固定了顯示區域的大小為初始10乘10個雷和外加雷區上部的控制區域,部分代碼如下。
cs.style=ws_overlapped|ws_sysmenu| ws_border|ws_minimizebox;
cs.cy = 10*15+6;
cs.cx = 10*15+60; //6和60分別是橫縱的附加值,用於邊框、菜單、標題條、控制區域。
5. 遊戲的主要工作就是呈現不斷變換的圖形或動畫,並按用戶的輸入交互進行顯示,而windows文檔—–視窗構架中的視窗的功能正是接受用戶輸入並負責顯示,因此由cview類來完成掃雷的大部分工作。在cbombview中定義下列成員變數記錄相關操作的結果或對象的狀態。
bomb m_bomb[30][30]; //最大的地雷區域
cstring m_currenttime; //用於記錄並顯示掃雷時間
ctime m_begintime;//記錄遊戲開始時的時間
bool m_timerbegin;//定時器是否開啟
int m_ibomnum;//雷的數目
int m_irow;//雷的行數
int m_icolumn;//雷的列數
int m_ibombfound;//指示被認為是雷的數目
cbitmapbutton m_bitbutton;//控制區的點陣圖按鈕
int m_currentlevel;//指示當前遊戲的級別
bool m_biscolor;//指示當前是彩色還是單色
cbitmap m_bmbomb[12];//用於存放12個小點陣圖
int m_igameover;//遊戲未結束置0,已清除所有的雷置1,被炸死置2。
重載cbombview中oncreate函數創建點陣圖按鈕,該點陣圖按鈕的兩幅點陣圖對應了正常、排雷正確兩種狀態,當要顯示被炸死的狀態時應動態銷毀該按鈕,並重新創建一點陣圖對應正常和被炸死兩種狀態,將該點陣圖按鈕的id號定為id_game_begin,這樣一來當點擊按鈕時便可重新開始遊戲,部分代碼如下。
crect rcclient;
getclientrect(rcclient);
crect rect(rcclient.cx/2-8,10,rcclient.cx/2+8,20);
m_button.create(“new”,bs_defpushbutton|ws_visible|
bs_ownerdraw,rect,this,id_game_begin);
m_button.loadbitmaps(idb_face1, idb_face2);
顯示時間的功能相對比較簡單,在響應第一個wm_lbuttomdown消息時開啟定時器,並記錄遊戲開始的時間,在wm_time消息響應函數ontimer中獲得當前時間,減去遊戲開始時的時間,在顯示時間的客戶區域顯示得到的時間差(用數字點陣圖),當遊戲結束時(排完全部雷或被炸死)關閉定時器,停止顯示。
wm_lbuttomdown消息響應函數onlbuttomdown是處理用戶輸入的主要執行者,函數首先判斷點中位置是否是雷,是則關閉定時器,銷毀原點陣圖按鈕,創建一對應正常和被炸死兩種狀態的新點陣圖按鈕,並調用setstate將其設置為pushdown(小人哭的狀態),將m_bgameover,置為true標誌遊戲結束,否則先調用setstate 設置點陣圖按鈕為pushdown (小人笑的狀態),並在onlbuttomup中設置點陣圖按鈕為正常狀態,然後調用caculate函數記下周圍雷的數目,最後調用invalidate使客戶區無效,迫使ondraw函數重繪客戶區域,在調用invalidate時不應重畫背景,避免閃爍,這樣就完成了在雷區按下左鍵的響應動作。
wm_rbuttomdown消息響應函數onlbuttomdown將被認為有雷位置的m_ibombnum.findbomb置一,減少左上角的雷記數,然後判斷是否真正全部排完了雷,是則結束遊戲彈出input對話框,讓掃雷的人輸入姓名,在響應idok通知碼時將其寫入註冊表,沒有全部排完則使客戶區無效,迫使ondraw函數重繪客戶區域完成在雷區按下右鍵的動作。
ondraw函數在每次點擊左鍵或右鍵時都會被調用重雷區和控制區域,因為點擊情況的複雜性和雷屬性的多元化導致ondraw函數需要精心設計。
函數caculate計算某個雷周圍的雷數,根據前面的分析知道,計算某個雷周圍的雷數本身就是一個遞歸過程,在編製時應注意遞歸的邊界條件,稍不注意會陷入無窮遞歸而耗盡了系統的資源。
6. 菜單命令的響應是遊戲交互的另一個重要方式,下面的九個命令響應函數分別與九個菜單項相對應,用以完成用戶的更新和設置命令。
ongamebegin完成初始時間清零,隨機布雷,依據顏色指示裝載12幅小點陣圖,使雷區無效調用ondraw重繪等工作。其中隨機布雷就是多次調用rand(),根據其返回值決定m_bomb[i][j].isbomb的值。
ongamecustom首先彈出ccustomer對話框,在用戶輸入設置後響應idok通知碼時將用戶輸入的雷數、行列數分別賦給cview的數據成員m_ibombnum、m_irow、m_icolumn,得到框架窗口的指針,用其調用movewindow將窗口調至所需大小,銷毀原位置的點陣圖按鈕,並在x軸坐標為新窗口寬1/2減8處,y軸坐標為新窗口頂部加30的位置創建一新按鈕。最後調用ongamebegin重新開始遊戲。
ongamejunior、ongamemiddle、ongamesenior三個函數與ongamecustom類似,只不過將分別賦給cview的數據成員m_ibombnum、m_irow、m_icolumn以固定的值,其大小可由編程者自定,筆者定為junior(20,8,8,)、middle(40,13,13)、senior(99,20,25)。
ongamecolor函數銷毀原點陣圖按鈕,根據重新裝載點陣圖的標誌m_iscolor來創建新的點陣圖按鈕,將裝載12幅單色點陣圖的標誌取反,調用ongamebegin重新開始遊戲。
ongamesort函數根據當前遊戲級別從註冊表中讀出排名並彈出sort對話框顯示結果。到現在為止,一個自己編製的掃雷遊戲就基本完成了,將數百行代碼編譯一下,找出小錯誤,最後build一遍,run一下,好了,可愛的掃雷遊戲就出現在你的面前了。怎麼樣,自己的勞動成果並不比microsoft的差吧,而且你還可以把小點陣圖畫成各種樣子,當然你自己要認得出才行了。
如何用C語言編程 掃雷!~
俄羅斯方快
掃雷
#includestdio.h
#includegraphics.h
#includestdlib.h
struct list
{
int x;
int y;
int num;
int bomb;
int wa;
};
struct list di[10][10];
int currentx=210;
int currenty=130;
void initxy(void)
{
int i,j;
for(i=0;i=9;i++)
for(j=0;j=9;j++)
{
di[j].x=i*20+200;
di[j].y=j*20+120;
di[j].wa=0;
di[j].bomb=0;
}
}
void initmu(void)
{
int i,j;
setcolor(2);
rectangle(200,120,400,320);
rectangle(190,110,410,330);
setfillstyle(8,14);
floodfill(191,111,2);
for(i=0;i=9;i++)
for(j=0;j=9;j++)
rectangle(di[j].x,di[j].y,di[j].x+19,di[j].y+19);
outtextxy(450,200,”press ‘enter’ to kick”);
outtextxy(450,250,”press ‘\’ to mark”);
}
void randbomb(void)
{
int k;
int i,j;
randomize();
for(i=0;i=9;i++)
for(j=0;j=9;j++)
{
k=random(5);
if(k==2)
di[j].bomb=1;
}
}
void jisuan(void)
{
int k=0;
int i,j;
for(i=0;i=9;i++)
for(j=0;j=9;j++)
{
if(ijdi[i-1][j-1].bomb)
k=k+1;
if(idi[i-1][j].bomb)
k=k+1;
if(jdi[j-1].bomb)
k=k+1;
if(i=8di[i+1][j].bomb)
k=k+1;
if(j=8di[j+1].bomb)
k=k+1;
if(i=8j=8di[i+1][j+1].bomb)
k=k+1;
if(ij=8di[i-1][j+1].bomb)
k=k+1;
if(i=8jdi[i+1][j-1].bomb)
k=k+1;
di[j].num=k;
k=0;
}
}
void xianbomb(void)
{
int i,j;
char biaoji[2];
char znum[2];
biaoji[0]=1;
biaoji[1]=NULL;
for(i=0;i=9;i++)
for(j=0;j=9;j++)
{
if(di[j].bomb==1)
outtextxy(di[j].x+2,di[j].y+2,biaoji);
else
{
itoa(di[j].num,znum,10);
setfillstyle(1,0);
bar(i*20+202,j*20+122,i*20+218,j*20+138);
outtextxy(i*20+202,j*20+122,znum);
}
}
}
void move(void)
{
int key;
key=bioskey(1);
if(key)
key=bioskey(0);
if(key==0x4800)
{
if(currenty130)
{
setcolor(0);
circle(currentx,currenty,5);
currenty-=20;
setcolor(4);
circle(currentx,currenty,5);
}
else
{
setcolor(0);
circle(currentx,currenty,5);
currenty=310;
setcolor(4);
circle(currentx,currenty,5);
}
}
if(key==0x4b00)
{
if(currentx210)
{
setcolor(0);
circle(currentx,currenty,5);
currentx-=20;
setcolor(4);
circle(currentx,currenty,5);
}
else
{
setcolor(0);
circle(currentx,currenty,5);
currentx=390;
setcolor(4);
circle(currentx,currenty,5);
}
}
if(key==0x4d00)
{
if(currentx390)
{
setcolor(0);
circle(currentx,currenty,5);
currentx+=20;
setcolor(4);
circle(currentx,currenty,5);
}
else
{
setcolor(0);
circle(currentx,currenty,5);
currentx=210;
setcolor(4);
circle(currentx,currenty,5);
}
}
if(key==0x5000)
{
if(currenty310)
{
setcolor(0);
circle(currentx,currenty,5);
currenty+=20;
setcolor(4);
circle(currentx,currenty,5);
}
else
{
setcolor(0);
circle(currentx,currenty,5);
currenty=130;
setcolor(4);
circle(currentx,currenty,5);
}
}
if(key==0x1c0d)
{
int i,j;
char snum[2];
snum[0]=NULL;
snum[1]=NULL;
i=(currentx-210)/20;
j=(currenty-130)/20;
if(di[j].bomb==1)
{
outtextxy(100,100,”game over”);
xianbomb();
sleep(2);
exit(0);
}
if(di[j].bomb==0)
{
di[j].wa=1;
setfillstyle(1,0);
bar(currentx-8,currenty-8,currentx+8,currenty+8);
setcolor(15);
itoa(di[j].num,snum,10);
outtextxy(currentx-8,currenty-8,snum);
setcolor(4);
circle(currentx,currenty,5);
}
}
if(key==0x2b5c)
{
char biaoji[2];
biaoji[0]=1;
biaoji[1]=NULL;
setcolor(0);
bar(currentx-8,currenty-8,currentx+8,currenty+8);
setcolor(4);
outtextxy(currentx-8,currenty-8,biaoji);
circle(currentx,currenty,5);
}
}
void success(void)
{
int k=1;
int i,j;
for(i=0;i=9;i++)
for(j=0;j=9;j++)
if(di[j].bomb==0di[j].wa==0)
k=0;
if(k==1)
{
outtextxy(100,100,”success good”);
xianbomb();
sleep(2);
exit(0);
}
}
void main(void)
{
int gd=DETECT,gm;
initgraph(gd,gm,””);
initxy();
initmu();
randbomb();
jisuan();
setcolor(4);
circle(210,130,5);
while(1)
{
move();
success();
}
}
C語言 掃雷
#includestdio.h
int main(void)
{
char plat[100][100]; //雷的地圖
char plat_new[100][100]; //數字映射圖
int n, m; //存儲行、列數
int in, im;
int mark = 0; //記錄該點附近8個坐標雷的總數
int j = 1;
scanf(“%d %d”, n, m);
getchar(); //消除回車符的影響
do {
if (n == 0 m == 0)
break;
for (in = 0; in n; in++)
{
for (im = 0; im m; im++)
{
scanf(“%c”, plat[in][im]);
}
getchar();
}
for (in = 0; in n; in++)
for (im = 0; im m; im++)
{
if (plat[in][im] == ‘*’) /*該點有雷,無需檢測*/
{
plat_new[in][im]= plat[in][im];
continue;
}
if (in – 1 = 0) //檢測上面3個點的雷數
{
if (plat[in – 1][im] == ‘*’)
mark++;
if (im – 1 = 0 plat[in -1][im – 1] == ‘*’)
mark++;
if (im + 1 mplat[in -1][im + 1] == ‘*’)
mark++;
}
if (im – 1 = 0 plat[in][im- 1] == ‘*’) //檢測左右兩個點的雷數
mark++;
if (im + 1 m plat[in][im+ 1] == ‘*’)
mark++;
if (in + 1 n) //檢測下面3個點的雷數
{
if (plat[in + 1][im] == ‘*’)
mark++;
if (im – 1 = 0 plat[in +1][im – 1] == ‘*’)
mark++;
if (im + 1 mplat[in +1][im + 1] == ‘*’)
mark++;
}
switch (mark)
{
case 0:plat_new[in][im] = ‘0’; break;
case 1:plat_new[in][im] = ‘1’; break;
case 2:plat_new[in][im] = ‘2’; break;
case 3:plat_new[in][im] = ‘3’; break;
case 4:plat_new[in][im] = ‘4’; break;
case 5:plat_new[in][im] = ‘5’; break;
case 6:plat_new[in][im] = ‘6’; break;
case 7:plat_new[in][im] = ‘7’; break;
case 8:plat_new[in][im] = ‘8’; break;
}
mark = 0; //重置雷數
}
if (j != 1)
putchar(‘\n’);
printf(“Field#%d:\n”, j);
for (in = 0; in n; in++) //列印數字地圖
{
for (im = 0; im m; im++)
{
printf(“%c”, plat_new[in][im]);
}
if(in!=n-1)
putchar(‘\n’);
}
scanf(“%d %d”, n, m);
getchar();
j++;
} while (1);
return 0;
}
C語言掃雷遊戲源代碼
“掃雷”小遊戲C代碼
#includestdio.h
#includemath.h
#includetime.h
#includestdlib.h
main( )
{char a[102][102],b[102][102],c[102][102],w;
int i,j; /*循環變數*/
int x,y,z[999]; /*雷的位置*/
int t,s; /*標記*/
int m,n,lei; /*計數*/
int u,v; /*輸入*/
int hang,lie,ge,mo; /*自定義變數*/
srand((int)time(NULL)); /*啟動隨機數發生器*/
leb1: /*選擇模式*/
printf(“\n 請選擇模式:\n 1.標準 2.自定義\n”);
scanf(“%d”,mo);
if(mo==2) /*若選擇自定義模式,要輸入三個參數*/
{do
{t=0; printf(“請輸入\n行數 列數 雷的個數\n”);
scanf(“%d%d%d”,hang,lie,ge);
if(hang2){printf(“行數太少\n”); t=1;}
if(hang100){printf(“行數太多\n”);t=1;}
if(lie2){printf(“列數太少\n”);t=1;}
if(lie100){printf(“列數太多\n”);t=1;}
if(ge1){printf(“至少要有一個雷\n”);t=1;}
if(ge=(hang*lie)){printf(“雷太多了\n”);t=1;}
}while(t==1);
}
else{hang=10,lie=10,ge=10;} /*否則就是選擇了標準模式(默認參數)*/
for(i=1;i=ge;i=i+1) /*確定雷的位置*/
{do
{t=0; z[i]=rand( )%(hang*lie);
for(j=1;ji;j=j+1){if(z[i]==z[j]) t=1;}
}while(t==1);
}
for(i=0;i=hang+1;i=i+1) /*初始化a,b,c*/
{for(j=0;j=lie+1;j=j+1) {a[i][j]=’1′; b[i][j]=’1′; c[i][j]=’0′;} }
for(i=1;i=hang;i=i+1)
{for(j=1;j=lie;j=j+1) {a[i][j]=’+’;} }
for(i=1;i=ge;i=i+1) /*把雷放入c*/
{x=z[i]/lie+1; y=z[i]%lie+1; c[x][y]=’#’;}
for(i=1;i=hang;i=i+1) /*計算b中數字*/
{for(j=1;j=lie;j=j+1)
{m=48;
if(c[i-1][j-1]==’#’)m=m+1; if(c[i][j-1]==’#’)m=m+1;
if(c[i-1][j]==’#’)m=m+1; if(c[i+1][j+1]==’#’)m=m+1;
if(c[i][j+1]==’#’)m=m+1; if(c[i+1][j]==’#’)m=m+1;
if(c[i+1][j-1]==’#’)m=m+1; if(c[i-1][j+1]==’#’)m=m+1;
b[i][j]=m;
}
}
for(i=1;i=ge;i=i+1) /*把雷放入b中*/
{x=z[i]/lie+1; y=z[i]%lie+1; b[x][y]=’#’;}
lei=ge; /*以下是遊戲設計*/
do
{leb2: /*輸出*/
system(“cls”);printf(“\n\n\n\n”);
printf(” “);
for(i=1;i=lie;i=i+1)
{w=(i-1)/10+48; printf(“%c”,w);
w=(i-1)%10+48; printf(“%c “,w);
}
printf(“\n |”);
for(i=1;i=lie;i=i+1){printf(“—|”);}
printf(“\n”);
for(i=1;i=hang;i=i+1)
{w=(i-1)/10+48; printf(“%c”,w);
w=(i-1)%10+48; printf(“%c |”,w);
for(j=1;j=lie;j=j+1)
{if(a[i][j]==’0′)printf(” |”);
else printf(” %c |”,a[i][j]);
}
if(i==2)printf(” 剩餘雷個數”);
if(i==3)printf(” %d”,lei);
printf(“\n |”);
for(j=1;j=lie;j=j+1){printf(“—|”);}
printf(“\n”);
}
scanf(“%d%c%d”,u,w,v); /*輸入*/
u=u+1,v=v+1;
if(w!=’#’a[u][v]==’@’)
goto leb2;
if(w==’#’)
{if(a[u][v]==’+’){a[u][v]=’@’; lei=lei-1;}
else if(a[u][v]==’@’){a[u][v]=’?’; lei=lei+1;}
else if(a[u][v]==’?’){a[u][v]=’+’;}
goto leb2;
}
a[u][v]=b[u][v];
leb3: /*打開0區*/
t=0;
if(a[u][v]==’0′)
{for(i=1;i=hang;i=i+1)
{for(j=1;j=lie;j=j+1)
{s=0;
if(a[i-1][j-1]==’0′)s=1; if(a[i-1][j+1]==’0′)s=1;
if(a[i-1][j]==’0′)s=1; if(a[i+1][j-1]==’0′)s=1;
if(a[i+1][j+1]==’0′)s=1; if(a[i+1][j]==’0′)s=1;
if(a[i][j-1]==’0′)s=1; if(a[i][j+1]==’0′)s=1;
if(s==1)a[i][j]=b[i][j];
}
}
for(i=1;i=hang;i=i+1)
{for(j=lie;j=1;j=j-1)
{s=0;
if(a[i-1][j-1]==’0′)s=1; if(a[i-1][j+1]==’0′)s=1;
if(a[i-1][j]==’0′)s=1; if(a[i+1][j-1]==’0′)s=1;
if(a[i+1][j+1]==’0′)s=1; if(a[i+1][j]==’0′)s=1;
if(a[i][j-1]==’0′)s=1; if(a[i][j+1]==’0′)s=1;
if(s==1)a[i][j]=b[i][j];
}
}
for(i=hang;i=1;i=i-1)
{for(j=1;j=lie;j=j+1)
{s=0;
if(a[i-1][j-1]==’0′)s=1; if(a[i-1][j+1]==’0′)s=1;
if(a[i-1][j]==’0′)s=1; if(a[i+1][j-1]==’0′)s=1;
if(a[i+1][j+1]==’0′)s=1; if(a[i+1][j]==’0′)s=1;
if(a[i][j-1]==’0′)s=1; if(a[i][j+1]==’0′)s=1;
if(s==1)a[i][j]=b[i][j];
}
}
for(i=hang;i=1;i=i-1)
{for(j=lie;j=1;j=j-1)
{s=0;
if(a[i-1][j-1]==’0′)s=1; if(a[i-1][j+1]==’0′)s=1;
if(a[i-1][j]==’0′)s=1; if(a[i+1][j-1]==’0′)s=1;
if(a[i+1][j+1]==’0′)s=1;if(a[i+1][j]==’0′)s=1;
if(a[i][j-1]==’0′)s=1; if(a[i][j+1]==’0′)s=1;
if(s==1)a[i][j]=b[i][j];
}
}
for(i=1;i=hang;i=i+1) /*檢測0區*/
{for(j=1;j=lie;j=j+1)
{if(a[i][j]==’0′)
{if(a[i-1][j-1]==’+’||a[i-1][j-1]==’@’||a[i-1][j-1]==’?’)t=1;
if(a[i-1][j+1]==’+’||a[i-1][j+1]==’@’||a[i-1][j+1]==’?’)t=1;
if(a[i+1][j-1]==’+’||a[i+1][j-1]==’@’||a[i+1][j-1]==’?’)t=1;
if(a[i+1][j+1]==’+’||a[i+1][j+1]==’@’||a[i+1][j+1]==’?’)t=1;
if(a[i+1][j]==’+’||a[i+1][j]==’@’||a[i+1][j]==’?’)t=1;
if(a[i][j+1]==’+’||a[i][j+1]==’@’||a[i][j+1]==’?’)t=1;
if(a[i][j-1]==’+’||a[i][j-1]==’@’||a[i][j-1]==’?’)t=1;
if(a[i-1][j]==’+’||a[i-1][j]==’@’||a[i-1][j]==’?’)t=1;
}
}
}
if(t==1)goto leb3;
}
n=0; /*檢查結束*/
for(i=1;i=hang;i=i+1)
{for(j=1;j=lie;j=j+1)
{if(a[i][j]!=’+’a[i][j]!=’@’a[i][j]!=’?’)n=n+1;}
}
}
while(a[u][v]!=’#’n!=(hang*lie-ge));
for(i=1;i=ge;i=i+1) /*遊戲結束*/
{x=z[i]/lie+1; y=z[i]%lie+1; a[x][y]=’#’; }
printf(” “);
for(i=1;i=lie;i=i+1)
{w=(i-1)/10+48; printf(“%c”,w);
w=(i-1)%10+48; printf(“%c “,w);
}
printf(“\n |”);
for(i=1;i=lie;i=i+1){printf(“—|”);}
printf(“\n”);
for(i=1;i=hang;i=i+1)
{w=(i-1)/10+48; printf(“%c”,w);
w=(i-1)%10+48; printf(“%c |”,w);
for(j=1;j=lie;j=j+1)
{if(a[i][j]==’0′)printf(” |”);
else printf(” %c |”,a[i][j]);
}
if(i==2)printf(” 剩餘雷個數”);
if(i==3)printf(” %d”,lei); printf(“\n |”);
for(j=1;j=lie;j=j+1) {printf(“—|”);}
printf(“\n”);
}
if(n==(hang*lie-ge)) printf(“你成功了!\n”);
else printf(” 遊戲結束!\n”);
printf(” 重玩請輸入1\n”);
t=0;
scanf(“%d”,t);
if(t==1)goto leb1;
}
/*註:在DEV c++上運行通過。行號和列號都從0開始,比如要確定第0行第9列不是「雷」,就在0和9中間加入一個字母,可以輸入【0a9】三個字元再按回車鍵。3行7列不是雷,則輸入【3a7】回車;第8行第5列是雷,就輸入【8#5】回車,9行0列是雷則輸入【9#0】並回車*/
C語言掃雷點到空白地方一次打開一大片的演算法求解
能把代碼再多給點嗎?
那8個遞歸其實可以用兩個for來做的
void ClickBlank(int x, int y) {
int i, j;
if (isBlank(x, y)) {
ShowAroundBlock(x, y);
for (i = -1; i = 1; i++) {
for (j = -1; j = 1; j++) {
if (i == 0 j == 0) continue;
ClickBlank(x + i, y + j);
}
}
}
}
而且你應該設訪問標記,已經ClickBlank的格子不應再調用ClickBlank
原創文章,作者:小藍,如若轉載,請註明出處:https://www.506064.com/zh-tw/n/198111.html