C語言 掃雷程序的實現(xiàn)
C語言 掃雷程序的實現(xiàn)
這個游戲可以實現(xiàn)根據(jù)選擇坐標(biāo)后所顯示無雷區(qū)范圍的不同分為簡單 ,普通和困難
游戲程序中,實現(xiàn)了游戲的計時(分鐘)功能,實現(xiàn)了掃雷游戲的最基礎(chǔ)功能。
定義了一個9*9的棋盤,玩家只要根據(jù)提示選擇游戲,和難度;
根據(jù)提示輸入 合法的坐標(biāo),如輸入不合法則會進行提示;
掃雷結(jié)束則會提示;如觸雷則游戲自動結(jié)束;
整個游戲設(shè)計中主要的函數(shù)為:
1、初始化地雷棋盤和顯示棋盤
2、棋盤打印函數(shù)
3、掃雷函數(shù)的實現(xiàn)
4、游戲主函數(shù)
大家可以在宏定義中改變棋盤大小,雷的個數(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); //游戲基本實現(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]); //簡單掃雷實現(xiàn)
void mine_COMMON_sweep(char mine[LINES][ROWS],char text[LINES][ROWS]); //普通掃雷實現(xiàn)
void mine_DIFFICULT_sweep(char mine[LINES][ROWS],char text[LINES][ROWS]) ; //困難掃雷實現(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)); //隨機產(chǎn)生兩個數(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]) //簡單整個游戲進程
{
int a;
int b;
int count = 0; // 雷的個數(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]) //普通整個游戲進程
{
int a;
int b;
int count;
do //是否將雷全部掃完
{
int i;
int j;
int x;
int y;
count = 0; // 雷的個數(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]) //困難整個游戲進程
{
int a;
int b;
int count ; // 雷的個數(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("計時開始??!\n");
t_start = time(NULL); //開始計時
mine_EAXY_sweep(mine,text);
t_end = time(NULL); //計時結(jié)束
printf("您所用時間為:%.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("計時開始?。n");
t_start = time(NULL); //開始計時
mine_COMMON_sweep(mine,text);
t_end = time(NULL); //計時結(jié)束
printf("您所用時間為:%.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("計時開始??!\n");
t_start = time(NULL); //開始計時
mine_DIFFICULT_sweep(mine,text);
t_end = time(NULL); //計時結(jié)束
printf("您所用時間為:%.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;
}
感謝閱讀,希望能幫助到大家,謝謝大家對本站的支持!
您可能感興趣的文章
- 04-02c語言函數(shù)調(diào)用后清空內(nèi)存 c語言調(diào)用函數(shù)刪除字符
- 04-02c語言的正則匹配函數(shù) c語言正則表達式函數(shù)庫
- 04-02func函數(shù)+在C語言 func函數(shù)在c語言中
- 04-02c語言中對數(shù)函數(shù)的表達式 c語言中對數(shù)怎么表達
- 04-02c語言用函數(shù)寫分段 用c語言表示分段函數(shù)
- 04-02c語言編寫函數(shù)冒泡排序 c語言冒泡排序法函數(shù)
- 04-02c語言沒有round函數(shù) round c語言
- 04-02c語言分段函數(shù)怎么求 用c語言求分段函數(shù)
- 04-02C語言中怎么打出三角函數(shù) c語言中怎么打出三角函數(shù)的值
- 04-02c語言調(diào)用函數(shù)求fibo C語言調(diào)用函數(shù)求階乘


閱讀排行
本欄相關(guān)
- 04-02c語言函數(shù)調(diào)用后清空內(nèi)存 c語言調(diào)用
- 04-02func函數(shù)+在C語言 func函數(shù)在c語言中
- 04-02c語言的正則匹配函數(shù) c語言正則表達
- 04-02c語言用函數(shù)寫分段 用c語言表示分段
- 04-02c語言中對數(shù)函數(shù)的表達式 c語言中對
- 04-02c語言編寫函數(shù)冒泡排序 c語言冒泡排
- 04-02c語言沒有round函數(shù) round c語言
- 04-02c語言分段函數(shù)怎么求 用c語言求分段
- 04-02C語言中怎么打出三角函數(shù) c語言中怎
- 04-02c語言調(diào)用函數(shù)求fibo C語言調(diào)用函數(shù)求
隨機閱讀
- 04-02jquery與jsp,用jquery
- 01-10SublimeText編譯C開發(fā)環(huán)境設(shè)置
- 01-11ajax實現(xiàn)頁面的局部加載
- 01-10delphi制作wav文件的方法
- 01-11Mac OSX 打開原生自帶讀寫NTFS功能(圖文
- 01-10C#中split用法實例總結(jié)
- 08-05DEDE織夢data目錄下的sessions文件夾有什
- 01-10使用C語言求解撲克牌的順子及n個骰子
- 08-05dedecms(織夢)副欄目數(shù)量限制代碼修改
- 08-05織夢dedecms什么時候用欄目交叉功能?


