目录

一.项目说明:

二.项目作用

三.项目技术要求

四.库、宏、主函数说明

五.项目实现

5.1游戏背景的实现

5.2实现Hero奔跑

5.3 实现Hero跳跃

5.4 优化帧等待

5.6使用结构体优化障碍物

5.7添加柱子障碍物

5.8碰撞检测

5.9优化下蹲-实现血条

5.10判断游戏结束、添加背景音乐、添加初始界面

5.11解决死亡障碍

5.12​​​​​​​显示分数

5.13​​​​​​​判断胜利

六:成品展示


一.项目说明:

原作者:奇牛编程 Rock老师

视频原地址:C语言手写天天酷跑_哔哩哔哩_bilibili

1.编程语言:C语言加上一点点C++的函数
2.开发环境:VC2010-VS2022 都可
3.开发用时:7小时
4.素材、源码、第三方库等加学习群:817459939  【传送门】


二.项目作用

1. 多层次滚动背景实现立体距离
2. 游戏引擎架构的设计
3. 多重障碍物的设计和实现
4. 游戏核心:碰撞检测的实现
5. 跳跃、下蹲的设计和实现
6. 炫酷分数的设计和实现

能够快速提升项目开发能力!
项目和笔记,可以直接作为课设。

三.项目技术要求

最低要求:

常量,变量,数组,循环,函数。

四.库、宏、主函数说明

#define _CRT_SECURE_NO_WARNINGS//使用scanf函数防止报错
#define WIN_SCORE 20//用于定义游戏获胜的分数条件
#define WIDTH 1012//游戏背景的宽度
#define HEIGHT 396//高度
#define OBSTACLE_COUNT 10//障碍物数量
#include<stdio.h>//标准输入输出库函数
#include<graphics.h>//引入图形库
#include<conio.h>//按键输入库
#include"tools.h"//添加本地头文件
#include<vector>//引入c++库用于使用容器变长数组
——————————————————————————————————————————————————int main(void) { init();//初始化函数loadimage(0, "res/over.png");//初始画面system("pause");//调用DOS系统的暂停命令 pause 来暂停程序执行,按任意一个键后将继续执行。int timer = 0;while (1) {keyEvent();//用于接收空格和tab键来去执行对应的跳跃/下蹲函数timer+=getDelay();//第三方封装函数用于返回距离上次间隔调用的时间if (timer > 30) {//间隔30帧刷新一次页面timer = 0;update = true;}if (update) {//刷新页面update = false;BeginBatchDraw();//去除闪烁updateBg();//渲染游戏背景//putimagePNG2(heroX, heroY, &imgHeros[heroIndex]);updateHero();//渲染下蹲图片updateEnemy();//渲染障碍物updateBloodBar();//调用第三方接口渲染血条updateScore();//渲染分数图片输出checkWin();//检查游戏是否胜利EndBatchDraw();//去除闪烁checkOver();//检查游戏是否结束checkScore();//计算得分fly();//实现跳跃,下蹲,障碍物的移动等动态效果}}system("pause");
//调用DOS系统的暂停命令 pause 来暂停程序执行,按任意一个键后将继续执行。return 0;
}

五.项目实现

5.1游戏背景的实现

#include <stdio.h>
#include <graphics.h>
#include "tools.h"#define WIN_WIDTH  1012
#define WIN_HEIGHT 396IMAGE imgBgs[3]; // 背景图片
int bgX[3];  //背景图片的x坐标
int bgSpeed[3] = { 1, 2, 4 };// 游戏的初始化
void init() {// 创建游戏窗口initgraph(WIN_WIDTH, WIN_HEIGHT);// 加载背景资源char name[64];for (int i = 0; i < 3; i++) {// "res/bg001.png"    "res/bg002.png"     "res/bg003.png"   sprintf(name, "res/bg%03d.png", i + 1);loadimage(&imgBgs[i], name);bgX[i] = 0;}}void fly() {for (int i = 0; i < 3; i++) {bgX[i] -= bgSpeed[i];if (bgX[i] < -WIN_WIDTH) {bgX[i] = 0;}}
}// 渲染“游戏背景”
void updateBg() {putimagePNG2(bgX[0], 0, &imgBgs[0]);putimagePNG2(bgX[1], 119, &imgBgs[1]);putimagePNG2(bgX[2], 330, &imgBgs[2]);
}int main(void) {init();while (1) {BeginBatchDraw();updateBg();EndBatchDraw();fly();Sleep(30);}system("pause");return 0;
}

5.2实现Hero奔跑

void updateHero() {if (!heroDown) {putimagePNG2(heroX, heroY, &imgHeros[heroIndex]);}else {int y = 345 - imgHeroDown[heroIndex].getheight();putimagePNG2(heroX, y, &imgHeroDown[heroIndex]);}}

5.3 实现Hero跳跃

// 实现跳跃if (heroJump) {if (heroY < jumpHeightMax) {heroJumpOff = 4;}heroY += heroJumpOff;if (heroY > 345 - imgHeros[0].getheight()) {heroJump = false;heroJumpOff = -4;}}else if (heroDown) {static int count = 0;int delays[2] = { 8, 30 };count++;if (count >= delays[heroIndex]) {count = 0;heroIndex++;if (heroIndex >= 2) {heroIndex = 0;heroDown = false;}}}else { //不跳跃heroIndex = (heroIndex + 1) % 12;}

5.4 优化帧等待

timer += getDelay(); //10if (timer > 30) {timer = 0;update = true;}

5.5 实现随机小乌龟

 for (int i = 0; i < OBSTACLE_COUNT; i++) {if (obstacles[i].exist) {putimagePNG2(obstacles[i].x, obstacles[i].y, WIN_WIDTH,&obstacleImgs[obstacles[i].type][obstacles[i].imgIndex]);}}

5.6使用结构体优化障碍物


typedef struct obstacle {int type; //障碍物的类型 int imgIndex; //当前显示的图片的序号int x, y; //障碍物的坐标int speed;int power; //杀伤力bool exist;bool hited; //表示是否已经发生碰撞bool passed; //表示是否已经被通过
}obstacle_t;obstacle_t obstacles[OBSTACLE_COUNT];

5.7添加柱子障碍物

 // 加载“柱子”障碍物IMAGE imgH;vector<IMAGE> imgHookArray;for (int i = 0; i < 4; i++) {sprintf_s(name, sizeof(name), "res/h%d.png", i + 1); //帧图片不够,补帧loadimage(&imgH, name, 63, 260, true);imgHookArray.push_back(imgH);obstacleImgs.push_back(imgHookArray);imgHookArray.pop_back();}// 初始化障碍物池for (int i = 0; i < OBSTACLE_COUNT; i++) {obstacles[i].exist = false;}

5.8碰撞检测

  // 玩家和障碍物的“碰撞检测”处理checkHit();

5.9优化下蹲-实现血条

优化下蹲:
int delays[2] = { 6, 10 };
改成
int delays[2] = { 8, 30 };// 预加载音效
preLoadSound("res/hit.mp3");实现血条
void updateBloodBar() {drawBloodBar(10, 10, 200, 10, 2, BLUE, DARKGRAY, RED, heroBlood / 100.0);
}

5.10判断游戏结束、添加背景音乐、添加初始界面

void  updateBloodBar() {drawBloodBar(10, 10, 200, 10, 2, BLUE, DARKGRAY, RED, heroBlood / 100.0);
}void checkOver() {if (heroBlood <= 0) {loadimage(0, "res/over.png");FlushBatchDraw();mciSendString("stop res/bg.mp3", 0, 0, 0);system("pause");// 暂停之后,充币复活,或者直接开始下一局heroBlood = 100;mciSendString("play res/bg.mp3", 0, 0, 0);}
}int main(void) {init();// 显示初始画面loadimage(0, "res/over.png");system("pause");int timer = 0;while (1) {keyEvent();timer += getDelay(); //10if (timer > 30) {timer = 0;update = true;}if (update) {update = false;BeginBatchDraw();updateBg();//putimagePNG2(heroX, heroY, &imgHeros[heroIndex]);

5.11​​​​​​​解决死亡障碍

​​​​​​​

int lastObsIndex; //last obstacle index
……mciSendString("play res/bg.mp3 repeat", 0, 0, 0);lastObsIndex = -1;
}……if (lastObsIndex >= HOOK1 && lastObsIndex <= HOOK4 &&obstacles[i].type == LION &&obstacles[lastObsIndex].x > (WIN_WIDTH - 500)) {obstacles[i].type = TORTOISE;}lastObsIndex = i;

5.12​​​​​​​显示分数

void updateScore() {// 50 => "50"   '5'     '5'-'0' == 5   char str[8];sprintf(str, "%d", score);int x = 20;int y = 25;for (int i = 0; str[i]; i++) {int sz = str[i] - '0';putimagePNG(x, y, &imgSZ[sz]);x += imgSZ[sz].getwidth() + 5;}
}

5.13​​​​​​​判断胜利

void checkOver() {if (heroBlood <= 0) {loadimage(0, "res/over.png");FlushBatchDraw();mciSendString("stop res/bg.mp3", 0, 0, 0);system("pause");// 暂停之后,充币复活,或者直接开始下一局heroBlood = 100;score = 0;mciSendString("play res/bg.mp3 repeat", 0, 0, 0);}
}

六:成品展示

视频演示:第一集​​​​​​​C语言手写天天酷跑_哔哩哔哩_bilibili

图片演示:

1.启动界面

2.游戏界面

3.胜利画面

​​​​​​​


一个很棒的练手项目,如果你学完了基本语法,

恰好又需要一个项目来锻炼一下自己

那么值得一学哦!

原作者:奇牛编程 Rock老师

视频原地址:C语言手写天天酷跑_哔哩哔哩_bilibili

(如需转载,请表明出处)...

【C语言】游戏开发:天天酷跑丨完美练手项目 [附源码]相关推荐

  1. 联网游戏开发实例分享之《游侠姐妹》(附源码)

    项目情况 游戏名:<游侠姐妹> 工具说明:本游戏前端使用白鹭Egret开发,后端联网部分通过接入Matchvs游戏云的SDK实现. 游戏简介: <游侠姐妹>是一款支持联网对战的 ...

  2. 联网对战游戏开发实例之《斗兽棋》(附源码)

    本次,Matchvs为大家带来的是一款回合制休闲游戏的开源案例 .玩家双方在一个4X4的棋盘上,遵循食物链的规则玩法下进行翻牌与追逐,最终以场上存活的一方为获胜者. 体验地址:http://demo. ...

  3. 联网对战游戏开发实例分享之《激流竞速》(附源码)

    Matchvs是一款游戏服务器引擎,<激流竞速>这款游戏是基于Cocos Creator进行前端开发的基础上,通过接入matchvs SDK完成了联网功能的快速实现.在游戏中,双方可以进行 ...

  4. c语言打印n个连续的字符tzz,C/C++编程笔记:C语言实现连连看游戏,小白练手项目(源码分享)...

    /*课程内容:练练看,很简单 开发环境:vs2013+easyx图形库 知识点: 数组,结构体,分支结构,图形库函数*/#include#include #define IMG_SIZE 39 //隔 ...

  5. 多人对战游戏开发实例之《组队小鸡射击》(附源码)

    前言:该游戏项目主要是基于前端引擎Cocos Creator开发,涉及后端联网的部分,则通过接入Matchvs SDK完成快速开发工作. 准备工作 Matchvs JavaScript SDK 下载地 ...

  6. 【原创】IOS游戏辅助--天天酷跑助手的实现

    标 题: [原创]IOS游戏辅助--天天酷跑助手的实现 作 者: coltor 时 间: 2014-04-16,20:20:44 链 接: http://bbs.pediy.com/showthrea ...

  7. Web 开发中很实用的10个效果【附源码下载】

    在工作中,我们可能会用到各种交互效果.而这些效果在平常翻看文章的时候碰到很多,但是一时半会又想不起来在哪,所以养成知识整理的习惯是很有必要的.这篇文章给大家推荐10个在 Web 开发中很有用的效果,记 ...

  8. 微信公众平台开发教程(四) 实例入门:机器人(附源码)

    微信公众平台开发教程(四) 实例入门:机器人(附源码) 上一篇文章,写了基本框架,可能很多人会觉得晕头转向,这里提供一个简单的例子来予以说明,希望能帮你解开谜团. 一.功能介绍 通过微信公众平台实现在 ...

  9. html实现酷炫好看的个人介绍主页(附源码)

    文章目录 1.设计来源 1.1 主界面 1.2 我的简介界面 1.3 教育经历界面 1.4 我的源码界面 1.5 我的相册界面 1.6 朋友评价界面 1.7 热门文章界面 1.8 联系我界面 2.效果 ...

最新文章

  1. 数据中心的未来:一体化无人值守
  2. 计算机网络c卷及参考答案,2019年广东自考《计算机网络技术》本科习题及答案1...
  3. Linux命令之乐--sed
  4. C语言程序设计线上测试01,2001年C语言程序设计笔试A卷.doc
  5. 一场由SameSite字段引发的前端悲剧
  6. Linux系统是什么
  7. ceres-solver库使用示例
  8. 虚树详解+例子分析+模板
  9. 神器octotree
  10. Mac下安装Adobe pr
  11. Win10 系统菜单和应用程序菜单显示字体模糊
  12. Android 反编译修改包名、重新签名、更换app名称
  13. 给找机器学习/算法岗工作的同学们的一些建议
  14. 飞秋FeiQ可以聊天,但无法传输文件
  15. 驱动开发:Win10枚举完整SSDT地址表
  16. opencv函数测试对话框
  17. Spark项目实战:购物网站评价标签生成(非常详细的Spark算子操作)
  18. 传奇私服搭建网站的几种方法
  19. REMOTE HOST IDENTIFICATION HAS CHANGED问题解决
  20. 两台linux服务器互相自动备份

热门文章

  1. uni-app 编码解码_编码指南-可解码
  2. 医疗DICOM LUT应用
  3. 基于QT实现的图的可视化程序地铁换乘指南系统
  4. 使用动态jenkins从节点和kubernetes进行实时滚动更新的Web服务器
  5. 谷歌浏览器安装了插件也无法使用
  6. 深度学习-----缺乏可解释性
  7. Debian更改开机动画
  8. DEM 提取高程点(自动批量)
  9. 二体问题之4:速度分量及活力公式
  10. ctfshow XSS web316~web333