C語言遊戲項目球球大作戰實現流程
序
時間在流去,我們在長大
嗨,這裡是狐貍~~
今天是2022年1月11日,今天突然發現好久沒有給你們更新項目瞭,今天來教大傢一個新的項目,一個遊戲項目——球球大作戰。
球球大作戰在宇宙深處一片遍佈著荊棘之花的神秘星雲中,生活著一群名叫“波拉哩”(譯名“球球”)的奇特生物。他們外表萌萌,卻有著勇敢的心。他們是天生的戰鬥種族,為戰鬥而生,為戰鬥而亡。
傳說中,這群波拉哩的共同祖先是一隻叫“塔坦”的超級波拉哩,塔坦的職責就是守護宇宙瑰寶“荊棘之花”,它擁有強大的能量,會分出分身,變化萬物,唯一的弱點就是貪吃。
一天,塔坦終於禁不住誘惑,偷食瞭“荊棘之花”,結果身體爆裂,成為瞭數以億計的小波拉哩。從此,波拉哩的族群就受到瞭貪食的詛咒,隻能在這片星雲中無休止的戰鬥,如果停止戰鬥,生命便會流失,消亡在茫茫的星空之中。在漫漫的歷史長河裡,隻有最強大的波拉哩才能沖過這片黑暗星雲,打破命運的枷鎖,去尋找那傳說中的光明與和平。
為瞭那甜蜜的希望,波拉哩們戰鬥著。他們必須奮力奔跑,讓自己變大變大再變大,才能對抗比自己更強的存在。哪怕經歷無數失敗也必須重新凝聚力量,直到成為最強壯的那個。
項目代碼
直接進入代碼階段吧,大傢認真觀看。
1、結構體
struct Ball //小球結構,玩傢,食物,人工智障 { int x; int y; int r;//半徑 DWORD color;//顏色 bool flag;//是否存在 }; int score = 0;//分數 struct Ball food[FOOD_NUM]; struct Ball player;//玩傢 struct Ball ai[AI_NUM];
2、初始化
void GameInit() { //播放背景音樂 mciSendString("open ./BallBGM.mp3 alias BGM", 0, 0, 0); //mciSendString("play BGM repeat", 0, 0, 0); //設置隨機數種子 時間是在不斷的變化的 srand((unsigned)time(NULL)); //找到每一個元素 for (int i = 0; i < FOOD_NUM; i++) { food[i].x = rand() % WIDTH; food[i].y = rand() % HEIGHT; food[i].flag = true;//剛開始食物是存在的,沒有被吃掉 food[i].r = rand() % 6 + 1; food[i].color = RGB(rand() % 256, rand() % 256, rand() % 256); } //初始化玩傢數據 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、繪制函數
void GameDraw() { //防止閃屏 BeginBatchDraw(); setbkcolor(WHITE); cleardevice();//清屏 for (int i = 0; i < FOOD_NUM; i++) { if (food[i].flag) { setfillcolor(food[i].color);//設置填充顏色 solidcircle(food[i].x, food[i].y, food[i].r);//畫一個填充圓 } else { food[i].x = rand() % WIDTH; food[i].y = rand() % HEIGHT; food[i].flag = true;//剛開始食物是存在的,沒有被吃掉 food[i].r = rand() % 6 + 1; food[i].color = RGB(rand() % 256, rand() % 256, rand() % 256); } } //繪制玩傢 setfillcolor(player.color);//設置填充顏色 solidcircle(player.x, player.y, player.r); settextcolor(GREEN); settextstyle(30, 0, "黑體"); setbkmode(0);//設置文字背景透明 outtextxy(player.x-50, player.y, "我是最亮的崽"); //輸出分數 settextcolor(BLACK); char str[20]; sprintf(str,"分數:%d",score);//格式化字符串 outtextxy(20, 20, str); //繪制ai for (int i = 0; i < AI_NUM; i++) { if (ai[i].flag) { setfillcolor(ai[i].color);//設置填充顏色 solidcircle(ai[i].x, ai[i].y, ai[i].r);//畫一個填充圓 } } EndBatchDraw(); }
4、玩傢控制函數
void keyControl(int speed) { //獲取鍵盤消息,按得是哪一個鍵 _getch(); GetAsyncKeyState() windows系統函數 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、吃食物函數
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、電腦移動函數
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、主函數
int main(int argc,char *agv[]) { initgraph(WIDTH, HEIGHT); GameInit(); while (1) { keyControl(1); GameDraw(); eatFood(); aiMove(); } getchar(); return 0; }
總結
OK,簡單總結一下下,距離上次給大傢分享項目好像已經過去很久瞭,今天的這個項目希望大傢可以認真的去試試,難度不大,這個項目暫時是個單機版的,大傢可以增加玩傢聯機對戰也是可以的,畫風也比較簡單,這些都是可以自己去優化的,好叭,今天就到這裡瞭哈。後續我還會發佈更多的項目源或者學習資料,希望大傢可以持續關註。
視頻講解
今天沒有效果展示,emmmm,有很大原因是因為那個錄制有點麻煩,有興趣的同學可以去看視頻講解,上面有詳細的代碼講解,大傢可以認真觀看
https://www.bilibili.com/video/BV1Yu41127E4/
到此這篇關於C語言遊戲項目球球大作戰實現流程的文章就介紹到這瞭,更多相關C語言 球球大作戰內容請搜索WalkonNet以前的文章或繼續瀏覽下面的相關文章希望大傢以後多多支持WalkonNet!