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

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

3天内不再提示

如何用C语言实现2048项目

C语言编程学习基地 来源:C语言编程学习基地 作者:C语言编程学习基地 2021-11-21 16:45 次阅读

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

游戏介绍:

《2048》一款益智小游戏,游戏的规则十分简单,是一款简单易上手的数字小游戏。游戏的规则很简单,你需要控制所有方块向同一个方向运动,两个相同数字方块撞在一起之后合并成为他们的和,每次操作之后会随机生成一个2或者4,最终得到一个“2048”的方块就算胜利了!

玩法简单,容易上手!所以这也成为了我们编程学习者C语言练习的一个非常好的小项目,如果你没有玩过的话那么可以先去玩一下的,会玩的话对于项目逻辑的理解也是非常有帮助的!接下来就让我们一起来看看吧!

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

源代码示例:

#include#include#include#include#include//需要安装之后,才有这个头文件#define MAX_GRID 4    //每行格子数#define GRID_WIDTH 100  //格子宽度#define INTERVAL 15    //间隔#define WIN_SIZE (5*INTERVAL+MAX_GRID*GRID_WIDTH)//窗口大小enum Color //枚举格子颜色{  zero = RGB(205, 193, 180), //0的颜色  twoTo1 = RGB(238, 228, 218), //2的颜色  twoTo2 = RGB(237, 224, 200), //4的颜色  twoTo3 = RGB(242, 177, 121), //8的颜色  twoTo4 = RGB(245, 149, 99), //16的颜色  twoTo5 = RGB(246, 124, 95), //32的颜色  twoTo6 = RGB(246, 94, 59), //64的颜色  twoTo7 = RGB(242, 177, 121), //128的颜色  twoTo8 = RGB(237, 204, 97), //256的颜色  twoTo9 = RGB(255, 0, 128), //512的颜色  twoTo10 = RGB(145, 0, 72), //1024的颜色  twoTo11 = RGB(242, 17, 158), //2048的颜色  back = RGB(187, 173, 160), //背景颜色};Color arr[13] = { zero, twoTo1, twoTo2, twoTo3, twoTo4, twoTo5, twoTo6, twoTo7, twoTo8, twoTo9, twoTo10, twoTo11, back };//数据 二维数组int map[MAX_GRID][MAX_GRID];int createNum(){  int num = 0;  if (rand() % 10 == 0)  {    num = 4;  }  else  {    num = 2;  }  return num;}void gameInit(){  srand((unsigned)time(NULL));  //随机在空白的位置产生两个整数  for (int i = 0; i < 5; )  {    //随机数 rand() 随机获得一个整数   0~上万    int r = rand() % MAX_GRID; //0~3    int c = rand() % MAX_GRID; //0~3    if (map[r][c] == 0)    {      map[r][c] = createNum();      i++;    }      }
}void gameDraw(){  //绘制界面,设置背景颜色 187,173,160 三原色 set background color  setbkcolor(RGB(187, 173, 160));  //设置颜色之后需要,清屏(原本的颜色是黑色的,设置的颜色,被覆盖了)  cleardevice();//清楚绘图设备
  for (int i = 0; i < MAX_GRID; i++)//->y  {    for (int k = 0; k < MAX_GRID; k++)//->x    {      //00 01 02 03       //10 11 12 13      //求出每一个格子的x,y      int x = k*GRID_WIDTH + INTERVAL*(k + 1);      int y = i*GRID_WIDTH + INTERVAL*(i + 1);      //4->2      //32->5      //2^n=map[i][k];  ->log2map[i][k]=n;      int index = (int)log2((float)map[i][k]);      setfillcolor(arr[index]);      //画矩形:空心矩形,填充矩形,实心矩形,圆角矩形      //solidrectangle(x, y, x + GRID_WIDTH, y + GRID_WIDTH);      solidroundrect(x, y, x + GRID_WIDTH, y + GRID_WIDTH, 15, 15);
      if (map[i][k] != 0)      {        //绘制数字        //printf("%d", map[i][k]);//输出到控制台窗口        //设置文字大小        settextstyle(50, 0, "黑体");        settextcolor(RGB(163, 73, 164));        setbkmode(TRANSPARENT);//设置文字背景为透明        //把数字转成字符串 格式化字符串        char str[10] = "";        sprintf(str, "%d", map[i][k]);        //为了文字居中在格子中间        int textx = textwidth(str) / 2;        int texty = textheight(str) / 2;        int win = GRID_WIDTH / 2;    //格子宽度一半        outtextxy(x + win - textx, y + win - texty, str);      }    }  }}void moveup(){  for (int i = 0; i < MAX_GRID; i++)  {    int temp = 0;    for (int begin = 1; begin < MAX_GRID; begin++)    {      if (map[begin][0] != 0)      {        if (map[temp][i] == 0)        {          map[temp][i] = map[begin][i];          map[begin][i] = 0;        }        else if (map[temp][i] == map[begin][i])        {          map[temp][i] += map[begin][i];          map[begin][i] = 0;          temp++;        }        else        {          map[temp+1][i] = map[begin][i];          if (temp + 1 != begin)          {            map[begin][i] = 0;          }          temp++;        }      }    }  }}void moveDown(){  for (int i = 0; i < MAX_GRID; i++)  {    int temp = MAX_GRID-1;    for (int begin = MAX_GRID-2; begin >=0; begin--)    {      if (map[begin][0] != 0)      {        if (map[temp][i] == 0)        {          map[temp][i] = map[begin][i];          map[begin][i] = 0;        }        else if (map[temp][i] == map[begin][i])        {          map[temp][i] += map[begin][i];          map[begin][i] = 0;          temp--;        }        else        {          map[temp - 1][i] = map[begin][i];          if (temp - 1 != begin)          {            map[begin][i] = 0;          }          temp--;        }      }    }  }}//获取键盘按键 _getch(),它不需要按回车确认输入void keyControl(){  switch (_getch())  {  case 'w':  case 'W':  case 72:    moveup();    break;  case 's':  case 'S':  case 80:    moveDown();    break;  case 'a':  case 'A':  case 75:    break;  case 'd':  case 'D':  case 77:    break;  }  printf("key
");}int main(){  //不要控制台窗口,我要图形窗口 easyx  initgraph(WIN_SIZE,WIN_SIZE,SHOWCONSOLE);//第一个参数是宽度,二个高度  gameInit();
  while (1)  {    gameDraw();    keyControl();  }  return 0;}

未完成的数字部分代码,大家也可以自己先去想想试试,每一次的思考就是你进步的过程!

如果学习的过程中有什么问题,以及本项目有什么不懂的地方,都可以来找我交流,我来帮你!

那么今天的分享就到这里了,后续会更新更多精彩项目或者知识内容的,大家要好好学C语言C++哟~

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

    关注

    180

    文章

    7530

    浏览量

    128558
  • 代码
    +关注

    关注

    30

    文章

    4555

    浏览量

    66764

原文标题:C语言项目实战:《2048》零基础项目!208 行源代码示例

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

收藏 人收藏

    评论

    相关推荐

    C语言实现Web参数传递

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

    原来安装的KEIL可以用103系列单片机,为何打开32G431项目找不到芯片?

    原来安装的KEIL 可以用103系列单片机,为何打开32G431项目找不到芯片
    发表于 03-11 06:48

    CCES加载ADSP-21479项目时,找不到头文件怎么解决?

    我第一次接触CCES,加载ADSP-21479项目时候。找不到头文件、我软件是在官网下载的、是不是要下载license许可,才能加载头文件、如果需要license许可。那我又该去哪里获取到、谢谢解答。
    发表于 01-12 07:38

    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 318次阅读
    如<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

    基于FPGA的2048小游戏实现案例

    这周末调试《车牌识别算法》遇到点问题,“无聊”中用FPGA搞个2048小游戏玩玩。
    的头像 发表于 09-08 10:01 843次阅读
    基于FPGA的<b class='flag-5'>2048</b>小游戏<b class='flag-5'>实现</b>案例

    如何获得MA35D1项目在RTT - Studio研究?

    如何获得MA35D1项目 在RTT - Studio 研究?
    发表于 09-07 08:19

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

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

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

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

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

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

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

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

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

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