C/C++編程筆記:飛翔的小鳥(Flappy Bird)——C語(yǔ)言版本
C語(yǔ)言游戲教學(xué)項(xiàng)目,有C基礎(chǔ)和對(duì)小游戲感興趣的可以看看,做出來(lái)成就感爆棚~

使用的編譯器是VS2013,圖片素材,可以自己百度尋找素材圖片,也可以在主頁(yè)群領(lǐng)取哦~
效果圖:

話不多說,接下來(lái)就奉上我們的源碼了(寫的時(shí)候包含了一些筆者的注釋,勿怪勿怪):
/*
1.創(chuàng)建一個(gè)可視化窗口
2.顯示一張背景圖
*/
#include <graphics.h>
#include <stdlib.h>
#include <conio.h>
#include <stdio.h>
#include <time.h>
#include <mmsystem.h>
#pragma comment(lib,"winmm.lib")
/*
stdlib.h? : Sleep
stdio.h ? : C語(yǔ)言頭文件
conio.h ? : _getch()
graphics.h: 圖形庫(kù)頭文件
寫的時(shí)候報(bào)錯(cuò),需要安裝
*/
int main()
{
//288*608
srand((unsigned int)time(NULL));
initgraph(288, 608);
struct 柱子 pillar[3];
for (int i = 0; i < 3; i++)
{
initPillar(pillar, i);
//讓柱子之間有差距
pillar[i].x = 288 + i * 150;
}
loadResource();
while (1)
{
putimage(0, 0, &background);
drawBird(flyBird.x, flyBird.y);
flyBird.y += 10;
for (int i = 0; i < 3; i++)
{
pillar[i].x -= 10;
if (pillar[i].x < (-52 - 150))
{
initPillar(pillar, i);
}
}
for (int i = 0; i < 3; i++)
{
drawPillar(pillar[i]);
}
//一定要先判斷按鍵是否按下
if (_kbhit())
{
keyDown();
}
if (hitFloor())
{
actionGameOver();
break;
}
Sleep(50);
}
closegraph();
return 0;
}
IMAGE background;
IMAGE myBird[2]; //鳥有兩張 myBird[0] myBird[1]
IMAGE overImg[2];
IMAGE down[2];
IMAGE up[2];
//鳥的屬性
struct 鳥
{
int x;
int y;
int speed; //上跳速度
};
struct 鳥 flyBird = { 124, 0, 100 };
struct 柱子
{
int x; //上面柱子的起始坐標(biāo)
int y;
int h; //上面柱子顯示的高度
};
//加載資源
void loadResource()
{
loadimage(&background, "background.bmp");
loadimage(&myBird[0], "birdy.bmp", 48, 48);
loadimage(&myBird[1], "bird.bmp", 48, 48);
loadimage(&overImg[0], "endy.bmp");
loadimage(&overImg[1], "end.bmp");
loadimage(&down[0], "downy.bmp");
loadimage(&down[1], "down.bmp");
loadimage(&up[0], "upy.bmp");
loadimage(&up[1], "up.bmp");
}
//畫鳥--->透明貼圖技術(shù)
void drawBird(int x, int y)
{
//SRCAND方式貼掩碼圖
putimage(x, y, &myBird[0], SRCAND);
//SRCPAINT 方式貼背景圖
putimage(x, y, &myBird[1], SRCPAINT);
}
//多線程
DWORD WINAPI playMusic(LPVOID lpParamer)
{
mciSendString("open jump.mp3", 0, 0, 0);
mciSendString("play jump.mp3 wait", 0, 0, 0);
mciSendString("close jump.mp3", 0, 0, 0);
return 0;
}
//應(yīng)用技術(shù)-->所有編程行業(yè)通用
//沒有學(xué)的同學(xué),想辦法去拓展一下
//并發(fā)編程,網(wǎng)絡(luò)編程,數(shù)據(jù)庫(kù)編程
//鳥的按鍵處理
void keyDown()
{
/*
mciSendString("指令",0,0,0);
指令:
open:打開
play:播放
pause:暫停
wait:等待
stop:停止
close:關(guān)閉
*/
char userKey = _getch(); //_getch();
switch (userKey)
{
case ' ':
flyBird.y -= flyBird.speed;
CreateThread(NULL, NULL, playMusic, NULL, NULL, NULL);
break;
default:
break;
}
}
int? hitFloor()
{
if (flyBird.y <= 0 || flyBird.y >= (608 - 96))
return 1;
return 0;
}
void actionGameOver()
{
//結(jié)束圖片初始位置
int? x = 50;
int y = 608;
while (y >= 240)
{
putimage(0, 0, &background);
putimage(x, y, &overImg[0], SRCAND);
putimage(x, y, &overImg[1], SRCPAINT);
y -= 50;
Sleep(50);
}
Sleep(5000);
}
void? initPillar(struct 柱子 pillar[], int i)
{
pillar[i].h = rand() % 100 + 160; //[160,259];
pillar[i].x = 288;
pillar[i].y = 0;
}
void drawPillar(struct 柱子 pillar)
{
//上面的柱子
putimage(pillar.x, 0, 52, pillar.h, &down[0], 0, 320 - pillar.h, SRCAND);
putimage(pillar.x, 0, 52, pillar.h, &down[1], 0, 320 - pillar.h, SRCPAINT);
//下面那根柱子
putimage(pillar.x, 512 - (320 - pillar.h), 52, 320 - pillar.h, &up[0], 0, 0, SRCAND);
putimage(pillar.x, 512 - (320 - pillar.h), 52, 320 - pillar.h, &up[1], 0, 0, SRCPAINT);
}
//小作業(yè):
//碰上面柱子的求解
//碰下面柱子的柱子
最后呢,筆者將剩下了這兩部分源碼給去掉了,目的想必大家也知道,可不要直接照著源碼敲,而不自己去理解哦!你們應(yīng)該學(xué)著自己去理解這個(gè)小游戲,然后呢,自己寫出剩下的部分哦!希望我們能夠在學(xué)習(xí)C語(yǔ)言C++的路上越走越遠(yuǎn),共勉!

另外,UP在主頁(yè)上傳了一些學(xué)習(xí)C/C++編程的視頻教程(含C語(yǔ)言全套視頻以及本文章教學(xué)視頻),有興趣或者正在學(xué)習(xí)的小伙伴一定要去看一看哦!會(huì)對(duì)你有幫助的~