c语言小游戏 flybird Easyx编程 项目源码讲解
分享一个c语言小游戏可以帮助大家更好的熟悉c语言
这个就是前几年很火的手机小游戏飞行的小鸟
1.游戏流程:小鸟不断下落使用按键让其飞起来不断的穿过两个管子。
2.游戏框架:采用老师提供的框架和重要模块分开编写,使用easyx图形系统。
a.核心算法:使用了坐标的判断,和判断语句的熟练运用。
b.程序调度。
c.透明贴图消除图片的背景方框
d.文件的使用
3.代码优化。
先看一下游戏效果
现在开始上代码
先上流程图
//
//
//flybrid小游戏
// 主要玩法:
// 使用空格键让不断下落的小鸟在管子中间穿梭
// 若碰到了地板,顶部,管子游戏结束
// 保存最高分数#include"head.h"int x = 0;//分数
int max;//最高分IMAGE back;//背景图
IMAGE per;//小鸟图
IMAGE bird1;//小鸟底图
IMAGE up;//管子图
IMAGE down;//管子图
IMAGE lend;//地板图
IMAGE over;//游戏结束图
IMAGE over1;//游戏结束底图
IMAGE began;//开始游戏图
IMAGE began1;//开始游戏底图
IMAGE diff;//困难模式游戏图
IMAGE again1;//重新开始游戏图
IMAGE out;//退出图
IMAGE open;//开机动画的图
//IMAGE again;MOUSEMSG k;//小鸟的结构体
struct Bird {int x; //小鸟的横坐标int y; //小鸟的纵坐标 int speed; //小鸟下坠的高度
}bird = { 100,250,30 }; //初始化//管子的结构体
struct pipe {int x; //管子的横坐标int y; //管子的纵坐标int h; //管子的高度
};//加载资源
void loadRescue() {loadimage(&back, "bg_night.png"); //加载背景图loadimage(&per, "bird.png",30,30); //加载小鸟图loadimage(&bird1, "bird1_1.png", 30, 30);loadimage(&lend, "land.png"); //加载地板图loadimage(&over, "game_over.png"); //加载游戏结束图loadimage(&over1, "text_game_over_1.png"); //加载游戏结束图loadimage(&down, "down.png"); //加载管子图loadimage(&up, "up.png");//加载上管子图loadimage(&began, "button_play.png");//简单模式游戏图//loadimage(&again, "again.png");loadimage(&again1, "again1.png");//重新开始图loadimage(&began, "button_play.png");loadimage(&began1, "button_play_1.png");loadimage(&out, "back.png");}//开始的按钮
void Booton() {Startmove();MOUSEMSG m;//鼠标定义MOUSEMSG g;//loadimage(&back, "bg_night.png"); //加载背景图putimage(0, 0, &back);rectangle(120, 210, 200, 250);//简单模式rectangle(120, 310, 200, 350);//困难模式loadimage(&began, "button_play.png",80,40);loadimage(&diff, "diff.png",80,40);putimage(120, 310, &diff);putimage(120,210, &began);while (1) {m = GetMouseMsg();//获取鼠标if (m.uMsg == WM_LBUTTONDOWN /*|| _kbhit()*/) {if (((m.x > 100 && m.x < 216) && (m.y > 200 && m.y < 270))//简单模式范围/*|| _getch() == 'e'*/) {Begin();}}g = GetMouseMsg();if (g.uMsg == WM_LBUTTONDOWN /*|| _kbhit()*/) {if (((g.x > 120 && g.x < 216) && (g.y > 300 && g.y < 370))//困难模式范围/*|| _getch() == 'd'*/) {Diffcult_Began();}}if (_kbhit()) {if (_getch() == 'e') {Begin();}else if (_getch() == 'd') {Diffcult_Began();}}}return;
}//设定鸟
void drawperson(int x, int y) {putimage(x,y,&per,SRCAND);//底图putimage(x, y, &bird1, SRCPAINT);//正图bird.y += 5; //鸟一直往下坠落5
}//多线程 否则会卡顿
//加载按键音乐
DWORD WINAPI playMusic(LPVOID IpParamer) {mciSendString("open correct.mp3", 0, 0, 0);mciSendString("play correct.mp3 wait", 0, 0, 0);mciSendString("close correct.mp3", 0, 0, 0);return 0;
}//加载游戏结束音乐
DWORD WINAPI OverMusic(LPVOID IpParamer) {mciSendString("open 12321.mp3", 0, 0, 0);mciSendString("play 12321.mp3 wait", 0, 0, 0);mciSendString("close 12321.mp3", 0, 0, 0);return 0;
}//加载地板
void drawland() {putimage(0,414, &lend, SRCAND);putimage(0,414, &lend, SRCPAINT);}//鸟的按键处理
void Down() {char userkey = _getch();switch (userkey) {//按下空格键时鸟向上弹跳case ' ': bird.y -= bird.speed;CreateThread(NULL,NULL,playMusic,NULL,NULL,NULL); //按下空格键时的音效break;default:break;}
}
//撞击地板后
int hitland() {if (bird.y <= 0 || bird.y >= (512 - 96)) {return 1;}return 0;
}//游戏死亡后的弹出的图标
void GameOver() {
//图标的坐标int x = 50; int y = 512;
//图标从底层出现 提留在中间层5swhile (y >= 200) {putimage(0, 0, &back);putimage(x, y, &over1, SRCAND);putimage(x, y, &over, SRCPAINT);y -= 30;Sleep(100);}CreateThread(NULL, NULL, OverMusic, NULL, NULL, NULL); //游戏结束后的音效Again();//重新开始游戏图标选项Sleep(5000);}//定义管子
void printpipe(struct pipe pip[], int i) {pip[i].h = rand() % 100 + 130; //管子在屏幕的高度 随机显示在130—230之间pip[i].x = 288;pip[i].y = 0;
}//画出管子
void drawpip(struct pipe pip) {//上方的管子putimage(pip.x, 0, 52, pip.h, &down, 0, 320 - pip.h);// xy轴坐标 长框 图片指针名 图片开始从哪画的xy轴//下方的管子putimage(pip.x, 412-(320-pip.h), 52, 320 - pip.h, &up, 0, 0);}//简单模式管子的移动和刷新
void Movetube(struct pipe pip[], int i) {pip[i].x -= 5;//当管子被刷出屏幕外时加载新管子if (pip[i].x < (-52 - 150)) //第一个出去150后 重新载第四跟管子 屏幕永远都有两个管子{printpipe(pip, i);}return;
}//困难模式下管子的移动和刷新
void Diff_Movetube(struct pipe pip[], int i) {pip[i].x -= 10;//当管子被刷出屏幕外时加载新管子if (pip[i].x < (-52 - 150)){printpipe(pip, i);}return;
}//是否碰撞到了上面的柱子
int HItUp(struct pipe pip[],int i) {//判断鸟的坐标与上方柱子坐标之间的关系if ((bird.y <= pip[i].h) && (bird.x + 30 >= pip[i].x) && (pip[i].x <= pip[i].x + 52)) { return 1;//1表示撞到了}return 0;
}//是否碰撞到了下面的柱子
int HItDown(struct pipe pip[], int i) {//判断鸟的坐标与下方柱子坐标之间的关系if ((bird.y + 30 >= 412 - (320 - pip[i].h)) && (bird.x + 30 >= pip[i].x) && (pip[i].x <= pip[i].x + 52)) {return 1;}return 0;
}//是否撞到管子
void Hittube(struct pipe pip[], int i) {//判断鸟穿过当前这个管子if (pip[i].x + 52 <= bird.x) {return;}//与下一个管子比较else if (HItUp(pip, i) == 1) {GameOver();return;}else if (HItDown(pip, i) == 1) {GameOver();return;}}
//记录分数
void Score(struct pipe pip[], int i){char s[10];sprintf_s(s, " %d", x);//将整型数字转成字符保存在s中//settextcolor(RED);outtextxy(72, 0, s);outtextxy(0, 0, "你的分数: ");if (pip[i].x + 52 == bird.x){ //判断鸟是否串过管子了x++;sprintf_s(s, " %d", x);outtextxy(0, 0, "你的分数: ");outtextxy(72, 0, s);}
}//简单分数管理
void ChangeMaxScore(int x) {FILE* fp = fopen("Score.txt", "r+"); //存放普通模式下的最高分文件fscanf(fp, "%d", &max); //取出保存在max中char s1[10];sprintf_s(s1, " %d", max);//转换类型 用outtextxy输出到游戏界面outtextxy(72, 16, s1);outtextxy(0, 16, "最高分数: ");FlushBatchDraw();fclose(fp);if (x > max) {//在数据库中存入最高分FILE* fp = fopen("Score.txt", "w+");fprintf(fp, "%d", x);fclose(fp);}}//困难模式分数管理
void Diff_ChangeMaxScore(int x) {FILE* fp = fopen("Diff_Score.txt", "r+");//困难模式最高分的文件fscanf(fp, "%d", &max);char s1[10];sprintf_s(s1, " %d", max);outtextxy(72, 16, s1);outtextxy(0, 16, "最高分数: ");fclose(fp);if (x > max) {//在数据库中存入最高分FILE* fp = fopen("Diff_Score.txt", "w+");fprintf(fp, "%d", x);fclose(fp);}}//游戏开始
void Begin() {struct pipe pip[3];//三个管子//初始化三个管子for (int i = 0; i < 3; i++) {printpipe(pip, i);//在屏幕中显示管子pip[i].x = 288 + i * 150;//每个管子之间的间隔150}loadRescue(); //加载资源while (1) {putimage(0, 0, &back); //画出背景图drawland(); //画出地板drawperson(bird.x, bird.y); //画出鸟for (int i = 0; i < 3; i++) {drawpip(pip[i]);//画出管子Movetube(pip, i);}FlushBatchDraw();//判断是否撞上了管子for (int i = 0; i < 3; i++) {Hittube(pip, i);Score(pip, i); //显示当前分数}//MaxScore();//显示最高分ChangeMaxScore(x);//判断按键是否按下if (_kbhit()) {Down();}//判断是否撞击地板if (hitland()) {GameOver();break;}Sleep(100);}
}void Diffcult_Began() {struct pipe pip[3];//三个管子//初始化三个管子for (int i = 0; i < 3; i++) {printpipe(pip, i);//在屏幕中显示管子pip[i].x = 288 + i * 150;//每个管子之间的间隔150}loadRescue(); //加载资源while (1) {putimage(0, 0, &back); //画出背景图drawland(); //画出地板drawperson(bird.x, bird.y); //画出鸟for (int i = 0; i < 3; i++) {drawpip(pip[i]);//画出管子Diff_Movetube(pip, i);}FlushBatchDraw();//判断是否撞上了管子for (int i = 0; i < 3; i++) {Hittube(pip, i);Score(pip, i); //显示当前分数}//MaxScore();//显示最高分Diff_ChangeMaxScore(x);//判断按键是否按下if (_kbhit()) {Down();}//判断是否撞击地板if (hitland()) {GameOver();break;}Sleep(100);}
}//重新开始
void Again() {rectangle(70, 310,240, 380);putimage(70, 310, &again1);putimage(100, 100, &out);//putimage(80, 310, &again, SRCPAINT);MOUSEMSG k;while (1) {k = GetMouseMsg();if (k.uMsg == WM_LBUTTONDOWN) {if (((k.x > 80 && k.x < 240) && (k.y > 300 && k.y < 380))) {x = 0;bird.y = 250;Begin();//重新开始游戏}}if (_kbhit()) {if (_getch() == 'k') {x = 0;Begin();//重新开始游戏}else if (_getch() == 'q') {Endmove();}}}
}void Startmove() {//开机动画clearrectangle(0, 0, 288, 512);setbkcolor(BLACK);int i;for (i = 0; i < 5; i++) {//随机出现图画int x = rand() % 180;int y = rand() % 480;loadimage(&open, "open.png");putimage(x, y, &open);Sleep(50);}
}void Endmove() { //关机动画 clearrectangle(0, 0, 288, 512);//清屏setbkcolor(BLACK);//背景颜色int y = 100;for (int x = 50; x < 288; x += 20) {settextcolor(BLUE);settextstyle(32, 0, NULL);//高度 宽度0自适应 字体样式无outtextxy(100, y,"GOOD BYE");y += 52;//下移setcolor(YELLOW);setfillstyle(BLUE);fillellipse(x, 50, 10, 10);Sleep(500);setcolor(GREEN);setfillstyle(RED);fillellipse(x, 50, 10, 10);}closegraph();
}//头文件
#define _CRT_SECURE_NO_WARNINGS#include<stdio.h>
#include<stdlib.h>
#include<graphics.h> //图形库文件
#include<conio.h> //按键头文件
#include<time.h>
#include<mmsystem.h>//调用音乐的头文件
#pragma comment(lib,"winmm.lib")
/*全局变量*/
extern int x;//分数
extern int max;//最高分/*游戏资源的加载初始化*/
void loadRescue();//加载资源void drawperson(int x, int y);//画鸟void Booton();//开始的按钮DWORD WINAPI playMusic(LPVOID IpParamer);//加载按键音乐 多线程 否则会卡顿DWORD WINAPI OverMusic(LPVOID IpParamer);//加载游戏结束音乐void drawland();//加载地板void printpipe(struct pipe pip[], int i);//定义管子void drawpip(struct pipe pip);//画出管子/*游戏过程的处理*/
void Down();//鸟的按键处理int hitland();//撞击地板后void Movetube(struct pipe pip[], int i);//管子的移动和刷新int HItUp(struct pipe pip[], int i);//是否碰撞到了上面的柱子int HItDown(struct pipe pip[], int i);//是否碰撞到了下面的柱子void Hittube(struct pipe pip[], int i);//是否撞到管子void Diff_Movetube(struct pipe pip[], int i);//困难模式下的管子移动/*分数管理*/
void Diff_ChangeMaxScore(int x);//最高分的记录void Score(struct pipe pip[], int i);//记录分数void ChangeMaxScore(int x);//分数管理/*游戏的几种模式*/
void Diffcult_Began();//困难模式void Begin();//游戏开始void Again();//重新开始void GameOver();//游戏死亡后的弹出的图标/*开关机动画*/
void Endmove();//关机动画void Startmove();//开机动画
//主函数
#include"head.h"
int main() {
initgraph(288, 512);//初始化图形系统
setbkcolor(BLACK);
Booton(); //开始按钮 点击开始后进入游戏
return 0;
}
//刚刚学的c语言如果有不对的地方欢迎大家给我提出
//不懂的地方可以评论提问 我尽量解答
//需要图片资源的可以留下邮箱
c语言小游戏 flybird Easyx编程 项目源码讲解相关推荐
- 【Unity小游戏】 横版2D射击小游戏 效果展示+完整项目源码【超级简单,自己也可以做游戏玩了】
- 基于JAVA网页小游戏交流论坛计算机毕业设计源码+数据库+lw文档+系统+部署
基于JAVA网页小游戏交流论坛计算机毕业设计源码+数据库+lw文档+系统+部署 基于JAVA网页小游戏交流论坛计算机毕业设计源码+数据库+lw文档+系统+部署 本源码技术栈: 项目架构:B/S架构 开 ...
- JAVA课程设计(小游戏贪吃蛇)完整源码附素材(二)
目录 JAVA课程设计(小游戏贪吃蛇)完整源码附素材(一) JAVA课程设计(小游戏贪吃蛇)完整源码附素材(二) JAVA课程设计(小游戏贪吃蛇)完整源码附素材(三) 前言 1. 任务描述 1.1 ...
- 基于Python的旅游管理系统微信小程序设计与实现毕业论文+项目源码及数据库
源码获取:我的博客资源页面可以下载!!!! 项目名称 基于Python的旅游管理系统微信小程序设计与实现毕业论文+项目源码及数据库 系统说明 本商业旅游系统可以分为三个部分,即微信小程序的手机客户端 ...
- java游戏下载象棋暗棋_JS小游戏之象棋暗棋源码详解
本文实例讲述了JS小游戏的象棋暗棋源码,分享给大家供大家参考.具体如下: 游戏运行后如下图所示: Javascript 部分: /** chinese chess * Author: fdipzone ...
- 益智小游戏《测试脑力》源码H5+安卓+IOS三端源码
cocos creator2.4.2 益智小游戏<测试脑力>源码H5+安卓+IOS三端源码,开发脚本为typeScript方便扩展和阅读,支持cocos creator2.X版本,完整的源 ...
- cocos creator2.1.3休闲小游戏《切水果》源码H5+安卓+IOS三端源码
cocos creator2.1.3休闲小游戏<切水果>源码H5+安卓+IOS三端源码,开发脚本为JavaScript方便扩展和阅读,支持cocos creator2.X版本,完整的源码可 ...
- cocos creator 2.1.4休闲小游戏《颜色跳跃》源码H5+安卓+IOS三端源码
cocos creator 2.1.4休闲小游戏<颜色跳跃>源码H5+安卓+IOS三端源码,开发脚本为typeScript方便扩展和阅读,支持cocos creator2.X版本,完整的源 ...
- 微信小程序校园社团管理系统项目源码来了~
团队承接各类小程序定制,需要加微 code_gg_boy .小商城,购物,公司的一些管理,流程批准,视频播放次数授权. 云服务开发或java后端,都可以承接. 今天我们看下一个社团管理的小程序,麻雀虽 ...
- java实现飞机大战小游戏——————【附素材、源码、逐行注释讲解】
java飞机小游戏,实现了以下功能: 1.我方小飞机可以通过鼠标移动来控制. 2.蜜蜂(必须打死而不是碰到,并且碰到蜜蜂会失去生命值)分为两种奖励 获得生命值或者子弹翻3倍. 3.当鼠标移动到界面外可 ...
最新文章
- Java中super关键字的位置
- 00075_BigInteger
- Array 的一些常用 API
- route 更改网络设置
- php 返回script,从PHP脚本返回JSON
- 卑微测试员自述:入职新公司一个月,就让我做自动化测试?!
- matlab给图像加云,matlab怎么给图像加雾
- Python开发【第十九篇】:Python操作MySQL
- node js 修改js代码自动发布到服务器
- 计算机鼠标没有安装驱动,鼠标动不了怎么安装驱动_电脑鼠标不能动怎么安装驱动...
- 3.操作系统有五大功能
- 参数估计之矩估计和极大似然估计概述
- Ubuntu息屏后唤醒的花屏问题
- jsp实现数据提交以及jsp数据保存到本地
- 跟着老陈学嵌入式-C语言入门之类Linux编译环境搭建
- c++numeric
- ROS path [0]=/opt/ros/melodic/share/ros这种错误所有的可能性
- vue大文件分片上传插件
- 索引视图是否物理存储在数据库中以及使用索引视图的一些见解
- 数据3D可视化简述!