C語(yǔ)言 掃雷程序的實(shí)現(xiàn)
C語(yǔ)言 掃雷程序的實(shí)現(xiàn)
這個(gè)游戲可以實(shí)現(xiàn)根據(jù)選擇坐標(biāo)后所顯示無(wú)雷區(qū)范圍的不同分為簡(jiǎn)單 ,普通和困難
游戲程序中,實(shí)現(xiàn)了游戲的計(jì)時(shí)(分鐘)功能,實(shí)現(xiàn)了掃雷游戲的最基礎(chǔ)功能。
定義了一個(gè)9*9的棋盤(pán),玩家只要根據(jù)提示選擇游戲,和難度;
根據(jù)提示輸入 合法的坐標(biāo),如輸入不合法則會(huì)進(jìn)行提示;
掃雷結(jié)束則會(huì)提示;如觸雷則游戲自動(dòng)結(jié)束;
整個(gè)游戲設(shè)計(jì)中主要的函數(shù)為:
1、初始化地雷棋盤(pán)和顯示棋盤(pán)
2、棋盤(pán)打印函數(shù)
3、掃雷函數(shù)的實(shí)現(xiàn)
4、游戲主函數(shù)
大家可以在宏定義中改變棋盤(pán)大小,雷的個(gè)數(shù),以及顯示的無(wú)雷區(qū)范圍。
廢話不說(shuō) 直接上代碼:(未優(yōu)化,請(qǐng)多包涵 )
<pre name="code" class="objc">#ifndef __MINE_H__
#define __MINE_H__
#define LINES 11 // 棋盤(pán)的行
#define ROWS 11 // 棋盤(pán)的列
#define mine_MAX 10 // 雷的數(shù)目
#define EAXY 3 // 簡(jiǎn)單顯示的范圍
#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);// 初始化棋盤(pán)函數(shù)
void play_EAXY_game(char mine[LINES][ROWS],char text[LINES][ROWS]); // 簡(jiǎn)單游戲函數(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]); //簡(jiǎn)單掃雷實(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]); //打印棋盤(pán)
#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) //初始化顯示棋盤(pán)和雷盤(pán)
{
int i;
int j;
int a;
int b;
int count=0;
for(i=1; i<LINES-1;i++) //初始化顯示棋盤(pán)
{
for(j=1; j<ROWS-1;j++)
{
text[i][j]='*';
}
}
for(i=1; i<LINES-1;i++) //初始化雷盤(pán)
{
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]) //打印棋盤(pán)函數(shù)
{
int i; //行
int j; //列
for(i=0;i<LINES-1;i++) //定義第一行的打印
{
printf("%d ",i);
}
printf("\n");
for(i=1; i<LINES-1;i++) //輸出棋盤(pán)
{
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]) //簡(jiǎn)單整個(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("請(qǐng)輸入坐標(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("請(qǐng)輸入坐標(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("請(qǐng)輸入坐標(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.簡(jiǎn)單 *******\n");
printf("****** 2.普通 *******\n");
printf("****** 3.困難 *******\n");
printf("*********************\n");
}
void play_EAXY_game(char mine[LINES][ROWS],char text[LINES][ROWS]) //玩簡(jiǎn)單游戲
{
time_t t_start,t_end;
printf("計(jì)時(shí)開(kāi)始?。n");
t_start = time(NULL); //開(kāi)始計(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í)開(kāi)始??!\n");
t_start = time(NULL); //開(kāi)始計(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í)開(kāi)始??!\n");
t_start = time(NULL); //開(kāi)始計(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}; //定義雷盤(pán)
char text[LINES][ROWS]={0}; //定義顯示盤(pán)
init_mine(mine,text,LINES,ROWS); //初始化雷盤(pán)
do
{
emun();
init_mine(mine,text,LINES,ROWS); //初始化雷盤(pán)
printf("請(qǐng)選擇=》");
scanf("%d",&input);
switch(input)
{
case PLAY:
{
emun_dift();
printf("請(qǐng)選擇=》");
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;
}
感謝閱讀,希望能幫助到大家,謝謝大家對(duì)本站的支持!
- 基于C語(yǔ)言實(shí)現(xiàn)的掃雷游戲代碼
- C語(yǔ)言開(kāi)發(fā)簡(jiǎn)易版掃雷小游戲
- C語(yǔ)言代碼實(shí)現(xiàn)掃雷游戲
- C語(yǔ)言快速實(shí)現(xiàn)掃雷小游戲
- C語(yǔ)言實(shí)現(xiàn)簡(jiǎn)單掃雷小游戲
- C語(yǔ)言實(shí)現(xiàn)掃雷小游戲(適合初學(xué)者)
- C語(yǔ)言代碼實(shí)現(xiàn)簡(jiǎn)單掃雷小游戲
- C語(yǔ)言實(shí)現(xiàn)簡(jiǎn)單掃雷小程序
- C語(yǔ)言實(shí)現(xiàn)掃雷附完整代碼
- C語(yǔ)言輕松實(shí)現(xiàn)掃雷小游戲
相關(guān)文章
C語(yǔ)言初學(xué)者代碼中的常見(jiàn)錯(cuò)誤與問(wèn)題
C語(yǔ)言初學(xué)者犯過(guò)的很多錯(cuò)誤都非常典型,在初學(xué)者中非常普遍,于是整理了一下,應(yīng)該對(duì)其他初學(xué)者有借鑒意義2013-11-11
探討register關(guān)鍵字在c語(yǔ)言和c++中的差異
建議不要用register關(guān)鍵字定義全局變量,因?yàn)槿肿兞康纳芷谑菑膱?zhí)行程序開(kāi)始,一直到程序結(jié)束才會(huì)終止,而register變量可能會(huì)存放在cpu的寄存器中,如果在程序的整個(gè)生命周期內(nèi)都占用著寄存器的話,這是個(gè)相當(dāng)不好的舉措2013-10-10
C語(yǔ)言scandir函數(shù)獲取文件夾內(nèi)容的實(shí)現(xiàn)
scandir?函數(shù)用于列舉指定目錄下的文件列表,本文主要介紹了C語(yǔ)言scandir函數(shù)獲取文件夾內(nèi)容的實(shí)現(xiàn),具有一定的參考價(jià)值,感興趣的可以了解一下2024-03-03
C++類與對(duì)象深入之靜態(tài)成員與友元及內(nèi)部類詳解
朋友們好,這篇播客我們繼續(xù)C++的初階學(xué)習(xí),現(xiàn)在對(duì)我們對(duì)C++的靜態(tài)成員,友元,內(nèi)部類知識(shí)點(diǎn)做出總結(jié),整理出來(lái)一篇博客供我們一起復(fù)習(xí)和學(xué)習(xí),如果文章中有理解不當(dāng)?shù)牡胤?還希望朋友們?cè)谠u(píng)論區(qū)指出,我們相互學(xué)習(xí),共同進(jìn)步2022-06-06

