栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > C/C++/C#

用C语言实现简易的2048小游戏

C/C++/C# 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

用C语言实现简易的2048小游戏

main.c 调用init_game、start_game和end_game函数

#include 
#include "game2048.h"

int main(int argc,const char* argv[])
{
	init_game();
	start_game();
	end_game();
}

具体函数的声明及定义由game2048.c文件完成

#include 
#include 
#include 
#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)
{
	debug("%sn",__func__);
	//申请堆内存
	view = calloc(sizeof(view[0][0]),16);
	//初始化数据
	srand(time(NULL));	
	//读取文件,加载数据
}

//	运行游戏
void start_game(void)
{
	debug("%sn",__func__);
	for(;;)
	{
		//	随机位置生成2
		rand_two();
		
		is_move_merge = false;
		
		//	显示界面
		show_view();
		//	检查是否还能继续
		if(is_die())
		{
			printf("游戏失败!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("%sn",__func__);
	//	保存数据
	//	释放内存
	free(view);
	view = NULL;
}

上下左右移动及合并:

#include "direction.h"
#include "tools.h"
#include "game2048.h"

void up(void)
{
	debug("%sn",__func__);
	for(int y=0; y<4; y++)
	{
		int end = 0;
		for(int x=1; 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][y] == view[k-1][y])
				{
					view[k-1][y] *= 2;
					view[k][y] = 0;
					end = k;
					is_move_merge = true;
				}
			}
		}
	}
}
void down(void)
{
	debug("%sn",__func__);
	for(int y=0; y<4; y++)
	{
		int end = 3;
		for(int x=2; x>=0; x--)
		{
			for(int k=x; kend; 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] == view[x][k-1])
				{
					view[x][k-1] *= 2;
					view[x][k] = 0;
					end = k;
					is_move_merge = true;
				}
			}
		}
	}
}
void right(void)
{
	debug("%sn",__func__);
	for(int x=0; x<4; x++)
	{
		int end = 3;
		for(int y=2; y>=0; y--)
		{
			for(int k=y; k 

 

 随机位置产生2、界面显示、判断游戏是否继续的工具函数如下:

#include 
#include "tools.h"
#include "game2048.h"

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");
}

//	判断是否满
static 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)
{
	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;
		}
	}
}

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;
}


转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/1026297.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号