多文件实现2048小游戏
作者很懒,不想写太多
direction.h
#ifndef DIRECTION_H
#define DIRECTION_H
#include <getch.h>
void up(void);
void down(void);
void left(void);
void right(void);
#endif//DIRECTION_H
direction.c
#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=0;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-1][y] == view[k][y])
{
view[k-1][y] *=2;
view[k][y]=0;
end=k;
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 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+1][y] == view[k][y])
{
view[k+1][y] *=2;
view[k][y]=0;
end=k;
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 k=y;k>end;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-1] == view[x][k])
{
view[x][k-1] *=2;
view[x][k]=0;
end=k;
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 k=y;k<end;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+1] == view[x][k])
{
view[x][k+1] *=2;
view[x][k]=0;
end=k;
is_move_merge = true;
}
}
}
}
}
game2048.h
#ifndef GAME2048_H
#define GAME2048_H
#include <stdbool.h>
extern int (*view)[4];
extern int score;
extern bool is_move_merge;
// 初始化相关数据、加载数据
void init_game(void);
// 运行游戏
void start_game(void);
// 释放相关资源、保存数据
void end_game(void);
#endif//GAME2048_H
game2048.c
#include <getch.h>
#include <stdlib.h>
#include <time.h>
#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)
{
//申请堆内存
view = calloc(sizeof(view[0][0]),16);
//初始化数据
srand(time(NULL));
//读取文件,加载数据
}
// 运行游戏
void start_game(void)
{
for(;;)
{
// 随机位置生成2
rand_two();
is_move_merge = false;
// 显示界面
show_view();
// 检查是否还能继续
if(is_die())
{
printf("GAME over\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("%s\n",__func__);
// baocun
free(view);
view = NULL;
}
tools.h
#ifndef TOOLS_H
#define TOOLS_H
#include <stdio.h>
#include <stdbool.h>
bool is_full(void);
void rand_two(void);
void show_view(void);
bool is_die(void);
#ifdef DEBUG
#define debug(...) printf(__VA_ARGS__);
#else
#define debug(...)
#endif
#endif//TOOLS_H
tools.c
#include <stdlib.h>
#include "tools.h"
#include "game2048.h"
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)
{
int x,y;
if(is_full())
{
debug("NO");
return;
}
x=rand()%4;
y=rand()%4;
while(0 != view[x][y])
{
x=rand()%4;
y=rand()%4;
}
view[x][y]=2;
}
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");
}
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;
}
main.c
#include <stdio.h>
#include "game2048.h"
int main(int argc,const char* argv[])
{
init_game();
start_game();
return 0;
//end_game();
}