C語(yǔ)言游戲項(xiàng)目球球大作戰(zhàn)實(shí)現(xiàn)流程
序
時(shí)間在流去,我們?cè)陂L(zhǎng)大
嗨,這里是狐貍~~
今天是2022年1月11日,今天突然發(fā)現(xiàn)好久沒(méi)有給你們更新項(xiàng)目了,今天來(lái)教大家一個(gè)新的項(xiàng)目,一個(gè)游戲項(xiàng)目——球球大作戰(zhàn)。
球球大作戰(zhàn)在宇宙深處一片遍布著荊棘之花的神秘星云中,生活著一群名叫“波拉哩”(譯名“球球”)的奇特生物。他們外表萌萌,卻有著勇敢的心。他們是天生的戰(zhàn)斗種族,為戰(zhàn)斗而生,為戰(zhàn)斗而亡。
傳說(shuō)中,這群波拉哩的共同祖先是一只叫“塔坦”的超級(jí)波拉哩,塔坦的職責(zé)就是守護(hù)宇宙瑰寶“荊棘之花”,它擁有強(qiáng)大的能量,會(huì)分出分身,變化萬(wàn)物,唯一的弱點(diǎn)就是貪吃。
一天,塔坦終于禁不住誘惑,偷食了“荊棘之花”,結(jié)果身體爆裂,成為了數(shù)以億計(jì)的小波拉哩。從此,波拉哩的族群就受到了貪食的詛咒,只能在這片星云中無(wú)休止的戰(zhàn)斗,如果停止戰(zhàn)斗,生命便會(huì)流失,消亡在茫茫的星空之中。在漫漫的歷史長(zhǎng)河里,只有最強(qiáng)大的波拉哩才能沖過(guò)這片黑暗星云,打破命運(yùn)的枷鎖,去尋找那傳說(shuō)中的光明與和平。
為了那甜蜜的希望,波拉哩們戰(zhàn)斗著。他們必須奮力奔跑,讓自己變大變大再變大,才能對(duì)抗比自己更強(qiáng)的存在。哪怕經(jīng)歷無(wú)數(shù)失敗也必須重新凝聚力量,直到成為最強(qiáng)壯的那個(gè)。
項(xiàng)目代碼
直接進(jìn)入代碼階段吧,大家認(rèn)真觀看。
1、結(jié)構(gòu)體
struct Ball //小球結(jié)構(gòu),玩家,食物,人工智障 { int x; int y; int r;//半徑 DWORD color;//顏色 bool flag;//是否存在 }; int score = 0;//分?jǐn)?shù) struct Ball food[FOOD_NUM]; struct Ball player;//玩家 struct Ball ai[AI_NUM];
2、初始化
void GameInit() { //播放背景音樂(lè) mciSendString("open ./BallBGM.mp3 alias BGM", 0, 0, 0); //mciSendString("play BGM repeat", 0, 0, 0); //設(shè)置隨機(jī)數(shù)種子 時(shí)間是在不斷的變化的 srand((unsigned)time(NULL)); //找到每一個(gè)元素 for (int i = 0; i < FOOD_NUM; i++) { food[i].x = rand() % WIDTH; food[i].y = rand() % HEIGHT; food[i].flag = true;//剛開(kāi)始食物是存在的,沒(méi)有被吃掉 food[i].r = rand() % 6 + 1; food[i].color = RGB(rand() % 256, rand() % 256, rand() % 256); } //初始化玩家數(shù)據(jù) player.x = rand() % WIDTH; player.y = rand() % HEIGHT; player.r = 18;//只要比最大的食物大就可以了 player.flag = true; player.color= RGB(rand() % 256, rand() % 256, rand() % 256); //初始化ai for (int i = 0; i < AI_NUM; i++) { ai[i].x = rand() % WIDTH; ai[i].y = rand() % HEIGHT; ai[i].r = rand() % 10 + 5; ai[i].flag = true; ai[i].color = RGB(rand() % 256, rand() % 256, rand() % 256); } }
3、繪制函數(shù)
void GameDraw() { //防止閃屏 BeginBatchDraw(); setbkcolor(WHITE); cleardevice();//清屏 for (int i = 0; i < FOOD_NUM; i++) { if (food[i].flag) { setfillcolor(food[i].color);//設(shè)置填充顏色 solidcircle(food[i].x, food[i].y, food[i].r);//畫(huà)一個(gè)填充圓 } else { food[i].x = rand() % WIDTH; food[i].y = rand() % HEIGHT; food[i].flag = true;//剛開(kāi)始食物是存在的,沒(méi)有被吃掉 food[i].r = rand() % 6 + 1; food[i].color = RGB(rand() % 256, rand() % 256, rand() % 256); } } //繪制玩家 setfillcolor(player.color);//設(shè)置填充顏色 solidcircle(player.x, player.y, player.r); settextcolor(GREEN); settextstyle(30, 0, "黑體"); setbkmode(0);//設(shè)置文字背景透明 outtextxy(player.x-50, player.y, "我是最亮的崽"); //輸出分?jǐn)?shù) settextcolor(BLACK); char str[20]; sprintf(str,"分?jǐn)?shù):%d",score);//格式化字符串 outtextxy(20, 20, str); //繪制ai for (int i = 0; i < AI_NUM; i++) { if (ai[i].flag) { setfillcolor(ai[i].color);//設(shè)置填充顏色 solidcircle(ai[i].x, ai[i].y, ai[i].r);//畫(huà)一個(gè)填充圓 } } EndBatchDraw(); }
4、玩家控制函數(shù)
void keyControl(int speed) { //獲取鍵盤(pán)消息,按得是哪一個(gè)鍵 _getch(); GetAsyncKeyState() windows系統(tǒng)函數(shù) if ((GetAsyncKeyState('W') || GetAsyncKeyState(VK_UP)) && player.y >= 0)//按了上鍵 y不能小于0 { player.y -= speed; } if ((GetAsyncKeyState('S') || GetAsyncKeyState(VK_DOWN)) && player.y <= HEIGHT)//按了下鍵 { player.y += speed; } if ((GetAsyncKeyState('A') || GetAsyncKeyState(VK_LEFT)) && player.x >= 0)//按了左鍵 { player.x -= speed; } if ((GetAsyncKeyState('D') || GetAsyncKeyState(VK_RIGHT)) && player.x <= WIDTH)//按了右鍵 { player.x += speed; } }
5、吃食物函數(shù)
void eatFood() { for (int i = 0; i < FOOD_NUM; i++) { if (food[i].flag && distance(food[i], player) <= player.r) { food[i].flag = false; player.r += food[i].r / 4; score++;//加分 } } }
6、電腦移動(dòng)函數(shù)
void aiMove() { for (int i = 0; i < AI_NUM; i++) { if (ai[i].flag) { ai[i].x += rand() % 5-2;// ?%5={0,1,2,3,4}-2=={-2,-1,0,1,2} ai[i].y += rand() % 5 - 2;//0 } } }
7、主函數(shù)
int main(int argc,char *agv[]) { initgraph(WIDTH, HEIGHT); GameInit(); while (1) { keyControl(1); GameDraw(); eatFood(); aiMove(); } getchar(); return 0; }
總結(jié)
OK,簡(jiǎn)單總結(jié)一下下,距離上次給大家分享項(xiàng)目好像已經(jīng)過(guò)去很久了,今天的這個(gè)項(xiàng)目希望大家可以認(rèn)真的去試試,難度不大,這個(gè)項(xiàng)目暫時(shí)是個(gè)單機(jī)版的,大家可以增加玩家聯(lián)機(jī)對(duì)戰(zhàn)也是可以的,畫(huà)風(fēng)也比較簡(jiǎn)單,這些都是可以自己去優(yōu)化的,好叭,今天就到這里了哈。后續(xù)我還會(huì)發(fā)布更多的項(xiàng)目源或者學(xué)習(xí)資料,希望大家可以持續(xù)關(guān)注。
視頻講解
今天沒(méi)有效果展示,emmmm,有很大原因是因?yàn)槟莻€(gè)錄制有點(diǎn)麻煩,有興趣的同學(xué)可以去看視頻講解,上面有詳細(xì)的代碼講解,大家可以認(rèn)真觀看
https://www.bilibili.com/video/BV1Yu41127E4/
到此這篇關(guān)于C語(yǔ)言游戲項(xiàng)目球球大作戰(zhàn)實(shí)現(xiàn)流程的文章就介紹到這了,更多相關(guān)C語(yǔ)言 球球大作戰(zhàn)內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
C語(yǔ)言實(shí)現(xiàn)學(xué)生管理系統(tǒng)
這篇文章主要為大家詳細(xì)介紹了C語(yǔ)言實(shí)現(xiàn)學(xué)生管理系統(tǒng),文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2020-02-02C/C++高精度運(yùn)算(大整數(shù)運(yùn)算)詳細(xì)講解
高精度算法的本質(zhì)是把大數(shù)拆成若干固定長(zhǎng)度的塊,然后對(duì)每一塊進(jìn)行相應(yīng)的運(yùn)算,下面這篇文章主要給大家介紹了關(guān)于C/C++高精度運(yùn)算(大整數(shù)運(yùn)算)的相關(guān)資料,需要的朋友可以參考下2022-11-11用C語(yǔ)言求解一元二次方程的簡(jiǎn)單實(shí)現(xiàn)
這篇文章主要介紹了用C語(yǔ)言求解一元二次方程的簡(jiǎn)單實(shí)現(xiàn)方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2022-11-11C語(yǔ)言實(shí)現(xiàn)通訊錄的八種功能(添加、刪除、查找、修改、顯示、排序、退出、清空)
本文主要介紹了C語(yǔ)言實(shí)現(xiàn)通訊錄的八種功能,主要包括添加、刪除、查找、修改、顯示、排序、退出、清空,感興趣的可以了解一下2023-09-09c++多線程之死鎖的發(fā)生的情況解析(包含兩個(gè)歸納,6個(gè)示例)
這篇文章主要介紹了c++多線程之死鎖的發(fā)生的情況解析(包含兩個(gè)歸納,6個(gè)示例),需要的朋友可以參考下2018-01-01cocos2dx-3.10 C++實(shí)現(xiàn)滾動(dòng)數(shù)字
這篇文章主要為大家詳細(xì)介紹了cocos2dx-3.10 C++實(shí)現(xiàn)滾動(dòng)數(shù)字效果,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2020-09-09C語(yǔ)言運(yùn)算符深入探究?jī)?yōu)先級(jí)與結(jié)合性及種類
C語(yǔ)言運(yùn)算符號(hào)指的是運(yùn)算符號(hào)。C語(yǔ)言中的符號(hào)分為10類:算術(shù)運(yùn)算符、關(guān)系運(yùn)算符、邏輯運(yùn)算符、位操作運(yùn)算符、賦值運(yùn)算符、條件運(yùn)算符、逗號(hào)運(yùn)算符、指針運(yùn)算符、求字節(jié)數(shù)運(yùn)算符和特殊運(yùn)算符2022-05-05