2048⼩游戏代码解析C 语⾔版
2048⼩游戏,也算是风靡⼀时的益智游戏。其背后实现的逻辑⽐较简单,代码量不算多,⽽且趣味性强,适合作为有语⾔基础的童鞋来加强编程训练。本篇分析2048⼩游戏的C 语⾔实现代码。
前⾔
游戏截图:
游戏实现原理:
使⽤终端图形库⽂件curses 绘制终端⾥的图形。
使⽤⼀个⼆维数组保存4 x 4 空格中的变量。
键盘输⼊控制移动,经过逻辑判断,⼆维数组数据变化。
⼆维数组数据变化后交给图形函数显⽰出来。
库⽂件curses 介绍:
curses 是⼀种终端图形绘制库,利⽤curses 可以在终端中绘制多种图形。
简单demo
深⼊学习请查询相关资料。
#include <stdio.h>
#include <curses.h>
int main()
{
initscr();
border(0,0,0,0,0,0,0,0);
move(5,15);
printw("%s","hello world");
refresh();
char ch=getch();
endwin();
return 0;
}
编译:gcc curses_demo.c -lcurses
2048实现代码分析
根据2048实现原理,代码要实现的主要有三件事:
图形绘制
游戏逻辑操作
图形加载逻辑结果
主程序代码如下:
2048 C语⾔版代码分析
/
/-------------头⽂件--------------------//
#include <stdio.h>
#include <stdlib.h>
#include <curses.h>
#include <time.h>
#include <unistd.h>
#include <signal.h>
//--------------------------------------//
//------------------全局变量-------------------------------
// 游戏主界⾯是⼀个 4*4 的 16 宫格,使⽤⼆维数组进⾏表⽰,⽤ 0 表⽰空格int a[4][4] = {0};
// 16 宫格中空格的个数
int empty;
// 涉及到新产⽣的数字的位置的两个变量
int old_y, old_x;
//所有的C语⾔代码就是在这三个函数中
int main()
{
//初始化函数
init();
//游戏运⾏时函数
play();
//结束函数,清屏
/
/endwin()来关闭 curses 模式.
endwin();
return0;
}
main()函数代码分析
头⽂件+全局变量
头⽂件中包含的库⽂件如下:
<stdio.h> 标准输⼊输出
<stdlib.h> 设计到内存操作函数
<curses.h> 绘制图形库⽂件
<time.h> 时间函数
<unistd.h> 睡眠函数库⽂件
<signal.h> 信号相关操作库⽂件
主函数代码
主函数中共有三个⼦函数,其中复杂的为前两个,第三个为curses关闭的函数,没有任何逻辑。init()函数的作⽤是游戏准备,绘图函数等。play()函数是游戏运⾏的主要逻辑函数。
下⾯分别分析init()函数和play()函数的实现。
init()函数
必要的curses库开启函数
设置游戏开始时空格数为15
产⽣两个随机数x、y作为第⼀个数字的位置下标
调⽤draw()函数来绘制图形
所有的图形绘制都是依靠draw()函数来完成的。下⾯来分析该函数。
draw()函数
c语言编程小游戏使⽤两个双层循环绘制4*4窗格。
调⽤draw_one()函数将全局变量数组a[][]中的数据显⽰在空格中。
draw()_one()函数
将a[][]中的数字转换成c[]中的字符
循环c[]输出字符,并显⽰在图形中
play()函数代码
play函数是整个游戏的主题函数,负责移动,判断等逻辑。游戏的逻辑主要分两个步骤来完成,以向左移动为例来说明:
1、循环16个窗⼝,从(0,0)开始,如果(0,1)和(0,0)相同,则两个相加,并将(0,1)置为0。然后继续判断(0,2)和现在的(0,0)是否相同,相同则相加到(0,0)中。直到(0,0)右边都判断完成结束。
2、以上步骤只是完成⼀个窗⼝(0,0)的判断,使⽤循环将16个都完成相加。
3、所有的完成相加之后可能的情况是下⾯这样的,还须将所有的数字都移到左边。以图中(1,1)为例,循环到(1,1)时,判断左边的窗⼝是否为0,如果为0,则向左移动⼀个,继续判断左边是否为0,直到移动到最左边。
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论