打砖块游戏是一种动作电子游戏的名称。玩家操作一根萤幕上水平的“棒子”,让一颗不断弹来弹去的“球”在撞击作为过关目标消去的“砖块”的途中不会落到萤幕底下。球碰到砖块、棒子与底下以外的三边会反弹,落到底下会失去一颗球,把砖块全部消去就可以破关。

始祖是美国英宝格公司(en:Atari Games,ja:アタリ (ゲーム))于1976年推出的街机游戏“Breakout”(en:Breakout),由该公司在1972年发行的“PONG”(en:PONG,ja:ポン (ゲーム),世界上第一款电子游戏,类似台球)改良而来。相较于其前作,一个人就可以玩与变化丰富这两项特点让Breakout相当卖座,使各家公司竞相模仿。

因为规则简单与游戏性,现在许多移动电话都有内建打砖块游戏,也有许多因特网小游戏版本,目前在网上可以轻易查到。

我们今天就来自己写经典游戏《打砖块》

游戏目标:消除所有的方块即可过关。操作指南:游戏中使用键盘方向键←→控制移动

OK,了解游戏的基本操作以及游戏玩法之后就可以开始我们的编程之旅了,今天我会一步代码一个图片的来分布展示,希望这种方式可以让大家更容易的理解,如果有其他更好的方式,也欢迎大家向我提出建议

首先是创建一个游戏窗口,我们用EasyX图形库来做,只需要一行代码

hwnd = initgraph(800, 800);

这样我们就创建了一个800*800的窗口,非常简单,非常好用,这也是非常适合初学者去尝试的,这里我们写在主函数里面就可以了

接下来就是我们的老朋友结构体了,木板、球、以及砖块,这没什么好说的,不管啥项目用结构体都是很常见的

//木板的过程
struct Board
{int x;int y;int speed;COLORREF color;int width;int height;
};
//struct Board board = { 300, 800 - 25,1, WHITE, 200, 25 };
struct Board* createBoard(int x, int y, int  speed, COLORREF color, int width, int height)
{struct Board* pBoard = (struct Board*)malloc(sizeof(struct Board));//结构体指针->成员   ->指针指向运算符//(*指针).成员;pBoard->x = x;pBoard->y = y;pBoard->speed = speed;pBoard->color = color;//结构体变量.成员(*pBoard).width = width;(*pBoard).height = height;return pBoard;
}
//球:
struct Ball
{int x;int y;int r;             //半径int dx;int dy;COLORREF color;
};
struct Ball* createBall(int x, int y, int r, int dx, int dy, COLORREF color)
{struct Ball* pBall = (struct Ball*)malloc(sizeof(struct Ball));pBall->x = x;pBall->y = y;pBall->r = r;pBall->dx = dx;pBall->dy = dy;pBall->color = color;return pBall;
}

后面就是我们来画我们的游戏界面了(砖块、球、以及木板),这我是分开写的,可以更好的理解

void drawMap()
{setlinestyle(PS_SOLID, 2);setlinecolor(WHITE);for (int i = 0; i < 5; i++){for (int j = 0; j < 8; j++){int x = 100 * j;        //j=x/100int y = 25 * i;      //i=y/iswitch (map[i][j])   //map[i][j]!=0{case 0:            //做消除用的break;case 1:setfillcolor(YELLOW);fillrectangle(x, y, x + 100, y + 25);break;case 2:setfillcolor(LIGHTBLUE);fillrectangle(x, y, x + 100, y + 25);break;case 3:setfillcolor(LIGHTGREEN);fillrectangle(x, y, x + 100, y + 25);break;}}}
}
void drawBoard(struct Board* pBoard)
{setfillcolor(pBoard->color);fillrectangle(pBoard->x, pBoard->y,pBoard->x + pBoard->width, pBoard->y + pBoard->height);
}
void drawBall(struct Ball* pBall)
{setfillcolor(pBall->color);solidcircle(pBall->x, pBall->y, pBall->r);
}

做完之后我们就可以看到这样的界面了

到现在我们的基本游戏界面就已经出来了,现在差的就是判断逻辑问题了,这也是我们的重点中的重点,包括球的移动、球的弹射角度、木板的移动、砖块的消失、游戏的输赢判断都需要我们考虑到,希望大家可以好好看,好好学!

首先是木板的移动函数,我们就简单控制了,因为他只用左右移就行

//木板的按键操作
void keyDown(struct Board* pBoard)
{//C语言: scanf函数 getch() getchar() gets()//异步的按键操作if (GetAsyncKeyState('A') || GetAsyncKeyState(VK_LEFT) && pBoard->x >= 0){pBoard->x -= pBoard->speed;}if (GetAsyncKeyState('D') || GetAsyncKeyState(VK_RIGHT) && pBoard->x <= 800 - 200){pBoard->x += pBoard->speed;}
}

接下来就是球的移动函数

void moveBall(struct Ball* pBall, struct Board* pBoard)
{if (pBall->x - pBall->r <= 0 || pBall->x + pBall->r >= 800){pBall->dx = -pBall->dx;}if (pBall->y - pBall->r <= 0 || hitBoard(pBall, pBoard) || hitBricks(pBall)){pBall->dy = -pBall->dy;}pBall->x += pBall->dx;pBall->y += pBall->dy;

球的反射以及撞击木板时的判断函数

//1.反射
//2.撞击木板
int hitBoard(struct Ball* pBall, struct Board* pBoard)
{if (pBall->y + pBall->r == pBoard->y) //y满足{if (pBall->x >= pBoard->x && pBall->x <= pBoard->x + pBoard->width){return 1;}}return 0;
}

球撞击砖块的判断函数

//3.撞击砖块
int hitBricks(struct Ball* pBall)
{//1.算出球的行的列是属于地图int ballJ = pBall->x / 100;int ballI = (pBall->y - pBall->r) / 25;//2.当前下标下,数组中不等于表示有砖块需要反射if (ballJ < 8 && ballI < 5 && map[ballI][ballJ] != 0){map[ballI][ballJ] = 0;return 1;}return 0;
}

在这个过程中还需要一个定时器,我们来定义一个定时器,记住调用头文件<time.h>

int Timer(time_t num, int id)
{static time_t start[10];time_t end = clock();if (end - start[id]>num){start[id] = end;return 1;}return 0;
}

游戏结束的判断函数

int gameOver()
{for (int i = 0; i < 5; i++){for (int j = 0; j < 8; j++){if (map[i][j] != 0){return 0;}}}return 1;
}

最后是我们的主函数

int main()
{srand((unsigned int)time(0));          //设置随机数的范围跟随时间改变而改变hwnd = initgraph(800, 800);struct Board* pBoard = createBoard(300, 800 - 25, 5, WHITE, 200, 25);struct Ball* pBall = createBall(400, 600, 15, 5, -5, RED);initMap();BeginBatchDraw();while (1){cleardevice();drawMap();drawBoard(pBoard);drawBall(pBall);if (Timer(10, 0))moveBall(pBall, pBoard);keyDown(pBoard);if (die(pBall)){MessageBox(hwnd, L"you die", L"gameOver", MB_OK);exit(0);}if (gameOver()){MessageBox(hwnd, L"win game", L"gameOver", MB_OK);exit(0);}FlushBatchDraw();}EndBatchDraw();closegraph();return 0;
}

经典游戏《打砖块》完成,OK,简单总结一下,代码不难,逻辑也不难,重要是大家一定要自己动手去做,这是毋庸置疑的,编程没有捷径,只有不断的学习熟练,加强自己的能力,有条件的话找个老师的话效果会更好,好了,希望大家可以在这里得到自己想要的知识以及快乐吧,也希望大家可以给UP主一个关注,非常感谢大家了!!!

后续UP主还会发布更多的项目源码以及学习资料,希望大家可以持续关注,有什么问题可以回帖留言,我尽量回答。想要C/C++学习资料以及其他项目的源码的可以加群【765860056】了解。想要对程序员的未来发展有兴趣的也可加群闲聊。

点击下方链接进群更快拿到学习资料以及项目素材

点击链接加入群聊【C语言C++编程入坑】https://jq.qq.com/?_wv=1027&k=FYimeemN

C语言/C++游戏项目完整教程:《打砖块》相关推荐

  1. C/C++游戏项目完整教程:《坦克大战》

    <坦克大战>以二战坦克为题材,既保留了射击类游戏的操作性,也改进了射击类游戏太过于复杂难玩的高门槛特点,集休闲与竞技于一身.经典再度袭来,流畅的画面,疯狂的战斗,让玩家再次进入疯狂坦克的世 ...

  2. CC++游戏项目完整教程:《坦克大战》

    <坦克大战>以二战坦克为题材,既保留了射击类游戏的操作性,也改进了射击类游戏太过于复杂难玩的高门槛特点,集休闲与竞技于一身.经典再度袭来,流畅的画面,疯狂的战斗,让玩家再次进入疯狂坦克的世 ...

  3. C/C++游戏项目完整教程:《推箱子》

    经典的推箱子是一个的古老游戏,目的是在训练你的逻辑思考能力.在一个狭小的仓库中,要求把木箱放到指定的位置,稍不小心就会出现箱子无法移动或者通道被堵住的情况,所以需要巧妙的利用有限的空间和通道,合理安排 ...

  4. XML完整教程和什么是XML语言

    reille注: XML完整教程可从我的资源上下载到,下载地址为:http://download.csdn.net/source/3465952,本人浏览了下,对于掌握XML是一本不可多得的电子书籍, ...

  5. Ajax 完整教程 (转)

    Ajax 完整教程 第 1 页 Ajax 简介 Ajax 由 HTML.JavaScript™ 技术.DHTML 和 DOM 组成,这一杰出的方法可以将笨拙的 Web 界面转化成交互性的 Ajax 应 ...

  6. TensorFlow教程之完整教程 2.7 字词的向量表示

     TensorFlow教程之完整教程 2.7 字词的向量表示 知与谁同 2017-08-22 15:37:40 浏览67 评论0 函数 摘要: 本文档为TensorFlow参考文档,本转载已得到T ...

  7. 有关Drools业务规则引擎的完整教程

    与往常一样,我们在配套存储库EmailSchedulingRules中共享本教程中提供的代码. 业务规则很好地表现了某些领域的逻辑. 它们之所以有效,是因为它们可以直观直观地接近许多类型的领域专家的思 ...

  8. android studio安装教程完整,Android Studio 安装配置方法完整教程【小白秒懂】

    1.安装包下载 安装包我们可以在官网下载,但为了让大家更方便,点击链接直接保存就好啦!! 2.Android Studio 安装- 打开安装包,点next - 点next - 这步要注意了,这里填安装 ...

  9. c语言程序设计基础项目教程,C语言程序设计基础项目教程

    摘要: <C语言程序设计基础项目教程/高职高专计算机教学改革新体系规划教材>通过项目实例,重点讲解C语言结构化程序设计的基本思想,方法和解决实际问题的技巧,培养学习者设计,分析应用程序的能 ...

最新文章

  1. 25个提高网站可用性和转化率的工具
  2. ****65.磁盘阵列RAID
  3. Hadoop学习很好的书籍,理论和代码都有
  4. Cloud for Customer custom BO创建时间随着行项目数量增加而增加的关系
  5. 基础省选+NOI-第4部分 动态规划
  6. 4.Python标准库_文件管理 (部分os包,shutil包)
  7. spark如何防止内存溢出_什么叫内存溢出?内存泄漏的定义又是什么?使用中如何避免?...
  8. 触发器使用教程和命名规范
  9. ES6——Class 的继承 笔记
  10. 向eclipse中导入myeclipse项目
  11. Analysis::checkMerge2Nx2N_rd0_4()
  12. wps office 2013 利用wps文字制作一张漂亮的座位表
  13. Nginx模块开发之http handler实现流量统计(入门篇)
  14. html怎么拼图没有缝隙,【答疑】ps怎么拼图不留缝隙?急需答案!! - 视频教程线上学...
  15. 贵州大学计算机学院院长,贵州大学计算机科学与信息学院第七届研究生会干部选举大会...
  16. 客户要管理,就靠crm吗?
  17. CR 与 LF 换行符
  18. html5星空效果图,HTML5 canvas炫酷星空背景特效
  19. C 标准库 - 参考手册
  20. 程序员的终极思维方式:系统论

热门文章

  1. 医疗器械之-输尿管软管镜
  2. 13_51单片机应用_AT24C02IIC
  3. 可直接导入excel的在线考试答题刷题小程序
  4. python编码规范(第一部分)
  5. dockerer-compose搭建单机clickhouse集群,工作中最新亲测能用,超详细
  6. android 语音播报方案,Android 语音播报实现方案(无SDK)
  7. Matlab实现EOF分析
  8. Node.js 、Newman安装配置及报错问题解决
  9. 【今日CV 计算机视觉论文速览】Fri, 22 Mar 2019
  10. 查缺补漏系统学习 EF Core 6 - 原始 SQL 查询