C語言 掃雷程序的實現。本站提示廣大學習愛好者:(C語言 掃雷程序的實現)文章只能為提供參考,不一定能成為您想要的結果。以下是C語言 掃雷程序的實現正文
C語言 掃雷程序的實現
這個游戲可以實現根據選擇坐標後所顯示無雷區范圍的不同分為簡單 ,普通和困難
游戲程序中,實現了游戲的計時(分鐘)功能,實現了掃雷游戲的最基礎功能。
定義了一個9*9的棋盤,玩家只要根據提示選擇游戲,和難度;
根據提示輸入 合法的坐標,如輸入不合法則會進行提示;
掃雷結束則會提示;如觸雷則游戲自動結束;
整個游戲設計中主要的函數為:
1、初始化地雷棋盤和顯示棋盤
2、棋盤打印函數
3、掃雷函數的實現
4、游戲主函數
大家可以在宏定義中改變棋盤大小,雷的個數,以及顯示的無雷區范圍。
廢話不說 直接上代碼:(未優化,請多包涵 )
<pre name="code" class="objc">#ifndef __MINE_H__
#define __MINE_H__
#define LINES 11 // 棋盤的行
#define ROWS 11 // 棋盤的列
#define mine_MAX 10 // 雷的數目
#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); //游戲基本實現函數
void init_mine(char mine[LINES][ROWS],char text[LINES][ROWS],int lines,int rows);// 初始化棋盤函數
void play_EAXY_game(char mine[LINES][ROWS],char text[LINES][ROWS]); // 簡單游戲函數
void play_COMMON_game(char mine[LINES][ROWS],char text[LINES][ROWS]) ; //普通游戲函數
void play_DIFFICULT_game(char mine[LINES][ROWS],char text[LINES][ROWS]) ; //困難游戲函數
void mine_EAXY_sweep(char mine[LINES][ROWS],char text[LINES][ROWS]); //簡單掃雷實現
void mine_COMMON_sweep(char mine[LINES][ROWS],char text[LINES][ROWS]); //普通掃雷實現
void mine_DIFFICULT_sweep(char mine[LINES][ROWS],char text[LINES][ROWS]) ; //困難掃雷實現
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)); //隨機產生兩個數
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]) //打印棋盤函數
{
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; // 雷的個數
do //是否將雷全部掃完
{
int i;
int j;
int x;
int y;
print(text);
print(mine);
flag: printf("請輸入坐標=》");
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; //周圍雷的數量
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; // 雷的個數
print(text);
print(mine);
flag: printf("請輸入坐標=》");
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; //周圍雷的數量
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 ; // 雷的個數
do //是否將雷全部掃完
{
int i;
int j;
int x;
int y;
count = 0;
print(text);
print(mine);
flag: printf("請輸入坐標=》");
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; //周圍雷的數量
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); //計時結束
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); //計時結束
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); //計時結束
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;
}
感謝閱讀,希望能幫助到大家,謝謝大家對本站的支持!