C語言 掃雷程序的實(shí)現(xiàn)
C語言 掃雷程序的實(shí)現(xiàn)
這個(gè)游戲可以實(shí)現(xiàn)根據(jù)選擇坐標(biāo)后所顯示無雷區(qū)范圍的不同分為簡單 ,普通和困難
游戲程序中,實(shí)現(xiàn)了游戲的計(jì)時(shí)(分鐘)功能,實(shí)現(xiàn)了掃雷游戲的最基礎(chǔ)功能。
定義了一個(gè)9*9的棋盤,玩家只要根據(jù)提示選擇游戲,和難度;
根據(jù)提示輸入 合法的坐標(biāo),如輸入不合法則會進(jìn)行提示;
掃雷結(jié)束則會提示;如觸雷則游戲自動結(jié)束;
整個(gè)游戲設(shè)計(jì)中主要的函數(shù)為:
1、初始化地雷棋盤和顯示棋盤
2、棋盤打印函數(shù)
3、掃雷函數(shù)的實(shí)現(xiàn)
4、游戲主函數(shù)
大家可以在宏定義中改變棋盤大小,雷的個(gè)數(shù),以及顯示的無雷區(qū)范圍。
廢話不說 直接上代碼:(未優(yōu)化,請多包涵 )
<pre name="code" class="objc">#ifndef __MINE_H__ #define __MINE_H__ #define LINES 11 // 棋盤的行 #define ROWS 11 // 棋盤的列 #define mine_MAX 10 // 雷的數(shù)目 #define EAXY 3 // 簡單顯示的范圍 #define COMMON 2 // 普通顯示的范圍 #define DIFFICULT 1 // 困難顯示的范圍 enum op { EXIT, PLAY }; void game(char mine[LINES][ROWS],char text[LINES][ROWS],int lines,int rows); //游戲基本實(shí)現(xiàn)函數(shù) void init_mine(char mine[LINES][ROWS],char text[LINES][ROWS],int lines,int rows);// 初始化棋盤函數(shù) void play_EAXY_game(char mine[LINES][ROWS],char text[LINES][ROWS]); // 簡單游戲函數(shù) void play_COMMON_game(char mine[LINES][ROWS],char text[LINES][ROWS]) ; //普通游戲函數(shù) void play_DIFFICULT_game(char mine[LINES][ROWS],char text[LINES][ROWS]) ; //困難游戲函數(shù) void mine_EAXY_sweep(char mine[LINES][ROWS],char text[LINES][ROWS]); //簡單掃雷實(shí)現(xiàn) void mine_COMMON_sweep(char mine[LINES][ROWS],char text[LINES][ROWS]); //普通掃雷實(shí)現(xiàn) void mine_DIFFICULT_sweep(char mine[LINES][ROWS],char text[LINES][ROWS]) ; //困難掃雷實(shí)現(xiàn) void print(char tab[LINES][ROWS]); //打印棋盤 #endif
#include<stdio.h> #include"mine.h" #include<stdlib.h> #include<time.h> void init_mine(char mine[LINES][ROWS],char text[LINES][ROWS],int lines,int rows) //初始化顯示棋盤和雷盤 { int i; int j; int a; int b; int count=0; for(i=1; i<LINES-1;i++) //初始化顯示棋盤 { for(j=1; j<ROWS-1;j++) { text[i][j]='*'; } } for(i=1; i<LINES-1;i++) //初始化雷盤 { for(j=1; j<ROWS-1;j++) { mine[i][j]='1'; } } srand((unsigned)time(NULL)); //隨機(jī)產(chǎn)生兩個(gè)數(shù) while(count<mine_MAX) { a = rand()%9 + 1; b = rand()%9 + 1; if(mine[a][b]!='0') { mine[a][b]='0'; //定義雷為字符 0 count++; } } } void print(char tab[LINES][ROWS]) //打印棋盤函數(shù) { int i; //行 int j; //列 for(i=0;i<LINES-1;i++) //定義第一行的打印 { printf("%d ",i); } printf("\n"); for(i=1; i<LINES-1;i++) //輸出棋盤 { printf("%d",i); printf("%c",'|'); for(j=1; j<ROWS;j++) { printf("%c ",tab[i][j]); } printf("\n"); } } void mine_EAXY_sweep(char mine[LINES][ROWS],char text[LINES][ROWS]) //簡單整個(gè)游戲進(jìn)程 { int a; int b; int count = 0; // 雷的個(gè)數(shù) do //是否將雷全部掃完 { int i; int j; int x; int y; print(text); print(mine); flag: printf("請輸入坐標(biāo)=》"); scanf("%d %d",&a,&b); if(a>(LINES-2) || a<0 || b<0 || b>(ROWS-2) || text[a][b]!='*') { printf("輸入不合法!\n"); goto flag; } else if(mine[a][b]=='0') //判斷是否觸雷 { printf("您踩雷了!\n"); break; } else { for(i=(a-EAXY);i<=(a+EAXY);i++) { for(j=(b-EAXY);j<=(b+EAXY);j++) { if(mine[i][j]=='1') { int x=0; //周圍雷的數(shù)量 if(mine[i-1][j-1]=='0') { x++; } if(mine[i-1][j]=='0') { x++; } if(mine[i-1][j+1]=='0') { x++; } if(mine[i][j-1]=='0') { x++; } if(mine[i][j+1]=='0') { x++; } if(mine[i+1][j-1]=='0') { x++; } if(mine[i+1][j]=='0') { x++; } if(mine[i+1][j+1]=='0') { x++; } text[i][j]=(x+'0'); } } } } for(x=1;x<=(LINES-2);x++) { for(y=1;y<=(ROWS-2);y++) { if(text[x][y]=='*') count++; } } }while(count>mine_MAX); if(count==mine_MAX) { printf("恭喜你 掃雷成功!\n"); } } void mine_COMMON_sweep(char mine[LINES][ROWS],char text[LINES][ROWS]) //普通整個(gè)游戲進(jìn)程 { int a; int b; int count; do //是否將雷全部掃完 { int i; int j; int x; int y; count = 0; // 雷的個(gè)數(shù) print(text); print(mine); flag: printf("請輸入坐標(biāo)=》"); scanf("%d %d",&a,&b); if(a>(LINES-2) || a<0 || b<0 || b>(ROWS-2) || text[a][b]!='*') { printf("輸入不合法!\n"); goto flag; } else if(mine[a][b]=='0') //判斷是否觸雷 { printf("您踩雷了!\n"); break; } else { for(i=(a-COMMON);i<=(a+COMMON);i++) { for(j=(b-COMMON);j<=(b+COMMON);j++) { if(mine[i][j]=='1') { int x=0; //周圍雷的數(shù)量 if(mine[i-1][j-1]=='0') { x++; } if(mine[i-1][j]=='0') { x++; } if(mine[i-1][j+1]=='0') { x++; } if(mine[i][j-1]=='0') { x++; } if(mine[i][j+1]=='0') { x++; } if(mine[i+1][j-1]=='0') { x++; } if(mine[i+1][j]=='0') { x++; } if(mine[i+1][j+1]=='0') { x++; } text[i][j]=(x+'0'); } } } print(text); } for(x=1;x<=(LINES-2);x++) { for(y=1;y<=(ROWS-2);y++) { if(text[x][y]=='*') count++; } } }while(count>mine_MAX); if(count==mine_MAX) { printf("恭喜你 掃雷成功!\n"); } } void mine_DIFFICULT_sweep(char mine[LINES][ROWS],char text[LINES][ROWS]) //困難整個(gè)游戲進(jìn)程 { int a; int b; int count ; // 雷的個(gè)數(shù) do //是否將雷全部掃完 { int i; int j; int x; int y; count = 0; print(text); print(mine); flag: printf("請輸入坐標(biāo)=》"); scanf("%d %d",&a,&b); if(a>(LINES-2) || a<0 || b<0 || b>(ROWS-2) || text[a][b]!='*') { printf("輸入不合法!\n"); goto flag; } else if(mine[a][b]=='0') //判斷是否觸雷 { printf("您踩雷了!\n"); break; } else { for(i=(a-DIFFICULT);i<=(a+DIFFICULT);i++) { for(j=(b-DIFFICULT);j<=(b+DIFFICULT);j++) { if(mine[i][j]=='1') { int x=0; //周圍雷的數(shù)量 if(mine[i-1][j-1]=='0') { x++; } if(mine[i-1][j]=='0') { x++; } if(mine[i-1][j+1]=='0') { x++; } if(mine[i][j-1]=='0') { x++; } if(mine[i][j+1]=='0') { x++; } if(mine[i+1][j-1]=='0') { x++; } if(mine[i+1][j]=='0') { x++; } if(mine[i+1][j+1]=='0') { x++; } text[i][j]=(x+'0'); } } } print(text); } for(x=1;x<=(LINES-2);x++) { for(y=1;y<=(ROWS-2);y++) { if(text[x][y]=='*') count++; } } }while(count>mine_MAX); if(count==mine_MAX) { printf("恭喜你 掃雷成功!\n"); } }
#include<stdio.h> #include"mine.h" #include<time.h> void emun() { printf("***********************\n"); printf("******* 1.play ******\n"); printf("******** 0.exit ******\n"); printf("***********************\n"); } void emun_dift() //選擇難度菜單 { printf("*********************\n"); printf("****** 1.簡單 *******\n"); printf("****** 2.普通 *******\n"); printf("****** 3.困難 *******\n"); printf("*********************\n"); } void play_EAXY_game(char mine[LINES][ROWS],char text[LINES][ROWS]) //玩簡單游戲 { time_t t_start,t_end; printf("計(jì)時(shí)開始??!\n"); t_start = time(NULL); //開始計(jì)時(shí) mine_EAXY_sweep(mine,text); t_end = time(NULL); //計(jì)時(shí)結(jié)束 printf("您所用時(shí)間為:%.0f \n",difftime(t_end,t_start)); } void play_COMMON_game(char mine[LINES][ROWS],char text[LINES][ROWS]) //玩普通游戲 { time_t t_start,t_end; printf("計(jì)時(shí)開始!!\n"); t_start = time(NULL); //開始計(jì)時(shí) mine_COMMON_sweep(mine,text); t_end = time(NULL); //計(jì)時(shí)結(jié)束 printf("您所用時(shí)間為:%.0f \n",difftime(t_end,t_start)); } void play_DIFFICULT_game(char mine[LINES][ROWS],char text[LINES][ROWS]) //玩困難游戲 { time_t t_start,t_end; printf("計(jì)時(shí)開始!!\n"); t_start = time(NULL); //開始計(jì)時(shí) mine_DIFFICULT_sweep(mine,text); t_end = time(NULL); //計(jì)時(shí)結(jié)束 printf("您所用時(shí)間為:%.0f \n",difftime(t_end,t_start)); } void game() { int input = 0; int flout = 0; char mine[LINES][ROWS]={0}; //定義雷盤 char text[LINES][ROWS]={0}; //定義顯示盤 init_mine(mine,text,LINES,ROWS); //初始化雷盤 do { emun(); init_mine(mine,text,LINES,ROWS); //初始化雷盤 printf("請選擇=》"); scanf("%d",&input); switch(input) { case PLAY: { emun_dift(); printf("請選擇=》"); scanf("%d",&flout); switch(flout) { case 1: play_EAXY_game(mine,text); break; case 2: play_COMMON_game(mine,text); break; case 3: play_DIFFICULT_game(mine,text); break; } } break; case EXIT: break; } }while(input); } int main() { game(); return 0; }
感謝閱讀,希望能幫助到大家,謝謝大家對本站的支持!
相關(guān)文章
探討register關(guān)鍵字在c語言和c++中的差異
建議不要用register關(guān)鍵字定義全局變量,因?yàn)槿肿兞康纳芷谑菑膱?zhí)行程序開始,一直到程序結(jié)束才會終止,而register變量可能會存放在cpu的寄存器中,如果在程序的整個(gè)生命周期內(nèi)都占用著寄存器的話,這是個(gè)相當(dāng)不好的舉措2013-10-10C語言scandir函數(shù)獲取文件夾內(nèi)容的實(shí)現(xiàn)
scandir?函數(shù)用于列舉指定目錄下的文件列表,本文主要介紹了C語言scandir函數(shù)獲取文件夾內(nèi)容的實(shí)現(xiàn),具有一定的參考價(jià)值,感興趣的可以了解一下2024-03-03C++類與對象深入之靜態(tài)成員與友元及內(nèi)部類詳解
朋友們好,這篇播客我們繼續(xù)C++的初階學(xué)習(xí),現(xiàn)在對我們對C++的靜態(tài)成員,友元,內(nèi)部類知識點(diǎn)做出總結(jié),整理出來一篇博客供我們一起復(fù)習(xí)和學(xué)習(xí),如果文章中有理解不當(dāng)?shù)牡胤?還希望朋友們在評論區(qū)指出,我們相互學(xué)習(xí),共同進(jìn)步2022-06-06