基于C语言的多文件编程2048小游戏

基于C语言的多文件编程2048小游戏

文件规则
main.c  程序的入口
game2048.c game2048.h  游戏的业务逻辑功能
direction.c direction.h 方向键处理
tools.c tools.h   工具函数 
创建文件脚本
//	  project_create.sh文件脚本内容  
#程序入口
touch main.c
#游戏业务逻辑
touch game2048.c game2048.h
#方向键处理
touch direction.c direction.h
#工具函数
touch tools.c tools.h
#编译脚本
ls > Makefile
#编辑脚本
ls > game2048.conf
编辑文件脚本
//	game2048.conf文件
gedit Makefile main.c game2048.h game2048.c direction.h direction.c tools.h tools.c
编译脚本
//	Makefile文件
CC=gcc
STD=-std=gnu99
BIN=game.bin
OBJ=main.o game2048.o direction.o tools.o
FLAG=-Wall -Werror -DDEBUG

all:$(OBJ)
	$(CC) -o $(BIN) $(OBJ) && ./$(BIN)
main.o:main.c game2048.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 game2048.h tools.h
	$(CC) $(STD) $(FLAG) -c direction.c
tools.o:tools.c tools.h game2048.h
	$(CC) $(STD) $(FLAG) -c tools.c

clean:
	rm -rf $(BIN) $(OBJ)

主函数:

#include "game2048.h"

int main()
{
	//	初始化函数
	init_game();
	//	启动函数
	start_game();
	//	结束函数
	end_game();
}

方向函数:

#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=1; x<4; x++)
		{
			for(int i=x; i>end; i--)
			{
				//	移动
				if(view[i][y] && 0 == view[i-1][y])
				{
					view[i-1][y] = view[i][y];
					view[i][y] = 0;
					is_move_merge = true;
				}
				//	合并
				else if(view[i][y] 
				&& view[i-1][y] == view[i][y])
				{
					view[i-1][y] *= 2;
					view[i][y] = 0;
					end = i;
					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 i=x; i<end; i++)
			{
				//	移动
				if(view[i][y] && 0 == view[i+1][y])
				{
					view[i+1][y] = view[i][y];
					view[i][y] = 0;
					is_move_merge = true;
				}
				//	合并
				else if(view[i][y] 
				&& view[i+1][y] == view[i][y])
				{
					view[i+1][y] *= 2;
					view[i][y] = 0;
					end = i;
					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 i=y; i>end; i--)
			{
				//	移动
				if(view[x][i] && 0 == view[x][i-1])
				{
					view[x][i-1] = view[x][i];
					view[x][i] = 0;
					is_move_merge = true;
				}
				//	合并
				else if(view[x][i] 
				&& view[x][i-1] == view[x][i])
				{
					view[x][i-1] *= 2;
					view[x][i] = 0;
					end = i;
					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 i=y; i<end; i++)
			{
				//	移动
				if(view[x][i] && 0 == view[x][i+1])
				{
					view[x][i+1] = view[x][i];
					view[x][i] = 0;
					is_move_merge = true;
				}
				//	合并
				else if(view[x][i] 
				&& view[x][i+1] == view[x][i])
				{
					view[x][i+1] *= 2;
					view[x][i] = 0;
					end = i;
					is_move_merge = true;
				}
			}	
		}
	}
}

工具函数:

#include <stdlib.h>
#include "tools.h"
#include "game2048.h"

static bool is_full(void)
{
	int* arr = (int*)view;
	for(int i=0; i<16; i++)
	{
		if(0 == arr[i]) return false;
	}
	return true;
	/*
	for(int i=0; i<4; i++)
	{
		for(int j=0; j<4; j++)
		{
			if(0 == view[i][j]) return false;	
		}		
	}
	return true;
	*/
}

//随机位置产生一个2
void rand_two(void)
{
	debug("%s\n",__func__);
	if(is_full())
	{
		debug("没有空位置!\n");
		return;
	}
	for(;is_move_merge;)
	{
		int x = rand()%4;
		int y = rand()%4;
		if(0 == view[x][y])
		{
			view[x][y] = 2;
			return;
		}	
	}
	debug("没有移动合并\n");
}

//显示界面
void show_view(void)
{
	debug("%s\n",__func__);
	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)
{
	debug("%s\n",__func__);
	if(!is_full())	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;
			}
		}
	}
	
	for(int y=0; y<4; y++)
	{
		for(int x=0; x<3; x++)
		{
			if(view[x][y] == view[x+1][y])
			{
				return false;
			}
		}
	}
	return true;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值