基于C语言的多文件编程2048小游戏
文件规则
main.c 程序的入口
game2048.c game2048.h 游戏的业务逻辑功能
direction.c direction.h 方向键处理
tools.c tools.h 工具函数
创建文件脚本
// project_create.sh文件脚本内容
#程序入口
touch main.c
#游戏业务逻辑
touch game2048.c game2048.h
#方向键处理
touch direction.c direction.h
#工具函数
touch tools.c tools.h
#编译脚本
ls > Makefile
#编辑脚本
ls > game2048.conf
编辑文件脚本
// game2048.conf文件
gedit Makefile main.c game2048.h game2048.c direction.h direction.c tools.h tools.c
编译脚本
// Makefile文件
CC=gcc
STD=-std=gnu99
BIN=game.bin
OBJ=main.o game2048.o direction.o tools.o
FLAG=-Wall -Werror -DDEBUG
all:$(OBJ)
$(CC) -o $(BIN) $(OBJ) && ./$(BIN)
main.o:main.c game2048.h
$(CC) $(STD) $(FLAG) -c main.c
game2048.o:game2048.c game2048.h direction.h tools.h
$(CC) $(STD) $(FLAG) -c game2048.c
direction.o:direction.c direction.h game2048.h tools.h
$(CC) $(STD) $(FLAG) -c direction.c
tools.o:tools.c tools.h game2048.h
$(CC) $(STD) $(FLAG) -c tools.c
clean:
rm -rf $(BIN) $(OBJ)
主函数:
#include "game2048.h"
int main()
{
// 初始化函数
init_game();
// 启动函数
start_game();
// 结束函数
end_game();
}
方向函数:
#include "direction.h"
#include "tools.h"
#include "game2048.h"
// 上
void up(void)
{
debug("%s\n",__func__);
for(int y=0; y<4; y++)
{
int end = 0;
for(int x=1; x<4; x++)
{
for(int i=x; i>end; i--)
{
// 移动
if(view[i][y] && 0 == view[i-1][y])
{
view[i-1][y] = view[i][y];
view[i][y] = 0;
is_move_merge = true;
}
// 合并
else if(view[i][y]
&& view[i-1][y] == view[i][y])
{
view[i-1][y] *= 2;
view[i][y] = 0;
end = i;
is_move_merge = true;
}
}
}
}
}
// 下
void down(void)
{
debug("%s\n",__func__);
for(int y=0; y<4; y++)
{
int end = 3;
for(int x=2; x>=0; x--)
{
for(int i=x; i<end; i++)
{
// 移动
if(view[i][y] && 0 == view[i+1][y])
{
view[i+1][y] = view[i][y];
view[i][y] = 0;
is_move_merge = true;
}
// 合并
else if(view[i][y]
&& view[i+1][y] == view[i][y])
{
view[i+1][y] *= 2;
view[i][y] = 0;
end = i;
is_move_merge = true;
}
}
}
}
}
// 左
void left(void)
{
debug("%s\n",__func__);
for(int x=0; x<4; x++)
{
int end = 0;
for(int y=1; y<4; y++)
{
for(int i=y; i>end; i--)
{
// 移动
if(view[x][i] && 0 == view[x][i-1])
{
view[x][i-1] = view[x][i];
view[x][i] = 0;
is_move_merge = true;
}
// 合并
else if(view[x][i]
&& view[x][i-1] == view[x][i])
{
view[x][i-1] *= 2;
view[x][i] = 0;
end = i;
is_move_merge = true;
}
}
}
}
}
// 右
void right(void)
{
debug("%s\n",__func__);
for(int x=0; x<4; x++)
{
int end = 3;
for(int y=2; y>=0; y--)
{
for(int i=y; i<end; i++)
{
// 移动
if(view[x][i] && 0 == view[x][i+1])
{
view[x][i+1] = view[x][i];
view[x][i] = 0;
is_move_merge = true;
}
// 合并
else if(view[x][i]
&& view[x][i+1] == view[x][i])
{
view[x][i+1] *= 2;
view[x][i] = 0;
end = i;
is_move_merge = true;
}
}
}
}
}
工具函数:
#include <stdlib.h>
#include "tools.h"
#include "game2048.h"
static bool is_full(void)
{
int* arr = (int*)view;
for(int i=0; i<16; i++)
{
if(0 == arr[i]) return false;
}
return true;
/*
for(int i=0; i<4; i++)
{
for(int j=0; j<4; j++)
{
if(0 == view[i][j]) return false;
}
}
return true;
*/
}
//随机位置产生一个2
void rand_two(void)
{
debug("%s\n",__func__);
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;
}
}
debug("没有移动合并\n");
}
//显示界面
void show_view(void)
{
debug("%s\n",__func__);
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");
}
//判断是否失败
bool is_die(void)
{
debug("%s\n",__func__);
if(!is_full()) 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;
}
}
}
for(int y=0; y<4; y++)
{
for(int x=0; x<3; x++)
{
if(view[x][y] == view[x+1][y])
{
return false;
}
}
}
return true;
}