俄羅斯方快
創(chuàng)新互聯(lián)建站堅(jiān)持“要么做到,要么別承諾”的工作理念,服務(wù)領(lǐng)域包括:成都網(wǎng)站制作、成都網(wǎng)站建設(shè)、企業(yè)官網(wǎng)、英文網(wǎng)站、手機(jī)端網(wǎng)站、網(wǎng)站推廣等服務(wù),滿(mǎn)足客戶(hù)于互聯(lián)網(wǎng)時(shí)代的臨川網(wǎng)站設(shè)計(jì)、移動(dòng)媒體設(shè)計(jì)的需求,幫助企業(yè)找到有效的互聯(lián)網(wǎng)解決方案。努力成為您成熟可靠的網(wǎng)絡(luò)建設(shè)合作伙伴!
掃雷
#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();
}
}
用VC++編寫(xiě)掃雷游戲
用VC++編寫(xiě)掃雷游戲
王洪亞
本文從分析windows掃雷游戲的功能特點(diǎn)開(kāi)始,應(yīng)用面向?qū)ο蟮目梢暬幊陶Z(yǔ)言visual c++給出了個(gè)功能模塊的具體實(shí)現(xiàn)方法,并提供了編寫(xiě)小游戲程序的一般方法和visual c++的一些使用技巧。
首先分析掃雷的最基本功能。
點(diǎn)擊鼠標(biāo)左鍵于未知區(qū)域,如果未知區(qū)域有雷,游戲停止,顯示所有的地雷。如果沒(méi)雷,則顯示周?chē)讛?shù),如果周?chē)鷽](méi)雷,則再查看周?chē)藗€(gè)區(qū)域是否有雷直到有雷為止并顯示,這其實(shí)是一個(gè)遞歸過(guò)程。
點(diǎn)擊鼠標(biāo)右鍵于未知區(qū)域,則將其置為有雷而不管是否真的有雷。可選擇初、中、高三級(jí)并可自定義雷數(shù)和區(qū)域大小。
雷區(qū)上部左側(cè)顯示總雷數(shù)減被標(biāo)明有雷區(qū)域的數(shù)目。
雷區(qū)上部中間位置顯示一按鈕用于開(kāi)局和顯示鼠標(biāo)動(dòng)作的結(jié)果。
雷區(qū)上部右側(cè)顯示掃雷的時(shí)間。
將雷全部掃清后,則顯示一對(duì)話框?qū)⒛愕男彰浫肱判邪?。以時(shí)間排序。
為完成上述功能,應(yīng)用visual c++的具體技術(shù)細(xì)節(jié)如下:
1. 應(yīng)用appwizard創(chuàng)建基于sdi的應(yīng)用程序cbombapp,去除打印和狀態(tài)條支持,在資源編輯器中修改菜單和相應(yīng)的加速鍵,使其與windows掃雷游戲一致。具體為開(kāi)局(id-game-begin)、初級(jí)(id-game-junior)、中級(jí)(id-game-middle)、高級(jí)(id-game-senior)、自定義(id-game-custom)、顏色(id-game-color)、英雄榜(id-game-sort)、退出(id-game-exit)、幫助(id-help)。
2. 在資源編輯器中對(duì)應(yīng)于雷區(qū)的每個(gè)小區(qū)域的13個(gè)屬性。用畫(huà)筆或其他繪圖工具繪制出相對(duì)應(yīng)的13個(gè)10乘10的16色小位圖,三個(gè)對(duì)應(yīng)于小人表情的20乘20的16色小位圖,供更換顏色時(shí)使用的一套與前16個(gè)對(duì)應(yīng)的單色位圖,顯示時(shí)間和雷數(shù)的0~9十個(gè)數(shù)字位圖(底色為黑色)。
定制customer對(duì)話框,內(nèi)含三個(gè)靜態(tài)文本控件和三個(gè)編輯控件,三個(gè)編輯控件分別對(duì)應(yīng)成員m_irownum,m_icolumnnum,m_ibombnum。該對(duì)話框用于定制雷數(shù),行列數(shù),其相應(yīng)的mfc類(lèi)為ccustomer。定制sort對(duì)話框,內(nèi)含九個(gè)靜態(tài)文本控件,其中六個(gè)顯示排行榜的姓名和時(shí)間,其對(duì)應(yīng)的mfc類(lèi)為csort。定制input對(duì)話框,內(nèi)含一個(gè)靜態(tài)文本控件和一個(gè)編輯控件,編輯控件用于在游戲成功結(jié)束時(shí)輸入姓名,其對(duì)應(yīng)的mfc類(lèi)為cinput。
3. 定義類(lèi)bomb,封裝每顆雷的相關(guān)屬性。
class bomb
{
public:
int isbomb;//決定初始時(shí)是否是雷
bool issel; //判斷區(qū)域是否被處理過(guò)且周?chē)欣?/p>
bool isdone;//判斷遞歸時(shí)是否被處理過(guò)
int num; //周?chē)讛?shù)
bool findbomb; //排雷者認(rèn)為是雷時(shí)置一(但是不一定真是雷)
} ;
4. 重載cmainframe中precreatewindow,并設(shè)置相應(yīng)屬性,使其窗體大小固定,這樣就固定了顯示區(qū)域的大小為初始10乘10個(gè)雷和外加雷區(qū)上部的控制區(qū)域,部分代碼如下。
cs.style=ws_overlapped|ws_sysmenu| ws_border|ws_minimizebox;
cs.cy = 10*15+6;
cs.cx = 10*15+60; //6和60分別是橫縱的附加值,用于邊框、菜單、標(biāo)題條、控制區(qū)域。
5. 游戲的主要工作就是呈現(xiàn)不斷變換的圖形或動(dòng)畫(huà),并按用戶(hù)的輸入交互進(jìn)行顯示,而windows文檔-----視窗構(gòu)架中的視窗的功能正是接受用戶(hù)輸入并負(fù)責(zé)顯示,因此由cview類(lèi)來(lái)完成掃雷的大部分工作。在cbombview中定義下列成員變量記錄相關(guān)操作的結(jié)果或?qū)ο蟮臓顟B(tài)。
bomb m_bomb[30][30]; //最大的地雷區(qū)域
cstring m_currenttime; //用于記錄并顯示掃雷時(shí)間
ctime m_begintime;//記錄游戲開(kāi)始時(shí)的時(shí)間
bool m_timerbegin;//定時(shí)器是否開(kāi)啟
int m_ibomnum;//雷的數(shù)目
int m_irow;//雷的行數(shù)
int m_icolumn;//雷的列數(shù)
int m_ibombfound;//指示被認(rèn)為是雷的數(shù)目
cbitmapbutton m_bitbutton;//控制區(qū)的位圖按鈕
int m_currentlevel;//指示當(dāng)前游戲的級(jí)別
bool m_biscolor;//指示當(dāng)前是彩色還是單色
cbitmap m_bmbomb[12];//用于存放12個(gè)小位圖
int m_igameover;//游戲未結(jié)束置0,已清除所有的雷置1,被炸死置2。
重載cbombview中oncreate函數(shù)創(chuàng)建位圖按鈕,該位圖按鈕的兩幅位圖對(duì)應(yīng)了正常、排雷正確兩種狀態(tài),當(dāng)要顯示被炸死的狀態(tài)時(shí)應(yīng)動(dòng)態(tài)銷(xiāo)毀該按鈕,并重新創(chuàng)建一位圖對(duì)應(yīng)正常和被炸死兩種狀態(tài),將該位圖按鈕的id號(hào)定為id_game_begin,這樣一來(lái)當(dāng)點(diǎn)擊按鈕時(shí)便可重新開(kāi)始游戲,部分代碼如下。
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);
顯示時(shí)間的功能相對(duì)比較簡(jiǎn)單,在響應(yīng)第一個(gè)wm_lbuttomdown消息時(shí)開(kāi)啟定時(shí)器,并記錄游戲開(kāi)始的時(shí)間,在wm_time消息響應(yīng)函數(shù)ontimer中獲得當(dāng)前時(shí)間,減去游戲開(kāi)始時(shí)的時(shí)間,在顯示時(shí)間的客戶(hù)區(qū)域顯示得到的時(shí)間差(用數(shù)字位圖),當(dāng)游戲結(jié)束時(shí)(排完全部雷或被炸死)關(guān)閉定時(shí)器,停止顯示。
wm_lbuttomdown消息響應(yīng)函數(shù)onlbuttomdown是處理用戶(hù)輸入的主要執(zhí)行者,函數(shù)首先判斷點(diǎn)中位置是否是雷,是則關(guān)閉定時(shí)器,銷(xiāo)毀原位圖按鈕,創(chuàng)建一對(duì)應(yīng)正常和被炸死兩種狀態(tài)的新位圖按鈕,并調(diào)用setstate將其設(shè)置為pushdown(小人哭的狀態(tài)),將m_bgameover,置為true標(biāo)志游戲結(jié)束,否則先調(diào)用setstate 設(shè)置位圖按鈕為pushdown (小人笑的狀態(tài)),并在onlbuttomup中設(shè)置位圖按鈕為正常狀態(tài),然后調(diào)用caculate函數(shù)記下周?chē)椎臄?shù)目,最后調(diào)用invalidate使客戶(hù)區(qū)無(wú)效,迫使ondraw函數(shù)重繪客戶(hù)區(qū)域,在調(diào)用invalidate時(shí)不應(yīng)重畫(huà)背景,避免閃爍,這樣就完成了在雷區(qū)按下左鍵的響應(yīng)動(dòng)作。
wm_rbuttomdown消息響應(yīng)函數(shù)onlbuttomdown將被認(rèn)為有雷位置的m_ibombnum.findbomb置一,減少左上角的雷記數(shù),然后判斷是否真正全部排完了雷,是則結(jié)束游戲彈出input對(duì)話框,讓掃雷的人輸入姓名,在響應(yīng)idok通知碼時(shí)將其寫(xiě)入注冊(cè)表,沒(méi)有全部排完則使客戶(hù)區(qū)無(wú)效,迫使ondraw函數(shù)重繪客戶(hù)區(qū)域完成在雷區(qū)按下右鍵的動(dòng)作。
ondraw函數(shù)在每次點(diǎn)擊左鍵或右鍵時(shí)都會(huì)被調(diào)用重雷區(qū)和控制區(qū)域,因?yàn)辄c(diǎn)擊情況的復(fù)雜性和雷屬性的多元化導(dǎo)致ondraw函數(shù)需要精心設(shè)計(jì)。
函數(shù)caculate計(jì)算某個(gè)雷周?chē)睦讛?shù),根據(jù)前面的分析知道,計(jì)算某個(gè)雷周?chē)睦讛?shù)本身就是一個(gè)遞歸過(guò)程,在編制時(shí)應(yīng)注意遞歸的邊界條件,稍不注意會(huì)陷入無(wú)窮遞歸而耗盡了系統(tǒng)的資源。
6. 菜單命令的響應(yīng)是游戲交互的另一個(gè)重要方式,下面的九個(gè)命令響應(yīng)函數(shù)分別與九個(gè)菜單項(xiàng)相對(duì)應(yīng),用以完成用戶(hù)的更新和設(shè)置命令。
ongamebegin完成初始時(shí)間清零,隨機(jī)布雷,依據(jù)顏色指示裝載12幅小位圖,使雷區(qū)無(wú)效調(diào)用ondraw重繪等工作。其中隨機(jī)布雷就是多次調(diào)用rand(),根據(jù)其返回值決定m_bomb[i][j].isbomb的值。
ongamecustom首先彈出ccustomer對(duì)話框,在用戶(hù)輸入設(shè)置后響應(yīng)idok通知碼時(shí)將用戶(hù)輸入的雷數(shù)、行列數(shù)分別賦給cview的數(shù)據(jù)成員m_ibombnum、m_irow、m_icolumn,得到框架窗口的指針,用其調(diào)用movewindow將窗口調(diào)至所需大小,銷(xiāo)毀原位置的位圖按鈕,并在x軸坐標(biāo)為新窗口寬1/2減8處,y軸坐標(biāo)為新窗口頂部加30的位置創(chuàng)建一新按鈕。最后調(diào)用ongamebegin重新開(kāi)始游戲。
ongamejunior、ongamemiddle、ongamesenior三個(gè)函數(shù)與ongamecustom類(lèi)似,只不過(guò)將分別賦給cview的數(shù)據(jù)成員m_ibombnum、m_irow、m_icolumn以固定的值,其大小可由編程者自定,筆者定為junior(20,8,8,)、middle(40,13,13)、senior(99,20,25)。
ongamecolor函數(shù)銷(xiāo)毀原位圖按鈕,根據(jù)重新裝載位圖的標(biāo)志m_iscolor來(lái)創(chuàng)建新的位圖按鈕,將裝載12幅單色位圖的標(biāo)志取反,調(diào)用ongamebegin重新開(kāi)始游戲。
ongamesort函數(shù)根據(jù)當(dāng)前游戲級(jí)別從注冊(cè)表中讀出排名并彈出sort對(duì)話框顯示結(jié)果。到現(xiàn)在為止,一個(gè)自己編制的掃雷游戲就基本完成了,將數(shù)百行代碼編譯一下,找出小錯(cuò)誤,最后build一遍,run一下,好了,可愛(ài)的掃雷游戲就出現(xiàn)在你的面前了。怎么樣,自己的勞動(dòng)成果并不比microsoft的差吧,而且你還可以把小位圖畫(huà)成各種樣子,當(dāng)然你自己要認(rèn)得出才行了。
"掃雷"小游戲C代碼
#includestdio.h
#includemath.h
#includetime.h
#includestdlib.h
main( )
{char a[102][102],b[102][102],c[102][102],w;
int i,j; ?/*循環(huán)變量*/
int x,y,z[999]; ?/*雷的位置*/
int t,s; ?/*標(biāo)記*/
int m,n,lei; ?/*計(jì)數(shù)*/
int u,v; ?/*輸入*/
int hang,lie,ge,mo; ?/*自定義變量*/
srand((int)time(NULL)); ?/*啟動(dòng)隨機(jī)數(shù)發(fā)生器*/
leb1:? /*選擇模式*/
printf("\n? ?請(qǐng)選擇模式:\n ??1.標(biāo)準(zhǔn) ?2.自定義\n");
scanf("%d",mo);
if(mo==2) ?/*若選擇自定義模式,要輸入三個(gè)參數(shù)*/
{do
{t=0; printf("請(qǐng)輸入\n行數(shù) 列數(shù) 雷的個(gè)數(shù)\n");
scanf("%d%d%d",hang,lie,ge);
if(hang2){printf("行數(shù)太少\n"); t=1;}
if(hang100){printf("行數(shù)太多\n");t=1;}
if(lie2){printf("列數(shù)太少\n");t=1;}
if(lie100){printf("列數(shù)太多\n");t=1;}
if(ge1){printf("至少要有一個(gè)雷\n");t=1;}
if(ge=(hang*lie)){printf("雷太多了\n");t=1;}
}while(t==1);
}
else{hang=10,lie=10,ge=10;}? /*否則就是選擇了標(biāo)準(zhǔn)模式(默認(rèn)參數(shù))*/
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)? /*計(jì)算b中數(shù)字*/
{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; ?/*以下是游戲設(shè)計(jì)*/
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(" 剩余雷個(gè)數(shù)");
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: ?/*打開(kāi)0區(qū)*/
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) ?/*檢測(cè)0區(qū)*/
{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; ?/*檢查結(jié)束*/
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) ?/*游戲結(jié)束*/
{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(" 剩余雷個(gè)數(shù)");
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("??? 游戲結(jié)束!\n");
printf("??? 重玩請(qǐng)輸入1\n");
t=0;
scanf("%d",t);
if(t==1)goto leb1;
}
/*注:在DEV c++上運(yùn)行通過(guò)。行號(hào)和列號(hào)都從0開(kāi)始,比如要確定第0行第9列不是“雷”,就在0和9中間加入一個(gè)字母,可以輸入【0a9】三個(gè)字符再按回車(chē)鍵。3行7列不是雷,則輸入【3a7】回車(chē);第8行第5列是雷,就輸入【8#5】回車(chē),9行0列是雷則輸入【9#0】并回車(chē)*/