91超碰碰碰碰久久久久久综合_超碰av人澡人澡人澡人澡人掠_国产黄大片在线观看画质优化_txt小说免费全本

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

如何使用C++實現掃雷游戲

發布時間:2021-11-19 14:15:46 來源:億速云 閱讀:239 作者:小新 欄目:開發技術

這篇文章主要介紹了如何使用C++實現掃雷游戲,具有一定借鑒價值,感興趣的朋友可以參考下,希望大家閱讀完這篇文章之后大有收獲,下面讓小編帶著大家一起了解一下。

掃雷最原始的版本可以追溯到1973年一款名為“方塊”的游戲。 不久,“方塊”被改寫成了游戲“Rlogic”。在“Rlogic”里,玩家的任務是作為美國海軍陸戰隊隊員,為指揮中心探出一條沒有地雷的安全路線,如果路全被地雷堵死就算輸。兩年后,湯姆·安德森在“Rlogic”的基礎上又編寫出了游戲“地雷”,由此奠定了現代掃雷游戲的雛形。 1981年,微軟公司的羅伯特·杜爾和卡特·約翰遜兩位工程師在Windows3.1系統上加載了該游戲,掃雷游戲才正式在全世界推廣開來。

如何使用C++實現掃雷游戲

這款游戲的玩法是在一個9*9(初級),16*16(中級),16*30(高級),或自定義大小的方塊矩陣中隨機布置一定量的地雷(初級為10個,中級為40個,高級為99個)。由玩家逐個翻開方塊,以找出所有地雷為最終游戲目標。如果玩家翻開的方塊有地雷,則游戲結束。

我們今天就來自己寫《掃雷》 這個項目并不是很難,今天就和大家從頭到尾詳細的講一遍,大家一定要好好看好好學!

行吧,開始了

我們今天用的是Cpp來寫,但不是用Windows來創建窗口,而是用他的遠房表親EasyX圖形庫來創建窗口,因為用圖形庫會簡單很多,剛學C的也可以聽懂,而且C/C++不分家,沒有什么問題,OK,我們現在開始寫代碼,今天我就把頭文件也分享出來了,主要是教大家如何去調用圖形庫。(注:沒有EasyX圖形庫的可以去官網下載,也可以進群直接下載) 首先是我們的頭文件以及一些宏定義

#include<stdio.h>
#include<graphics.h>//包含圖形庫頭文件
#define ROW 9 //行
#define COL 9 //列  共81個格子
#define MINE_NUM  18//雷的數量
#define IMG_SIZE 40

初始化函數,也是我們的老朋友了

void GameInit()
{
	//1,創建窗口 一行有九張圖片每張圖片40px,
	initgraph(IMG_SIZE*ROW, IMG_SIZE*COL,SHOWCONSOLE);
	//加載圖片(賦值) load加載 第一個參數,存儲圖片的變量 錯誤:字符集問題
	for (int i = 0; i < 12; i++)
	{
		char file[20] = "";
		sprintf(file, "./image/%d.jpg", i);
		loadimage(&img[i], file, IMG_SIZE, IMG_SIZE);
	}
	//布雷
	for (int i = 0; i < MINE_NUM; )
	{
		//排除輔助區
		int row = rand() % ROW+1;//0-8  1-9
		int col = rand() % COL+1;
		if (mine[row][col] == 0)
		{
			mine[row][col] = 9;
			i++;
		}
	}
	//雷所在的九宮格,要加1(雷除外)
	for (int i = 1; i < ROW+1; i++)
	{
		for (int k = 1; k < COL+1; k++)
		{
			if (mine[i][k] == 9)
			{
				//遍歷雷的九宮格 細心
				for (int a = i - 1; a <= i + 1; a++)
				{
					for (int b = k - 1; b <= k + 1; b++)
					{
						//非雷的格子加1
						if (mine[a][b] != 9)
						{
							mine[a][b]++;
						}
					}
				}
			}
		}
	}
	//加密 開始時全部為掩碼圖
	for (int i = 1; i < ROW + 1; i++)
	{
		for (int k = 1; k < COL + 1; k++)
		{
			mine[i][k] += 20;
		}
	}
 
}

鼠標信息處理函數

void MouseEvent()
{
	//檢測是否有鼠標消息
	if (MouseHit())
	{
		//獲取鼠標消息,坐標,左鍵還是右鍵
		MOUSEMSG msg = GetMouseMsg();
		//把坐標轉化成數組下標
		openr = msg.y / IMG_SIZE+1;
		openc = msg.x / IMG_SIZE+1;
		//判斷是左鍵還是右鍵
		switch (msg.uMsg)
		{
		case WM_LBUTTONDOWN:
			//如果格子沒有打開,就打開格子,否則不做處理
			if (mine[openr][openc] > 9)
			{
				mine[openr][openc] -= 20;
				OpenNull(openr,openc);
				num++;
			}
			break;
		case WM_RBUTTONDOWN:
			//標記
			if (mine[openr][openc] > 9 && mine[openr][openc] <= 29)
			{
				mine[openr][openc] += 20;
			}
			else
			{
				mine[openr][openc] -= 20;
			}
			break;
		}
	}
}

進行遞歸操作,判斷鼠標點擊的地方

//遞歸打開所有空白,以及空白周圍的數字
void OpenNull(int row,int col)
{
	//點擊的是空白才能打開
	if (mine[row][col] == 0)
	{
		for (int i = row - 1; i <= row + 1; i++)
		{
			for (size_t k = col-1; k <= col+1; k++)
			{
				//如果為空或者不是雷就打開
				if ((mine[i][k] == 20 || mine[i][k] != 29)&& mine[i][k]>9)
				{
					mine[i][k] -= 20;
					num++;
					OpenNull(i, k);
				}
			}
		}
	}
}

游戲的輸贏判斷函數,注意理清邏輯

void Jude()
{
	//判斷輸
	if (mine[openr][openc] == 9)
	{
		int isok = MessageBox(GetHWnd(), "是否繼續!", "點到雷了", MB_OKCANCEL);
		if (isok == IDOK)
		{
			mine[openr][openc] += 20;
		}
		else
		{
			exit(666);
		}
	}
	//判斷贏
	if (num == ROW*COL - MINE_NUM)
	{
		int isok = MessageBox(GetHWnd(), "是否繼續!", "點到雷了", MB_OKCANCEL);
		if (isok == IDOK)
		{
			num = 0;
			GameInit();
		}
		else
		{
			exit(666);
		}
	}
}

最后就是我們的主函數了

int main()
{
	GameInit();
	show();
	//循環處理游戲邏輯
	while (1)
	{
		MouseEvent();
		GameDraw();
		Jude();
	}
	
	getchar();
	return 0;
}

感謝你能夠認真閱讀完這篇文章,希望小編分享的“如何使用C++實現掃雷游戲”這篇文章對大家有幫助,同時也希望大家多多支持億速云,關注億速云行業資訊頻道,更多相關知識等著你來學習!

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

c++
AI

新竹市| 合山市| 康马县| 宜兰市| 台北县| 綦江县| 乌拉特中旗| 肃北| 安溪县| 新竹县| 泉州市| 额敏县| 兴宁市| 鹤庆县| 廊坊市| 阳泉市| 修水县| 珠海市| 新津县| 万山特区| 浮梁县| 惠来县| 神农架林区| 宜君县| 冀州市| 达日县| 忻城县| 巩义市| 晋中市| 孟连| 鄢陵县| 饶河县| 堆龙德庆县| 浦东新区| 石狮市| 卓资县| 犍为县| 赣榆县| 雷波县| 南皮县| 全椒县|