当前位置: 首页 > 工具软件 > 2048.cpp > 使用案例 >

2048游戏(C语言)

堵才哲
2023-12-01

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)

 类似资料: