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

C++實(shí)現(xiàn)掃雷游戲示例講解

 更新時(shí)間:2020年08月03日 14:46:16   作者:叁三山雨  
這篇文章主要介紹了C++實(shí)現(xiàn)掃雷游戲示例講解,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧

C/C++實(shí)現(xiàn)掃雷小游戲

源代碼:

github:https://github.com/KamSss/C-Practice/tree/master/Minesweeper掃雷小游戲/Minesweeper掃雷

總體構(gòu)造:

a.簡(jiǎn)易的游戲菜單邏輯
b.初始化棋盤(pán)
c.布置雷的位置
d.排雷、棋盤(pán)打印、判斷輸贏(難點(diǎn))

a.簡(jiǎn)易的游戲菜單邏輯

簡(jiǎn)單的通過(guò)一個(gè)輸入0和1實(shí)現(xiàn)判斷是玩游戲還是退出游戲的邏輯
輸入1則進(jìn)入游戲
輸入0則break退出游戲,且退出do…while循環(huán),程序結(jié)束。

void test(){
	int input = 0;
	do{
		menu();
		cout << "請(qǐng)輸入:>--";
		cin >> input;
		switch (input)
		{
		case 1:
			game();
			break;
		case 0:
			cout << "退出游戲" << endl;
			break;
		default:
			cout << "    選擇錯(cuò)誤!請(qǐng)重新輸入" << endl;
			break;
		}
	} while (input);
}

b.初始化棋盤(pán)

一、越界情況的考慮

為了減少邊界情況可能出現(xiàn)越界訪問(wèn)的情況,把棋盤(pán)擴(kuò)大一圈,但是在顯示的時(shí)候只顯示沒(méi)擴(kuò)大之前的棋盤(pán)。

在這里插入圖片描述

二、棋盤(pán)打印的考慮

如果只使用一個(gè)二維數(shù)組,同時(shí)要記錄雷的位置和每一個(gè)位置附近的雷數(shù)以及點(diǎn)擊和未點(diǎn)擊的位置顯示顯然不合適。
所以: 初始化兩個(gè)棋盤(pán),一個(gè)專(zhuān)門(mén)用來(lái)存放雷的位置,一個(gè)專(zhuān)門(mén)用于打印當(dāng)前棋盤(pán)給玩家看。

	//初始化格子
	InitBoard(mine, ROWS, COLS, '0');
	InitBoard(show, ROWS, COLS, '*');
	
	void InitBoard(char board[ROWS][COLS], int rows, int cols, char set)
	{
		memset(&board[0][0], set, rows*cols*sizeof(board[0][0]));
	}

初始化完,得到一個(gè)全0的雷盤(pán),和一個(gè)全*的顯示盤(pán)。

c.布置雷的位置

這里用隨機(jī)數(shù)布置雷的位置,會(huì)不會(huì)對(duì)同一個(gè)點(diǎn)多次放雷呢?這里的解決辦法是,如果當(dāng)前隨機(jī)到的位置已經(jīng)有雷就再隨機(jī)一個(gè)位置防雷。

void SetMine(char board[ROWS][COLS], int row, int col)
{
	srand((unsigned int)time(NULL));
	int count = EASY_COUNT;
	while (count)
	{
		int x = rand() % row + 1;
		int y = rand() % col + 1;
		if (board[x][y] == '0')
		{
			board[x][y] = '1';
			count--;
		}
	}
}

d.排雷、棋盤(pán)打印、判斷輸贏(難點(diǎn))d

排雷的邏輯判斷:

在這里插入圖片描述

如果沒(méi)有雷如何打印棋盤(pán)呢?
掃雷應(yīng)該做到,“點(diǎn)擊”棋盤(pán)之后,一路“打開(kāi)”到最近的出現(xiàn)雷的邊界上。

void Spread(char mine[ROWS][COLS], char show[ROWS][COLS], int x, int y)
{
	int offset_x = 0;
	int offset_y = 0;
	int count = 0;
	//坐標(biāo)合法
	if (x >= 1 && x <= 9 && y >= 1 && y <= 9)
	{
		//遍歷周?chē)鴺?biāo)
		for (offset_x = -1; offset_x <= 1; offset_x++)
		{
			for (offset_y = -1; offset_y <= 1; offset_y++)
			{
				//如果這個(gè)坐標(biāo)不是雷
				if (mine[x + offset_x][y + offset_y] == '0')
				{
					//統(tǒng)計(jì)周?chē)椎膫€(gè)數(shù)
					count = GetMineCount(mine, x + offset_x, y + offset_y);
					if (count == 0)
					{
						if (show[x + offset_x][y + offset_y] == '*')
						{
							show[x + offset_x][y + offset_y] = ' ';
							Spread(mine, show, x + offset_x, y + offset_y);
						}
					}
					else
					{
						show[x + offset_x][y + offset_y] = count + '0';
					}
				}
			}
		}
	}
}

如何判斷輸贏:
很簡(jiǎn)單,踩到雷 board[i][j] == 1
所有的雷都出現(xiàn)了 * == MineCount 就贏了

//判斷是否排雷成功
int IsWin(char show[ROWS][COLS], int row, int col)
{
	int i = 0;
	int j = 0;
	int count = 0;
	for (i = 1; i <= row; i++)
	{
		for (j = 1; j <= col; j++)
		{
			if (show[i][j] == '*')
			{
				count++;
			}
		}
	}
	return count == EASY_COUNT;
}

到此這篇關(guān)于C++實(shí)現(xiàn)掃雷游戲示例講解的文章就介紹到這了,更多相關(guān)C++實(shí)現(xiàn)掃雷游戲內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • 詳解Java如何實(shí)現(xiàn)圖像灰度化

    詳解Java如何實(shí)現(xiàn)圖像灰度化

    這篇文章主要介紹了灰度化的幾種方法,以及如何使用Java實(shí)現(xiàn)灰度化。同時(shí)分析了網(wǎng)上一種常見(jiàn)卻并不妥當(dāng)?shù)腏ava灰度化實(shí)現(xiàn),以及證明了opencv的灰度化是使用“加權(quán)灰度化”法,下面一起來(lái)看看。
    2016-08-08
  • 基于SpringBoot實(shí)現(xiàn)動(dòng)態(tài)配置數(shù)據(jù)庫(kù)的加載

    基于SpringBoot實(shí)現(xiàn)動(dòng)態(tài)配置數(shù)據(jù)庫(kù)的加載

    這篇文章主要介紹了Spring?Boot?如何動(dòng)態(tài)配置數(shù)據(jù)庫(kù)的加載,現(xiàn)項(xiàng)目有一個(gè)需求,期望通過(guò)在application.yml配置文件中設(shè)置一個(gè)開(kāi)關(guān),來(lái)決定是否加載數(shù)據(jù)庫(kù),文中通過(guò)代碼示例講解的非常詳細(xì),需要的朋友可以參考下
    2024-10-10
  • Java實(shí)現(xiàn)超市會(huì)員管理系統(tǒng)

    Java實(shí)現(xiàn)超市會(huì)員管理系統(tǒng)

    這篇文章主要為大家詳細(xì)介紹了Java實(shí)現(xiàn)超市會(huì)員管理系統(tǒng),文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2022-03-03
  • springboot+vue實(shí)現(xiàn)Token自動(dòng)續(xù)期(雙Token方案)

    springboot+vue實(shí)現(xiàn)Token自動(dòng)續(xù)期(雙Token方案)

    雙Token方案通過(guò)訪問(wèn)令牌和刷新令牌提高用戶(hù)登錄安全性和體驗(yàn),訪問(wèn)令牌有效期短,包含用戶(hù)信息,用于請(qǐng)求校驗(yàn),本文就來(lái)介紹一下springboot+vue實(shí)現(xiàn)Token自動(dòng)續(xù)期(雙Token方案),感興趣的可以了解一下
    2024-10-10
  • SWT(JFace) 圖片瀏覽器 實(shí)現(xiàn)代碼

    SWT(JFace) 圖片瀏覽器 實(shí)現(xiàn)代碼

    SWT(JFace)小制作:圖片瀏覽器
    2009-06-06
  • Java等待喚醒機(jī)制原理實(shí)例解析

    Java等待喚醒機(jī)制原理實(shí)例解析

    這篇文章主要介紹了Java等待喚醒機(jī)制原理實(shí)例解析,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2020-01-01
  • 新建springboot項(xiàng)目時(shí),entityManagerFactory報(bào)錯(cuò)的解決

    新建springboot項(xiàng)目時(shí),entityManagerFactory報(bào)錯(cuò)的解決

    這篇文章主要介紹了新建springboot項(xiàng)目時(shí),entityManagerFactory報(bào)錯(cuò)的解決方案,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2022-01-01
  • Java線(xiàn)程在什么情況下可以終止

    Java線(xiàn)程在什么情況下可以終止

    Thread線(xiàn)程類(lèi)自帶的stop方法,但是jdk不建議使用,因?yàn)閟top方法終止線(xiàn)程只是強(qiáng)行終止,內(nèi)存中部分值可能已發(fā)生變化,并未保證數(shù)據(jù)的一致性,將會(huì)導(dǎo)致線(xiàn)程安全問(wèn)題,那么在什么情況下可以終止線(xiàn)程呢,本篇帶你探究一下
    2022-04-04
  • 分享Java多線(xiàn)程實(shí)現(xiàn)的四種方式

    分享Java多線(xiàn)程實(shí)現(xiàn)的四種方式

    這篇文章主要介紹了分享Java多線(xiàn)程實(shí)現(xiàn)的四種方式,文章基于?Java的相關(guān)資料展開(kāi)多線(xiàn)程的詳細(xì)介紹,具有一的的參考價(jià)值,需要的小伙伴可以參考一下
    2022-05-05
  • Java方法重載和方法重寫(xiě)的區(qū)別到底在哪?

    Java方法重載和方法重寫(xiě)的區(qū)別到底在哪?

    今天給大家?guī)?lái)的是關(guān)于Java的相關(guān)知識(shí),文章圍繞著Java方法重載和方法重寫(xiě)的區(qū)別到底在哪展開(kāi),文中有非常詳細(xì)的解釋,需要的朋友可以參考下
    2021-06-06

最新評(píng)論

西城区| 苏尼特右旗| 招远市| 沂源县| 台前县| 罗江县| 监利县| 凭祥市| 建始县| 荆门市| 疏勒县| 越西县| 榆树市| 锦屏县| 涟水县| 类乌齐县| 文安县| 昌乐县| 九寨沟县| 营口市| 聊城市| 丰县| 甘洛县| 开原市| 临邑县| 平果县| 六安市| 铜陵市| 红安县| 双峰县| 冀州市| 涞源县| 微博| 永吉县| 合肥市| 樟树市| 濮阳县| 泉州市| 五河县| 五原县| 中阳县|