C語言掃雷排雷小游戲?qū)崿F(xiàn)全程_第1頁
C語言掃雷排雷小游戲?qū)崿F(xiàn)全程_第2頁
C語言掃雷排雷小游戲?qū)崿F(xiàn)全程_第3頁
C語言掃雷排雷小游戲?qū)崿F(xiàn)全程_第4頁
C語言掃雷排雷小游戲?qū)崿F(xiàn)全程_第5頁
已閱讀5頁,還剩8頁未讀 繼續(xù)免費閱讀

下載本文檔

版權說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權,請進行舉報或認領

文檔簡介

第C語言掃雷排雷小游戲?qū)崿F(xiàn)全程目錄test.cgame.hgame.c詳解游戲代碼的實現(xiàn)1初化掃雷區(qū)2打印掃雷區(qū)3設置雷4排雷4.1展開一片的功能4.2雷標記功能的實現(xiàn)游戲過程

test.c

在這個文件中,我們主要是完成游戲邏輯的測試,在這里我們要注意的點,我們建立了二個數(shù)組,mine數(shù)組我們用來存放布置雷的信息,show數(shù)組存放排查出雷的信息。本次排雷區(qū)域是9*9的格子,為了防止數(shù)組出現(xiàn)越界,我們特意把數(shù)組的下標定義大點變?yōu)?1*11。

#define_CRT_SECURE_NO_WARNINGS

#include"game.h"

voidgame()

charmine[ROWS][COLS]={0};//存放布置雷的信息

charshow[ROWS][COLS]={0};//存放排查出雷的信息

//初始化棋盤

InitBoard(mine,ROWS,COLS,'0');

InitBoard(show,ROWS,COLS,'*');

//打印棋盤

DisplayBoard(show,ROW,COL);

//設置雷

SetMine(mine,ROW,COL);

//找雷

/*DisplayBoard(mine,ROW,COL);*///開局顯示雷的位置

FindMine(mine,show,ROW,COL);

voidmenu()

printf("*************************\n");

printf("******1.play*****\n");

printf("******0.exit*****\n");

printf("*************************\n");

intmain()

srand((unsignedint)time(NULL));

intinput=0;

menu();

printf("請選擇:");

scanf("%d",input);

switch(input)

case1:

game();

break;

case0:

printf("退出游戲\n");

break;

default:

printf("選擇錯誤,請重新選擇:\n");

}while(input);

return0;

}

game.h

這個文件,我們用來實現(xiàn)游戲所用頭文件的包含,游戲常量的定義,函數(shù)的聲明。

#define_CRT_SECURE_NO_WARNINGS

#includestdio.h

#includetime.h

#includestdlib.h

//定義棋盤數(shù)

#defineROW9

#defineCOL9

#defineROWSROW+2

#defineCOLSCOL+2

//定義雷數(shù)

#defineEASY_COUNT10

//函數(shù)的聲明

voidInitBoard(charboard[ROWS][COLS],introws,intcols,charset);

voidDisplayBoard(charboard[ROWS][COLS],introw,intcol);

voidSetMine(charmine[ROWS][COLS],introw,intcol);

voidFindMine(charmine[ROWS][COLS],charshow[ROWS][COLS],introw,intcol);

voidUnfoldMine(charmine[ROWS][COLS],charshow[ROWS][COLS],intx,inty,introw,intcol,int*win);

game.c

在這里,我們實現(xiàn)掃雷游戲的整體過程,我們可以分為:初化掃雷區(qū),打印掃雷區(qū),設置雷和排雷。

#define_CRT_SECURE_NO_WARNINGS

#include"game.h"

//初化掃雷區(qū)

voidInitBoard(charboard[ROWS][COLS],introws,intcols,charset)

inti=0;

intj=0;

for(i=0;irows;i++)

for(j=0;jcols;j++)

board[i][j]=set;

//打印掃雷區(qū)

voidDisplayBoard(charboard[ROWS][COLS],introw,intcol)

inti=0;

intj=0;

printf("--------掃雷游戲--------\n");

//打印列提示數(shù)

for(j=0;j=col;j++)

printf("%d",j);

printf("\n");

for(i=1;i=row;i++)

printf("%d",i);//打印行提示數(shù)

for(j=1;j=col;j++)

printf("%c",board[i][j]);

printf("\n");

printf("---------掃雷游戲-------\n");

//設置雷

voidSetMine(charmine[ROWS][COLS],introw,intcol)

intcount=EASY_COUNT;

while(count)

intx=rand()%row+1;//生成0~9之間的數(shù)

inty=rand()%col+1;//生成0~9之間的數(shù)

if(mine[x][y]=='0')

mine[x][y]='1';

count--;

//返回周圍雷的個數(shù)

intget_mine_count(charboard[ROWS][COLS],intx,inty)

return(

board[x-1][y]+

board[x+1][y]+

board[x-1][y-1]+

board[x][y-1]+

board[x+1][y-1]+

board[x-1][y+1]+

board[x][y+1]+

board[x+1][y+1]-8*'0');

//展開一片沒有雷的地區(qū),用遞歸實現(xiàn)

//遞歸結(jié)束的條件:

//1該坐標不是雷

//2該坐標不是空格(防止死遞歸)

voidUnfoldMine(charmine[ROWS][COLS],charshow[ROWS][COLS],intx,inty,introw,intcol,int*win)

if((show[x][y]!=''mine[x][y]!='1')||(show[x][y])=='#')

intcount=get_mine_count(mine,x,y);

if(count==0)

show[x][y]='';//無雷設置為空格

(*win)--;//無雷的位置減1

inti=0;

intj=0;

for(i=-1;ii++)

for(j=-1;jj++)

UnfoldMine(mine,show,x+i,y+j,row,col,win);

//不符合遞歸的條件

else

show[x][y]=count+'0';

(*win)--;

voidFindMine(charmine[ROWS][COLS],charshow[ROWS][COLS],introw,intcol)

intx=0;

inty=0;

intm=0;//標記的橫坐標

intn=0;//標記的縱坐標

intsign=0;//標記的選擇

intwin=ROW*COL-EASY_COUNT;//找到不是雷的次數(shù)

while(win)

printf("請選擇是否要標記雷:0/1\n");

scanf("%d",sign);

switch(sign)

case1:

printf("請輸入要標記的坐標:

again:

scanf("%d%d",m,

if(show[m][n]=='*')

show[m][n]='#';//用'#'標記雷

DisplayBoard(show,ROW,COL);//展示標記

else

printf("該位置不需要標記,請重新選擇:\n");

gotoagain;

break;

case0:

break;

default:

printf("選擇錯誤,請重新選擇:

break;

}while(sign);

printf("\n");

printf("請選擇要排查雷的坐標:

scanf("%d%d",x,

if(x=1x=rowy=1y=col)

if((show[x][y]!='*')(show[x][y]!='#'))

printf("該坐標以前被排查過了,請重新選擇\n");

else

if(mine[x][y]=='1')

printf("很遺憾,你被炸死了\n");

DisplayBoard(mine,ROW,COL);//打印雷區(qū)

break;

else

UnfoldMine(mine,show,x,y,ROW,COL,win);//注意這里要傳win的地址,讓形參和實參建立聯(lián)系

DisplayBoard(show,ROW,COL);//展示棋盤

else

printf("選擇坐標違規(guī),請重新選擇:\n");

if(win==0)//判斷位置是否都找完

printf("恭喜你,排雷成功\n");

DisplayBoard(mine,ROW,COL);//顯示埋雷的棋盤

}

詳解游戲代碼的實現(xiàn)

1初化掃雷區(qū)

這里我們規(guī)定:

無雷我們用0表示;

初始界面用*表示;

為了解決二個數(shù)組的初始化問題,我們將數(shù)組mine和數(shù)組show要初始化的內(nèi)容直接傳過來,我們用set接收.

/初化掃雷區(qū)

voidInitBoard(charboard[ROWS][COLS],introws,intcols,charset)

inti=0;

intj=0;

for(i=0;irows;i++)

for(j=0;jcols;j++)

board[i][j]=set;

}

2打印掃雷區(qū)

這部分主要實現(xiàn)的功能是為了我們能夠打印出現(xiàn)掃雷游戲的界面

//打印掃雷區(qū)

voidDisplayBoard(charboard[ROWS][COLS],introw,intcol)

inti=0;

intj=0;

printf("--------掃雷游戲--------\n");

//打印列提示數(shù)

for(j=0;j=col;j++)

printf("%d",j);

printf("\n");

for(i=1;i=row;i++)

printf("%d",i);//打印行提示數(shù)

for(j=1;j=col;j++)

printf("%c",board[i][j]);

printf("\n");

printf("---------掃雷游戲-------\n");

}

3設置雷

這里我們用字符1來表示雷,這里我們?nèi)匀挥玫搅穗S機數(shù)生成rand與設置隨機數(shù)的種子srand

//設置雷

voidSetMine(charmine[ROWS][COLS],introw,intcol)

intcount=EASY_COUNT;

while(count)

intx=rand()%row+1;//生成0~9之間的數(shù)

inty=rand()%col+1;//生成0~9之間的數(shù)

if(mine[x][y]=='0')

mine[x][y]='1';

count--;

}

4排雷

為了實現(xiàn)排雷的功能,我們在排雷過程中根據(jù)自己推斷,就知道那個位置有雷,所有我們要標記,在這里我們規(guī)定用#來標記,有時候在我們輸入坐標附近都是沒有雷的,為了提高游戲的體驗,我們可以把這片區(qū)域都展開。

4.1展開一片的功能

這里為了實現(xiàn)展開一片的功能,我們需要用遞歸來進行實現(xiàn)。這里我們繼續(xù)用在之前博客和大家分享的寫遞歸的思路

明確你的函數(shù)要實現(xiàn)什么功能

這里我們就是為了實現(xiàn)當x和y坐標附近周圍沒有雷的時候就用空格展示

尋找遞歸結(jié)束的條件:

1該坐標不是雷

2該坐標周圍沒有雷

3該坐標沒有被排查過

if((show[x][y]!=mine[x][y]!=1)||(show[x][y])==#)

找出函數(shù)的等價條件

這里我們?yōu)榱藢ふ襵和y周圍是否有雷,我們可以用二層循環(huán)遍歷周圍是否存在遞歸結(jié)束的條件,沒有我們就繼續(xù)尋找,函數(shù)的等價為UnfoldMine(mine,show,x+i,y+j,row,col,win)。

/展開一片沒有雷的地區(qū),用遞歸實現(xiàn)

//遞歸結(jié)束的條件:

//1該坐標不是雷

//2該坐標不是空格(防止死遞歸)

voidUnfoldMine(charmine[ROWS][COLS],charshow[ROWS][COLS],intx,inty,introw,intcol,int*win)

if((show[x][y]!=''mine[x][y]!='1')||(show[x][y])=='#')

intcount=get_mine_count(mine,x,y);

if(count==0)

show[x][y]='';//無雷設置為空格

(*win)--;//無雷的位置減1

inti=0;

intj=0;

for(i=-1;ii++)

for(j=-1;jj++)

UnfoldMine(mine,show,x+i,y+j,row,col,win);

//不符合遞歸的條件

else

show[x][y]=count+'0';

(*win)--;

}

4.2雷標記功能的實現(xiàn)

這里我們猜出雷的位置,就可以用#標記,但我們要注意,標記的地方show[x][y]==*應該要滿足這個條件。

//排雷

voidFindMine(charmine[ROWS][COLS],charshow[ROWS][COLS],introw,intcol)

intx=0;

inty=0;

intm=0;//標記的橫坐標

intn=0;//標記的縱坐標

intsign=0;//標記的選擇

intwin=ROW*COL-EASY_COUNT;//找到不是雷的次數(shù)

while(win)

printf("請選擇是否要標記雷:0/1\n");

scanf("%d",sign);

switch(sign)

case1:

printf("請輸入要標記的坐標:

again:

scanf("%d%d",m,

if(show[m][n]=='*')

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
  • 4. 未經(jīng)權益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責。
  • 6. 下載文件中如有侵權或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論