C语言游戏教学项目,有C基础和对小游戏感兴趣的可以看看,做出来成就感爆棚~
使用的编译器是VS2013,图片素材,可以自己百度寻找素材图片。
话不多说,接下来就奉上我们的源码了(写的时候包含了一些笔者的注释,勿怪勿怪):
/*
1.创建一个可视化窗口
2.显示一张背景图
*/
#include
#include
#include
#include
#include
#include
#pragma comment(lib,"winmm.lib")
/*
stdlib.h : Sleep
stdio.h : C语言头文件
conio.h : _getch()
graphics.h: 图形库头文件
写的时候报错,需要安装
*/
int main()
{
//288*608
srand((unsigned int)time(NULL));
initgraph(288, 608);
struct 柱子 pillar[3];
for (int i = 0; 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
{
pillar[i].x -= 10;
if (pillar[i].x
{
initPillar(pillar, i);
}
}
for (int i = 0; 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;//上面柱子的起始坐标
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");
}
//画鸟--->透明贴图技术
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;
}
//应用技术-->所有编程行业通用
//没有学的同学,想办法去拓展一下
//并发编程,网络编程,数据库编程
//鸟的按键处理
void keyDown()
{
/*
mciSendString("指令",0,0,0);
指令:
open:打开
play:播放
pause:暂停
wait:等待
stop:停止
close:关闭
*/
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 = (608 - 96))
return 1;
return 0;
}
void actionGameOver()
{
//结束图片初始位置
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);
}
//小作业:
//碰上面柱子的求解
//碰下面柱子的柱子
效果图:
最后呢,笔者将剩下了这两部分源码给去掉了,目的想必大家也知道,可不要直接照着源码敲,而不自己去理解哦!你们应该学着自己去理解这个小游戏,然后呢,自己写出剩下的部分哦!希望我们能够在学习C语言C++的路上越走越远,共勉!