欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

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

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

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

源代碼:

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

總體構(gòu)造:

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

a.簡易的游戲菜單邏輯

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

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

b.初始化棋盤

一、越界情況的考慮

為了減少邊界情況可能出現(xiàn)越界訪問的情況,把棋盤擴大一圈,但是在顯示的時候只顯示沒擴大之前的棋盤。

在這里插入圖片描述

二、棋盤打印的考慮

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

	//初始化格子
	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]));
	}

初始化完,得到一個全0的雷盤,和一個全*的顯示盤。

c.布置雷的位置

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

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.排雷、棋盤打印、判斷輸贏(難點)d

排雷的邏輯判斷:

在這里插入圖片描述

如果沒有雷如何打印棋盤呢?
掃雷應(yīng)該做到,“點擊”棋盤之后,一路“打開”到最近的出現(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)
	{
		//遍歷周圍坐標(biāo)
		for (offset_x = -1; offset_x <= 1; offset_x++)
		{
			for (offset_y = -1; offset_y <= 1; offset_y++)
			{
				//如果這個坐標(biāo)不是雷
				if (mine[x + offset_x][y + offset_y] == '0')
				{
					//統(tǒng)計周圍雷的個數(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';
					}
				}
			}
		}
	}
}

如何判斷輸贏:
很簡單,踩到雷 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++實現(xiàn)掃雷游戲示例講解的文章就介紹到這了,更多相關(guān)C++實現(xiàn)掃雷游戲內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • springboot配置文件中敏感數(shù)據(jù)(賬號密碼)加密方式

    springboot配置文件中敏感數(shù)據(jù)(賬號密碼)加密方式

    這篇文章主要介紹了springboot配置文件中敏感數(shù)據(jù)(賬號密碼)加密方式,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教
    2024-04-04
  • Java?synchronized與死鎖深入探究

    Java?synchronized與死鎖深入探究

    這篇文章主要介紹了Java?synchronized與死鎖,Java中提供了synchronized關(guān)鍵字,將可能引發(fā)安全問題的代碼包裹在synchronized代碼塊中,表示這些代碼需要進行線程同步
    2023-01-01
  • ResultSet如何動態(tài)獲取列名和值

    ResultSet如何動態(tài)獲取列名和值

    這篇文章主要介紹了ResultSet如何動態(tài)獲取列名和值問題,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2022-12-12
  • JVM類加載器之ClassLoader的使用詳解

    JVM類加載器之ClassLoader的使用詳解

    類加載器負責(zé)讀取Java字節(jié)代碼,并轉(zhuǎn)換成java.lang.Class類的一個實例的代碼模塊。本文主要和大家聊聊JVM類加載器ClassLoader的使用,需要的可以了解一下
    2022-10-10
  • Servlet服務(wù)端實現(xiàn)原理詳解

    Servlet服務(wù)端實現(xiàn)原理詳解

    Servlet是Sun公司開發(fā)動態(tài)web的一門技術(shù),Sun公司在這些API中提供了一個接口叫做:Servlet,如果想開發(fā)一個Servlet程序,只需要完成兩個小步驟:編寫一個類,實現(xiàn)Servlet接口、把開發(fā)好的Java類部署到web服務(wù)器中。但是你了解Servlet實現(xiàn)的原理嗎
    2022-07-07
  • MyBatis查詢無記錄時的返回值問題

    MyBatis查詢無記錄時的返回值問題

    這篇文章主要介紹了MyBatis查詢無記錄時的返回值問題,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2022-01-01
  • SpringBoot過濾器的使用

    SpringBoot過濾器的使用

    過濾器是對數(shù)據(jù)進行過濾,預(yù)處理過程,當(dāng)我們訪問網(wǎng)站時,有時候會發(fā)布一些敏感信息,發(fā)完以后有的會用*替代,還有就是登陸權(quán)限控制等,一個資源,沒有經(jīng)過授權(quán),肯定是不能讓用戶隨便訪問的,這個時候,也可以用到過濾器,需要的朋友可以參考一下
    2021-11-11
  • Spring Boot使用yml格式進行配置的方法

    Spring Boot使用yml格式進行配置的方法

    很多springboot項目使用的是yml格式,主要目的是方便對讀懂其他人的項目,下面小編通過本文給大家分享Spring Boot使用yml格式進行配置的方法,需要的朋友參考下吧
    2018-04-04
  • Java中NIO的三大核心組件詳細解析

    Java中NIO的三大核心組件詳細解析

    這篇文章主要介紹了Java中NIO的三大核心組件詳細解析,NIO的Buffer類是一個抽象類,位于java.nio包中,提供了一組更加有效的方法,用來進行寫入和讀取的交替訪問,本質(zhì)上是一個內(nèi)存塊,既可以寫入數(shù)據(jù),也可以從中讀取數(shù)據(jù),需要的朋友可以參考下
    2023-12-12
  • Spring MVC數(shù)據(jù)處理和亂碼問題詳解

    Spring MVC數(shù)據(jù)處理和亂碼問題詳解

    這篇文章主要給大家介紹了關(guān)于Spring MVC數(shù)據(jù)處理和亂碼問題的相關(guān)資料,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2020-12-12

最新評論