标准C语言 Day14 (C语言实现2048小游戏)

先设置文件规则

main.c  程序入口

game2048.c    game2048.h        游戏业务逻辑

direction.c    direction.h              方向键处理

tool.c    tool.h                              工具函数

Makefile                                      编译脚本文件

project_create.sh                        创建文件的脚本文件

tool.h 文件

#ifndef TOOLS_H
#define TOOLS_H

#include <stdio.h>
#include <stdbool.h>
#include <stdbool.h>

#ifdef DEBUG
	#define debug(...) printf(__VA_ARGS__);
#else
	#define debug(...)
#endif

extern int score;

void rand_number(void);     //	随机空位置产生一个2

void show_view(void);       //	显示界面

bool is_die(void);          //	检查是否还能继续

#endif//TOOLS_H
direction.h 文件

#ifndef DIRECTION_H
#define DIRECTION_H

void up(void);
void down(void);
void right(void);
void left(void);

#endif//DIRECTION_H
game2048.h 文件

#ifndef GAME2048_H
#define GAME2048_H

#include <stdbool.h>

extern int (*view)[4];
extern bool flag;

void init_game(void);   //	初始化相关数据、加载数据
void run_game(void);    //	运行游戏
void exit_game(void);   //	释放相关数据、保存数据

#endif//GAME2048_H
main.c 文件

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

int main(int argc ,const char* argv[])
{
	init_game();
	run_game();
	return 0;
}
game2048.c 文件
#include <stdlib.h>
#include <getch.h>
#include "game2048.h"
#include "direction.h"
#include "tools.h"

int (*view)[4] = NULL;
bool flag = true;

void init_game(void)        //	初始化相关数据、加载数据
{
	view = calloc(sizeof(view[0][0]),4*4);	//	申请堆内存
}

void run_game(void)         //	运行游戏
{
	debug("%s\n",__func__);
	for(;;)
	{
		rand_number();      //	随机空位置产生一个2
		show_view();        //	显示界面
		if(is_die())        //	检查是否还能继续
		{
			exit_game();
			return;
		}
		flag = false;
		switch(getch()) 	//	获取方向键并处理
		{
			case 183:	up();		break;
			case 184:	down();		break;
			case 185:	right();	break;
			case 186:	left();		break;
		}
	}
}

void exit_game(void)        //	释放相关数据、保存数据
{
	free(view);
	view = NULL;        	//释放堆内存
}

tool.c 文件
#include <stdlib.h>
#include <time.h>
#include "game2048.h"
#include "tools.h"

int score = 0;

static bool is_full(void)    // 判断是否满
{
	int* arr = (int*)view;
	for(int i=0; i<16; i++)
	{
		if(0 == arr[i])
		{
			return false;
		}
	}
	return true;
}

void rand_number(void)       // 随机空位置产生一个2或4
{
	srand(time(NULL));
	if(is_full())
	{
		debug("没有空位置!\n");
		return;
	}
	for(;flag;)
	{
		int x = rand()%4;
		int y = rand()%4;
		if(0 == view[x][y])
		{
			view[x][y] = 2;
			return;
		}
	}
}

void show_view(void)         //	显示界面
{
	system("clear");
	for(int x=0; x<4; x++)
	{
		printf("*----*----*----*----*\n");
		for(int y=0; y<4; y++)
		{
			if(view[x][y])
			{
				printf("|%4d",view[x][y]);
			}
			else
			{
				printf("|    ");
			}
		}
		printf("|\n");
	}
	printf("*----*----*----*----*\n");
	printf("score=%d", score);
}

bool is_die(void)            // 检查是否还能继续
{
	for(int i=0;i<4;i++)
	{
		for(int j=0; j<3; j++)
		{
			if(view[i][j] == view[i][j+1] || view[i][j] == 0 )
			{
				return false;
			}
		}
		if(view[i][3] == 0)
		{
			return false;
		}
		for(int j=0; j<3; j++)
		{
			if(view[j][i] == view[j+1][i])
			{
				return false;
			}
		}
	}
	return true;
}
direction.c 文件
#include "direction.h"
#include "game2048.h"
#include "tools.h"

void up(void)
{
	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])
  				{
  					if(0 == view[i-1][y])   //  移动
  					{
  						view[i-1][y] = view[i][y];
  						view[i][y] = 0;
  						flag = true;
  					}
  					else if(view[i][y] == view[i-1][y])  //  合并
  					{
  						view[i-1][y] *= 2;
  						view[i][y] = 0;
  						end = i;
  						flag = true;
  						score += view[i-1][y];
  					}
  				}
  			}
 		}
	}
}

void down(void) //  同理
{
	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])
  				{
  					if(0 == view[i+1][y])
  					{
  						view[i+1][y] = view[i][y];
  						view[i][y] = 0;
  						flag = true;
  					}
  					else if(view[i][y] == view[i+1][y])
  					{
  						view[i+1][y] *= 2;
  						view[i][y] = 0;
  						end = i;
  						flag = true;
  						score += view[i+1][y];
  					}
  				}
  			}
 		}
	}	
}

void right(void) //  同理
{
	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])
			 	{
					if(0 == view[x][i+1])
					{
						view[x][i+1] = view[x][i];
						view[x][i] = 0;
						flag = true;
					}
					else if(view[x][i] == view[x][i+1])
					{
						view[x][i+1] *=2;
						view[x][i] = 0;
						end = i;
						flag = true;
						score += view[x][i+1];
					}
				}
			}
		}
	}
}

void left(void) //  同理
{
	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])
				{
					if(view[x][i-1] == 0)
					{
						view[x][i-1] = view[x][i];
						view[x][i] = 0;
						flag = true;
					}
					else if(view[x][i] == view[x][i-1])
					{
						view[x][i-1] *= 2;
						view[x][i] = 0;
						end = i;
						flag = true;
  						score += view[x][i-1];
					}
				}
			}
		}
	}
}
Makefile 文件

CC=gcc
BIN=game2048.bin
STD=-std=gnu99
FLAG=-Wall -Werror -DDEBUG
OBJ=direction.o game2048.o main.o tools.o

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

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

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 3
    评论
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值