最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

C語言遞歸應(yīng)用實(shí)現(xiàn)掃雷游戲

 更新時(shí)間:2022年06月07日 15:27:09   作者:橘澤  
這篇文章主要為大家詳細(xì)介紹了C語言遞歸應(yīng)用實(shí)現(xiàn)掃雷游戲,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下

本文實(shí)例為大家分享了C語言遞歸應(yīng)用實(shí)現(xiàn)掃雷游戲的具體代碼,供大家參考,具體內(nèi)容如下

游戲設(shè)計(jì)規(guī)則:

  • 菜單  
  • 兩個(gè)棋盤,Mine一個(gè)布置雷,Show一個(gè)給玩家看,玩家選擇show里的坐標(biāo)翻開雷陣,在mine里的相同坐標(biāo)如果是雷則玩家失敗游戲結(jié)束,若不是雷則判斷此坐標(biāo)周圍8個(gè)坐標(biāo)是否有雷,有雷則顯示周圍總雷數(shù),沒有就顯示為空格。為了避免判斷雷陣最外邊一圈坐標(biāo)時(shí)出現(xiàn)溢出,因此設(shè)置雷陣數(shù)組時(shí)行(列)比打印出的要多兩行(列),布置雷時(shí)也不在最外面一圈布雷。
  • 第一步如果踩雷則將mine中所選坐標(biāo)位置換為安全,并重新布置雷位,確保玩家第一次不會踩雷。
  • 雷區(qū)沒有雷時(shí)的展開操作:當(dāng)所以選位置周圍8個(gè)坐標(biāo)均無雷時(shí),則分別判斷坐標(biāo)周圍8個(gè)坐標(biāo)的周圍8個(gè)坐標(biāo)是否有雷(沒寫錯(cuò),請仔細(xì)思考理解。。),有雷則在該座標(biāo)處顯示雷數(shù),并不再進(jìn)行下一坐標(biāo)的判斷,若沒有則顯示空格,并繼續(xù)進(jìn)行下一次判斷。

函數(shù)模塊及講解

test.c文件主要內(nèi)容及功能講解

#include"game.h"

int main()
{
? ? ? srand((unsigned int)time(NULL)); ??
? ? ? int x = 0;
?? ? ??
? ? ? while (1) ? ? ?
? ? ? {
?? ? ?menu();//菜單
?? ? ?printf("請選擇:>");
?? ? ?scanf("%d", &x);
?? ? ?if (x == 1)
?? ? ?{
?? ? ? ? ?char mine[ROWS][COLS] = { 0 };//布置雷的棋盤
?? ? ? ? ?char show[ROWS][COLS] = { 0 };//查找雷的棋盤
?? ? ? ? ?//初始化
?? ? ? ? ?setboard(mine, ROWS, COLS, '0');//設(shè)置雷的棋盤初始化
?? ? ? ? ?setboard(show, ROWS, COLS, '*');//設(shè)置排查的棋盤初始化
?? ? ? ? ?//打印
?? ? ? ? ?displayboard(show, ROW, COL);//打印排查的棋盤9 ?
?? ? ? ? ?//布雷
?? ? ? ? ?putmine(mine, ROW, COL);// ?
? ??? ? ? ? ?//displayboard(mine, ROW, COL);//打印用來方便測試
??? ? ? ? ?//排雷
?? ? ? ? ?findmine(mine,show, ROW, COL);
?? ? ?}
?? ? ?else if (x == 0)
?? ? ?{
?? ??? ? ? printf("退出游戲!\n");
?? ??? ? ? break;
?? ? ?}
?? ? ?else
?? ? ?{
?? ??? ? ? printf("輸入錯(cuò)誤,請重新輸入!\n");//處理非法輸入
?? ? ?}
? ? ? }
?system("pause");
?return 0;
}

game.c文件主要內(nèi)容及功能講解

#include"game.h"

void menu()//菜單
{
?printf("*****************************\n");
?printf("**** ? 1.play ? 0.exit ? ****\n");
?printf("*****************************\n");
}

void setboard(char board[ROWS][COLS], int rows, int cols, char n)//初始化,mine初始化為0,show初始化為*
{
?int x = 0;
?int y = 0;
?int a = 0;
?for (x = 0; x < rows; x++)
?{
? for (y = 0; y < cols; y++)
? {
? ?board[x][y] = n;
? }
?}
}

void displayboard(char board[ROWS][COLS], int rows, int cols)//打印棋盤
{
?int x = 0;
?int y = 0;
?for (x = 0; x <= cols; x++)
?{
? printf("%d ", x);//打印列的序號
?}
?printf("\n");
?for (x = 1; x <= rows; x++)
?{
? printf("%d ", x);//打印行的序號
? for (y = 1; y <= cols; y++)
? {
? ?printf("%c ", board[x][y]);
? }
? printf("\n");
?}
?printf("\n");
}

//布雷,使用rand產(chǎn)生隨機(jī)值,srand調(diào)用在主函數(shù)里
void putmine(char mine[ROWS][COLS], int rows, int cols)
{
?int x = 0;
?int y = 0;
?int count = low;
?while (count)
?{
? x = rand() % ROW + 1;
? y = rand() % COL + 1;
? if (mine[x][y] == '0')
? {
? ?mine[x][y] = '1';
? ?count--;
? }
?}
}


//計(jì)算盤中還有多少個(gè)*,
//后面用來和雷數(shù)比較判斷,
//當(dāng)*等于雷數(shù)時(shí)排雷成功
int number(char show[ROWS][COLS])
{
?int count = 0;
?int x = 0;
?int y = 0;
?for (x = 1; x <= ROW; x++)
?{
? for (y = 1; y <= COL; y++)
? {
? ?if (show[x][y] == '*')
? ? count++;
? }
?}
?return count;
}


void findmine(char mine[ROWS][COLS], char show[ROWS][COLS], int rows, int cols)
{
?int x = 0;
?int y = 0;
?while (number(show) != low)
?{
? printf("請輸入查找坐標(biāo):>");
? scanf("%d%d", &x, &y);
? if (x > 0 && x <= rows && y > 0 && y <= cols && show[x][y] != ' ')//注意判斷坐標(biāo)合法性
? {
? ?if (mine[x][y] == '1')
? ?{
? ? if (number(show) == ROW * COL)//第一步踩雷時(shí)要替換雷位保證玩家不會first blood
? ? {
? ? ?firstsafe(mine, x, y);
? ? ?//displayboard(mine, ROW, COL);//用來打印方便測試?yán)孜挥袥]有被替換
? ? ?goto first;//替換之后繼續(xù)判斷該坐標(biāo),轉(zhuǎn)到first
? ? }
? ? printf("YOU LOSE!GAME OVER!\n");//當(dāng)玩家不是第一步踩雷時(shí)就輸了
? ? printf("\n");
? ? displayboard(mine, ROW, COL);//打印雷盤讓玩家看到自己踩得是不是雷
? ? break;
? ?}
? ?else
? ?{
? ? first:
? ? recfindmine(mine, show, x, y);//展開程序
? ? displayboard(show, ROW, COL);
? ? //displayboard(mine, ROW, COL);//方便測試
? ?}
? }
? else
? {
? ?printf("坐標(biāo)錯(cuò)誤,請重新輸入!\n");
? }
?}
?if (number(show) == low)//當(dāng)*等于雷數(shù)時(shí)排雷成功
?{
? printf("YOU WIN!\n");
? displayboard(mine, ROW, COL);
?}
}

//算一個(gè)坐標(biāo)周圍8個(gè)有沒有雷
//mine盤里放的是字符'0'和'1',
//函數(shù)返回是整型值,
//'1'-'0'=1;
int minenum(char mine[ROWS][COLS], int x, int y)
{
?return mine[x - 1][y] +
? mine[x - 1][y - 1] +
? mine[x][y - 1] +
? mine[x + 1][y - 1] +
? mine[x + 1][y] +
? mine[x + 1][y + 1] +
? mine[x][y + 1] +
? mine[x - 1][y + 1] - 8 * '0';
}


//本來寫的時(shí)候?qū)懙牟檎抑車?個(gè)坐標(biāo),結(jié)果后來發(fā)現(xiàn)找周圍4個(gè)也是一樣的
//用遞歸來進(jìn)行判斷
//目前這個(gè)函數(shù)還有bug,展開有時(shí)候遇到周圍有雷的時(shí)候不會停,會繼續(xù)判斷
//導(dǎo)致展開不是連續(xù)的,就像掃雷開掛了。。但是基本的展開功能還是能夠?qū)崿F(xiàn)的
//希望看出來的大佬給指點(diǎn)一下,謝謝;
void recfindmine(char mine[ROWS][COLS], char show[ROWS][COLS], int x, int y)
{
?int i = minenum(mine, x, y);
?if (show[x][y] == '*' && i == 0)
?{
? show[x][y] = ' ';
? if (show[x - 1][y] == '*' && (x - 1) > 0 && y > 0)//上
? {
? ?recfindmine(mine, show, x-1, y);
? }
? //if ((x - 1) > 0 && (y - 1) > 0 && show[x - 1][y - 1] == '*')//左上
? //{
? // recfindmine(mine, show, x-1, y-1);
? //}
? //if ((x - 1) > 0 && (y + 1) > 0 && show[x - 1][y + 1] == '*')//右上
? //{
? // recfindmine(mine, show, x-1, y+1);
? //}
? if (show[x + 1][y] == '*' && (x + 1) > 0 && y > 0)//下
? {
? ?recfindmine(mine, show, x+1, y);
? }
? //if ((x + 1) > 0 && (y - 1) > 0 && show[x + 1][y - 1] == '*')//左下
? //{
? // recfindmine(mine, show, x+1, y-1);
? //}
? //if ((x + 1) > 0 && (y + 1) > 0 && show[x + 1][y + 1] == '*')//右下
? //{
? // recfindmine(mine, show, x+1, y+1);
? //}
? if (show[x][y + 1] == '*' && x > 0 && (y + 1) > 0)//右
? {
? ?recfindmine(mine, show, x, y+1);
? }
? if (show[x][y - 1] == '*' && x > 0 && (y - 1) > 0)//左
? {
? ?recfindmine(mine, show, x, y-1);
? }
?}
?else?
?{
? show[x][y] = i + '0';
?}
}

//保證第一步不死,把第一步的雷替換成0,再隨機(jī)生成一個(gè)不是雷的坐標(biāo)改成雷
void firstsafe(char mine[ROWS][COLS], int x, int y)
{
?mine[x][y] = '0';
?while (1)
?{
? int a = 0;
? int b = 0;
? a = rand() % ROW + 1;
? b = rand() % COL + 1;
? if (mine[a][b] == '0')
? {
? ?mine[a][b] = '1';
? ?break;
? }
?}
}

game.h文件主要內(nèi)容及功能講解

#include<stdlib.h>
#include<stdio.h>
#include<time.h>

#define ROWS 11
#define COLS 11
#define ROW 9
#define COL 9
#define low 10

void menu();
void setboard(char board[ROWS][COLS], int rows, int cols,char n);
void displayboard(char board[ROWS][COLS], int rows, int cols);
void putmine(char mine[ROWS][COLS], int rows, int cols);
void findmine(char mine[ROWS][COLS], char show[ROWS][COLS], int rows, int cols);
void recfindmine(char mine[ROWS][COLS], char show[ROWS][COLS], int x, int y);
int minenum(char mine[ROWS][COLS], int x,int y);
int number(char show[ROWS][COLS]);
void firstsafe(char mine[ROWS][COLS], int x, int y);

以上就是本文的全部內(nèi)容,希望對大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。

相關(guān)文章

  • C語言使用矩形法求定積分的通用函數(shù)

    C語言使用矩形法求定積分的通用函數(shù)

    這篇文章主要為大家詳細(xì)介紹了C語言使用矩形法求定積分的通用函數(shù),分別求解sinx, cosx,e^x,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2020-02-02
  • VC程序設(shè)計(jì)小技巧20例

    VC程序設(shè)計(jì)小技巧20例

    這篇文章主要介紹了VC程序設(shè)計(jì)小技巧20例,需要的朋友可以參考下
    2014-07-07
  • 舉例剖析C++中引用的本質(zhì)及引用作函數(shù)參數(shù)的使用

    舉例剖析C++中引用的本質(zhì)及引用作函數(shù)參數(shù)的使用

    這篇文章主要介紹了C++中引用的本質(zhì)及引用作函數(shù)參數(shù)的使用,講解了函數(shù)返回值是引用的情況等一些難點(diǎn),需要的朋友可以參考下
    2016-03-03
  • C語言判斷字符串是否回文三種方法實(shí)例

    C語言判斷字符串是否回文三種方法實(shí)例

    回文就是字符串中心對稱,從左向右讀和從右向左讀的內(nèi)容是一樣的,下面這篇文章主要給大家介紹了關(guān)于C語言判斷字符串是否回文的三種方法,文中通過代碼介紹的非常詳細(xì),需要的朋友可以參考下
    2024-03-03
  • 嵌入式QT移植的實(shí)現(xiàn)

    嵌入式QT移植的實(shí)現(xiàn)

    本文主要介紹了嵌入式QT移植的實(shí)現(xiàn),文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2022-05-05
  • C和C++混合編程問題

    C和C++混合編程問題

    這篇文章主要介紹了C和C++混合編程問題,需要的朋友可以參考下
    2015-10-10
  • C語言 位域詳解及示例代碼

    C語言 位域詳解及示例代碼

    本文主要介紹C語言 位域的知識,這里整理了相關(guān)資料,并附示例代碼及詳解,有興趣的小伙伴可以參考下
    2016-08-08
  • C++操作.json文件的超詳細(xì)新手教程

    C++操作.json文件的超詳細(xì)新手教程

    最近因?yàn)轫?xiàng)目原因需要解析JSON格式數(shù)據(jù),所以這篇文章主要給大家介紹了關(guān)于C++操作.json文件的相關(guān)資料,文中通過實(shí)例代碼介紹的非常詳細(xì),需要的朋友可以參考下
    2022-08-08
  • C語言程序環(huán)境中的預(yù)處理詳解

    C語言程序環(huán)境中的預(yù)處理詳解

    這篇文章主要為大家詳細(xì)介紹了C語言程序環(huán)境中的預(yù)處理,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下,希望能夠給你帶來幫助
    2022-02-02
  • C語言中的正則表達(dá)式使用示例詳解

    C語言中的正則表達(dá)式使用示例詳解

    正則表達(dá)式是使用單個(gè)字符串來描述、匹配一系列符合某個(gè)句法規(guī)則的字符串。本文通過示例代碼給大家介紹了C語言中的正則表達(dá)式使用,感興趣的朋友跟隨小編一起看看吧
    2019-07-07

最新評論

丰镇市| 宜宾市| 阜新市| 安陆市| 罗甸县| 且末县| 天水市| 吉木萨尔县| 康保县| 综艺| 吴川市| 杭州市| 礼泉县| 吴川市| 临泽县| 通许县| 兴业县| 吉木乃县| 通州市| 宜兰市| 庄河市| 南通市| 太仆寺旗| 新龙县| 凤庆县| 雷波县| 合江县| 荥经县| 宜城市| 凭祥市| 旬阳县| 武鸣县| 新野县| 九江县| 宁蒗| 怀远县| 临城县| 盈江县| 肥西县| 当阳市| 舒兰市|