本程序采用多文件编程
其中tools.c里面是游戏中需要用到的工具函数
direction.c里是控制方向的函数
game2048.c中是将所有其他函数整合
各文件及代码如下:
如有错误请大佬指正
//Makefile
OBJ=direction.o game2048.o main.o tools.o
STD=-std=gnu99
CC=gcc
BIN=game2048.bin
FLAG=-Wall -Werror -DDEBUG
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 *~
//main.c
#include <stdio.h>
#include "game2048.h"
#include "tools.h"
int main()
{
init_game();
run_game();
return 0;
}
//direction.h
#ifndef DIRETCION_H
#define DIRETCION_H
extern int cnt;
void up(void);
void down(void);
void right(void);
void left(void);
#endif//DIRECTION_H
//direction.c
#include "direction.h"
#include "game2048.h"
#include "tools.h"
int cnt=1;
void up(void)
{
cnt = 0;
for(int y = 0;y<4;y++)
{
int temp = 0;
for(int x =1;x<4;x++)
{
for(int i =x;i>temp;i--)
{
if(view[i][y])
{
if(view[i-1][y] == 0)
{
view[i-1][y] = view[i][y];
view[i][y] = 0;
cnt++;
}
else if(view[i][y] == view[i-1][y])
{
view[i-1][y] *= 2;
view[i][y] = 0;
cnt++;
score += view[i-1][y];
temp = i;
}
}
}
}
}
}
void down(void)
{
cnt=0;
for(int y=0;y<4;y++)
{
int temp = 3;
for(int x=2;x>=0;x--)
{
for(int i = x;i<temp;i++)
{
if(view[i][y])
{
if(view[i+1][y] == 0)
{
view[i+1][y] = view[i][y];
view[i][y] = 0;
cnt++;
}
else if(view[i+1][y] == view[i][y])
{
view[i+1][y] *= 2;
view[i][y] = 0;
score += view[i+1][y];
cnt++;
temp = i;
}
}
}
}
}
}
void right(void)
{
cnt=0;
for(int x=0;x<4;x++)
{
int temp = 3;
for(int y=2;y>=0;y--)
{
for(int i=y;i<temp;i++)
{
if(view[x][i+1] == 0)
{
view[x][i+1] = view[x][i];
view[x][i] = 0;
cnt++;
}
else if(view[x][i+1] == view[x][i])
{
view[x][i+1] *= 2;
view[x][i] = 0;
cnt++;
score += view[x][i+1];
temp = i;
}
}
}
}
}
void left(void)
{
cnt=0;
for(int x=0;x<4;x++)
{
int temp = 0;
for(int y=1;y<4;y++)
{
for(int i=y;i>temp;i--)
{
if(view[x][i-1] == 0)
{
view[x][i-1] = view[x][i];
view[x][i] = 0;
cnt++;
}
else if(view[x][i-1] == view[x][i])
{
view[x][i-1] *= 2;
view[x][i] = 0;
cnt++;
score += view[x][i-1];
temp = i;
}
}
}
}
}
//tools.h
#ifndef TOOLS_H
#define TOOLS_H
#include <stdbool.h>
#include <stdio.h>
extern int score;
#ifdef DEBUG
#define debug(...) printf(__VA_ARGS__);
#else
#define debug(...)
#endif
//随机空位置产生一个2
int get_null(void);
void rand_number(void);
//显示界面
void show_view(void);
//检查是否还能继续
bool is_die(void);
#endif//TOOLS_H
//tools.c
#include "game2048.h"
#include "tools.h"
#include <stdlib.h>
#include <time.h>
int i = 0,j = 0;
int score = 0;
//随机空位置产生一个2
int get_null(void)
{
int n = 0;
for(int i=0;i<4;i++)
{
for(int j=0;j<4;j++)
{
if(view[i][j]==0)
n++;
}
}
return n;
}
void rand_number(void)
{
srand(time(NULL));
int rand_num = rand()%get_null();
for(int i = 0;i<4;i++)
{
for(int j = 0;j<4;j++)
{
if(view[i][j] == 0 && rand_num-- == 0)
view[i][j] = (rand()%10?2:4);
}
}
}
//显示界面
void show_view(void)
{
system("clear");
for(i=0;i<4;i++)
{
printf("—————————————————————————————————————\n");
printf("| | | | |\n");
for(j=0;j<4;j++)
{
if(view[i][j] == 0)
printf("|%9c",0);
else
printf("|%8d",view[i][j]);
}
printf("|\n");
}
printf("—————————————————————————————————————\n");
printf("score:%d\n",score);
}
//检查是否还能继续
bool is_die(void)
{
if(get_null() > 0)
{
return false;
}
else
{
for(int x = 0;x<3;x++)
{
for(int y = 0;y<4;y++)
{
if(view[x][y] == view[x+1][y])
{
return false;
}
}
}
for(int y = 0;y<3;y++)
{
for(int x = 0;x<4;x++)
{
if(view[x][y] == view[x][y+1])
{
return false;
}
}
}
}
return true;
}
//game2048.h
#ifndef GAME2048_H
#define GAME2048_H
extern int (*view)[4];
//初始化相关数据、加载数据
void init_game(void);
//运行游戏
void run_game(void);
//释放相关数据、保存数据
void exit_game(void);
#endif//GAME2048_H
//game2048.c
#include "game2048.h"
#include "tools.h"
#include "direction.h"
#include <getch.h>
#include <stdlib.h>
int (*view)[4] = NULL;
//初始化相关数据、加载数据
void init_game(void)
{
view = malloc(64);
//申请堆内存
//从文件中加载上一次数据
}
//运行游戏
void run_game(void)
{
for(;;)
{
//随机空位置产生一个2
if(cnt>0)
{
cnt = 0;
rand_number();
}
//显示界面
show_view();
//检查是否还能继续
if(is_die())
{
exit_game();
printf("游戏结束!您的最终得分为:%d\n",score);
return;
}
//获取方向键并处理
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;
//保存数据
//释放堆内存
}