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

C語言 風靡一時的黃金礦工游戲?qū)崿F(xiàn)流程詳解

 更新時間:2021年11月19日 10:55:12   作者:MAX在碼字  
《黃金礦工》是一款非常經(jīng)典的游戲。在游戲中,玩家通過不斷挖礦,獲取金子,最終能夠闖入下一關(guān)。在這個過程中,會不斷有巖石、煙霧、老鼠來搗亂,甚至還會出現(xiàn)扛著炸藥包的小老鼠,玩家必須戰(zhàn)勝它們,才能進入更深的礦坑

游戲的玩法主要是通過不斷采集地下的黃金和鉆石,來得到更高的積分。只有完成任務(wù)目標,才可以通過相應(yīng)的關(guān)卡。游戲畫面中沙灘上的人物便是玩家的角色,下方深褐色的部分是地下,而黃金和鉆石就是玩家需要采集的物品。人物右邊的四個方框里的物品是游戲中可以使用的道具。 畫面中的虛線就是游戲中的探測器,探測器會不斷的左右擺動,當擺動到地下的黃金和鉆石的位置時,只需要點擊礦坑任意處,便可以發(fā)射勘探頭采集到這些物品,當然一定要瞄準好再出手呦。

黃金礦工

當然想要順利采集到豐富的資源也不是那么簡單的,地下礦坑中,會有各式各樣的困難和阻礙來干擾玩家的采集,這時我們就要用到人物右邊的各種道具了,當?shù)V坑中采集到石塊的時候,玩家可以使用炸藥棒來炸毀這些石塊。當?shù)V坑中有大量石塊阻礙玩家的采集時,這時就可以用炸彈來拖拽到礦坑中石塊群的位置,會一次性炸毀所有礙事的石塊。當?shù)V坑中煙霧桶被引爆后,看不清地下情況的時候,我們可以使用電風扇,它會把所有的煙霧都吹散,讓玩家可以清楚的徹底看清礦坑的分布。礦坑中不時也會有小老鼠來搗亂,不用擔心,我們有老鼠藥來對付這些小東西,只要把老鼠藥拖拽到老鼠所在的位置,就會瞬間消滅這些小麻煩,讓玩家更順利的采集到想要得到的資源。 緊張刺激的對戰(zhàn),輕松有趣的玩法,豐富多樣的道具,還有精美細致的畫面,這就是我們今天要完成的項目《黃金礦工》

在此之前呢,和大家說明一下,因為這是一個比較大的項目了,所以展示所有代碼會有些困難,從中還要數(shù)據(jù)庫的參與,所以我裁剪了主要部分的代碼,主要目的的讓大家明白實現(xiàn)這個項目的難點以及邏輯思路,希望大家可以理解

好了,話不多說,開始了

首先我們先創(chuàng)建一個頭文件,把一些結(jié)構(gòu)體以及枚舉類型的函數(shù)放進去,這樣會讓整個項目看起來更加有序,更好理解,先把枚舉類型放進去

enum ATTR
{
	//圖片對應(yīng)的數(shù)組下標
	i_gold=1,
	i_money=3,
	i_role=5,
	i_stone=9,
	i_bk= i_stone+1,
	//窗口尺寸
	WIDTH = 1080,
	HEIGHT= 640,
	//物品數(shù)量
	MINE_NUM=10,
}; 
enum TYPE
{
	//物品類型
	GOLD,	//金塊
	MONEY,	//錢袋
	STONE,	//石頭
	//擺動方向
	LEFT,
	RIGHT,
	//擺動狀態(tài)
	M_LONG,
	M_NORMAL,
	M_SHORT,
 
};

之后把我們的老朋友結(jié)構(gòu)體也放進去

struct Role
{
	int x;		//貼圖的位置
	int y;
	int width;//圖片寬度和高度
	int height;
	int coin;//金幣
};
struct Mine //物品
{
	int x;
	int y;
	int size;//用來計算碰撞
	int flag;//物品是否存在
	int type;//物品類型,錢袋,石頭,金塊
	int gold;//價值
};
//鉤子
struct Hook
{
	double x;//繩子開始坐標,固定不變的
	double y;
	double endx;//末端變化的坐標
	double endy;
	int len;//繩子長度
	int dir;//擺動方向
	double angle;//擺動角度
	double speed;//速度
	double vx;//速度分量
	double vy;
	int swing;//是否在擺動
	int state;//伸長狀態(tài),伸長,正常,縮短
	int index;//抓到的物品下標
};

OK,接下來就是我們的主要函數(shù)main.Cpp了,記得開始的時候加上我們寫的頭文件,先寫初始化函數(shù)

void GameInit()
{
	//初始化隨機數(shù)種子
	srand(GetTickCount());
	//初始化角色數(shù)據(jù)
	role.coin = 0;
	role.width = 140;
	role.height = 120;
	role.x = WIDTH / 2 - role.width / 2;//讓角色圖片居中顯示
	role.y = 0;
	//加載圖片
	for (int i = 0; i < 10; i++)
	{
		char fileName[20];
		sprintf(fileName, "./images/%d.jpg", i);
		if (i <= 1)
		{
			loadimage(&img[i], fileName,73,62);
		}
		else
		{
			loadimage(&img[i], fileName);
		}	
	}
	loadimage(&img[i_bk], "./images/bk.jpg",WIDTH,HEIGHT-role.height);
	//初始化物品
	for (int i = 0; i < MINE_NUM; i++)
	{
		mine[i].flag = 1;
		mine[i].size = 60;
		mine[i].type = rand() % 3;
		mine[i].x=rand()%(WIDTH-mine[i].size);
		mine[i].y=rand()%(HEIGHT-role.height-100)+ role.height+ 50;
		mine[i].gold = rand()%600+rand()%200;
	}
	//初始化鉤子
	hook.x = role.x+45;
	hook.y = role.y+100;
	hook.len = 50;
	hook.endx = hook.x;
	hook.endy=hook.y+hook.len;
	hook.angle = 0.0;
	hook.dir = RIGHT;
	hook.state = M_NORMAL;
	hook.vx = 0;
	hook.vy = 0;
	hook.speed = 5.0;
	hook.index = -1;
}

再寫我們的繪制函數(shù),這個比較簡單,就是貼圖

void Gamedraw()
{
	BeginBatchDraw();
	//設(shè)置背景顏色
	setbkcolor(GREEN);
	cleardevice();
	putimage(0, role.height, &img[i_bk]);
	//透明貼圖 兩張圖片,一張掩碼圖,一張原圖
	putimage(role.x, role.y, &img[i_role-1],SRCAND);//掩碼圖
	putimage(role.x, role.y, &img[i_role],SRCPAINT);//原圖
		//繪制鉤子
	setlinestyle(PS_SOLID, 5);
	setlinecolor(BROWN);
	line(hook.x, hook.y, hook.endx, hook.endy);
	//繪制物品
	for (int i = 0; i < MINE_NUM; i++)
	{
		if (mine[i].flag)
		{
			switch (mine[i].type)
			{
			case GOLD:
				putimage(mine[i].x, mine[i].y, &img[i_gold-1],SRCAND);
				putimage(mine[i].x, mine[i].y, &img[i_gold],SRCPAINT);
				break;
			case MONEY:
				putimage(mine[i].x, mine[i].y, &img[i_money-1], SRCAND);
				putimage(mine[i].x, mine[i].y, &img[i_money], SRCPAINT);
				break;
			case STONE:
				putimage(mine[i].x, mine[i].y, &img[i_stone-1], SRCAND);
				putimage(mine[i].x, mine[i].y, &img[i_stone], SRCPAINT);
				break;
			}
		}
	}
	//繪制分數(shù)
	char s[30];
	sprintf(s, "金幣:%d", role.coin);
	settextstyle(50, 0, "黑體");
	outtextxy(50, 50, s);
	EndBatchDraw();
}

鉤子擺動的函數(shù),鉤子該如何的擺,主要是讓他不要往天上擺就行

//鉤子擺動
void hookRock()
{
	if (hook.state == M_NORMAL)
	{
		if (hook.dir == RIGHT)
		{
			hook.angle++;
		}
		else
		{
			hook.angle--;
		}
		if (hook.angle > 80)
		{
			hook.dir = LEFT;
		}
		else if (hook.angle < -80)
		{
			hook.dir = RIGHT;
		}
		hook.endx = hook.x + sin(π / 180 * hook.angle) * hook.len;
		hook.endy = hook.y + cos(π / 180 * hook.angle) * hook.len;
	}
}
int distance(struct Hook hook)
{
	double dis=sqrt((hook.x-hook.endx)* (hook.x - hook.endx) + (hook.y-hook.endy) * (hook.y - hook.endy));
	return dis <= hook.len;
}
void keyControl()
{
	//按空格伸長
	if (GetAsyncKeyState(VK_SPACE) && hook.state == M_NORMAL)
	{
		hook.state = M_LONG;
		hook.vx = sin(π / 180 * hook.angle) * hook.speed;
		hook.vy = cos(π / 180 * hook.angle) * hook.speed;
	}
 
	if (hook.endx <= 0 || hook.endx >= WIDTH || hook.endy >= HEIGHT)
	{
		hook.state = M_SHORT;
	}	
	if (hook.state == M_LONG)
	{
		hook.endx += hook.vx;
		hook.endy += hook.vy;
	}
	else if (hook.state == M_SHORT)
	{
		hook.endx -= hook.vx;
		hook.endy -= hook.vy;
		//如果縮短到原來的長度,就停止縮短,判斷起點和末端的距離是否等于,長度
		if (distance(hook))
		{
			hook.state = M_NORMAL;
		}
	}
}

接下來是我們的抓取函數(shù),也是比較簡單

​
void grap()
{
	//找到抓取的是哪個物品
	for (int i = 0; i < MINE_NUM; i++)
	{
		if (mine[i].flag &&
			hook.endx > mine[i].x && hook.endx<mine[i].x + mine[i].size &&
			hook.endy>mine[i].y && hook.endy < mine[i].y + mine[i].size)
		{
			hook.index = i;//保存抓到的物品的下標
			break;
		}
	}
	if (hook.index != -1)
	{
		hook.state = M_SHORT;
		mine[hook.index].x = hook.endx-mine[hook.index].size/2;
		mine[hook.index].y = hook.endy- mine[hook.index].size / 2;
		if (distance(hook))
		{
			hook.state = M_NORMAL;
			mine[hook.index].flag = 0;
			role.coin += mine[hook.index].gold;
			hook.state = M_NORMAL;
			hook.index = -1;
		}
	}
}
 
​

最后是我們的主函數(shù)

int main()
{
	initgraph(WIDTH,HEIGHT,1);
	GameInit();
 
	while (1)
	{
		printf("%lf,%lf vxy(%lf,%lf)\n", hook.endx, hook.endy,hook.vx,hook.vy);
		hookRock();
		Gamedraw();
		keyControl();   
		grap();
	}
	closegraph();
	return 0;
}

這就是我們《黃金礦工》的主要代碼了,有人會問了,好像也不多呀,從代碼上看確實還好,但這個項目牽扯的東西有點多,包括數(shù)據(jù)庫,考慮到有些同學(xué)看不懂我就不放在這里了,有興趣的同學(xué)可以進去領(lǐng)取源碼之后自己學(xué)習,最后想說的是,寫游戲項目其實還好,主要是理清初始化函數(shù)以及更新函數(shù),包裝起來就很好理解了,好啦,希望大家可以在這里得到自己想要的知識以及快樂吧,也希望大家可以給UP主一個關(guān)注,非常感謝大家了?。?!

到此這篇關(guān)于C語言 風靡一時的黃金礦工游戲?qū)崿F(xiàn)流程詳解的文章就介紹到這了,更多相關(guān)C語言 黃金礦工內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

您可能感興趣的文章:

相關(guān)文章

  • 深入解讀C++中的指針變量

    深入解讀C++中的指針變量

    這篇文章主要介紹了深入解讀C++中的指針變量,是C語言入門學(xué)習中的基礎(chǔ)知識,需要的朋友可以參考下
    2015-09-09
  • Qt Creator + CMake 構(gòu)建教程的方法步驟

    Qt Creator + CMake 構(gòu)建教程的方法步驟

    本文主要介紹了Qt Creator + CMake 構(gòu)建教程的方法步驟,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習或者工作具有一定的參考學(xué)習價值,需要的朋友們下面隨著小編來一起學(xué)習學(xué)習吧
    2025-02-02
  • C++定制刪除器與特殊類設(shè)計(餓漢和懶漢)

    C++定制刪除器與特殊類設(shè)計(餓漢和懶漢)

    這篇文章主要給大家介紹了關(guān)于C++定制刪除器與特殊類設(shè)計的相關(guān)資料,使用餓漢模式和懶漢模式,文中通過實例代碼介紹的非常詳細,需要的朋友可以參考下
    2023-07-07
  • C++實現(xiàn)LeetCode(115.不同的子序列)

    C++實現(xiàn)LeetCode(115.不同的子序列)

    這篇文章主要介紹了C++實現(xiàn)LeetCode(115.不同的子序列),本篇文章通過簡要的案例,講解了該項技術(shù)的了解與使用,以下就是詳細內(nèi)容,需要的朋友可以參考下
    2021-07-07
  • 詳解C++中四種類型的轉(zhuǎn)換

    詳解C++中四種類型的轉(zhuǎn)換

    這篇文章主要是想和大家一起聊聊來C++中的四種類型轉(zhuǎn)換?:const_cast、static_cast、reinterpret_cast和dynamic_cast,感興趣的可以了解一下
    2022-12-12
  • 獲取本地網(wǎng)卡適配器信息具體代碼

    獲取本地網(wǎng)卡適配器信息具體代碼

    這篇文章主要介紹了獲取本地網(wǎng)卡適配器信息具體代碼,有需要的朋友可以參考一下
    2013-12-12
  • 深入了解C語言的動態(tài)內(nèi)存管理

    深入了解C語言的動態(tài)內(nèi)存管理

    所謂動態(tài)和靜態(tài)就是指內(nèi)存的分配方式。動態(tài)內(nèi)存是指在堆上分配的內(nèi)存,而靜態(tài)內(nèi)存是指在棧上分配的內(nèi)存,本文將用5600字帶你深入了解動態(tài)內(nèi)存管理,感興趣的可以學(xué)習一下
    2022-07-07
  • C++11中模板隱式實例化與顯式實例化的定義詳解分析

    C++11中模板隱式實例化與顯式實例化的定義詳解分析

    實例化是為在程序中的函數(shù)模板本身并不會生成函數(shù)定義,它只是一個用于生成函數(shù)定義的方案。編譯器使用模板為特定類型生成函數(shù)定義時,得到的是模板實例。這即是函數(shù)模板的實例化。而函數(shù)模板實例化又分為兩種類型:隱式實例化和顯式實例化
    2022-04-04
  • C語言中經(jīng)socket接收數(shù)據(jù)的相關(guān)函數(shù)詳解

    C語言中經(jīng)socket接收數(shù)據(jù)的相關(guān)函數(shù)詳解

    這篇文章主要介紹了C語言中經(jīng)socket接收數(shù)據(jù)的相關(guān)函數(shù)詳解,分別為recv()函數(shù)和recvfrom()函數(shù)以及recvmsg()函數(shù)的使用,需要的朋友可以參考下
    2015-09-09
  • 一篇文章帶你入門C語言:操作符

    一篇文章帶你入門C語言:操作符

    這篇文章主要介紹了C語言中的運算符,文中講解非常詳細,適合初學(xué)小白進行學(xué)習,想入門C語言的朋友不妨了解下,希望能給你帶來幫助
    2021-08-08

最新評論

顺义区| 中西区| 双鸭山市| 泸州市| 北京市| 磐石市| 周至县| 霍邱县| 定远县| 昭平县| 平武县| 成安县| 和平县| 浦东新区| 侯马市| 沾化县| 吉林市| 调兵山市| 万宁市| 肥城市| 乌苏市| 曲阜市| 永年县| 滦平县| 东山县| 安龙县| 广南县| 黄大仙区| 富蕴县| 金昌市| 库尔勒市| 宁城县| 阿拉善盟| 锦州市| 乐山市| 赤水市| 资中县| 湄潭县| 濮阳市| 武汉市| 永吉县|