交换一个苹果,得到一个苹果;交换一种思想,得到一种思想。选择与你才干,性格不同的人,他可以弥补你的缺陷。

嗨!这里是狐狸~~

最近有点网抑云了,脑子很乱,不晓得想些什么,到了年底感觉什么都没做显得格外的浮躁,每晚睡觉时都有万根针在扎似的,时间又是一年去,时间的年轮又转了一圈,不知道大家有没有和我相似的感受呢,扯远了,回归正题,今天来和大家分享的项目是《疯狂赛车》

当然啦,我们今天做的是个简易版的,也不是3d的,主要是希望大家可以更容易的理解里面的逻辑关系,好了,先给大家展示一下我们的游戏界面吧

看起来还是比较粗糙的,但这都不是问题,我说过很多次了,我只教方法,至于做成什么样还得看自己的审美以及能力,OK,接下来来教大家怎么具体的实现这个游戏项目。

具体思路

1、图形基础

1.1 如何显示一张图片?

1.1.1 起名字
                类型:IMAGE
           1.1.2 所以要加载图片
                loadimage(&图片名字,"图片的路径");
            1.1.3 显示图片:putimage(int x,int y,那张图片);

1.2 创建图形窗口

1.2.1 创建一个多大的窗口
                initgraph(int w,int h);
            1.2.2 关闭窗口
                closegraph();

1.3 透明贴图技术

1.3.1 认识一下背景图和掩码图
            1.3.2 采用SRCAND 方式掩码图
                putimage(int x,int y,那张图片,SRCAND);
            1.3.3 采用SRCPAINT 方式贴背景图
                putimage(int x,int y,那张图片,SRCPAINT);

2、绘制赛道

2.1设置线条样式

setlinestyle(PS_SOLID, 3);

2.2设置线条的颜色

setlinecolor(BLACK);

2.3画赛道中心线

setlinecolor(WHITE);

line(IMG_SIZE * 2, 0, IMG_SIZE * 2, IMG_SIZE * ROW);

3、绘制赛车

3.1 绘制玩家赛车

drawImg(player.x, player.y, img_car + player.i);

3.2绘制敌车

for (size_t i = 0; i < 3; i++){

drawImg(enemy[i].x, enemy[i].y, img_car + enemy[i].i);

}

4、赛车的移动

键盘控制赛车的移动

if (GetAsyncKeyState(VK_UP) && player.y >= 0){player.y -= player.speed;}if (GetAsyncKeyState(VK_DOWN) && player.y + 60 <= getheight()){player.y += player.speed;}if (GetAsyncKeyState(VK_LEFT) && player.x > IMG_SIZE){player.x -= player.speed;}if (GetAsyncKeyState(VK_RIGHT) && player.x + 40 <= IMG_SIZE * 3){player.x += player.speed;}

5、碰撞检测(重点)

如果我方赛车碰撞敌方赛车 返回1 否则返回-1, 如过没有碰撞返回0

//检测碰撞 c1碰撞c2for (size_t i = 0; i < 4; i++){if (pc1[i].x > c2->x && pc1[i].x <= c2->x + 40 &&pc1[i].y>c2->y && pc1[i].y<=c2->y+60){return 1;}}//检测碰撞 c2碰撞c1for (size_t i = 0; i < 4; i++){if (pc2[i].x > c1->x && pc2[i].x <= c1->x + 40 &&pc2[i].y > c1->y && pc2[i].y <= c1->y + 60){return -1;}}

项目代码

头文件

#include<stdio.h>
#include<easyx.h> //需要安装的
#include"images/tools.hpp"#include<mmsystem.h>
#pragma comment(lib,"winmm.lib")

绘制函数

void draw()
{for (size_t i = 0; i < ROW; i++){for (size_t k = 0; k < COL; k++){if (k == 1 || k == 2){putimage(k * IMG_SIZE, i * IMG_SIZE, img+1);}else{putimage(k * IMG_SIZE, i * IMG_SIZE, img);}     }}//美化车道//设置线条样式setlinestyle(PS_SOLID, 3);//设置线条的颜色setlinecolor(BLACK);line(IMG_SIZE, 0, IMG_SIZE, IMG_SIZE * ROW);line(IMG_SIZE*3, 0, IMG_SIZE*3, IMG_SIZE * ROW);//画中心线setlinecolor(WHITE);line(IMG_SIZE * 2, 0, IMG_SIZE * 2, IMG_SIZE * ROW);
}
void drawCar()
{//绘制玩家drawImg(player.x, player.y, img_car + player.i);//绘制敌车for (size_t i = 0; i < 3; i++){drawImg(enemy[i].x, enemy[i].y, img_car + enemy[i].i);}
}

初始化函数

void initCar()
{//玩家player.x = carX[rand() % 4];player.y = getheight() -  80;player.speed = 1;player.i = 3;//初始化敌车for (size_t i = 0; i < 3; i++){enemy[i].x = carX[rand() % 4];enemy[i].y = rand() % getheight();enemy[i].speed = rand() % 3 + 1;//1 2 3enemy[i].i = rand() % 4;}
}

赛车移动函数

void moveCar()
{//获取异步按键状态if (GetAsyncKeyState(VK_UP) && player.y >= 0){player.y -= player.speed;}if (GetAsyncKeyState(VK_DOWN) && player.y + 60 <= getheight()){player.y += player.speed;}if (GetAsyncKeyState(VK_LEFT) && player.x > IMG_SIZE){player.x -= player.speed;}if (GetAsyncKeyState(VK_RIGHT) && player.x + 40 <= IMG_SIZE * 3){player.x += player.speed;}for (size_t i = 0; i < 3; i++){enemy[i].y += enemy[i].speed;if (enemy[i].y > getheight()){enemy[i].y = -70;enemy[i].x = carX[rand() % 4];enemy[i].speed = rand() % 3 + 1;//1 2 3enemy[i].i = rand() % 4;}}
}

碰撞检测函数

int collision(struct Car* c1, struct Car* c2)
{struct Point pc1[4] = { {c1->x,c1->y},{c1->x + 40,c1->y},{c1->x,c1->y + 60},{c1->x + 40,c1->y + 60} };struct Point pc2[4] = { {c2->x,c2->y},{c2->x + 40,c2->y },{c2->x,c2->y + 60},{c2->x + 40,c2->y + 60} };//检测碰撞 c1碰撞c2for (size_t i = 0; i < 4; i++){if (pc1[i].x > c2->x && pc1[i].x <= c2->x + 40 &&pc1[i].y>c2->y && pc1[i].y<=c2->y+60){return 1;}}//检测碰撞 c2碰撞c1for (size_t i = 0; i < 4; i++){if (pc2[i].x > c1->x && pc2[i].x <= c1->x + 40 &&pc2[i].y > c1->y && pc2[i].y <= c1->y + 60){return -1;}}return 0;
}

效果展示

总结

简单的总结一下,想对初学编程的同学说,其实编程不一定是没有乐趣的,不可否认它确实是一个枯燥而又漫长的过程,在其中苦中做乐就显得十分重要,大家不要想着项目很难做就整天的抱着题目刷,搁谁时间长了都会烦,兴趣是最好的老师,何不把自己学的知识以项目的形式实际的出现在自己面前呢,希望大家可以明白这个道理吧,千万不要被动的去学习,ok,说的有点多了,最后希望可以得到大家的点赞和关注了,十分感谢!

好了,大家还想看什么一定要在评论区告诉我,后续我还会发布更多的项目源或者学习资料,希望大家可以持续关注,有什么问题可以回帖留言。想要C/C++学习资料以及其他项目的源码的可以加群【1083227756】了解。想要对程序员的未来发展有兴趣的可以关注微信公众号:【狐狸的编码时光】,希望和大家一起学习进步

视频讲解

看文字太枯燥?有需要视频详细讲解的看这里

https://www.bilibili.com/video/BV1M44y1a7nr/https://www.bilibili.com/video/BV1M44y1a7nr/

完整代码

#include<stdio.h>
#include<easyx.h> //需要安装的
#include"images/tools.hpp"#include<mmsystem.h>
#pragma comment(lib,"winmm.lib")#define ROW 6
#define COL 4
#define IMG_SIZE    128 //背景图片的宽度IMAGE img[2];
IMAGE img_car[4];
void loadImg()
{loadimage(img + 0, "./images/bk_grass.png");loadimage(img + 1, "./images/bk_track.png");loadimage(img_car + 0, "./images/000.png");loadimage(img_car + 1, "./images/001.png");loadimage(img_car + 2, "./images/002.png");loadimage(img_car + 3, "./images/003.png");
}
void draw()
{for (size_t i = 0; i < ROW; i++){for (size_t k = 0; k < COL; k++){if (k == 1 || k == 2){putimage(k * IMG_SIZE, i * IMG_SIZE, img+1);}else{putimage(k * IMG_SIZE, i * IMG_SIZE, img);}     }}//美化车道//设置线条样式setlinestyle(PS_SOLID, 3);//设置线条的颜色setlinecolor(BLACK);line(IMG_SIZE, 0, IMG_SIZE, IMG_SIZE * ROW);line(IMG_SIZE*3, 0, IMG_SIZE*3, IMG_SIZE * ROW);//画中心线setlinecolor(WHITE);line(IMG_SIZE * 2, 0, IMG_SIZE * 2, IMG_SIZE * ROW);
}
/*@line*/
#define Line_Num 30
struct Line
{int x;int y;int len;
}lines[Line_Num];
void initLines()
{for (size_t i = 0; i < Line_Num; i++){lines[i].len = 50;//前15条if (i < Line_Num / 2){lines[i].x = IMG_SIZE + IMG_SIZE / 2;lines[i].y = i * (25 + lines[i].len)+25;}//后15条else{lines[i].x = IMG_SIZE * 2 + IMG_SIZE / 2;lines[i].y = (i - Line_Num / 2) * (25 + lines[i].len)+25;//15 16 17 18 19 }}
}
void drawLines()
{for (size_t i = 0; i < Line_Num; i++){line(lines[i].x, lines[i].y, lines[i].x, lines[i].y + lines[i].len);}
}
void moveLines()
{for (size_t i = 0; i < Line_Num; i++){lines[i].y += 2;if (lines[i].y > getheight()){lines[i].y = -lines[i].len;}}
}/*@Car*/
struct Car
{int x;int y;int speed; //车的移动速度int i;      //图片下标,决定贴那一张图片
};
struct Car player;
struct Car enemy[3];
//四条车道的坐标
int carX[4] =
{ IMG_SIZE + 10,IMG_SIZE / 2 * 3 + 10,IMG_SIZE * 2 + 10,IMG_SIZE / 2 * 5 + 10
};
void initCar()
{//玩家player.x = carX[rand() % 4];player.y = getheight() -  80;player.speed = 1;player.i = 3;//初始化敌车for (size_t i = 0; i < 3; i++){enemy[i].x = carX[rand() % 4];enemy[i].y = rand() % getheight();enemy[i].speed = rand() % 3 + 1;//1 2 3enemy[i].i = rand() % 4;}
}
void drawCar()
{//绘制玩家drawImg(player.x, player.y, img_car + player.i);//绘制敌车for (size_t i = 0; i < 3; i++){drawImg(enemy[i].x, enemy[i].y, img_car + enemy[i].i);}
}
void moveCar()
{//获取异步按键状态if (GetAsyncKeyState(VK_UP) && player.y >= 0){player.y -= player.speed;}if (GetAsyncKeyState(VK_DOWN) && player.y + 60 <= getheight()){player.y += player.speed;}if (GetAsyncKeyState(VK_LEFT) && player.x > IMG_SIZE){player.x -= player.speed;}if (GetAsyncKeyState(VK_RIGHT) && player.x + 40 <= IMG_SIZE * 3){player.x += player.speed;}for (size_t i = 0; i < 3; i++){enemy[i].y += enemy[i].speed;if (enemy[i].y > getheight()){enemy[i].y = -70;enemy[i].x = carX[rand() % 4];enemy[i].speed = rand() % 3 + 1;//1 2 3enemy[i].i = rand() % 4;}}
}//碰撞检测
struct Point
{int x;int y;
};
//如果c1碰撞c2 返回1   否则返回-1, 如过没有碰撞返回0
int collision(struct Car* c1, struct Car* c2)
{struct Point pc1[4] = { {c1->x,c1->y},{c1->x + 40,c1->y},{c1->x,c1->y + 60},{c1->x + 40,c1->y + 60} };struct Point pc2[4] = { {c2->x,c2->y},{c2->x + 40,c2->y },{c2->x,c2->y + 60},{c2->x + 40,c2->y + 60} };//检测碰撞 c1碰撞c2for (size_t i = 0; i < 4; i++){if (pc1[i].x > c2->x && pc1[i].x <= c2->x + 40 &&pc1[i].y>c2->y && pc1[i].y<=c2->y+60){return 1;}}//检测碰撞 c2碰撞c1for (size_t i = 0; i < 4; i++){if (pc2[i].x > c1->x && pc2[i].x <= c1->x + 40 &&pc2[i].y > c1->y && pc2[i].y <= c1->y + 60){return -1;}}return 0;
}
void judge()
{for (size_t i = 0; i < 3; i++){if (collision(enemy + i, &player)){enemy[i].y = -70;enemy[i].x = carX[rand() % 4];enemy[i].speed = rand() % 3 + 1;//1 2 3enemy[i].i = rand() % 4;}}
}int main()
{//mci  media device interface mciSendString("open ./images/racing.mp3", NULL, 0, NULL);mciSendString("play ./images/racing.mp3", NULL, 0, NULL);// 创建窗口initgraph(COL * IMG_SIZE, ROW * IMG_SIZE);loadImg();initLines();initCar();//双缓冲绘图BeginBatchDraw();while (true){draw();drawLines();moveLines();drawCar();moveCar();judge();FlushBatchDraw();}EndBatchDraw();getchar();return 0;
}

【C语言】游戏项目:《疯狂赛车》,每个人都要加油活下去相关推荐

  1. 熬夜给这个C语言游戏项目找了几个bug

    晚上看到一个非常有意思的C语言游戏项目,这个项目完全都是用C语言写的,而且资料也比较齐全,有github资料,也有QQ群. 它的项目介绍是这样的: 哦,还有它的官网 http://paintereng ...

  2. python语言有什么用-Python到底有什么用?为什么那么多人都在学Python?

    原标题:Python到底有什么用?为什么那么多人都在学Python? 现如今无论是工作汇报.产品设计.后台设计甚至是数据大屏,越来越多的行业都离不开与数据打交道! Excel作为数据必备工具,一直以来 ...

  3. python语言有什么用-为什么现在很多人都使用Python语言有什么优势

    很多人觉得程序猿是高薪的代表,很多人都想学习一门编程语言,如果你想选择一种语言来入门编程,那么Python绝对是首选!其非常接近自然语言,精简了很多不必要的分号和括号,非常容易阅读理解.接下来一起看看 ...

  4. 为什么不用php做系统吗,IT行业:为什么大部分人都不认可php语言呢?

    大家好我是伊凡央千澈素觉已染尘,其实在这行久了这个问题一直缠绕了很久,我们当初也是java程序,由于在一个北京的大型医院开发以及维护的项目中逐渐发现,java维护起来特别麻烦,而且当时没有从底层开始开 ...

  5. Computer:少儿编程—每个人都应该学习编程,它能教你如何思考—编程入门的简介(编程语言的特点种类开发工具对比人类语言)、编程应用、编程意义之详细攻略

    Computer:少儿编程-每个人都应该学习编程,它能教你如何思考-编程入门的简介(编程语言的特点&种类&开发工具&对比人类语言).编程应用.编程意义之详细攻略 导读:乔布斯说 ...

  6. qq家园里游戏c语言,盘点腾讯旗下5款过气游戏,全部玩过的人都该结婚了吧

    原标题:盘点腾讯旗下5款过气游戏,全部玩过的人都该结婚了吧 腾讯游戏作为国内最大的游戏运营商,从成立以来发行和运营过数百款游戏,拥有的游戏类型也非常丰富,几乎覆盖了所有产品类型,但并不是所有游戏都能成 ...

  7. 苹果手机能运行c语言吗,为什么苹果iPhone手机不使用Type-C接口,很多人都不知道...

    原标题:为什么苹果iPhone手机不使用Type-C接口,很多人都不知道 有一句老话叫做:"一流企业定标准.二流企业做品牌.三流企业卖技术.四流企业做产品"是经济发展的普遍规律. ...

  8. 自从微信更新后,广东人都玩疯了!以后语音可以识别英语、粤语啦!

    原标题:自从微信更新后,广东人都玩疯了!以后语音可以识别英语.粤语啦! 太好玩啦! 自从前天微信悄咪咪更新过后 小编办公室里会讲粤语的小伙伴 都快开心惨了! 一整天凑在一堆聊得飞起! 完全忽略掉我们这 ...

  9. 很多人都想考一个RHCE吧,大家不妨看看我是怎么变成一个RHCE的。

    从CHINAUNIX上看到的文章,很有感慨,一个学计算机的同学的经历,在河南这个地方,很多同学毕业,都不干计算机相关的工作,看看人家的酸甜苦辣吧. http://bbs.chinaunix.net/t ...

最新文章

  1. 【实验报告】四恶意代码实验
  2. 【mmall】Guava框架
  3. python 模块学习 hashlib
  4. 随机数排列JAVA_随机数生成器,按排序顺序
  5. mysql 自己写数据库,自己写了一个简单的mysql数据库连接类
  6. C++:new 和 delete
  7. 我用着不舒服的东西, 就TM是不合理的东西!!!
  8. 构建一个虚拟DOM并转换为真实DOM
  9. L1-041 寻找250 (10 分)—团体程序设计天梯赛
  10. TCP/IP路由技术 -1.3 IPv4地址
  11. 让代码在SharePoint页面执行如何在aspx页面中写代码
  12. 64位锐捷多网卡、VMWareNat模式、ICS共享破解
  13. 编写项目工作说明书(SOW)
  14. EDI电除盐纯水设备
  15. Qt 5.7设置调试器
  16. Vue小demo—美团注册页面
  17. Oracle安装步骤详解
  18. wchar_t的使用
  19. ArchLinux安装完成登陆时出现login incorrect错误
  20. QVM 实操记 - 18.12.28

热门文章

  1. arcgisengine 线转面方法
  2. YDOOK: ANSYS 命令 定义线性材料属性 TB, TBPT
  3. Mac OSX系统下使用DosBox编写汇编
  4. 点阵字库HZK12 HZK16 HZK24 ASC12 ASC16 简介 及 使用方法[附源码]
  5. Go 程序设计语言书中 源码
  6. 不会下载软件?这5个网站别错过,纯净、安全、无捆绑
  7. 大厂offer?拿来吧你!网易有道笔试编程题特辑
  8. Golang梦网云短信对接
  9. Ubuntu16.04安装ROS操作系统
  10. [MIT]微积分重点 第六课 sinx和cosx的导数 学习笔记