main.c 调用init_game、start_game和end_game函数
#include#include "game2048.h" int main(int argc,const char* argv[]) { init_game(); start_game(); end_game(); }
具体函数的声明及定义由game2048.c文件完成
#include#include #include #include "game2048.h" #include "tools.h" #include "direction.h" int (*view)[4] = NULL; int score = 0; // 判断是否产生移动、合并的标志 bool is_move_merge = true; // 初始化相关数据、加载数据 void init_game(void) { debug("%sn",__func__); //申请堆内存 view = calloc(sizeof(view[0][0]),16); //初始化数据 srand(time(NULL)); //读取文件,加载数据 } // 运行游戏 void start_game(void) { debug("%sn",__func__); for(;;) { // 随机位置生成2 rand_two(); is_move_merge = false; // 显示界面 show_view(); // 检查是否还能继续 if(is_die()) { printf("游戏失败!n"); return; } // 获取方向键并处理 switch(getch()) { case 183: up(); break; case 184: down(); break; case 186: left(); break; case 185: right();break; } } } // 释放相关资源、保存数据 void end_game(void) { debug("%sn",__func__); // 保存数据 // 释放内存 free(view); view = NULL; }
上下左右移动及合并:
#include "direction.h"
#include "tools.h"
#include "game2048.h"
void up(void)
{
debug("%sn",__func__);
for(int y=0; y<4; y++)
{
int end = 0;
for(int x=1; x<4; x++)
{
for(int k=x; k>end; k--)
{
if(view[k][y] && 0 == view[k-1][y])
{
view[k-1][y] = view[k][y];
view[k][y] = 0;
is_move_merge = true;
}
else if(view[k][y] &&
view[k][y] == view[k-1][y])
{
view[k-1][y] *= 2;
view[k][y] = 0;
end = k;
is_move_merge = true;
}
}
}
}
}
void down(void)
{
debug("%sn",__func__);
for(int y=0; y<4; y++)
{
int end = 3;
for(int x=2; x>=0; x--)
{
for(int k=x; kend; k--)
{
if(view[x][k] && 0 == view[x][k-1])
{
view[x][k-1] = view[x][k];
view[x][k] = 0;
is_move_merge = true;
}
else if(view[x][k] &&
view[x][k] == view[x][k-1])
{
view[x][k-1] *= 2;
view[x][k] = 0;
end = k;
is_move_merge = true;
}
}
}
}
}
void right(void)
{
debug("%sn",__func__);
for(int x=0; x<4; x++)
{
int end = 3;
for(int y=2; y>=0; y--)
{
for(int k=y; k
随机位置产生2、界面显示、判断游戏是否继续的工具函数如下:
#include
#include "tools.h"
#include "game2048.h"
void show_view(void)
{
system("clear");
for(int i=0; i<4; i++)
{
printf("---------------------n");
for(int j=0; j<4; j++)
{
if(view[i][j])
{
printf("|%4d",view[i][j]);
}
else
{
printf("| ");
}
}
printf("|n");
}
printf("---------------------n");
}
// 判断是否满
static bool is_full(void)
{
int* num = (int*)view;
for(int i=0; i<16; i++)
{
if(0 == num[i]) return false;
}
return true;
}
void rand_two(void)
{
if(is_full())
{
debug("没有空位置n");
return;
}
for(;is_move_merge;)
{
int x = rand()%4;
int y = rand()%4;
if(0 == view[x][y])
{
view[x][y] = 2;
return;
}
}
}
bool is_die(void)
{
if(!is_full()) return false;
for(int y=0; y<4; y++)
{
for(int x=0; x<3; x++)
{
if(view[x][y] == view[x+1][y])
return false;
}
}
for(int x=0; x<4; x++)
{
for(int y=0; y<3; y++)
{
if(view[x][y] == view[x][y+1])
return false;
}
}
return true;
}



