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

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

當(dāng)然想要順利采集到豐富的資源也不是那么簡單的,地下礦坑中,會(huì)有各式各樣的困難和阻礙來干擾玩家的采集,這時(shí)我們就要用到人物右邊的各種道具了,當(dāng)?shù)V坑中采集到石塊的時(shí)候,玩家可以使用炸藥棒來炸毀這些石塊。當(dāng)?shù)V坑中有大量石塊阻礙玩家的采集時(shí),這時(shí)就可以用炸彈來拖拽到礦坑中石塊群的位置,會(huì)一次性炸毀所有礙事的石塊。當(dāng)?shù)V坑中煙霧桶被引爆后,看不清地下情況的時(shí)候,我們可以使用電風(fēng)扇,它會(huì)把所有的煙霧都吹散,讓玩家可以清楚的徹底看清礦坑的分布。礦坑中不時(shí)也會(huì)有小老鼠來搗亂,不用擔(dān)心,我們有老鼠藥來對付這些小東西,只要把老鼠藥拖拽到老鼠所在的位置,就會(huì)瞬間消滅這些小麻煩,讓玩家更順利的采集到想要得到的資源。 緊張刺激的對戰(zhàn),輕松有趣的玩法,豐富多樣的道具,還有精美細(xì)致的畫面,這就是我們今天要完成的項(xiàng)目《黃金礦工》
在此之前呢,和大家說明一下,因?yàn)檫@是一個(gè)比較大的項(xiàng)目了,所以展示所有代碼會(huì)有些困難,從中還要數(shù)據(jù)庫的參與,所以我裁剪了主要部分的代碼,主要目的的讓大家明白實(shí)現(xiàn)這個(gè)項(xiàng)目的難點(diǎn)以及邏輯思路,希望大家可以理解
好了,話不多說,開始了
首先我們先創(chuàng)建一個(gè)頭文件,把一些結(jié)構(gòu)體以及枚舉類型的函數(shù)放進(jìn)去,這樣會(huì)讓整個(gè)項(xiàng)目看起來更加有序,更好理解,先把枚舉類型放進(jìn)去
enum ATTR
{
//圖片對應(yīng)的數(shù)組下標(biāo)
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, //石頭
//擺動(dòng)方向
LEFT,
RIGHT,
//擺動(dòng)狀態(tài)
M_LONG,
M_NORMAL,
M_SHORT,
};
之后把我們的老朋友結(jié)構(gòu)體也放進(jìn)去
struct Role
{
int x; //貼圖的位置
int y;
int width;//圖片寬度和高度
int height;
int coin;//金幣
};
struct Mine //物品
{
int x;
int y;
int size;//用來計(jì)算碰撞
int flag;//物品是否存在
int type;//物品類型,錢袋,石頭,金塊
int gold;//價(jià)值
};
//鉤子
struct Hook
{
double x;//繩子開始坐標(biāo),固定不變的
double y;
double endx;//末端變化的坐標(biāo)
double endy;
int len;//繩子長度
int dir;//擺動(dòng)方向
double angle;//擺動(dòng)角度
double speed;//速度
double vx;//速度分量
double vy;
int swing;//是否在擺動(dòng)
int state;//伸長狀態(tài),伸長,正常,縮短
int index;//抓到的物品下標(biāo)
};
OK,接下來就是我們的主要函數(shù)main.Cpp了,記得開始的時(shí)候加上我們寫的頭文件,先寫初始化函數(shù)
void GameInit()
{
//初始化隨機(jī)數(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ù),這個(gè)比較簡單,就是貼圖
void Gamedraw()
{
BeginBatchDraw();
//設(shè)置背景顏色
setbkcolor(GREEN);
cleardevice();
putimage(0, role.height, &img[i_bk]);
//透明貼圖 兩張圖片,一張掩碼圖,一張?jiān)瓐D
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;
}
}
}
//繪制分?jǐn)?shù)
char s[30];
sprintf(s, "金幣:%d", role.coin);
settextstyle(50, 0, "黑體");
outtextxy(50, 50, s);
EndBatchDraw();
}
鉤子擺動(dòng)的函數(shù),鉤子該如何的擺,主要是讓他不要往天上擺就行
//鉤子擺動(dòng)
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;
//如果縮短到原來的長度,就停止縮短,判斷起點(diǎn)和末端的距離是否等于,長度
if (distance(hook))
{
hook.state = M_NORMAL;
}
}
}
接下來是我們的抓取函數(shù),也是比較簡單
void grap()
{
//找到抓取的是哪個(gè)物品
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;//保存抓到的物品的下標(biāo)
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;
}
這就是我們《黃金礦工》的主要代碼了,有人會(huì)問了,好像也不多呀,從代碼上看確實(shí)還好,但這個(gè)項(xiàng)目牽扯的東西有點(diǎn)多,包括數(shù)據(jù)庫,考慮到有些同學(xué)看不懂我就不放在這里了,有興趣的同學(xué)可以進(jìn)去領(lǐng)取源碼之后自己學(xué)習(xí),最后想說的是,寫游戲項(xiàng)目其實(shí)還好,主要是理清初始化函數(shù)以及更新函數(shù),包裝起來就很好理解了,好啦,希望大家可以在這里得到自己想要的知識(shí)以及快樂吧,也希望大家可以給UP主一個(gè)關(guān)注,非常感謝大家了?。?!

到此這篇關(guān)于C語言 風(fēng)靡一時(shí)的黃金礦工游戲?qū)崿F(xiàn)流程詳解的文章就介紹到這了,更多相關(guān)C語言 黃金礦工內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
C++11中列表初始化機(jī)制的概念與實(shí)例詳解
在我們實(shí)際編程中,我們經(jīng)常會(huì)碰到變量初始化的問題,對于不同的變量初始化的手段多種多樣,下面這篇文章主要給大家介紹了關(guān)于C++11中列表初始化機(jī)制的相關(guān)資料,需要的朋友可以參考下2021-11-11
C++實(shí)現(xiàn)LeetCode(93.復(fù)原IP地址)
這篇文章主要介紹了C++實(shí)現(xiàn)LeetCode(93.復(fù)原IP地址),本篇文章通過簡要的案例,講解了該項(xiàng)技術(shù)的了解與使用,以下就是詳細(xì)內(nèi)容,需要的朋友可以參考下2021-07-07
Qt實(shí)現(xiàn)定時(shí)器的兩種方法分享
這篇文章主要為大家詳細(xì)介紹了Qt中實(shí)現(xiàn)定時(shí)器的兩種不同方法,文中的示例代碼講解詳細(xì),對我們了解Qt有一定的幫助,感興趣的可以跟隨小編一起學(xué)習(xí)一下2022-11-11

