2048游戏C语言代码是通过文件链接的方式实现的,主要的文件包含main.c(代码实现入口文件)、game2048.c(游戏内容处理)、game2048.h(头文件)、direction.c(方向键处理)、derection.h(头文件)、tools.c(显示界面、随机位置生成2、判断是否失败)、tools.h(头文件),下面也展现了它的 makefile 文件。
main.c
#include <stdio.h>
#include "game2048.h"
int main(int argc,const char* argv[])
{
init_game(); //初始化相关数据、加载数据
start_game(); //运行游戏
end_game(); //游戏结束 释放相关资源、保存数据
}
game2048.c
#include <time.h>
#include <stdlib.h>
#include <getch.h>
#include "direction.h"
#include "game2048.h"
#include "tools.h"
int (*picp)[4]=NULL;
int score =0;
// 判断是否产生移动、合并的标志
bool is_move_merge=true;
//初始化相关数据、加载数据
void init_game(void)
{
//debug("%s\n",__func__);
//申请堆内存
picp=malloc(64);
//初始化数据
for(int i=0;i<4;i++)
{
for(int j=0;j<4;j++)
{
picp[i][j]=0;
}
}
//读取文件、加载数据
}
//运行游戏
void start_game(void)
{
// debug("%s\n",__func__);
for(;;)
{
// 随机位置生成2
rand_two();
is_move_merge=false;
// 显示界面
show_view();
// 获取方向键并处理
switch(getch())
{
case 183: up(); break;
case 184: down(); break;
case 186: left(); break;
case 185: right();break;
}
// 检查是否还能继续
if(if_die())
{
printf("游戏结束!成绩为%d分\n",score);
return;
}
}
}
// 释放相关资源、保存数据
void end_game(void)
{
debug("%s\n",__func__);
//保存数据
//释放内存
free(picp);
picp=NULL;
}
game2048.h
#ifndef GAME2048_H
#define GAME2048_H
#include <stdbool.h>
extern int (*picp)[4];
int score;
bool is_move_merge;
// 初始化相关数据、加载数据
void init_game(void);
//运行游戏
void start_game(void);
//释放相关资源、保存数据
void end_game(void);
#endif//GAME2048_H
direction.c
#include "direction.h"
#include "game2048.h"
//方向键处理
void up(void) //向上
{
int now,next;
int k;
for(int j=0;j<4;j++)
{
for(int i=0;i<4;i++)
{
now=picp[i][j];
if(now!=0)
{
k=i+1;
while(k<4)
{
next=picp[k][j];
if(next!=0)
{
if(now==next)
{
picp[i][j]=2*picp[k][j];
picp[k][j]=0;
is_move_merge=true;
score+=picp[k][j];
}
k=4;
}
k++;
}
}
}
}
for(int j=0;j<4;j++)
{
for(int i=0;i<4;i++)
{
now=picp[i][j];
if(now==0)
{
k=i+1;
while(k<4)
{
next=picp[k][j];
if(next!=0)
{
picp[i][j]=next;
picp[k][j]=0;
k=4;
is_move_merge=true;
}
k++;
}
}
}
}
}
void down(void) //向下
{
int now,next;
int k;
for(int j=0;j<4;j++)
{
for(int i=3;i>=0;i--)
{
now=picp[i][j];
if(now!=0)
{
k=i-1;
while(k>=0)
{
next=picp[k][j];
if(next!=0)
{
if(now==next)
{
picp[i][j]=2*picp[k][j];
picp[k][j]=0;
is_move_merge=true;
score+=picp[k][j];
}
k=0;
}
k--;
}
}
}
}
for(int j=0;j<4;j++)
{
for(int i=3;i>=0;i--)
{
now=picp[i][j];
if(now==0)
{
k=i-1;
while(k>=0)
{
next=picp[k][j];
if(next!=0)
{
picp[i][j]=next;
picp[k][j]=0;
k=0;
is_move_merge=true;
}
k--;
}
}
}
}
}
void left(void) //向左
{
int now,next;
int k;
for(int i=0;i<4;i++)
{
for(int j=0;j<4;j++)
{
now=picp[i][j];
if(now!=0)
{
k=j+1;
while(k<4)
{
next=picp[i][k];
if(next!=0)
{
if(now==next)
{
picp[i][j]=2*picp[i][k];
picp[i][k]=0;
is_move_merge=true;
score+=picp[i][k];
}
k=4;
}
k++;
}
}
}
}
for(int i=0;i<4;i++)
{
for(int j=0;j<4;j++)
{
now=picp[i][j];
if(now==0)
{
k=j+1;
while(k<4)
{
next=picp[i][k];
if(next!=0)
{
picp[i][j]=next;
picp[i][k]=0;
k=4;
is_move_merge=true;
}
k++;
}
}
}
}
}
void right(void) //向右
{
int now,next;
int k;
for(int i=0;i<4;i++)
{
for(int j=3;j>=0;j--)
{
now=picp[i][j];
if(now!=0)
{
k=j-1;
while(k>=0)
{
next=picp[i][k];
if(next!=0)
{
if(now==next)
{
picp[i][j]=2*picp[i][k];
picp[i][k]=0;
is_move_merge=true;
score+=picp[i][k];
}
k=0;
}
k--;
}
}
}
}
for(int i=0;i<4;i++)
{
for(int j=3;j>=0;j--)
{
now=picp[i][j];
if(now==0)
{
k=j-1;
while(k>=0)
{
next=picp[i][k];
if(next!=0)
{
picp[i][j]=next;
picp[i][k]=0;
k=0;
is_move_merge=true;
}
k--;
}
}
}
}
}
direction.h
#ifndef DIRECTION_H
#define DIRECTION_H
void up(void);
void down(void);
void left(void);
void right(void);
#endif//DIRECTION_H
tools.c
#include <stdlib.h>
#include <time.h>
#include "game2048.h"
#include "tools.h"
// 随机位置生成2
void rand_two(void)
{
srand(time(NULL));
for(int i=0;i<16&&is_move_merge;i++)
{
int picp_x=rand()%4;
int picp_y=rand()%4;
if(!picp[picp_x][picp_y])
{
picp[picp_x][picp_y]=2;
break;
}
}
}
// 显示界面
void show_view(void)
{
system("clear");
for(int i=0;i<4;i++)
{
for(int j=0;j<4;j++)
{
if(picp[i][j]==0) printf(" ");
else printf("%-4d ",picp[i][j]);
}
printf("\n----------------\n");
}
}
bool if_die(void)
{
for(int i=0;i<4;i++)
{
for(int j=0;j<4;j++)
{
if(!picp[i][j]) return 0;
if(i>0&&picp[i][j]==picp[i-1][j]) return 0;
if(j>0&&picp[i][j]==picp[i][j-1]) return 0;
}
}
return 1;
}
tools.h
#ifndef TOOS_H
#define TOOS_H
#include <stdio.h>
#include <stdbool.h>
// 随机位置生成2
void rand_two(void);
// 显示界面
void show_view(void);
bool if_die(void);
#ifdef DEBUG
#define debug(...) printf(__VA_ARGS__)
#else
#define debug(...)
#endif
#endif//TOOS_H
makefile
CC=gcc
BIN=game2048.bin
OBJ=direction.o game2048.o main.o tools.o
FLAG=-Wall -Werror -DDEBUG
STD=-std=gnu99
all:$(OBJ)
$(CC) -o $(BIN) $(OBJ) && ./$(BIN)
%.o:%.c
$(CC) $(STD) $(FLAG) -c $< -o $@
clean:
rm -rf $(BIN) $(OBJ)