分享一个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编程 项目源码讲解相关推荐

  1. 【Unity小游戏】 横版2D射击小游戏 效果展示+完整项目源码【超级简单,自己也可以做游戏玩了】

  2. 基于JAVA网页小游戏交流论坛计算机毕业设计源码+数据库+lw文档+系统+部署

    基于JAVA网页小游戏交流论坛计算机毕业设计源码+数据库+lw文档+系统+部署 基于JAVA网页小游戏交流论坛计算机毕业设计源码+数据库+lw文档+系统+部署 本源码技术栈: 项目架构:B/S架构 开 ...

  3. JAVA课程设计(小游戏贪吃蛇)完整源码附素材(二)

    目录 JAVA课程设计(小游戏贪吃蛇)完整源码附素材(一) JAVA课程设计(小游戏贪吃蛇)完整源码附素材(二) JAVA课程设计(小游戏贪吃蛇)完整源码附素材(三) 前言 1. 任务描述 1.1  ...

  4. 基于Python的旅游管理系统微信小程序设计与实现毕业论文+项目源码及数据库

     源码获取:我的博客资源页面可以下载!!!! 项目名称 基于Python的旅游管理系统微信小程序设计与实现毕业论文+项目源码及数据库 系统说明 本商业旅游系统可以分为三个部分,即微信小程序的手机客户端 ...

  5. java游戏下载象棋暗棋_JS小游戏之象棋暗棋源码详解

    本文实例讲述了JS小游戏的象棋暗棋源码,分享给大家供大家参考.具体如下: 游戏运行后如下图所示: Javascript 部分: /** chinese chess * Author: fdipzone ...

  6. 益智小游戏《测试脑力》源码H5+安卓+IOS三端源码

    cocos creator2.4.2 益智小游戏<测试脑力>源码H5+安卓+IOS三端源码,开发脚本为typeScript方便扩展和阅读,支持cocos creator2.X版本,完整的源 ...

  7. cocos creator2.1.3休闲小游戏《切水果》源码H5+安卓+IOS三端源码

    cocos creator2.1.3休闲小游戏<切水果>源码H5+安卓+IOS三端源码,开发脚本为JavaScript方便扩展和阅读,支持cocos creator2.X版本,完整的源码可 ...

  8. cocos creator 2.1.4休闲小游戏《颜色跳跃》源码H5+安卓+IOS三端源码

    cocos creator 2.1.4休闲小游戏<颜色跳跃>源码H5+安卓+IOS三端源码,开发脚本为typeScript方便扩展和阅读,支持cocos creator2.X版本,完整的源 ...

  9. 微信小程序校园社团管理系统项目源码来了~

    团队承接各类小程序定制,需要加微 code_gg_boy .小商城,购物,公司的一些管理,流程批准,视频播放次数授权. 云服务开发或java后端,都可以承接. 今天我们看下一个社团管理的小程序,麻雀虽 ...

  10. java实现飞机大战小游戏——————【附素材、源码、逐行注释讲解】

    java飞机小游戏,实现了以下功能: 1.我方小飞机可以通过鼠标移动来控制. 2.蜜蜂(必须打死而不是碰到,并且碰到蜜蜂会失去生命值)分为两种奖励 获得生命值或者子弹翻3倍. 3.当鼠标移动到界面外可 ...

最新文章

  1. Java中super关键字的位置
  2. 00075_BigInteger
  3. Array 的一些常用 API
  4. route 更改网络设置
  5. php 返回script,从PHP脚本返回JSON
  6. 卑微测试员自述:入职新公司一个月,就让我做自动化测试?!
  7. matlab给图像加云,matlab怎么给图像加雾
  8. Python开发【第十九篇】:Python操作MySQL
  9. node js 修改js代码自动发布到服务器
  10. 计算机鼠标没有安装驱动,鼠标动不了怎么安装驱动_电脑鼠标不能动怎么安装驱动...
  11. 3.操作系统有五大功能
  12. 参数估计之矩估计和极大似然估计概述
  13. Ubuntu息屏后唤醒的花屏问题
  14. jsp实现数据提交以及jsp数据保存到本地
  15. 跟着老陈学嵌入式-C语言入门之类Linux编译环境搭建
  16. c++numeric
  17. ROS path [0]=/opt/ros/melodic/share/ros这种错误所有的可能性
  18. vue大文件分片上传插件
  19. 索引视图是否物理存储在数据库中以及使用索引视图的一些见解
  20. 数据3D可视化简述!

热门文章

  1. IDEA实用插件推荐
  2. 图解机器学习算法 | 从入门到精通系列教程(机器学习通关指南·完结)
  3. 希尔加密法matlab,希尔密码加密解密
  4. 设计模式——Facade(外观)模式
  5. 拼多多商品详情接口、拼多多商品基本信息、拼多多商品属性接口
  6. 详解两个队列实现一个栈(python实现——经典面试题)
  7. 无模拟电路基础如何看TTL电路
  8. 用Java实现并查集
  9. icepak计算机机箱热仿真,基于ANSYSIcepak的密闭机箱散热仿真分析.PDF
  10. paypal php 接口文档,paypal接口开发记录