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

C語言遞歸應用實現(xiàn)掃雷游戲

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

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

游戲設計規(guī)則:

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

函數(shù)模塊及講解

test.c文件主要內容及功能講解

#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');//設置雷的棋盤初始化
?? ? ? ? ?setboard(show, ROWS, COLS, '*');//設置排查的棋盤初始化
?? ? ? ? ?//打印
?? ? ? ? ?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("輸入錯誤,請重新輸入!\n");//處理非法輸入
?? ? ?}
? ? ? }
?system("pause");
?return 0;
}

game.c文件主要內容及功能講解

#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)生隨機值,srand調用在主函數(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--;
? }
?}
}


//計算盤中還有多少個*,
//后面用來和雷數(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("請輸入查找坐標:>");
? scanf("%d%d", &x, &y);
? if (x > 0 && x <= rows && y > 0 && y <= cols && show[x][y] != ' ')//注意判斷坐標合法性
? {
? ?if (mine[x][y] == '1')
? ?{
? ? if (number(show) == ROW * COL)//第一步踩雷時要替換雷位保證玩家不會first blood
? ? {
? ? ?firstsafe(mine, x, y);
? ? ?//displayboard(mine, ROW, COL);//用來打印方便測試雷位有沒有被替換
? ? ?goto first;//替換之后繼續(xù)判斷該坐標,轉到first
? ? }
? ? printf("YOU LOSE!GAME OVER!\n");//當玩家不是第一步踩雷時就輸了
? ? printf("\n");
? ? displayboard(mine, ROW, COL);//打印雷盤讓玩家看到自己踩得是不是雷
? ? break;
? ?}
? ?else
? ?{
? ? first:
? ? recfindmine(mine, show, x, y);//展開程序
? ? displayboard(show, ROW, COL);
? ? //displayboard(mine, ROW, COL);//方便測試
? ?}
? }
? else
? {
? ?printf("坐標錯誤,請重新輸入!\n");
? }
?}
?if (number(show) == low)//當*等于雷數(shù)時排雷成功
?{
? printf("YOU WIN!\n");
? displayboard(mine, ROW, COL);
?}
}

//算一個坐標周圍8個有沒有雷
//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';
}


//本來寫的時候寫的查找周圍8個坐標,結果后來發(fā)現(xiàn)找周圍4個也是一樣的
//用遞歸來進行判斷
//目前這個函數(shù)還有bug,展開有時候遇到周圍有雷的時候不會停,會繼續(xù)判斷
//導致展開不是連續(xù)的,就像掃雷開掛了。。但是基本的展開功能還是能夠實現(xià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,再隨機生成一個不是雷的坐標改成雷
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文件主要內容及功能講解

#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);

以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支持腳本之家。

相關文章

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

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

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

    VC程序設計小技巧20例

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

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

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

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

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

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

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

    C和C++混合編程問題

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

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

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

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

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

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

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

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

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

最新評論

赤壁市| 大宁县| 中宁县| 宁南县| 郧西县| 望江县| 科尔| 黔江区| 岳阳县| 荥阳市| 墨脱县| 河池市| 晋城| 清丰县| 昌平区| 铜梁县| 琼结县| 呼和浩特市| 静宁县| 遂宁市| 额济纳旗| 大英县| 乐都县| 宝坻区| 泗阳县| 南宁市| 依安县| 广东省| 金坛市| 信宜市| 抚顺县| 绵竹市| 辽阳市| 信阳市| 教育| 上饶县| 荣昌县| 香港 | 习水县| 察雅县| 九龙坡区|