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

C/C++百行代碼實(shí)現(xiàn)熱門(mén)游戲消消樂(lè)功能的示例代碼

 更新時(shí)間:2020年07月01日 10:31:30   作者:#殘芯  
這篇文章主要介紹了C/C++百行代碼實(shí)現(xiàn)熱門(mén)游戲消消樂(lè)功能的示例代碼,本文通過(guò)圖文并茂的形式給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下

游戲設(shè)計(jì)

首先我們需要使用第三方框架,這里我使用的是sfml,不會(huì)使用sfml在我的上幾篇文章當(dāng)中-掃雷(上)有詳細(xì)的開(kāi)發(fā)環(huán)境搭建介紹

首先準(zhǔn)備圖片資源

一張背景圖片,一張寶石圖片

在這里插入圖片描述

窗口初始化加載圖片

Texture t1;
t1.loadFromFile(“images/bg2.png”);

當(dāng)鼠標(biāo)第一次單擊時(shí),記錄下位置,第二次單擊又記錄一下位置,如果兩個(gè)小方塊相鄰就交換位置,如果不相鄰如圖c的位置則,不發(fā)生變化

在這里插入圖片描述

判斷行或列如果三張一樣的圖片相鄰,清除一下圖片,進(jìn)行刷新

實(shí)列

#include <SFML/Graphics.hpp>
#include <SFML/Audio.hpp>
#include <time.h>

using namespace sf;

#define GAME_ROWS_COUNT 8
#define GAME_COLS_COUNT 8

int ts = 57; // 每一個(gè)游戲小方塊區(qū)域的大小

bool isMoving = false;
bool isSwap = false;

// 相鄰位置的第幾次單擊,第2次單擊才交換方塊
int click = 0;

Vector2i pos; //鼠標(biāo)單擊時(shí)的位置
Vector2i offset(15, 273);

int posX1, posY1; //第一次單擊的位置(記錄行和列的序號(hào))
int posX2, posY2; //第二次單擊的位置(記錄行和列的序號(hào))

struct Block {
	int x, y; //坐標(biāo)值 x == col * ts y == row * ts;
	int row, col; //第幾行,第幾列
	int kind; //表示第幾種小方塊
	bool match; //表示是否成三
	int alpha; //透明度

	Block() {
		match = false;
		alpha = 255;
		kind = -1;
	}
} grid[GAME_ROWS_COUNT + 2][GAME_ROWS_COUNT + 2];

void swap(Block p1, Block p2) {
	std::swap(p1.col, p2.col);
	std::swap(p1.row, p2.row);

	grid[p1.row][p1.col] = p1;
	grid[p2.row][p2.col] = p2;
}

void doEvent(RenderWindow* window) {
	Event e;
	while (window->pollEvent(e)) {
		if (e.type == Event::Closed) {
			window->close();
		}

		if (e.type == Event::MouseButtonPressed) {
			if (e.key.code == Mouse::Left) {
				if (!isSwap && !isMoving) click++;
				pos = Mouse::getPosition(*window) - offset;
			}
		}
	}

	if (click == 1) {
		posX1 = pos.x / ts + 1;
		posY1 = pos.y / ts + 1;
	}
	else if (click == 2) {
		posX2 = pos.x / ts + 1;
		posY2 = pos.y / ts + 1;

		// 是相鄰方塊就交換位置
		if (abs(posX2 - posX1) + abs(posY2 - posY1) == 1) {
			// 交換相鄰的兩個(gè)小方塊
			// 消消樂(lè)的方塊,怎么表示?
			swap(grid[posY1][posX1], grid[posY2][posX2]);
			isSwap = 1;
			click = 0;
		}
		else {
			click = 1;
		}
	}
}

void check() {
	for (int i = 1; i <= GAME_ROWS_COUNT; i++) {
		for (int j = 1; j <= GAME_COLS_COUNT; j++) {
			if (grid[i][j].kind == grid[i + 1][j].kind &&
				grid[i][j].kind == grid[i - 1][j].kind) {
				//grid[i - 1][j].match++;
				//grid[i][j].match++;
				//grid[i + 1][j].match++;
				for (int k = -1; k <= 1; k++) grid[i + k][j].match++;
			}

			if (grid[i][j].kind == grid[i][j - 1].kind &&
				grid[i][j].kind == grid[i][j + 1].kind) {
				//grid[i][j - 1].match++;
				//grid[i][j + 1].match++;
				//grid[i][j].match++;
				for (int k = -1; k <= 1; k++) grid[i][j + k].match++;
			}
		}
	}
}

void doMoving() {
	isMoving = false;

	for (int i = 1; i <= GAME_ROWS_COUNT; i++) {
		for (int j = 1; j <= GAME_COLS_COUNT; j++) {
			Block& p = grid[i][j]; // 引用p, 就是grid[i][j]的別名
			int dx, dy;

			for (int k = 0; k < 4; k++) {
				dx = p.x - p.col * ts;
				dy = p.y - p.row * ts;

				if (dx) p.x -= dx / abs(dx);
				if (dy) p.y -= dy / abs(dy);
			}

			if (dx || dy) isMoving = true;
		}
	}
}

void xiaochu() {
	for (int i = 1; i <= GAME_ROWS_COUNT; i++) {
		for (int j = 1; j <= GAME_COLS_COUNT; j++) {
			if (grid[i][j].match && grid[i][j].alpha > 10) {
				grid[i][j].alpha -= 10;
				isMoving = true;
			}
		}
	}
}

void huanYuan() {
	if (isSwap && !isMoving) {
		// 如果此時(shí)沒(méi)有產(chǎn)生匹配效果,就要還原
		int score = 0;
		for (int i = 1; i <= GAME_ROWS_COUNT; i++) {
			for (int j = 1; j <= GAME_COLS_COUNT; j++) {
				score += grid[i][j].match;
			}
		}

		if (score == 0) {
			swap(grid[posY1][posX1], grid[posY2][posX2]);
		}

		isSwap = false;
	}
}

void updateGrid() {
	for (int i = GAME_ROWS_COUNT; i > 0; i--) {
		for (int j = 1; j <= GAME_COLS_COUNT; j++) {
			if (grid[i][j].match) {
				for (int k = i - 1; k > 0; k--) {
					if (grid[k][j].match == 0) {
						swap(grid[k][j], grid[i][j]);
						break;
					}
				}

			}
		}
	}

	for (int j = 1; j <= GAME_COLS_COUNT; j++) {
		int n = 0;
		for (int i = GAME_ROWS_COUNT; i > 0; i--) {
			if (grid[i][j].match) {
				grid[i][j].kind = rand() % 7;
				grid[i][j].y = -ts * n;
				n++;
				grid[i][j].match = false;
				grid[i][j].alpha = 255;
			}
		}
	}
}

void drawBlocks(Sprite* sprite, RenderWindow* window) {
	for (int i = 1; i <= GAME_ROWS_COUNT; i++) {
		for (int j = 1; j <= GAME_COLS_COUNT; j++) {
			Block p = grid[i][j];
			sprite->setTextureRect(
				IntRect(p.kind * 52, 0, 52, 52));
			// 設(shè)置透明度
			sprite->setColor(Color(255, 255, 255, p.alpha));
			sprite->setPosition(p.x, p.y);
			// 因?yàn)閿?shù)組gird中的Block, 每個(gè)Block的行標(biāo),列標(biāo)是從1計(jì)算的,
			// 并根據(jù)行標(biāo)和列表來(lái)計(jì)算的x,y坐標(biāo)
			// 所以坐標(biāo)的偏移,需要少便宜一些,也就是相當(dāng)于在正方形區(qū)域的左上角的左上角方向偏移一個(gè)單位
			// 在這個(gè)位置開(kāi)發(fā)存放第0行第0列(實(shí)際不繪制第0行第0列)
			sprite->move(offset.x - ts, offset.y - ts); // to do
			window->draw(*sprite);
		}
	}
}

void initGrid() {
	for (int i = 1; i <= GAME_ROWS_COUNT; i++) {
		for (int j = 1; j <= GAME_COLS_COUNT; j++) {
			grid[i][j].kind = rand() % 3;
			grid[i][j].col = j;
			grid[i][j].row = i;
			grid[i][j].x = j * ts;
			grid[i][j].y = i * ts;
		}
	}
}

int main(void) {
	srand(time(0));

	RenderWindow window(VideoMode(485, 917), "canxin-xiaoxiaole");
	// 設(shè)置刷新的最大幀率
	window.setFramerateLimit(60);

	Texture t1, t2;
	t1.loadFromFile("images/bg2.png");
	if (!t2.loadFromFile("images/1.png")) {
		return -1;
	}
	Sprite spriteBg(t1);
	Sprite spriteBlock(t2);

	initGrid();

	while (window.isOpen()) {
		// 處理用戶(hù)的點(diǎn)擊事件
		doEvent(&window);

		// 檢查匹配情況
		check();

		// 移動(dòng)處理
		doMoving();

		// 消除
		if (!isMoving) {
			xiaochu();
		}

		// 還原處理
		huanYuan();

		if (!isMoving) {
			updateGrid();
		}

		// 渲染游戲畫(huà)面
		window.draw(spriteBg);
		// 渲染所有的小方塊 
		drawBlocks(&spriteBlock, &window);
		// 顯示
		window.display();
	}

	return 0;
}

總結(jié)

到此這篇關(guān)于C/C++百行代碼實(shí)現(xiàn)熱門(mén)游戲消消樂(lè)功能的示例代碼的文章就介紹到這了,更多相關(guān)C++ 消消樂(lè)內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • 關(guān)于C++中vector的兩個(gè)小tips分享

    關(guān)于C++中vector的兩個(gè)小tips分享

    這篇文章主要給大家介紹了關(guān)于C++中vector的兩個(gè)小tips,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家學(xué)習(xí)或者使用C++具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2019-05-05
  • 教你分辨C++堆與棧的區(qū)別

    教你分辨C++堆與棧的區(qū)別

    堆與棧的區(qū)別有:1、棧由系統(tǒng)自動(dòng)分配,而堆是人為申請(qǐng)開(kāi)辟;2、棧獲得的空間較小,而堆獲得的空間較大;3、棧由系統(tǒng)自動(dòng)分配,速度較快,而堆一般速度比較慢;4、棧是連續(xù)的空間,而堆是不連續(xù)的空間
    2021-06-06
  • 堆基本操作實(shí)現(xiàn)最大堆

    堆基本操作實(shí)現(xiàn)最大堆

    這篇文章主要介紹了堆基本操作實(shí)現(xiàn)最大堆,需要的朋友可以參考下
    2014-02-02
  • 淺談C++ 設(shè)計(jì)模式的基本原則

    淺談C++ 設(shè)計(jì)模式的基本原則

    這篇文章主要介紹了++ 設(shè)計(jì)模式的基本原則,主要的目標(biāo)是實(shí)現(xiàn)最終目的,高內(nèi)聚,低耦合,開(kāi)放封閉原則類(lèi)的改動(dòng)是通過(guò)增加代碼進(jìn)行的,感興趣的小伙伴可參考下面文章的具體內(nèi)容
    2021-09-09
  • OpenCV視頻流C++多線程處理方法詳細(xì)分析

    OpenCV視頻流C++多線程處理方法詳細(xì)分析

    為OpenCV是搞計(jì)算機(jī)視覺(jué)必須要掌握的基礎(chǔ),這篇文章主要給大家介紹了關(guān)于OpenCV視頻流多線程處理的相關(guān)資料,文中通過(guò)示例代碼介紹的非常詳細(xì),需要的朋友可以參考下
    2022-11-11
  • C語(yǔ)言超詳細(xì)講解棧的實(shí)現(xiàn)及代碼

    C語(yǔ)言超詳細(xì)講解棧的實(shí)現(xiàn)及代碼

    棧(stack)又名堆棧,它是一種運(yùn)算受限的線性表。限定僅在表尾進(jìn)行插入和刪除操作的線性表。這一端被稱(chēng)為棧頂,相對(duì)地,把另一端稱(chēng)為棧底。向一個(gè)棧插入新元素又稱(chēng)作進(jìn)棧、入棧或壓棧,它是把新元素放到棧頂元素的上面,使之成為新的棧頂元素
    2022-04-04
  • C語(yǔ)言代碼實(shí)現(xiàn)猜數(shù)字

    C語(yǔ)言代碼實(shí)現(xiàn)猜數(shù)字

    這篇文章主要為大家詳細(xì)介紹了C語(yǔ)言代碼實(shí)現(xiàn)猜數(shù)字,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2020-11-11
  • C++分析類(lèi)的對(duì)象作類(lèi)成員調(diào)用構(gòu)造與析構(gòu)函數(shù)及靜態(tài)成員

    C++分析類(lèi)的對(duì)象作類(lèi)成員調(diào)用構(gòu)造與析構(gòu)函數(shù)及靜態(tài)成員

    終于到了對(duì)象的初始化和清理的最后階段了,在這里分享一個(gè)cpp里有多個(gè)類(lèi)時(shí),一個(gè)類(lèi)的對(duì)象作為另一個(gè)類(lèi)成員的時(shí)候構(gòu)造函數(shù)和析構(gòu)函數(shù)調(diào)用的時(shí)機(jī)。還有一個(gè)靜態(tài)成員也是經(jīng)??嫉降狞c(diǎn),在這篇博客將會(huì)詳解其概念并舉出案例鞏固,讓我們開(kāi)始
    2022-05-05
  • STL中vector的使用你了解嗎

    STL中vector的使用你了解嗎

    這篇文章主要為大家詳細(xì)介紹了STL中vector的使用,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下,希望能夠給你帶來(lái)幫助
    2022-03-03
  • VC創(chuàng)建圓角dialog的實(shí)現(xiàn)方法

    VC創(chuàng)建圓角dialog的實(shí)現(xiàn)方法

    這篇文章主要介紹了VC創(chuàng)建圓角dialog的實(shí)現(xiàn)方法,結(jié)合實(shí)例形式分析了圓角dialog對(duì)話框的創(chuàng)建步驟與相關(guān)操作技巧,需要的朋友可以參考下
    2016-08-08

最新評(píng)論

林口县| 探索| 清苑县| 平阳县| 元阳县| 杂多县| 阜南县| 翁源县| 金堂县| 云梦县| 枞阳县| 石柱| 且末县| 湛江市| 平定县| 陆良县| 文安县| 惠来县| 黄浦区| 夏津县| 肥乡县| 平邑县| 遂昌县| 汶上县| 濉溪县| 旬阳县| 新巴尔虎右旗| 湄潭县| 呼玛县| 隆尧县| 六盘水市| 六盘水市| 准格尔旗| 若羌县| 甘孜县| 江川县| 陆丰市| 武胜县| 呼伦贝尔市| 武穴市| 九龙城区|