浅学C++(3)学习C语言(2048 小游戏)

多文件实现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();
}

  • 2
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值