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

c語言實現(xiàn)含遞歸清場版掃雷游戲

 更新時間:2021年11月21日 14:55:20   作者:Shany-Ming  
掃雷大家應(yīng)該都玩過,這是一個十分經(jīng)典的游戲,下面這篇文章主要給大家介紹了關(guān)于c語言實現(xiàn)含遞歸清場版掃雷游戲的相關(guān)資料,文中通過示例代碼介紹的非常詳細(xì),需要的朋友可以參考下

一,設(shè)計思路

想必大家都玩過掃雷

?這便是一個標(biāo)準(zhǔn)的掃雷,換做代碼實現(xiàn),我們需要考慮以下幾點:

1.棋盤的設(shè)計與初始化

2.在棋盤中放入雷

3.統(tǒng)計雷數(shù)

4.如何實現(xiàn)“一片”的效果

5.輸贏的判斷

接下來我們進行具體操作。

二.實現(xiàn)方式

1.菜單的打印

對任意一個游戲,菜單是必不可少的,也是最簡單的部分,直接上代碼

void menu()
{
	printf("------------------掃雷------------------\n");
	printf("---------------1.開始游戲---------------\n");
	printf("---------------0.退出游戲---------------\n");
}
int main()
{
	srand((unsigned int)time(NULL));
	int a = 0;
	do
	{
		menu();
		scanf("%d", &a);
		if (a == 0)
		{
			break;
		}
		game();
	} while (a);
	return 0;
}

其中srand是為了求隨機值,用來布置雷

2.game函數(shù)

主菜單完后進入game函數(shù),在game函數(shù)里我們就要開始主要的游戲部分,如棋盤初始化與打印等,當(dāng)然這些步驟都依靠函數(shù)完成,game函數(shù)只相當(dāng)于集合了一系列的游戲模塊

void game()
{
	char mine[ROWS][COLS];
	char show[ROWS][COLS];
	initeboard(mine, ROWS, COLS, '0');
	initeboard(show, ROWS, COLS, '*');//初始棋盤
	displayboard(show, ROW, COL);//打印棋盤
	mine_make(mine, ROW, COL);//設(shè)置雷
	//displayboard(mine, ROW, COL);
	find_mine(mine, show, ROWS, COLS);//排查雷
 
}

3.棋盤的初始化與打印

可以看到,我在game函數(shù)里初始了兩個棋盤,為什么要兩個呢?

其實,一個是為了放置了雷,一個為了展示給玩家,為什么不用一個呢,我們要在放雷處用'1',表示不放雷處用‘0',這樣計算一個坐標(biāo)周圍雷的數(shù)量就會更簡單,接下來看一段代碼:

#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#define ROW 10
#define COL 10
#define ROWS ROW+2
#define COLS COL+2

這里我們看到定義了一個ROWS和COLS這又是為何呢?

回歸棋盤

?掃雷時當(dāng)你確認(rèn)一個點時,它會對此點周圍的八個點進行排查看是否有淚,當(dāng)坐標(biāo)位于紅線處時沒有無法判斷八個,因此有了ROWS與COLS,這時,有人就會問了:那埋雷的地方用ROW COL就可以了,還不用擔(dān)心雷跑到外邊我們加的框,想法很好,但我們有兩個棋盤,必須對應(yīng),而且也不存在跑出雷的情況,往下分析你就會知道

void initeboard(char board[ROWS][COLS], int cols, int rows,char s)//棋盤初始化,此處用了個節(jié)省步驟的方法,不用兩個棋盤依次初始化
{
	int i = 0;
	int j = 0;
	for (i = 0; i < rows; i++)
	{
		for (j = 0; j < cols; j++)
		{
			board[i][j] = s;
		}
	}
}
void displayboard(char board[ROWS][COLS], int row, int col)//棋盤打印
{
	int i = 0;
	int j = 0;
	printf(" ");//與行中打印的0%d對應(yīng)
	for (j = 0; j <=col; j++)
	{
		printf(" %d  ", j);
	}
	printf("\n");
	printf("-");
	for (j = 1; j <= col + 1; j++)
	{
		printf("---");
		printf("|");
	}
	printf("\n");//列對應(yīng)打印完成
	for (i = 1; i <= row; i++)
	{
		if (i <= 9)
		{
			printf(" 0%d ", i);
		}
		else
		printf(" %d ", i);
		printf("|");
		for (j = 1; j <= col; j++)
		{
			printf(" %c ", board[i][j]);
			printf("|");
		}
		printf("\n");
		printf("-");
		for (j = 1; j <= col+1; j++)
		{
			printf("---");
			printf("|");
		}
		printf("\n");//行對應(yīng)嵌套在內(nèi)部 打印的數(shù)前加0是為了讓當(dāng)行數(shù)大于9時能夠?qū)?yīng) 如09與10
	}
}

棋盤的打印做了行列對應(yīng),所以可能有點不明顯

?4.雷的放置,雷的個數(shù)

雷的放置很簡單,在棋盤‘0',處放置就行,因為我們對隨機數(shù)的算式使隨機數(shù)只會出現(xiàn)在0-9沒有跑出的情況

mine_make(char mine[ROWS][COLS], int row, int col)//設(shè)置雷
{
	int count = 10;
	while (count)
	{
		int x = rand() % 10;
		int y = rand() % 10;
		if (mine[x][y] == '0')
		{
			mine[x][y] = '1';
			count--;
		}
	}
}

雷的個數(shù)就需要一定考慮了:

首先,我們需要把周圍八個位置是否有雷,有多少個雷判斷出來,這時我們設(shè)計‘0' ‘1'類型就排上用場了,但是注意,這是字符,不是數(shù)字

ASCII碼表

?一張表 讓我們知道如何轉(zhuǎn)型

當(dāng)然返回的數(shù)字記得轉(zhuǎn)成字符類型

int get_mine(char mine[ROWS][COLS], int i, int j)//得到一個坐標(biāo)附近雷的個數(shù)
{
	return mine[i - 1][j - 1] + mine[i - 1][j] + mine[i - 1][j + 1] +
		mine[i][j - 1] + mine[i][j + 1] +
		mine[i + 1][j - 1] + mine[i +1 ][j] + mine[i + 1][j + 1] - 8 * '0';//此處我們的數(shù)字其實是字符,用此方法可以轉(zhuǎn)為數(shù)字整形
}

5.遞歸實現(xiàn)一片效果

當(dāng)不為雷是會展開附近一片不為雷,提高游戲效率

void spread(char show[ROWS][COLS], char mine[ROWS][COLS], int x, int y)//遞歸方法實現(xiàn)一大片
{
	show[x][y] = ' ';//先讓輸入金的坐標(biāo)處變?yōu)榭崭?,因為已?jīng)判定過雷所以可以直接轉(zhuǎn)空格
	int i = 0;
	int j = 0;
	int ret = 0;
	for (i = x - 1; i <= x + 1; i++)
	{
		for (j = y - 1; j <= y + 1; j++)//嵌套for循環(huán)表示輸入坐標(biāo)包括自生及周圍八個
		{
			if (i > 0 && i <= ROW && j > 0 && j <= COL && mine[i][j] != '1' && show[i][j] == '*')//防止出現(xiàn)負(fù)坐標(biāo),避免有雷,避免輸入重復(fù)
			{
				ret = get_mine(mine, i, j);//判斷ret是0或非0,并得出周圍雷數(shù)
				if (!ret)//如果ret=0,!ret便是非0;為真
				{
					spread(show, mine, i, j);//遞歸
				}
				if (ret)//ret!=0時為真,便打印數(shù)
				{
					show[i][j] = ret + '0';//使數(shù)字轉(zhuǎn)成對應(yīng)字符
				}
			}
 
		}
	}
}

效果展示:

?6.排查雷

負(fù)責(zé)判斷是否被炸死及游戲勝利

void find_mine(char mine[ROWS][COLS], char show[ROWS][COLS], int row, int col)//排查雷
{
	printf("請輸入坐標(biāo)\n");
	int i = 0;
	int j = 0;
	int win = 0;
	while (row*col-10)//因為是十個雷,所以是—10,因為下總數(shù)減10就贏了,所以可以以此跳出循環(huán),當(dāng)然要是雷部位10,定一個變量就行,此處就不改了
	{
		scanf("%d %d", &i, &j);
		if (mine[i][j] == '1')
		{
			printf("你掛了\n");
			displayboard(mine, ROW, COL);
			break;
		}
		else
		{
			show[i][j] = get_mine(mine, i, j)+'0';
			spread(show,mine, i, j);
			displayboard(show, ROW, COL);
			win++;
		}		
	}
	if (win ==row * col - 10)
	{
		printf("恭喜你,成功了\n");
		displayboard(mine, ROW, COL);
	}
}

具體注釋都在代碼里了

正常情況把打印雷盤注釋就行,就可以正常游戲了

?三.完整代碼

#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#define ROW 10
#define COL 10
#define ROWS ROW+2
#define COLS COL+2
void menu()
{
	printf("------------------掃雷------------------\n");
	printf("---------------1.開始游戲---------------\n");
	printf("---------------0.退出游戲---------------\n");
}
void initeboard(char board[ROWS][COLS], int cols, int rows,char s)//棋盤初始化,此處用了個節(jié)省步驟的方法,不用兩個棋盤依次初始化
{
	int i = 0;
	int j = 0;
	for (i = 0; i < rows; i++)
	{
		for (j = 0; j < cols; j++)
		{
			board[i][j] = s;
		}
	}
}
void displayboard(char board[ROWS][COLS], int row, int col)//棋盤打印
{
	int i = 0;
	int j = 0;
	printf(" ");//與行中打印的0%d對應(yīng)
	for (j = 0; j <=col; j++)
	{
		printf(" %d  ", j);
	}
	printf("\n");
	printf("-");
	for (j = 1; j <= col + 1; j++)
	{
		printf("---");
		printf("|");
	}
	printf("\n");//列對應(yīng)打印完成
	for (i = 1; i <= row; i++)
	{
		if (i <= 9)
		{
			printf(" 0%d ", i);
		}
		else
		printf(" %d ", i);
		printf("|");
		for (j = 1; j <= col; j++)
		{
			printf(" %c ", board[i][j]);
			printf("|");
		}
		printf("\n");
		printf("-");
		for (j = 1; j <= col+1; j++)
		{
			printf("---");
			printf("|");
		}
		printf("\n");//行對應(yīng)嵌套在內(nèi)部 打印的數(shù)前加0是為了讓當(dāng)行數(shù)大于9時能夠?qū)?yīng) 如09與10
	}
}
mine_make(char mine[ROWS][COLS], int row, int col)//設(shè)置雷
{
	int count = 10;
	while (count)
	{
		int x = rand() % 10;
		int y = rand() % 10;
		if (mine[x][y] == '0')
		{
			mine[x][y] = '1';
			count--;
		}
	}
}
int get_mine(char mine[ROWS][COLS], int i, int j)//得到一個坐標(biāo)附近雷的個數(shù)
{
	return mine[i - 1][j - 1] + mine[i - 1][j] + mine[i - 1][j + 1] +
		mine[i][j - 1] + mine[i][j + 1] +
		mine[i + 1][j - 1] + mine[i +1 ][j] + mine[i + 1][j + 1] - 8 * '0';//此處我們的數(shù)字其實是字符,用此方法可以轉(zhuǎn)為數(shù)字整形
}
void spread(char show[ROWS][COLS], char mine[ROWS][COLS], int x, int y)//遞歸方法實現(xiàn)一大片
{
	show[x][y] = ' ';//先讓輸入金的坐標(biāo)處變?yōu)榭崭?,因為已?jīng)判定過雷所以可以直接轉(zhuǎn)空格
	int i = 0;
	int j = 0;
	int ret = 0;
	for (i = x - 1; i <= x + 1; i++)
	{
		for (j = y - 1; j <= y + 1; j++)//嵌套for循環(huán)表示輸入坐標(biāo)包括自生及周圍八個
		{
			if (i > 0 && i <= ROW && j > 0 && j <= COL && mine[i][j] != '1' && show[i][j] == '*')//防止出現(xiàn)負(fù)坐標(biāo),避免有雷,避免輸入重復(fù)
			{
				ret = get_mine(mine, i, j);//判斷ret是0或非0,并得出周圍雷數(shù)
				if (!ret)//如果ret=0,!ret便是非0;為真
				{
					spread(show, mine, i, j);//遞歸
				}
				if (ret)//ret!=0時為真,便打印數(shù)
				{
					show[i][j] = ret + '0';//使數(shù)字轉(zhuǎn)成對應(yīng)字符
				}
			}
 
		}
	}
}
void find_mine(char mine[ROWS][COLS], char show[ROWS][COLS], int row, int col)//排查雷
{
	printf("請輸入坐標(biāo)\n");
	int i = 0;
	int j = 0;
	int win = 0;
	while (row*col-10)//因為是十個雷,所以是—10,因為下總數(shù)減10就贏了,所以可以以此跳出循環(huán),當(dāng)然要是雷部位10,定一個變量就行,此處就不改了
	{
		scanf("%d %d", &i, &j);
		if (mine[i][j] == '1')
		{
			printf("你掛了\n");
			displayboard(mine, ROW, COL);
			break;
		}
		else
		{
			show[i][j] = get_mine(mine, i, j)+'0';
			spread(show,mine, i, j);
			displayboard(show, ROW, COL);
			win++;
		}		
	}
	if (win ==row * col - 10)
	{
		printf("恭喜你,成功了\n");
		displayboard(mine, ROW, COL);
	}
}
void game()
{
	char mine[ROWS][COLS];
	char show[ROWS][COLS];
	initeboard(mine, ROWS, COLS, '0');
	initeboard(show, ROWS, COLS, '*');//初始棋盤
	displayboard(show, ROW, COL);//打印棋盤
	mine_make(mine, ROW, COL);//設(shè)置雷
	displayboard(mine, ROW, COL);
	find_mine(mine, show, ROWS, COLS);//排查雷
 
}
int main()
{
	srand((unsigned int)time(NULL));
	int a = 0;
	do
	{
		menu();
		scanf("%d", &a);
		if (a == 0)
		{
			break;
		}
		game();
	} while (a);
	return 0;
}
    

總結(jié)

到此這篇關(guān)于c語言實現(xiàn)含遞歸清場版掃雷游戲的文章就介紹到這了,更多相關(guān)c語言實現(xiàn)掃雷內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • linux c程序中獲取shell腳本輸出的實現(xiàn)方法

    linux c程序中獲取shell腳本輸出的實現(xiàn)方法

    以下是對在linux下c程序中獲取shell腳本輸出的實現(xiàn)方法進行了詳細(xì)的分析介紹,需要的朋友可以過來參考下
    2013-08-08
  • C語言實現(xiàn)二叉樹遍歷的迭代算法

    C語言實現(xiàn)二叉樹遍歷的迭代算法

    這篇文章主要介紹了C語言實現(xiàn)二叉樹遍歷的迭代算法,包括二叉樹的中序遍歷、先序遍歷及后序遍歷等,是非常經(jīng)典的算法,需要的朋友可以參考下
    2014-09-09
  • C++使用宏實現(xiàn)動態(tài)庫加載

    C++使用宏實現(xiàn)動態(tài)庫加載

    開發(fā)的時候,有些項目不能靜態(tài)鏈接動態(tài)庫,需要程序運行時加載動態(tài)庫。本文將使用宏來實現(xiàn)動態(tài)庫的加載,感興趣的小伙伴可以跟隨小編一起了解一下
    2022-12-12
  • C++?手?jǐn)]簡易服務(wù)器

    C++?手?jǐn)]簡易服務(wù)器

    本文主要介紹了C++?手?jǐn)]簡易服務(wù)器,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2023-03-03
  • C++經(jīng)典例題之字符串特定規(guī)則反轉(zhuǎn)問題的解法

    C++經(jīng)典例題之字符串特定規(guī)則反轉(zhuǎn)問題的解法

    這篇文章主要介紹了如何解決字符串反轉(zhuǎn)問題,通過將字符串按每2k個字符為一個區(qū)間進行劃分,并使用雙指針方法來確定實際反轉(zhuǎn)的邊界,最終實現(xiàn)字符串按特定規(guī)則進行反轉(zhuǎn),文中通過代碼介紹的非常詳細(xì),需要的朋友可以參考下
    2025-03-03
  • 清除3389遠(yuǎn)程登錄日志

    清除3389遠(yuǎn)程登錄日志

    這篇文章主要介紹了清除3389遠(yuǎn)程登錄日志示例,需要的朋友可以參考下
    2014-01-01
  • C++中Boost的智能指針weak_ptr

    C++中Boost的智能指針weak_ptr

    這篇文章介紹了C++中Boost的智能指針weak_ptr,文中通過示例代碼介紹的非常詳細(xì)。對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2022-07-07
  • 深入理解strcpy與memcpy的區(qū)別

    深入理解strcpy與memcpy的區(qū)別

    本篇文章是對strcpy與memcpy的區(qū)別進行了詳細(xì)的分析介紹,需要的朋友參考下
    2013-05-05
  • vscode中配置LeetCode插件的教程(愉快刷題)

    vscode中配置LeetCode插件的教程(愉快刷題)

    這篇文章主要介紹了vscode中配置LeetCode插件的教程,本文通過圖文并茂的形式給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友參考下吧
    2020-03-03
  • C++資源管理操作方法詳解

    C++資源管理操作方法詳解

    系統(tǒng)中的資源,諸如動態(tài)申請的內(nèi)存,文件描述符,數(shù)據(jù)庫連接,網(wǎng)絡(luò)socket等,在不用的時候,應(yīng)該及時歸還給系統(tǒng),否則就會造成內(nèi)存泄露
    2022-09-09

最新評論

新乡县| 平利县| 台东县| 苗栗市| 汝南县| 嘉鱼县| 松溪县| 杨浦区| 环江| 大安市| 威信县| 宝鸡市| 嵊泗县| 南和县| 囊谦县| 星子县| 桃园县| 泰兴市| 红原县| 县级市| 喀喇沁旗| 济宁市| 绵竹市| 兴隆县| 获嘉县| 嘉兴市| 榆林市| 丽水市| 西乡县| 上林县| 青海省| 中卫市| 拜泉县| 淮南市| 科技| 河北省| 海淀区| 莫力| 镇巴县| 柏乡县| 北票市|