⑴ C語言 掃雷
#include<stdio.h>
intmain(void)
{
charplat[100][100];//雷的地圖
charplat_new[100][100];//數字映射圖
intn,m;//存儲行、列數
intin,im;
intmark=0;//記錄該點附近8個坐標雷的總數
intj=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<m&&plat[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<m&&plat[in+1][im+1]=='*')
mark++;
}
switch(mark)
{
case0:plat_new[in][im]='0';break;
case1:plat_new[in][im]='1';break;
case2:plat_new[in][im]='2';break;
case3:plat_new[in][im]='3';break;
case4:plat_new[in][im]='4';break;
case5:plat_new[in][im]='5';break;
case6:plat_new[in][im]='6';break;
case7:plat_new[in][im]='7';break;
case8:plat_new[in][im]='8';break;
}
mark=0;//重置雷數
}
if(j!=1)
putchar(' ');
printf("Field#%d: ",j);
for(in=0;in<n;in++)//列印數字地圖
{
for(im=0;im<m;im++)
{
printf("%c",plat_new[in][im]);
}
if(in!=n-1)
putchar(' ');
}
scanf("%d%d",&n,&m);
getchar();
j++;
}while(1);
return0;
}
⑵ C語言開發掃雷游戲,C語言設計
源代碼#include <graphics.h>
#include <stdlib.h>
#include <dos.h>
#define LEFTPRESS 0xff01
#define LEFTCLICK 0xff10
#define LEFTDRAG 0xff19
#define MOUSEMOVE 0xff08
struct
{
int num;/*格子當前處於什麼狀態,1有雷,0已經顯示過數字或者空白格子*/
int roundnum;/*統計格子周圍有多少雷*/
int flag;/*右鍵按下顯示紅旗的標志,0沒有紅旗標志,1有紅旗標志*/
}Mine[10][10];
int gameAGAIN=0;/*是否重來的變數*/
int gamePLAY=0;/*是否是第一次玩游戲的標志*/
int mineNUM;/*統計處理過的格子數*/
char randmineNUM[3];/*顯示數字的字元串*/
int Keystate;
int MouseExist;
int MouseButton;
int MouseX;
int MouseY;
void Init(void);/*圖形驅動*/
void MouseOn(void);/*滑鼠游標顯示*/
void MouseOff(void);/*滑鼠游標隱藏*/
void MouseSetXY(int,int);/*設置當前位置*/
int LeftPress(void);/*左鍵按下*/
int RightPress(void);/*滑鼠右鍵按下*/
void MouseGetXY(void);/*得到當前位置*/
void Control(void);/*游戲開始,重新,關閉*/
void GameBegain(void);/*游戲開始畫面*/
void DrawSmile(void);/*畫笑臉*/
void DrawRedflag(int,int);/*顯示紅旗*/
void DrawEmpty(int,int,int,int);/*兩種空格子的顯示*/
void GameOver(void);/*游戲結束*/
void GameWin(void);/*顯示勝利*/
int MineStatistics(int,int);/*統計每個格子周圍的雷數*/
int ShowWhite(int,int);/*顯示無雷區的空白部分*/
void GamePlay(void);/*游戲過程*/
void Close(void);/*圖形關閉*/
void main(void)
{
Init();
Control();
Close();
}
void Init(void)/*圖形開始*/
{
int gd=DETECT,gm;
initgraph(&gd,&gm,"c:\\program files\\winyes\\tc20h\\bgi");
}
void Close(void)/*圖形關閉*/
{
closegraph();
}
void MouseOn(void)/*滑鼠游標顯示*/
{
_AX=0x01;
geninterrupt(0x33);
}
void MouseOff(void)/*滑鼠游標隱藏*/
{
_AX=0x02;
geninterrupt(0x33);
}
void MouseSetXY(int x,int y)/*設置當前位置*/
{
_CX=x;
_DX=y;
_AX=0x04;
geninterrupt(0x33);
}
int LeftPress(void)/*滑鼠左鍵按下*/
{
_AX=0x03;
geninterrupt(0x33);
return(_BX&1);
}
int RightPress(void)/*滑鼠右鍵按下*/
{
_AX=0x03;
geninterrupt(0x33);
return(_BX&2);
}
void MouseGetXY(void)/*得到當前位置*/
{
_AX=0x03;
geninterrupt(0x33);
MouseX=_CX;
MouseY=_DX;
}
void Control(void)/*游戲開始,重新,關閉*/
{
int gameFLAG=1;/*游戲失敗後判斷是否重新開始的標志*/
while(1)
{
if(gameFLAG)/*游戲失敗後沒判斷出重新開始或者退出遊戲的話就繼續判斷*/
{
GameBegain(); /*游戲初始畫面*/
GamePlay();/*具體游戲*/
if(gameAGAIN==1)/*游戲中重新開始*/
{
gameAGAIN=0;
continue;
}
}
MouseOn();
gameFLAG=0;
if(LeftPress())/*判斷是否重新開始*/
{
MouseGetXY();
if(MouseX>280&&MouseX<300&&MouseY>65&&MouseY<85)
{
gameFLAG=1;
continue;
}
}
if(kbhit())/*判斷是否按鍵退出*/
break;
}
MouseOff();
}
void DrawSmile(void)/*畫笑臉*/
{
setfillstyle(SOLID_FILL,YELLOW);
fillellipse(290,75,10,10);
setcolor(YELLOW);
setfillstyle(SOLID_FILL,BLACK);/*眼睛*/
fillellipse(285,75,2,2);
fillellipse(295,75,2,2);
setcolor(BLACK);/*嘴巴*/
bar(287,80,293,81);
}
void DrawRedflag(int i,int j)/*顯示紅旗*/
{
setcolor(7);
setfillstyle(SOLID_FILL,RED);
bar(198+j*20,95+i*20,198+j*20+5,95+i*20+5);
setcolor(BLACK);
line(198+j*20,95+i*20,198+j*20,95+i*20+10);
}
void DrawEmpty(int i,int j,int mode,int color)/*兩種空格子的顯示*/
{
setcolor(color);
setfillstyle(SOLID_FILL,color);
if(mode==0)/*沒有單擊過的大格子*/
bar(200+j*20-8,100+i*20-8,200+j*20+8,100+i*20+8);
else
if(mode==1)/*單擊過後顯示空白的小格子*/
bar(200+j*20-7,100+i*20-7,200+j*20+7,100+i*20+7);
}
void GameBegain(void)/*游戲開始畫面*/
{
int i,j;
cleardevice();
if(gamePLAY!=1)
{
MouseSetXY(290,70); /*滑鼠一開始的位置,並作為它的初始坐標*/
MouseX=290;
MouseY=70;
}
gamePLAY=1;/*下次按重新開始的話滑鼠不重新初始化*/
mineNUM=0;
setfillstyle(SOLID_FILL,7);
bar(190,60,390,290);
for(i=0;i<10;i++)/*畫格子*/
for(j=0;j<10;j++)
DrawEmpty(i,j,0,8);
setcolor(7);
DrawSmile();/*畫臉*/
randomize();
for(i=0;i<10;i++)/*100個格子隨機賦值有沒有地雷*/
for(j=0;j<10;j++)
{
Mine[i][j].num=random(8);/*如果隨機數的結果是1表示這個格子有地雷*/
if(Mine[i][j].num==1)
mineNUM++;/*現有雷數加1*/
else
Mine[i][j].num=2;
Mine[i][j].flag=0;/*表示沒紅旗標志*/
}
sprintf(randmineNUM,"%d",mineNUM); /*顯示這次總共有多少雷數*/
setcolor(1);
settextstyle(0,0,2);
outtextxy(210,70,randmineNUM);
mineNUM=100-mineNUM;/*變數取空白格數量*/
MouseOn();
}
void GameOver(void)/*游戲結束畫面*/
{
int i,j;
setcolor(0);
for(i=0;i<10;i++)
for(j=0;j<10;j++)
if(Mine[i][j].num==1)/*顯示所有的地雷*/
{
DrawEmpty(i,j,0,RED);
setfillstyle(SOLID_FILL,BLACK);
fillellipse(200+j*20,100+i*20,7,7);
}
}
void GameWin(void)/*顯示勝利*/
{
setcolor(11);
settextstyle(0,0,2);
outtextxy(230,30,"YOU WIN!");
}
int MineStatistics(int i,int j)/*統計每個格子周圍的雷數*/
{
int nNUM=0;
if(i==0&&j==0)/*左上角格子的統計*/
{
if(Mine[0][1].num==1)
nNUM++;
if(Mine[1][0].num==1)
nNUM++;
if(Mine[1][1].num==1)
nNUM++;
}
else
if(i==0&&j==9)/*右上角格子的統計*/
{
if(Mine[0][8].num==1)
nNUM++;
if(Mine[1][9].num==1)
nNUM++;
if(Mine[1][8].num==1)
nNUM++;
}
else
if(i==9&&j==0)/*左下角格子的統計*/
{
if(Mine[8][0].num==1)
nNUM++;
if(Mine[9][1].num==1)
nNUM++;
if(Mine[8][1].num==1)
nNUM++;
}
else
if(i==9&&j==9)/*右下角格子的統計*/
{
if(Mine[9][8].num==1)
nNUM++;
if(Mine[8][9].num==1)
nNUM++;
if(Mine[8][8].num==1)
nNUM++;
}
else if(j==0)/*左邊第一列格子的統計*/
{
if(Mine[i][j+1].num==1)
nNUM++;
if(Mine[i+1][j].num==1)
nNUM++;
if(Mine[i-1][j].num==1)
nNUM++;
if(Mine[i-1][j+1].num==1)
nNUM++;
if(Mine[i+1][j+1].num==1)
nNUM++;
}
else if(j==9)/*右邊第一列格子的統計*/
{
if(Mine[i][j-1].num==1)
nNUM++;
if(Mine[i+1][j].num==1)
nNUM++;
if(Mine[i-1][j].num==1)
nNUM++;
if(Mine[i-1][j-1].num==1)
nNUM++;
if(Mine[i+1][j-1].num==1)
nNUM++;
}
else if(i==0)/*第一行格子的統計*/
{
if(Mine[i+1][j].num==1)
nNUM++;
if(Mine[i][j-1].num==1)
nNUM++;
if(Mine[i][j+1].num==1)
nNUM++;
if(Mine[i+1][j-1].num==1)
nNUM++;
if(Mine[i+1][j+1].num==1)
nNUM++;
}
else if(i==9)/*最後一行格子的統計*/
{
if(Mine[i-1][j].num==1)
nNUM++;
if(Mine[i][j-1].num==1)
nNUM++;
if(Mine[i][j+1].num==1)
nNUM++;
if(Mine[i-1][j-1].num==1)
nNUM++;
if(Mine[i-1][j+1].num==1)
nNUM++;
}
else/*普通格子的統計*/
{
if(Mine[i-1][j].num==1)
nNUM++;
if(Mine[i-1][j+1].num==1)
nNUM++;
if(Mine[i][j+1].num==1)
nNUM++;
if(Mine[i+1][j+1].num==1)
nNUM++;
if(Mine[i+1][j].num==1)
nNUM++;
if(Mine[i+1][j-1].num==1)
nNUM++;
if(Mine[i][j-1].num==1)
nNUM++;
if(Mine[i-1][j-1].num==1)
nNUM++;
}
return(nNUM);/*把格子周圍一共有多少雷數的統計結果返回*/
}
int ShowWhite(int i,int j)/*顯示無雷區的空白部分*/
{
if(Mine[i][j].flag==1||Mine[i][j].num==0)/*如果有紅旗或該格處理過就不對該格進行任何判斷*/
return;
mineNUM--;/*顯示過數字或者空格的格子就表示多處理了一個格子,當所有格子都處理過了表示勝利*/
if(Mine[i][j].roundnum==0&&Mine[i][j].num!=1)/*顯示空格*/
{
DrawEmpty(i,j,1,7);
Mine[i][j].num=0;
}
else
if(Mine[i][j].roundnum!=0)/*輸出雷數*/
{
DrawEmpty(i,j,0,8);
sprintf(randmineNUM,"%d",Mine[i][j].roundnum);
setcolor(RED);
outtextxy(195+j*20,95+i*20,randmineNUM);
Mine[i][j].num=0;/*已經輸出雷數的格子用0表示已經用過這個格子*/
return ;
}
/*8個方向遞歸顯示所有的空白格子*/
if(i!=0&&Mine[i-1][j].num!=1)
ShowWhite(i-1,j);
if(i!=0&&j!=9&&Mine[i-1][j+1].num!=1)
ShowWhite(i-1,j+1);
if(j!=9&&Mine[i][j+1].num!=1)
ShowWhite(i,j+1);
if(j!=9&&i!=9&&Mine[i+1][j+1].num!=1)
ShowWhite(i+1,j+1);
if(i!=9&&Mine[i+1][j].num!=1)
ShowWhite(i+1,j);
if(i!=9&&j!=0&&Mine[i+1][j-1].num!=1)
ShowWhite(i+1,j-1);
if(j!=0&&Mine[i][j-1].num!=1)
ShowWhite(i,j-1);
if(i!=0&&j!=0&&Mine[i-1][j-1].num!=1)
ShowWhite(i-1,j-1);
}
void GamePlay(void)/*游戲過程*/
{
int i,j,Num;/*Num用來接收統計函數返回一個格子周圍有多少地雷*/
for(i=0;i<10;i++)
for(j=0;j<10;j++)
Mine[i][j].roundnum=MineStatistics(i,j);/*統計每個格子周圍有多少地雷*/
while(!kbhit())
{
if(LeftPress())/*滑鼠左鍵盤按下*/
{
MouseGetXY();
if(MouseX>280&&MouseX<300&&MouseY>65&&MouseY<85)/*重新來*/
{
MouseOff();
gameAGAIN=1;
break;
}
if(MouseX>190&&MouseX<390&&MouseY>90&&MouseY<290)/*當前滑鼠位置在格子范圍內*/
{
j=(MouseX-190)/20;/*x坐標*/
i=(MouseY-90)/20;/*y坐標*/
if(Mine[i][j].flag==1)/*如果格子有紅旗則左鍵無效*/
continue;
if(Mine[i][j].num!=0)/*如果格子沒有處理過*/
{
if(Mine[i][j].num==1)/*滑鼠按下的格子是地雷*/
{
MouseOff();
GameOver();/*游戲失敗*/
break;
}
else/*滑鼠按下的格子不是地雷*/
{
MouseOff();
Num=MineStatistics(i,j);
if(Num==0)/*周圍沒地雷就用遞歸演算法來顯示空白格子*/
ShowWhite(i,j);
else/*按下格子周圍有地雷*/
{
sprintf(randmineNUM,"%d",Num);/*輸出當前格子周圍的雷數*/
setcolor(RED);
outtextxy(195+j*20,95+i*20,randmineNUM);
mineNUM--;
}
MouseOn();
Mine[i][j].num=0;/*點過的格子周圍雷數的數字變為0表示這個格子已經用過*/
if(mineNUM<1)/*勝利了*/
{
GameWin();
break;
}
}
}
}
}
if(RightPress())/*滑鼠右鍵鍵盤按下*/
{
MouseGetXY();
if(MouseX>190&&MouseX<390&&MouseY>90&&MouseY<290)/*當前滑鼠位置在格子范圍內*/
{
j=(MouseX-190)/20;/*x坐標*/
i=(MouseY-90)/20;/*y坐標*/
MouseOff();
if(Mine[i][j].flag==0&&Mine[i][j].num!=0)/*本來沒紅旗現在顯示紅旗*/
{
DrawRedflag(i,j);
Mine[i][j].flag=1;
}
else
if(Mine[i][j].flag==1)/*有紅旗標志再按右鍵就紅旗消失*/
{
DrawEmpty(i,j,0,8);
Mine[i][j].flag=0;
}
}
MouseOn();
sleep(1);
}
}
}
⑶ 掃雷游戲 c語言
#include<windows.h>
#include<CommCtrl.h>//用於InitCommonControls
#pragmacomment(lib,"comctl32.lib")//用於InitCommonControls
//常量
constintWINDOW_STYLES=WS_OVERLAPPED|WS_SYSMENU|WS_CAPTION;//窗口風格
constintMAX_WIDTH=30;//雷區最大寬度
constintMAX_HEIGHT=25;//雷區最大高度
constintFLAF_NULL=0; //格子無標記
constintFLAG_CAVEAT=1;//警告標記
constintFLAG_QUERY=2;//疑問標記
constintFLAG_OVERT=3;//已經打開的格子標記
constintFLAF_MINE=-1;//地雷標記
constintCELL_SIZE=25;//格子大小
//全局變數
staticstruct{
HINSTANCEhInst;//應用程序句柄實例
HWNDhWnd;//主窗口句柄
HWNDButton;//重新開始按鈕句柄
HWNDlButton;//左邊剩餘地雷按鈕
HWNDrButton;//右邊時間顯示按鈕
}Win;
staticstruct{
HWNDhWnd[MAX_WIDTH][MAX_HEIGHT];//雷區按鈕句柄
WNDPROCProc;//按鈕原來消息處理函數地址
intCode[MAX_WIDTH][MAX_HEIGHT];//存儲數據
intFlag[MAX_WIDTH][MAX_HEIGHT];//用戶標記
}MineField;
staticstruct{
intWidth;//雷區寬度
intHeight;//雷區高度
intCellNum;//剩下的安全格子數量
intRated_MineNum;//額定地雷數量
intMineNum;//剩餘地雷數量
inttime;//時間
booltimeOn;
}Game;
voidtoString(intval,char*string,intStringLen)
{//整數轉換文本,本程序使用Unicode字元集,字元串長度需要大於2
charstr[32];
inti=0;
if(StringLen<2) {
return;
}
_itoa_s(val,str,10);
while((i<32)&&(i<(StringLen/2-1))){
string[i*2]=str[i];
string[i*2+1]=0;
i++;
}
string[i]=string[i+1]=0;
}
intGetMineNum(intx,inty)//尋找周圍地雷的數目
{
inti,j,a,b,num=0;
for(i=-1;i<2;i++){
for(j=-1;j<2;j++){
a=x+i;
b=y+j;
if((a>-1)&&(b>-1)&&(a<Game.Width)&&(b<Game.Height)){
if(MineField.Code[a][b]==FLAF_MINE) {
num++;
}
}
}
}
returnnum;
}
voidNewGame(void)//新游戲
{
inti,j;
chartext[32];
//清空數組
for(i=0;i<Game.Width;i++){
for(j=0;j<Game.Height;j++){
MineField.Flag[i][j]=FLAF_NULL;
MineField.Code[i][j]=0;
SetWindowText(MineField.hWnd[i][j],L"");
}
}
//埋放地雷
srand(GetTickCount());//使用系統時間作為隨機數種子
for(intk=0;k<Game.Rated_MineNum;k++){
i=rand()%Game.Width;
j=rand()%Game.Height;
if(MineField.Code[i][j]==FLAF_MINE) {
k--;//已經有地雷,埋放失敗
}else{
MineField.Code[i][j]=FLAF_MINE;
}
}
//設置數字顯示周圍地雷數量
for(i=0;i<Game.Width;i++){
for(j=0;j<Game.Height;j++){
if(MineField.Code[i][j]!=FLAF_MINE) {
MineField.Code[i][j]=GetMineNum(i,j);
}
}
}
toString(Game.Rated_MineNum,text,32);
SetWindowText(Win.lButton,(LPCTSTR)text);
SetWindowText(Win.rButton,L"0");
SetWindowText(Win.Button,L"∩_∩");
Game.time=0;
Game.timeOn=false;
Game.MineNum=Game.Rated_MineNum;
Game.CellNum=Game.Width*Game.Height-Game.Rated_MineNum;
}
voidOvertMine(void)//顯示地雷
{
chartext[6],num;
Game.timeOn=false;
for(inti=0;i<Game.Width;i++){
for(intj=0;j<Game.Height;j++){
num=MineField.Code[i][j];
toString(num,text,6);
SetWindowText(MineField.hWnd[i][j],num==FLAF_MINE?L"雷":(LPCTSTR)text);
}
}
}
//雷區按鍵處理
voidMineSub(intx,inty,boolLButton=true){
inti,j,Num;
chartext[32];
//坐標范圍檢查
if((x<0)||(x>=Game.Width)||
(y<0)||(y>=Game.Height)){
return;
}
Num=MineField.Code[x][y];
if(LButton){
if((MineField.Flag[x][y]==FLAG_CAVEAT)||
MineField.Flag[x][y]==FLAG_OVERT){
return;
}
Game.timeOn=true;
MineField.Flag[x][y]=FLAG_OVERT;
if(Num==FLAF_MINE){
OvertMine();
SetWindowText(Win.Button,L">_<");
MessageBox(Win.hWnd,L"您踩到地雷啦,哈哈",L"您輸了",0);
NewGame();
return;
}else{
toString(Num,text,6);
SetWindowText(MineField.hWnd[x][y],(LPCTSTR)text);
Game.CellNum--;
if(Game.CellNum==0){
OvertMine();
MessageBox(Win.hWnd,L"恭喜你過關!",L"過關",0);
NewGame();
return;
}
if(Num==0){
for(i=-1;i<2;i++){
for(j=-1;j<2;j++){
if(Game.timeOn){//遞歸函數在重新開始後可能進入死循環
MineSub(x+i,y+j);
}
}
}
}
}
}else{
i=MineField.Flag[x][y];
if(i!=FLAG_OVERT){
if(i==FLAG_CAVEAT){
Game.MineNum++;
}
i=(i+1)%3;
MineField.Flag[x][y]=i;
SetWindowText(MineField.hWnd[x][y],
i==FLAF_NULL?L"":i==FLAG_CAVEAT?L"×":L"?");
if(i==FLAG_CAVEAT){
Game.MineNum--;
}
toString(Game.MineNum,text,32);
SetWindowText(Win.lButton,(LPCTSTR)text);
}
}
}
//雷區按鈕事件捕捉過程
(HWNDhWnd,UINTuMsg,WPARAMwParam,LPARAMlParam)
{
intx=0,y=0,i,j;
for(i=0;i<Game.Width;i++){
for(j=0;j<Game.Height;j++){
if(MineField.hWnd[i][j]==hWnd){
x=i;
y=j;
}
}
}
switch(uMsg){
caseWM_RBUTTONDOWN://滑鼠右鍵按下
MineSub(x,y,false);
break;
caseWM_KEYDOWN://鍵盤按鍵事件
switch(wParam){
caseVK_UP://上
y=y>0?y-1:0;
break;
caseVK_DOWN://下
y=y<(Game.Height-1)?y+1:Game.Height-1;
break;
caseVK_LEFT://左
x=x>0?x-1:0;
break;
caseVK_RIGHT://右
x=x<(Game.Width-1)?x+1:Game.Width-1;
break;
}
SetFocus(MineField.hWnd[x][y]);//設置焦點控制項
}
returnCallWindowProc(MineField.Proc,hWnd,uMsg,wParam,lParam);
}
//窗體事件捕捉過程
staticLRESULTCALLBACKWndProc(HWNDhWnd,UINTuMsg,WPARAMwParam,LPARAMlParam)
{
intid,msg;
chartext[32];
switch(uMsg){
caseWM_TIMER:
if(Game.timeOn){
Game.time++;
toString(Game.time,text,32);
SetWindowText(Win.rButton,(LPCTSTR)text);
}
break;
caseWM_COMMAND://按鈕發送的消息
id=LOWORD(wParam);//獲取按鈕編號
msg=HIWORD(wParam);//獲取消息值
if(msg==BN_CLICKED){//單擊消息
if((HWND)lParam==Win.Button){
NewGame();
}elseif(((HWND)lParam!=Win.lButton)&&((HWND)lParam!=Win.rButton)){
MineSub(id&255,id>>8);
}
}
break;
caseWM_DESTROY: //退出
PostQuitMessage(0);
break;
default: //其他事件
returnDefWindowProc(hWnd,uMsg,wParam,lParam);
}
returnFALSE;
}
//入口過程
intWINAPIWinMain(HINSTANCEhInstance,HINSTANCEhPrevInstance,LPSTRlpCmdLine,intnCmdShow)
{
intw,h;
chartext[32];
MSGmsg;
WNDCLASSEXwce;
RECTrect;
//初始化全局變數
Win.hInst=hInstance;
Game.Width=15;
Game.Height=10;
Game.Rated_MineNum=15;
InitCommonControls();//初始化通用組件庫
//設置窗口
wce.cbSize=sizeof(WNDCLASSEX);
wce.style=0;
wce.lpfnWndProc=(WNDPROC)WndProc;
wce.cbClsExtra=wce.cbWndExtra=0;
wce.hInstance=hInstance;
wce.hIcon=LoadIcon(NULL,IDI_APPLICATION);//窗口的最小化圖標為默認圖標
wce.hCursor=LoadCursor(NULL,IDC_ARROW);//窗口採用箭頭游標
wce.hbrBackground=(HBRUSH)(COLOR_BTNFACE+1);
wce.lpszMenuName=NULL;
wce.lpszClassName=L"Window";
wce.hIconSm=LoadIcon(NULL,IDI_APPLICATION);
RegisterClassEx(&wce);
//打開窗口
Win.hWnd=CreateWindow(L"Window",L"掃雷",WINDOW_STYLES,CW_USEDEFAULT,
CW_USEDEFAULT,100,100,NULL,NULL,hInstance,NULL);
if(Win.hWnd==NULL){
return-1;
}
ShowWindow(Win.hWnd,nCmdShow);
//調整客戶區大小
GetWindowRect(Win.hWnd,&rect);
rect.right=rect.left+Game.Width*CELL_SIZE;
rect.bottom=rect.top+(Game.Height+2)*CELL_SIZE;
AdjustWindowRect(&rect,WINDOW_STYLES,FALSE);//根據客戶區大小計算窗口大小
w=rect.right-rect.left;//寬度20*25應該是大於500
h=rect.bottom-rect.top;//高度15*25應該是大於375
MoveWindow(Win.hWnd,rect.left,rect.top,w,h,TRUE);
toString(Game.Rated_MineNum,text,32);
Win.lButton=CreateWindow(L"Button",(LPCTSTR)text,WS_CHILD|WS_VISIBLE,10,5,
CELL_SIZE*2,CELL_SIZE*2-10,Win.hWnd,0,hInstance,NULL);
Win.Button=CreateWindow(L"Button",L"∩_∩",WS_CHILD|WS_VISIBLE,(Game.Width-2)/2*CELL_SIZE,
5,CELL_SIZE*2,CELL_SIZE*2-10,Win.hWnd,0,hInstance,NULL);
Win.rButton=CreateWindow(L"Button",L"0",WS_CHILD|WS_VISIBLE,(Game.Width-2)*CELL_SIZE-5,
5,CELL_SIZE*2,CELL_SIZE*2-10,Win.hWnd,0,hInstance,NULL);
if((Win.lButton==NULL)||(Win.Button==NULL)||(Win.rButton==NULL)) {
return-1;
}
SetTimer(Win.hWnd,0,1000,NULL);//設置時鍾
//創建按鈕,成為雷區
for(inty=0;y<Game.Height;y++){
for(intx=0;x<Game.Width;x++){
MineField.hWnd[x][y]=CreateWindow(L"Button",L"",WS_CHILD|WS_VISIBLE,
x*CELL_SIZE,(y+2)*CELL_SIZE,CELL_SIZE,CELL_SIZE,Win.hWnd,
(HMENU)(y*256+x),hInstance,NULL);
if(MineField.hWnd[x][y]==NULL){
return-1;
}//endif
//改變按鈕消息接收函數地址,在此之前,記錄原地址
MineField.Proc=(WNDPROC)GetWindowLong(MineField.hWnd[x][y],GWL_WNDPROC);
SetWindowLong(MineField.hWnd[x][y],GWL_WNDPROC,(LONG)MineFieldProc);
}//nextx
}//nexty
NewGame();
SetFocus(MineField.hWnd[0][0]);
//接收消息
while(GetMessage(&msg,NULL,0,0)){
TranslateMessage(&msg);
DispatchMessage(&msg);
}
returnmsg.wParam;
}
代碼很亂,將就看吧
⑷ c語言編寫掃雷程序 編寫其摘要
沒寫過,我覺的是這樣.隨機數給出地雷的坐標,矩陣保存每個坐標周圍的地雷數,矩陣保存坐標是否被翻開的狀態,gui自己想吧.
⑸ C程序設計,寫一個掃雷隨機數佈雷的程序,11*11的
⑹ 掃雷C語言
#include <stdio.h>
#define N 40
int a[N][2];
int num;
void display()
{
for(int j=0; j < num; j++)
{
("%d ", a[j][1]);
}
printf("\n");
}
void test(int i)
{
if(i == num)
{
int j;
int flag = 1;
if(a[0][1]+a[1][1]!=a[0][0]&a[num-1][1]+a[num-2][1]!=a[num-1][0])
{
}
for(j = 1; j < num - 1; j++)
{
if(a[j-1][1] + a[j][1] + a[j+1][1] != a[j][0])
flag = 0;
}
if(flag)
display();
}
for(; i < num; i++)
{
if(a[i][1] == 0)
{
if(i == 0)
{
if(a[i][1]+a[i+1][1] != a[i][0])
{
a[i][1] = 1;
test(i+1);
a[i][1] = 0;
}
}
if(i > 0)
{
if(a[i-1][1] + a[i][1] + a[i+1][1] != a[i][0])
{
a[i][1] = 1;
test(i+1);
a[i][1] = 0;
}
}
}
}
}
int main()
{
int i;
printf("輸入個數:\n");
scanf("%d",&num);
printf("輸入數據(0~3):\n");
for(i = 0; i < num; i++)
{
scanf("%d",&a[i][0]);
a[i][1]=0;
}
for(i = 1; i < num - 1; i++)
{
if(a[i][0] == 3)
{
a[i-1][1] = 1;
a[i][1] = 1;
a[i+1][1] = 1;
}
}
test(0);
}
演算法思想:
1、如果有輸入數字是3則輸出數字中對應上中下都必為1
2、輸出數組中只有為0的才能為1;
3、用回溯法判斷成立條件,成功則輸出。
⑺ C語言課設掃雷游戲設計及論文!
c語言課程設計_掃雷游戲設計/*5.3.4 源程序*/
#include <graphics.h>
#include <stdlib.h>
#include <dos.h>
#define LEFTPRESS 0xff01
#define LEFTCLICK 0xff10
#define LEFTDRAG 0xff19
#define MOUSEMOVE 0xff08
struct
{
int num;/*格子當前處於什麼狀態,1有雷,0已經顯示過數字或者空白格子*/
int roundnum;/*統計格子周圍有多少雷*/
int flag;/*右鍵按下顯示紅旗的標志,0沒有紅旗標志,1有紅旗標志*/
}Mine[10][10];
int gameAGAIN=0;/*是否重來的變數*/
int gamePLAY=0;/*是否是第一次玩游戲的標志*/
int mineNUM;/*統計處理過的格子數*/
char randmineNUM[3];/*顯示數字的字元串*/
int Keystate;
int MouseExist;
int MouseButton;
int MouseX;
int MouseY;
void Init(void);/*圖形驅動*/
void MouseOn(void);/*滑鼠游標顯示*/
void MouseOff(void);/*滑鼠游標隱藏*/
void MouseSetXY(int,int);/*設置當前位置*/
int LeftPress(void);/*左鍵按下*/
int RightPress(void);/*滑鼠右鍵按下*/
void MouseGetXY(void);/*得到當前位置*/
void Control(void);/*游戲開始,重新,關閉*/
void GameBegain(void);/*游戲開始畫面*/
void DrawSmile(void);/*畫笑臉*/
void DrawRedflag(int,int);/*顯示紅旗*/
void DrawEmpty(int,int,int,int);/*兩種空格子的顯示*/
void GameOver(void);/*游戲結束*/
void GameWin(void);/*顯示勝利*/
int MineStatistics(int,int);/*統計每個格子周圍的雷數*/
int ShowWhite(int,int);/*顯示無雷區的空白部分*/
void GamePlay(void);/*游戲過程*/
void Close(void);/*圖形關閉*/
void main(void)
{
Init();
Control();
Close();
}
void Init(void)/*圖形開始*/
{
int gd=DETECT,gm;
initgraph(&gd,&gm,"c:\\tc");
}
void Close(void)/*圖形關閉*/
{
closegraph();
}
void MouseOn(void)/*滑鼠游標顯示*/
{
_AX=0x01;
geninterrupt(0x33);
}
void MouseOff(void)/*滑鼠游標隱藏*/
{
_AX=0x02;
geninterrupt(0x33);
}
void MouseSetXY(int x,int y)/*設置當前位置*/
{
_CX=x;
_DX=y;
_AX=0x04;
geninterrupt(0x33);
}
int LeftPress(void)/*滑鼠左鍵按下*/
{
_AX=0x03;
geninterrupt(0x33);
return(_BX&1);
}
int RightPress(void)/*滑鼠右鍵按下*/
{
_AX=0x03;
geninterrupt(0x33);
return(_BX&2);
}
void MouseGetXY(void)/*得到當前位置*/
{
_AX=0x03;
geninterrupt(0x33);
MouseX=_CX;
MouseY=_DX;
}
void Control(void)/*游戲開始,重新,關閉*/
{
int gameFLAG=1;/*游戲失敗後判斷是否重新開始的標志*/
while(1)
{
if(gameFLAG)/*游戲失敗後沒判斷出重新開始或者退出遊戲的話就繼續判斷*/
{
GameBegain(); /*游戲初始畫面*/
GamePlay();/*具體游戲*/
if(gameAGAIN==1)/*游戲中重新開始*/
{
gameAGAIN=0;
continue;
}
}
MouseOn();
gameFLAG=0;
if(LeftPress())/*判斷是否重新開始*/
{
MouseGetXY();
if(MouseX>280&&MouseX<300&&MouseY>65&&MouseY<85)
{
gameFLAG=1;
continue;
}
}
if(kbhit())/*判斷是否按鍵退出*/
break;
}
MouseOff();
}
void DrawSmile(void)/*畫笑臉*/
{
setfillstyle(SOLID_FILL,YELLOW);
fillellipse(290,75,10,10);
setcolor(YELLOW);
setfillstyle(SOLID_FILL,BLACK);/*眼睛*/
fillellipse(285,75,2,2);
fillellipse(295,75,2,2);
setcolor(BLACK);/*嘴巴*/
bar(287,80,293,81);
}
void DrawRedflag(int i,int j)/*顯示紅旗*/
{
setcolor(7);
setfillstyle(SOLID_FILL,RED);
bar(198+j*20,95+i*20,198+j*20+5,95+i*20+5);
setcolor(BLACK);
line(198+j*20,95+i*20,198+j*20,95+i*20+10);
}
void DrawEmpty(int i,int j,int mode,int color)/*兩種空格子的顯示*/
{
setcolor(color);
setfillstyle(SOLID_FILL,color);
if(mode==0)/*沒有單擊過的大格子*/
bar(200+j*20-8,100+i*20-8,200+j*20+8,100+i*20+8);
else
if(mode==1)/*單擊過後顯示空白的小格子*/
bar(200+j*20-7,100+i*20-7,200+j*20+7,100+i*20+7);
}
void GameBegain(void)/*游戲開始畫面*/
{
int i,j;
cleardevice();
if(gamePLAY!=1)
{
MouseSetXY(290,70); /*滑鼠一開始的位置,並作為它的初始坐標*/
MouseX=290;
MouseY=70;
}
gamePLAY=1;/*下次按重新開始的話滑鼠不重新初始化*/
mineNUM=0;
setfillstyle(SOLID_FILL,7);
bar(190,60,390,290);
for(i=0;i<10;i++)/*畫格子*/
for(j=0;j<10;j++)
DrawEmpty(i,j,0,8);
setcolor(7);
DrawSmile();/*畫臉*/
randomize();
for(i=0;i<10;i++)/*100個格子隨機賦值有沒有地雷*/
for(j=0;j<10;j++)
{
Mine[i][j].num=random(8);/*如果隨機數的結果是1表示這個格子有地雷*/
if(Mine[i][j].num==1)
mineNUM++;/*現有雷數加1*/
else
Mine[i][j].num=2;
Mine[i][j].flag=0;/*表示沒紅旗標志*/
}
sprintf(randmineNUM,"%d",mineNUM); /*顯示這次總共有多少雷數*/
setcolor(1);
settextstyle(0,0,2);
outtextxy(210,70,randmineNUM);
mineNUM=100-mineNUM;/*變數取空白格數量*/
MouseOn();
}
void GameOver(void)/*游戲結束畫面*/
{
int i,j;
setcolor(0);
for(i=0;i<10;i++)
for(j=0;j<10;j++)
if(Mine[i][j].num==1)/*顯示所有的地雷*/
{
DrawEmpty(i,j,0,RED);
setfillstyle(SOLID_FILL,BLACK);
fillellipse(200+j*20,100+i*20,7,7);
}
}
void GameWin(void)/*顯示勝利*/
{
setcolor(11);
settextstyle(0,0,2);
outtextxy(230,30,"YOU WIN!");
}
int MineStatistics(int i,int j)/*統計每個格子周圍的雷數*/
{
int nNUM=0;
if(i==0&&j==0)/*左上角格子的統計*/
{
if(Mine[0][1].num==1)
nNUM++;
if(Mine[1][0].num==1)
nNUM++;
if(Mine[1][1].num==1)
nNUM++;
}
else
if(i==0&&j==9)/*右上角格子的統計*/
{
if(Mine[0][8].num==1)
nNUM++;
if(Mine[1][9].num==1)
nNUM++;
if(Mine[1][8].num==1)
nNUM++;
}
else
if(i==9&&j==0)/*左下角格子的統計*/
{
if(Mine[8][0].num==1)
nNUM++;
if(Mine[9][1].num==1)
nNUM++;
if(Mine[8][1].num==1)
nNUM++;
}
else
if(i==9&&j==9)/*右下角格子的統計*/
{
if(Mine[9][8].num==1)
nNUM++;
if(Mine[8][9].num==1)
nNUM++;
if(Mine[8][8].num==1)
nNUM++;
}
else if(j==0)/*左邊第一列格子的統計*/
{
if(Mine[i][j+1].num==1)
nNUM++;
if(Mine[i+1][j].num==1)
nNUM++;
if(Mine[i-1][j].num==1)
nNUM++;
if(Mine[i-1][j+1].num==1)
nNUM++;
if(Mine[i+1][j+1].num==1)
nNUM++;
}
else if(j==9)/*右邊第一列格子的統計*/
{
if(Mine[i][j-1].num==1)
nNUM++;
if(Mine[i+1][j].num==1)
nNUM++;
if(Mine[i-1][j].num==1)
nNUM++;
if(Mine[i-1][j-1].num==1)
nNUM++;
if(Mine[i+1][j-1].num==1)
nNUM++;
}
else if(i==0)/*第一行格子的統計*/
{
if(Mine[i+1][j].num==1)
nNUM++;
if(Mine[i][j-1].num==1)
nNUM++;
if(Mine[i][j+1].num==1)
nNUM++;
if(Mine[i+1][j-1].num==1)
nNUM++;
if(Mine[i+1][j+1].num==1)
nNUM++;
}
else if(i==9)/*最後一行格子的統計*/
{
if(Mine[i-1][j].num==1)
nNUM++;
if(Mine[i][j-1].num==1)
nNUM++;
if(Mine[i][j+1].num==1)
nNUM++;
if(Mine[i-1][j-1].num==1)
nNUM++;
if(Mine[i-1][j+1].num==1)
nNUM++;
}
else/*普通格子的統計*/
{
if(Mine[i-1][j].num==1)
nNUM++;
if(Mine[i-1][j+1].num==1)
nNUM++;
if(Mine[i][j+1].num==1)
nNUM++;
if(Mine[i+1][j+1].num==1)
nNUM++;
if(Mine[i+1][j].num==1)
nNUM++;
if(Mine[i+1][j-1].num==1)
nNUM++;
if(Mine[i][j-1].num==1)
nNUM++;
if(Mine[i-1][j-1].num==1)
nNUM++;
}
return(nNUM);/*把格子周圍一共有多少雷數的統計結果返回*/
}
int ShowWhite(int i,int j)/*顯示無雷區的空白部分*/
{
if(Mine[i][j].flag==1||Mine[i][j].num==0)/*如果有紅旗或該格處理過就不對該格進行任何判斷*/
return;
mineNUM--;/*顯示過數字或者空格的格子就表示多處理了一個格子,當所有格子都處理過了表示勝利*/
if(Mine[i][j].roundnum==0&&Mine[i][j].num!=1)/*顯示空格*/
{
DrawEmpty(i,j,1,7);
Mine[i][j].num=0;
}
else
if(Mine[i][j].roundnum!=0)/*輸出雷數*/
{
DrawEmpty(i,j,0,8);
sprintf(randmineNUM,"%d",Mine[i][j].roundnum);
setcolor(RED);
outtextxy(195+j*20,95+i*20,randmineNUM);
Mine[i][j].num=0;/*已經輸出雷數的格子用0表示已經用過這個格子*/
return ;
}
/*8個方向遞歸顯示所有的空白格子*/
if(i!=0&&Mine[i-1][j].num!=1)
ShowWhite(i-1,j);
if(i!=0&&j!=9&&Mine[i-1][j+1].num!=1)
ShowWhite(i-1,j+1);
if(j!=9&&Mine[i][j+1].num!=1)
ShowWhite(i,j+1);
if(j!=9&&i!=9&&Mine[i+1][j+1].num!=1)
ShowWhite(i+1,j+1);
if(i!=9&&Mine[i+1][j].num!=1)
ShowWhite(i+1,j);
if(i!=9&&j!=0&&Mine[i+1][j-1].num!=1)
ShowWhite(i+1,j-1);
if(j!=0&&Mine[i][j-1].num!=1)
ShowWhite(i,j-1);
if(i!=0&&j!=0&&Mine[i-1][j-1].num!=1)
ShowWhite(i-1,j-1);
}
void GamePlay(void)/*游戲過程*/
{
int i,j,Num;/*Num用來接收統計函數返回一個格子周圍有多少地雷*/
for(i=0;i<10;i++)
for(j=0;j<10;j++)
Mine[i][j].roundnum=MineStatistics(i,j);/*統計每個格子周圍有多少地雷*/
while(!kbhit())
{
if(LeftPress())/*滑鼠左鍵盤按下*/
{
MouseGetXY();
if(MouseX>280&&MouseX<300&&MouseY>65&&MouseY<85)/*重新來*/
{
MouseOff();
gameAGAIN=1;
break;
}
if(MouseX>190&&MouseX<390&&MouseY>90&&MouseY<290)/*當前滑鼠位置在格子范圍內*/
{
j=(MouseX-190)/20;/*x坐標*/
i=(MouseY-90)/20;/*y坐標*/
if(Mine[i][j].flag==1)/*如果格子有紅旗則左鍵無效*/
continue;
if(Mine[i][j].num!=0)/*如果格子沒有處理過*/
{
if(Mine[i][j].num==1)/*滑鼠按下的格子是地雷*/
{
MouseOff();
GameOver();/*游戲失敗*/
break;
}
else/*滑鼠按下的格子不是地雷*/
{
MouseOff();
Num=MineStatistics(i,j);
if(Num==0)/*周圍沒地雷就用遞歸演算法來顯示空白格子*/
ShowWhite(i,j);
else/*按下格子周圍有地雷*/
{
sprintf(randmineNUM,"%d",Num);/*輸出當前格子周圍的雷數*/
setcolor(RED);
outtextxy(195+j*20,95+i*20,randmineNUM);
mineNUM--;
}
MouseOn();
Mine[i][j].num=0;/*點過的格子周圍雷數的數字變為0表示這個格子已經用過*/
if(mineNUM<1)/*勝利了*/
{
GameWin();
break;
}
}
}
}
}
if(RightPress())/*滑鼠右鍵鍵盤按下*/
{
MouseGetXY();
if(MouseX>190&&MouseX<390&&MouseY>90&&MouseY<290)/*當前滑鼠位置在格子范圍內*/
{
j=(MouseX-190)/20;/*x坐標*/
i=(MouseY-90)/20;/*y坐標*/
MouseOff();
if(Mine[i][j].flag==0&&Mine[i][j].num!=0)/*本來沒紅旗現在顯示紅旗*/
{
DrawRedflag(i,j);
Mine[i][j].flag=1;
}
else
if(Mine[i][j].flag==1)/*有紅旗標志再按右鍵就紅旗消失*/
{
DrawEmpty(i,j,0,8);
Mine[i][j].flag=0;
}
}
MouseOn();
sleep(1);
}
}
}
c語言課程設計_掃雷游戲設計
⑻ C語言程序設計課程設計掃地雷游戲,怎麼做
#include <stdlib.h>
#include <time.h>
#include <conio.h>
/************************************************************************/
/* 地圖狀態約定 */
/* 0 : 周圍9個格子都沒有雷 */
/* 1~8: 周圍9個格子有~8個雷 */
/* -1 : 有雷的格子 */
/* -2 : 被翻開的有雷的格子 */
/* -3 : 地圖邊界 */
/************************************************************************/
int Map[12][12]={0}; /* 當前在玩的雷圖 */
int MapShow[12][12]={0}; /* 當前用戶選擇過的地方,即「已翻開」的格子 */
int nSpaceLeft = 100; /* 剩餘的空白數,如果為0,則任務成功! */
int lastX,lastY; /* 失敗時,記錄挖到雷的位置 */
int AllMaps[5][12][12]={0}; /* 供用戶選擇的五張雷圖 */
/* 顯示雷區(每次用戶操作之後都要重新顯示) */
void DrawMap();
/* 初始化雷區 */
void InitMap();
/* 游戲開始時,載入用戶選擇的一幅雷圖 */
void LoadMap(int index);
/* 玩掃雷游戲 */
int Play();
/* 繪制主菜單 */
void DrawMainMenu();
/* 顯示結果 */
void ShowResult(int result);
/* 主函數 */
int main(int argc, char* argv[])
{
char ch;
int result;
srand(time(NULL)); /* 按當前時間初始化隨機數,這樣每次啟動的時候,雷的位置的不一樣 */
InitMap(); /* 初始化5張雷圖,供用戶選擇 */
while(1) /* 用while循環,保證只有在用戶選擇退出時,才退出遊戲 */
{
DrawMainMenu(); /* 繪制主菜單 */
flushall(); /* 清空所有輸入輸出緩沖區,主要是清空輸入緩沖區,防止前面的輸入對getch()的干擾 */
ch = getch(); /* 讀取輸入 */
switch(ch)
{
case '1': /* 用戶選擇1 */
printf("\n\t請輸入雷圖編號(1-5):");
while (1) /* 循環輸入,如果輸入錯誤就一直要求輸入 */
{
flushall();
ch = getch(); /* 讀取用戶輸入的雷圖編號 */
if (ch >= '1' && ch <= '5') /* 只有在1-5之間有效 */
{
LoadMap(ch-'1'); /* ch -'1',將用戶輸入轉換為雷圖下標(下標從0開始,所以是-'1')*/
break; /* 如果輸入正確,就退出循環輸入 */
}
else
{
/* 輸入錯誤,則提示重新輸入 */
printf("\n\t輸入無效!請重新輸入雷圖編號(1-5):");
flushall();
}
}
result = Play(); /* 開始玩掃雷游戲 */
ShowResult(result); /* 顯示游戲結果 */
break;
case '2': /* 用戶選擇2 */
exit(0); /* 直接退出 */
break;
default: /* 無效輸入 */
/* 不做任何操作,重新顯示主菜單 */
break;
}
}
return 0;
}
void LoadMap(int index)
{
int i,j;
nSpaceLeft = 90;
for(i=0;i<12;i++)
for(j=0;j<12;j++)
{
Map[i][j] = AllMaps[index][i][j]; /* 將5張雷圖中的下標為index的那一張載入到Map數組 */
MapShow[i][j] = 0; /* 重新開始游戲,所以所有格子都是「未翻開」狀態 */
}
}
void InitMap()
{
int i,j,k;
int m,n;
/* 要初始化5張地圖 */
for(k=0;k<5;k++)
{
/* 初始化地圖的邊界 */
for(i=0;i<12;i++)
{
/* 下標為0和11的位置都是「邊界」,這些位置不屬於雷區,僅在程序內部使用 */
AllMaps[k][0][i] = -3;
AllMaps[k][11][i] = -3;
AllMaps[k][i][0] = -3;
AllMaps[k][i][11] = -3;
}
/* 先初始化10個雷的位置 */
for(i=0;i<10;i++)
{
m = rand()%10 + 1; /* 隨機選一個X坐標 */
n = rand()%10 + 1; /* 隨機選一個Y坐標 */
if(AllMaps[k][m][n] == 0) /* 如果隨機產生的位置之前沒有被安排放置雷 */
{
AllMaps[k][m][n] = -1; /* 放置一個雷 */
}
else /* 隨機產生的位置在之前已經放置了雷了 */
{
i--; /* 這個位置無效,重新產生一個 */
}
}
/* 計算每個格子周圍雷的個數 */
for(i=1; i<11; i++)
for(j=1; j<11;j++)
{
if(AllMaps[k][i][j] != -1)
{
AllMaps[k][i][j] = 0;
/* 周圍的8個位置,有一個雷就加一 */
/************************************************************************/
/* 坐標[i][j]周圍的8個坐標位置: */
/* [i-1][j-1] [i-1][j] [i-1][j+1] */
/* [i][j-1] [i][j] [i][j+1] */
/* [i+1][j-1] [i+1][j] [i+1][j+1] */
/************************************************************************/
if(AllMaps[k][i-1][j-1] == -1)
AllMaps[k][i][j]++;
if(AllMaps[k][i-1][j] == -1)
AllMaps[k][i][j]++;
if(AllMaps[k][i-1][j+1] == -1)
AllMaps[k][i][j]++;
if(AllMaps[k][i][j-1] == -1)
AllMaps[k][i][j]++;
if(AllMaps[k][i][j+1] == -1)
AllMaps[k][i][j]++;
if(AllMaps[k][i+1][j-1] == -1)
AllMaps[k][i][j]++;
if(AllMaps[k][i+1][j] == -1)
AllMaps[k][i][j]++;
if(AllMaps[k][i+1][j+1] == -1)
AllMaps[k][i][j]++;
}
}
}
}
void DrawMap()
{
int i,j;
system("cls"); /* 清屏 */
/* 繪制坐標和邊框 */
printf("\n\n\n");
printf("\t Y ");
for(i=1; i<11; i++) printf("%-02d",i-1);
printf("\n\tX |###################|\n");
/* 每一行按規則繪制雷區 */
for(i=1; i<11; i++)
{
printf("\t%-02d|",i-1); /* 顯示X坐標 */
for(j=1; j<11; j++)
{
if(MapShow[i][j]) /* 如果該位置被用戶「挖開」了,就照實顯示 */
{
if (Map[i][j] >= 0) /* 非雷,顯示周圍雷的個數 */
{
printf("%d|",Map[i][j]);
}
/*else if(Map[i][j] == 0)
{
printf("0|");
}*/
else if (Map[i][j] == -1) /* 雷,顯示* */
{
printf("*|");
}
else if (Map[i][j] == -2) /* 用戶挖到的雷,顯示@ */
{
printf("@|");
}
else /* 其他情況(目前不會出現,方便以後擴展) */
{
printf(" |");
}
}
else /* 如果該位置沒有被用戶「挖開」,則顯示空格 */
{
printf(" |");
}
}
printf("\n");
}
printf("\t |###################|\n");
}
void DrawMainMenu()
{
system("cls");
printf("\n\n\n\n\n\n");
printf("\t|###################|\n");
printf("\t| 請選擇! |\n");
printf("\t| 1. 開始掃雷 |\n");
printf("\t| 2. 退出 |\n");
printf("\t|###################|\n");
}
int Play()
{
char chX,chY; /* 用戶輸入 */
int X,Y; /* 用戶輸入轉換為整數下標 */
int i,j;
while (1)
{
DrawMap(); /* 重新繪制雷區圖 */
/* 輸入X坐標 */
printf("\n\t請輸入X:");
flushall();
while(1)
{
chX = getch();
if (chX >= '0' && chX <= '9')
{
X = chX - '0' + 1;
break;
}
else
{
printf("\n\t輸入無效!請重新輸入X:");
flushall();
}
}
/* 輸入Y坐標 */
printf("\n\t請輸入Y:");
flushall();
while(1)
{
chY = getch();
if (chY >= '0' && chY <= '9')
{
Y = chY - '0' + 1;
break;
}
else
{
printf("\n\t輸入無效!請重新輸入Y:");
flushall();
}
}
if(MapShow[X][Y] == 0) /* 輸入的是未翻開的位置 */
{
MapShow[X][Y] = 1; /* 將該位置標記為「已翻開」 */
if(Map[X][Y] == -1) /* 如果挖到的是雷 */
{
Map[X][Y] = -2; /* 標記為-2,表示這是被用戶挖到的雷 */
for(i=1;i<11;i++)
for(j=1;j<11;j++)
MapShow[i][j]=1; /* 游戲結束,自動將所有位置「翻開」 */
/* 記錄用戶挖到雷的位置坐標 */
lastX = X-1;
lastY = Y-1;
return 0; /* 游戲失敗! */
}
else /* 如果挖到的不是雷 */
{
nSpaceLeft--; /* 剩餘空白數減一 */
if(nSpaceLeft==0) /* 剩餘空白數為0,則表示游戲成功 */
{
return 1; /* 游戲勝利! */
}
}
}
else /* 輸入的是已翻開的位置 */
{
printf("\n\t你輸入的位置是[%d,%d]\n\t這個位置已經翻開!請重新輸入!\n\t按任意鍵繼續...\n",X-1,Y-1);
flushall();
getch();
}
}
}
void ShowResult( int result )
{
DrawMap();
if(result == 1) /* 游戲成功 */
{
printf("\n\t恭喜!您完成的掃雷任務!\n\t按任意鍵繼續...");
flushall();
getch();
}
else /* 游戲失敗 */
{
printf("\n\t哈哈!您在位置[%d,%d]挖到雷了,任務失敗!\n\t按任意鍵繼續...",lastX, lastY);
flushall();
getch();
}
}
⑼ C語言掃雷怎麼實現
點擊(x,y)
{
如果(x,y)格子不存在,return
如果是炸彈,GG
如果已經翻開,return
如果周圍有雷,顯示雷數量,並標記翻開
否則
{
顯示空,並標記翻開
點擊(x-1,y-1)....點擊(x+1,y+1)共8個
}
}
基本思路是這樣