0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

如何用C语言实现打砖块项目

C语言编程学习基地 来源:C语言编程学习基地 作者:C语言编程学习基地 2021-11-19 10:37 次阅读

这篇文章主要为大家详细介绍了C语言实现——《打砖块项目》,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下!

游戏介绍:

在游戏中,玩家通过按住并滑动挡板下的圆点控制挡板左右移动,接住击打砖块而改变飞行轨迹掉落下来的小球。在游戏界面的左侧有个速度控制器,玩家可一边接球,一边控制它。上下滑动调整小球的飞行速度。速度越快风险越大,当然奖励和风险是成正比的。越快的速度得分会越多,反之速度越慢得分会越少。(本项目并没有设计速度调整这一块,大家可以自己完善一下)

项目技术:

主要是数组、结构体、绘图技术、按键操作和定时器等,对逻辑也是有一定的要求,但是这些在我们项目源码里面都会有注释,大家到时候学习的时候千万不要忽略注释,注释可以更好地帮你理解代码,尤其是C语言初学者。

本项目编译环境:VS2019/VS2013;

插件:图形库插件easyX,涉及图片素材可以自行百度找也可以关注文末领取;

源代码示例:

#include #include //画砖块int  map[5][8];        //描述整个地图HWND hwnd = NULL;//用1-3 给数组赋值void initMap() {  for (int i = 0; i < 5; i++)   {    for (int j = 0; j < 8; j++)     {      map[i][j] = rand() % 3 + 1;    }  }}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/100      int y = 25*i ;    //i=y/i      switch (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;      }    }  }}//木板的过程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;}void drawBoard(struct Board* pBoard) {  setfillcolor(pBoard->color);  fillrectangle(pBoard->x, pBoard->y,    pBoard->x + pBoard->width, pBoard->y + pBoard->height);}//木板的按键操作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;  }}//球: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 drawBall(struct Ball* pBall){  setfillcolor(pBall->color);  solidcircle(pBall->x, pBall->y, pBall->r);}//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;}int die(struct Ball* pBall) {  if (pBall->y > 800 - 25)  {    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;}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;}//4.收尾工作 :游戏结束//5.定时器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, "you die", "gameOver", MB_OK);      exit(0);    }    if (gameOver())     {      MessageBox(hwnd, "win game", "gameOver", MB_OK);      exit(0);    }    FlushBatchDraw();  }  EndBatchDraw();  closegraph();  return 0;}

责任编辑:haq
声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • C语言
    +关注

    关注

    180

    文章

    7532

    浏览量

    129905
  • 代码
    +关注

    关注

    30

    文章

    4558

    浏览量

    66929

原文标题:C语言项目实战:《打砖块》零基础项目!225 行源码注释示例

文章出处:【微信号:cyuyanxuexi,微信公众号:C语言编程学习基地】欢迎添加关注!文章转载请注明出处。

收藏 人收藏

    评论

    相关推荐

    C语言实现Web参数传递

    电子发烧友网站提供《C语言实现Web参数传递.docx》资料免费下载
    发表于 03-24 09:14 0次下载

    ADUC7061如何使用C语言实现EEPROM功能?

    我使用ADUC7061做的信号采集,现在客户需要实现EEPROM功能来保存3-5个数据,请问如何使用C语言实现?不使用外部EEPROM 专用IC。
    发表于 01-12 06:56

    C语言实用程序150例

    电子发烧友网站提供《C语言实用程序150例.rar》资料免费下载
    发表于 11-20 11:37 1次下载
    C<b class='flag-5'>语言实</b>用程序150例

    何用C语言实现线程池

    线程池是一种多线程处理形式,大多用于高并发服务器上,它能合理有效的利用高并发服务器上的线程资源;线程与进程用于处理各项分支子功能,我们通常的操作是:接收消息 ==> 消息分类 ==> 线程创建 ==> 传递消息到子线程 ==> 线程分离 ==> 在子线程中执行任务 ==> 任务结束退出; 对大多数小型局域网的通信来说,上述方法足够满足需求;但当我们的通信范围扩大到广域网或大型局域网通信中时,我们将面临大量消息频繁请求服务器;在这种情况下,创
    的头像 发表于 11-13 10:41 342次阅读
    如<b class='flag-5'>何用</b>C<b class='flag-5'>语言实现</b>线程池

    基于VHDL语言实现远程防盗报警设计

    电子发烧友网站提供《基于VHDL语言实现远程防盗报警设计.pdf》资料免费下载
    发表于 11-08 14:33 0次下载
    基于VHDL<b class='flag-5'>语言实现</b>远程防盗报警设计

    经典C语言接口与实现:创建可重用软件的技术

    )倡导基于接口的C语言设计理念及其实现技术,深入详细地描述了24个C语言接口及其实现
    发表于 09-25 06:42

    求职小项目实践-C语言实现四则运算器 - 第13节 #硬声创作季

    C语言
    充八万
    发布于 :2023年09月01日 18:57:40

    c语言实现通讯录管理系统 - 第6节 #硬声创作季

    Linux通讯C语言
    充八万
    发布于 :2023年09月01日 13:46:47

    c语言实现通讯录管理系统 - 第5节 #硬声创作季

    C语言程序代码
    充八万
    发布于 :2023年09月01日 13:45:57

    c语言实现通讯录管理系统 - 第4节 #硬声创作季

    C语言程序代码
    充八万
    发布于 :2023年09月01日 13:45:07

    c语言实现通讯录管理系统 - 第3节 #硬声创作季

    C语言程序代码
    充八万
    发布于 :2023年09月01日 13:44:17

    c语言实现通讯录管理系统 - 第1节 #硬声创作季

    C语言程序代码
    充八万
    发布于 :2023年09月01日 13:42:37

    一个使用Java语言实现的向量化BLAS库VectorBLAS

    VectorBLAS是一个使用Java语言实现的向量化BLAS高性能库,目前已在openEuler社区开源。
    的头像 发表于 08-16 10:40 610次阅读
    一个使用Java<b class='flag-5'>语言实现</b>的向量化BLAS库VectorBLAS

    砖块电源尺寸表下载

    砖块电源尺寸表
    发表于 08-07 15:37 1次下载

    用C语言实现简单工厂模式

    在我们的印象中,设计模式是由面向对象的语言(C++、JAVA)才能完成的,而 C 语言是面向过程的语言,不能实现设计模式。
    发表于 06-05 11:28 302次阅读
    用C<b class='flag-5'>语言实现</b>简单工厂模式