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

    文章

    7604

    浏览量

    136795
  • 代码
    +关注

    关注

    30

    文章

    4787

    浏览量

    68591

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

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

收藏 人收藏

    评论

    相关推荐

    基于FPGA实现图像直方图设计

    直方图统计的原理 直方图统计从数学上来说,是对图像中的像素点进行统计。图像直方图统计常用于统计灰度图像,表示图像中各个灰度级出现的次数或者概率。统计直方图的实现采用C/C++或者其他高级语言实
    的头像 发表于 12-24 10:24 81次阅读
    基于FPGA<b class='flag-5'>实现</b>图像直方图设计

    FPGA砖块小游戏设计思路

      交流问题   Q :FPGA砖块小游戏,如何基于FPGA用verilog语言在Vivado平台上写砖块小游戏,最好能用到PS2与VG
    的头像 发表于 12-09 16:57 193次阅读

    使用C语言实现函数模板

      用C语言能不能实现一个通用的函数,既能完成整数的相加,又能完成浮点数的相加?
    的头像 发表于 11-09 11:38 386次阅读

    C语言与Java语言的对比

    C语言和Java语言都是当前编程领域中的重要成员,它们各自具有独特的优势和特点,适用于不同的应用场景。以下将从语法特性、内存管理、跨平台性、性能、应用领域等多个方面对C
    的头像 发表于 10-29 17:31 326次阅读

    PLC编程语言C语言的区别

    在工业自动化和计算机编程领域中,PLC(可编程逻辑控制器)编程语言C语言各自扮演着重要的角色。尽管两者都是编程语言,但它们在多个方面存在显著的区别。本文将从多个维度深入探讨PLC编程
    的头像 发表于 06-14 17:11 2820次阅读

    何用C语言实现高效查找(二分法)

    今天给分享一下使用C语言实现二分算法,主要包含以下几部分内容:二分查找算法介绍二分查找算法使用场景二分查找算法代码实现二分查找算法实现过程用C
    的头像 发表于 06-04 08:04 1133次阅读
    如<b class='flag-5'>何用</b><b class='flag-5'>C</b><b class='flag-5'>语言实现</b>高效查找(二分法)

    使用C语言实现的CRC计算单元的例子

    使用C语言实现的CRC计算单元的例子
    的头像 发表于 05-16 16:16 983次阅读

    嵌入式编程,如何用 C 语言实现状态机设计?

    状态机模式是一种行为模式,通过多态实现不同状态的调转行为的确是一种很好的方法,只可惜在嵌入式环境下,有时只能写纯C代码,并且还需要考虑代码的重入和多任务请求跳转等情形,因此实现起来着实需要一番考虑
    发表于 04-23 11:00

    C语言实现Web参数传递

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

    嵌入式系统中C语言结构体的基础实现与应用

    C语言中的数组只能允许程序员定义存储相同类型数据。但是结构是C语言编程中允许您存储不同数据类型的数据。
    发表于 03-12 14:29 501次阅读
    嵌入式系统中<b class='flag-5'>C</b><b class='flag-5'>语言</b>结构体的基础<b class='flag-5'>实现</b>与应用

    c语言,c++,java,python区别

    C语言C++、Java和Python是四种常见的编程语言,各有优点和特点。 C语言
    的头像 发表于 02-05 14:11 2387次阅读

    vb语言c++语言的区别

    VB语言C++语言是两种不同的编程语言,虽然它们都属于高级编程语言,但在设计和用途上有很多区别。下面将详细比较VB
    的头像 发表于 02-01 10:20 2311次阅读

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

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

    单轴PSO视觉飞拍与精准输出:EtherCAT超高速实时运动控制卡XPCIE1032H上位机C#开发(七)

    正运动技术EtherCAT控制卡在VS平台采用C#语言实现的各种PSO功能。
    的头像 发表于 01-03 09:50 1044次阅读
    单轴PSO视觉飞拍与精准输出:EtherCAT超高速实时运动控制卡XPCIE1032H上位机<b class='flag-5'>C</b>#开发(七)

    怎么写出效率高、思路清晰的C语言程序?

    要用C语言的思维方式来进行程序的构架构建 要有良好的C语言算法基础,以此来实现程序的逻辑构架 灵活运用
    的头像 发表于 01-02 14:20 569次阅读