先设置文件规则
main.c 程序入口
game2048.c game2048.h 游戏业务逻辑
direction.c direction.h 方向键处理
tool.c tool.h 工具函数
Makefile 编译脚本文件
project_create.sh 创建文件的脚本文件
tool.h 文件
#ifndef TOOLS_H
#define TOOLS_H
#include <stdio.h>
#include <stdbool.h>
#include <stdbool.h>
#ifdef DEBUG
#define debug(...) printf(__VA_ARGS__);
#else
#define debug(...)
#endif
extern int score;
void rand_number(void); // 随机空位置产生一个2
void show_view(void); // 显示界面
bool is_die(void); // 检查是否还能继续
#endif//TOOLS_H
direction.h 文件
#ifndef DIRECTION_H
#define DIRECTION_H
void up(void);
void down(void);
void right(void);
void left(void);
#endif//DIRECTION_H
game2048.h 文件
#ifndef GAME2048_H
#define GAME2048_H
#include <stdbool.h>
extern int (*view)[4];
extern bool flag;
void init_game(void); // 初始化相关数据、加载数据
void run_game(void); // 运行游戏
void exit_game(void); // 释放相关数据、保存数据
#endif//GAME2048_H
main.c 文件
#include <stdio.h>
#include "game2048.h"
#include "tools.h"
int main(int argc ,const char* argv[])
{
init_game();
run_game();
return 0;
}
game2048.c 文件
#include <stdlib.h>
#include <getch.h>
#include "game2048.h"
#include "direction.h"
#include "tools.h"
int (*view)[4] = NULL;
bool flag = true;
void init_game(void) // 初始化相关数据、加载数据
{
view = calloc(sizeof(view[0][0]),4*4); // 申请堆内存
}
void run_game(void) // 运行游戏
{
debug("%s\n",__func__);
for(;;)
{
rand_number(); // 随机空位置产生一个2
show_view(); // 显示界面
if(is_die()) // 检查是否还能继续
{
exit_game();
return;
}
flag = false;
switch(getch()) // 获取方向键并处理
{
case 183: up(); break;
case 184: down(); break;
case 185: right(); break;
case 186: left(); break;
}
}
}
void exit_game(void) // 释放相关数据、保存数据
{
free(view);
view = NULL; //释放堆内存
}
tool.c 文件
#include <stdlib.h>
#include <time.h>
#include "game2048.h"
#include "tools.h"
int score = 0;
static bool is_full(void) // 判断是否满
{
int* arr = (int*)view;
for(int i=0; i<16; i++)
{
if(0 == arr[i])
{
return false;
}
}
return true;
}
void rand_number(void) // 随机空位置产生一个2或4
{
srand(time(NULL));
if(is_full())
{
debug("没有空位置!\n");
return;
}
for(;flag;)
{
int x = rand()%4;
int y = rand()%4;
if(0 == view[x][y])
{
view[x][y] = 2;
return;
}
}
}
void show_view(void) // 显示界面
{
system("clear");
for(int x=0; x<4; x++)
{
printf("*----*----*----*----*\n");
for(int y=0; y<4; y++)
{
if(view[x][y])
{
printf("|%4d",view[x][y]);
}
else
{
printf("| ");
}
}
printf("|\n");
}
printf("*----*----*----*----*\n");
printf("score=%d", score);
}
bool is_die(void) // 检查是否还能继续
{
for(int i=0;i<4;i++)
{
for(int j=0; j<3; j++)
{
if(view[i][j] == view[i][j+1] || view[i][j] == 0 )
{
return false;
}
}
if(view[i][3] == 0)
{
return false;
}
for(int j=0; j<3; j++)
{
if(view[j][i] == view[j+1][i])
{
return false;
}
}
}
return true;
}
direction.c 文件
#include "direction.h"
#include "game2048.h"
#include "tools.h"
void up(void)
{
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])
{
if(0 == view[i-1][y]) // 移动
{
view[i-1][y] = view[i][y];
view[i][y] = 0;
flag = true;
}
else if(view[i][y] == view[i-1][y]) // 合并
{
view[i-1][y] *= 2;
view[i][y] = 0;
end = i;
flag = true;
score += view[i-1][y];
}
}
}
}
}
}
void down(void) // 同理
{
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])
{
if(0 == view[i+1][y])
{
view[i+1][y] = view[i][y];
view[i][y] = 0;
flag = true;
}
else if(view[i][y] == view[i+1][y])
{
view[i+1][y] *= 2;
view[i][y] = 0;
end = i;
flag = true;
score += view[i+1][y];
}
}
}
}
}
}
void right(void) // 同理
{
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])
{
if(0 == view[x][i+1])
{
view[x][i+1] = view[x][i];
view[x][i] = 0;
flag = true;
}
else if(view[x][i] == view[x][i+1])
{
view[x][i+1] *=2;
view[x][i] = 0;
end = i;
flag = true;
score += view[x][i+1];
}
}
}
}
}
}
void left(void) // 同理
{
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])
{
if(view[x][i-1] == 0)
{
view[x][i-1] = view[x][i];
view[x][i] = 0;
flag = true;
}
else if(view[x][i] == view[x][i-1])
{
view[x][i-1] *= 2;
view[x][i] = 0;
end = i;
flag = true;
score += view[x][i-1];
}
}
}
}
}
}
Makefile 文件
CC=gcc
BIN=game2048.bin
STD=-std=gnu99
FLAG=-Wall -Werror -DDEBUG
OBJ=direction.o game2048.o main.o tools.o
all : $(OBJ)
$(CC) -o $(BIN) $(OBJ)
main.o : main.c game2048.h tools.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 tools.h
$(CC) $(STD) $(FLAG) -c direction.c
tools.o : tools.c tools.h
$(CC) $(STD) $(FLAG) -c tools.c
clean:
rm -rf $(OBJ) $(BIN)
rm -rf *~