概要:2048.c是一个C语言编写的2048游戏,本文将详细分析它的源码和实现。C语言是一种经典实用的编程语言,本身也不复杂,但是学会C语言和能够编写实用的程序还是有一道鸿沟的。本文试图通过一个例子展示如何用C语言实现一个简单但有用的程序。
一、程序简介
本文分析的代码是mevdschee在GitHub上的项目2048.c,游戏的规则和安装说明都可以到主页查看,本文不再赘述。顺便一提,这个程序虽然是纯C编写的,但是它适用于Linux终端,因此如果你想要看一下运行效果可能需要一个Linux.
2048.c源代码只有一个文件,也就是2048.c。它支持图形和色彩,右上角显示分数,下面是操作说明。界面整体看起来挺简洁美观,我们一会看一下它是怎么做到的。
二、代码结构
我们先看一下程序所包含的函数,大体了解它的结构和功能。
程序入口和测试:
- main (argc,argv[])
- test ()
绘制界面相关:
- getColor (value,color,length)
- drawBoard (board[][])
- setBufferedInput (enable):设置终端的行为
- signal_callback_handler (signum)
游戏逻辑:
- findTarget (array[],x,stop)
- slideArray (array[])
- rotateBoard (board[][])
- moveUp (board[][])
- moveLeft (board[][])
- moveDown (board[][])
- moveRight (board[][])
- findPairDown (board[][])
- countEmpty (board[][])
- gameEnded (board[][])
- addRandom (board[][])
- initBoard (board[][])
从函数的参数中可以看出,游戏使用的主要的数据结构是一个二维数组,在主函数中定义: uint8_t board[SIZE][SIZE] 。SIZE的值默认是4,这是2048游戏面板的一般大小,下文直接称为4。数组中的元素保存的是指数,例如如果显示的数是1024,那么存储的应该是10。在初始化过程中,该数组被填满0.
主函数中完成一些初始化和设置工作,然后进入主循环。在循环中接受用户的键盘输入,然后调用相应的函数。
三、图形绘制函数
1 void drawBoard(uint8_t board[SIZE][SIZE]) { 2 uint8_t x,y; 3 char color[40], reset[] = "