- 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
- 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
- 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
- 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们。
- 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
- 7、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
2048源代码
一、实验说明
1. 环境登录
2. 环境介绍
本实验环境采用带桌面的Ubuntu Linux环境,实验中会用到桌面上的程序:
LX终端(LXTerminal):Linux命令行终端,打开后会进入Bash环境,可以使用Linux命令。
GVim:非常好用的编辑器,最简单的用法可以参考课程Vim编辑器。
3.环境使用
使用GVim编辑器输入实验所需的代码及文件,使用LX终端(LXTerminal)运行所需命令进行操作。 完成实验后可以点击桌面上方的“实验截图”保存并分享实验结果到微博,向好友展示自己的学习进度。实验楼提供后台系统截图,可以真实有效证明您已经完成了实验。 实验记录页面可以在“我的主页”中查看,其中含有每次实验的截图及笔记,以及每次实验的有效学习时间(指的是在实验桌面内操作的时间,如果没有操作,系统会记录为发呆时间)。这些都是您学习的真实性证明。
二、项目介绍
这次我们的项目是2048游戏,开动脑筋秀秀智商吧。最终效果图是这样的?
三、项目实战
1. 基础知识
我们的项目用到了一点数据结构的知识,还涉及到了linux的一些系统调用,有助于我们加深对linux下的程序设计的深入理解。此外,我们还用了一个文本界面的屏幕绘图库ncurses,编译时需要加上-lcurses选项。
1.1.安装ncurses库
在终端输入sudo apt-get install libncurses5-dev
2. 设计思路
我们的2048游戏里最关键的就是消掉方块和在屏幕任意位置输出数据。后者通过ncurses库可以轻松实现,前者就需要我们开动脑筋了。
3. 开始动手
让我们先来完成一些基础工作,首先是头文件:
#include stdio.h
#include stdlib.h
#include curses.h
#include sys/time.h
#include signal.h
还需要几个全局变量:
// 4*4方格
int a[4][4] = {0};
// 方格里空格的个数
int empty;
int old_y, old_x;
为了调用起来方便,我们先声明一下我们定义的函数:
void draw();
void play();
void init();
void draw_one(int y, int x);
void cnt_value(int *new_y, int *new_x);
int game_over();
int cnt_one(int y, int x);
4. main函数
先看看代码:
int main(){
init();
play();
endwin();
return 0;
}
我们在main里先做好初始化,然后就进入play子函数。 下面看一下init函数:
void init()
{
int x, y;
initscr();
cbreak();
noecho();
curs_set(0);
empty = 15;
srand(time(0));
x = rand() % 4;
y = rand() % 4;
a[y][x] = 2;
draw();
}
init函数首先初始化屏幕,在方格中随机生成一个位置并放入数字2。然后绘制方格。draw函数代码如下:
void draw(){
int n, m, x, y, i, j, k, t, h;
char c[4] = {0, 0, 0, 0};
clear();
for(n = 0; n 9; n += 2) //横线
for(m = 0; m 21; m++) {
move(n, m);
addch(-);
refresh();
}
for(m = 0; m 22; m += 5) //竖线
for(n = 1; n 8; n++) {
move(n, m);
addch(|);
refresh();
}
for(y = 0; y 4; y++, t++) //数字
for(x = 0; x 4; x++) {
draw_one(y, x);
}
}
其中draw_one函数用于绘制单个数字:
void draw_one(int y, int x){
文档评论(0)