从零开始的2048(标准C语言)(简单版)

在翻以前的代码时发现了一个2048的小练习

在这通过这篇博客分享给大家

2048功能

这个游戏的玩法就是左右上下移动,遇到两个相同的数字将其合并生成两数字之和的新数字,数字满盘了游戏就结束。

#include <stdio.h>
#include <stdlib.h>
#include <stdbool.h>
#include <time.h>
#include <getch.h>

// 创建二维数组
int arr[4][4];
// 是否移动或合并过
bool IS_MOVE_MERGE = true;

界面

// 显示界面
void show_view(void)
{
	// 清理屏幕
	system("clear");

	for(int i=0; i<4; i++)
	{
		printf("---------------------\n");
		for(int j=0; j<4; j++)
		{
			if(arr[i][j])
				printf("|%4d",arr[i][j]);
			else
				printf("|    ");
		}
		printf("|\n");
	}
	printf("---------------------\n");
}

bool is_null(void)
{
	for(int i=0; i<4; i++)
	{
		for(int j=0; j<4; j++)
		{
			if(0 == arr[i][j])
			{
				return true;
			}
		}
	}
	return false;
}

创建数

// 创建一个数
void creat_num(void)
{
	// 进入循环前要先保证有空位置
	while(is_null()&&IS_MOVE_MERGE)
	{
		int x = rand() % 4;
		int y = rand() % 4;
		if(0 == arr[x][y])
		{
			arr[x][y] = 2;
			break;
		}
	}
}

数字的移动

void up(void)
{
	for(int y=0; y<4; y++)
	{
		int end = 0;
		for(int x=1; x<4; x++)
		{
			for(int m=x; m>end && arr[m][y]; m--)
			{
				if(arr[m][y] == arr[m-1][y])
				{
					arr[m-1][y] *= 2;
					arr[x][y]= 0;
					end = m;
					IS_MOVE_MERGE = true;
				}
				else if(0 == arr[m-1][y])
				{
					arr[m-1][y] = arr[m][y];
					arr[m][y] = 0;
					IS_MOVE_MERGE = true;
				}
			}
		}
	}
}
void down(void)
{
	for(int y=0; y<4; y++)
	{
		int end = 3;
		for(int x=2; x>=0; x--)
		{
			for(int m=x; m<end && arr[m][y]; m++)
			{
				if(arr[m][y] == arr[m+1][y])
				{
					arr[m+1][y] *= 2;
					arr[m][y] = 0;
					end = m;
					IS_MOVE_MERGE = true;
				}
				else if(0 == arr[m+1][y])
				{
					arr[m+1][y] = arr[m][y];
					arr[m][y] = 0;
					IS_MOVE_MERGE = true;
				}
			}
		}
	}
}
void right(void)
{
	for(int x=0; x<4; x++)
	{
		int end = 3;
		for(int y=2; y>=0; y--)
		{
			for(int m=y; m<end && arr[x][m]; m++)
			{
				if(arr[x][m] == arr[x][m+1])
				{
					arr[x][m+1] *= 2;
					arr[x][m] = 0;
					end = m;
					IS_MOVE_MERGE = true;
				}
				else if(0 == arr[x][m+1])
				{
					arr[x][m+1] = arr[x][m];
					arr[x][m] = 0;
					IS_MOVE_MERGE = true;
				}
			}
		}
	}
}

void left(void)
{
	for(int x=0; x<4; x++)
	{
		int end = 0;
		for(int y=1; y<4; y++)
		{
			for(int m=y; m>end && arr[x][m]; m--)
			{
				if(arr[x][m] == arr[x][m-1])
				{
					arr[x][m-1] *= 2;
					arr[x][m] = 0;
					end = m;
					IS_MOVE_MERGE = true;
				}
				else if(0 == arr[x][m-1])
				{
					arr[x][m-1] = arr[x][m];
					arr[x][m] = 0;
					IS_MOVE_MERGE = true;
				}
			}
		}
	}
}

判断是否结束

// 判断是否结束
bool is_over(void)
{
	if(is_null())
	{
		return false;
	}

	for(int x=0; x<4; x++)
	{
		for(int y=0; y<3; y++)
		{
			if(arr[x][y] == arr[x][y+1])
			{
				return false;
			}
		}
	}
	for(int x=0; x<3; x++)
	{
		for(int y=0; y<4; y++)
		{
			if(arr[x][y] == arr[x+1][y])
			{
				return false;
			}
		}
	}
	return true;
}

设置随机数

void init(void)
{
	// 设置随机数获取位置
	srand(time(NULL));
	
	FILE* frp = fopen(".2048.dat","r");
	if(NULL != frp)
	{
		IS_MOVE_MERGE = false;
		fread(arr,4,16,frp);
		fclose(frp);
		system("rm .2048.dat");
	}
}

int main()
{
	init();
	while(1)
	{
		// 创建一个数
		creat_num();
		// 显示界面
		show_view();
		// 判断游戏是否结束
		if(is_over())
		{
			printf("游戏结束!\n");
			return 0;
		}
		// 假定此次不能移动或合并
		IS_MOVE_MERGE = false;
		// 获取方向键,并处理
		switch(getch())
		{
			case 183: up(); break;//up
			case 184: down(); break;//down
			case 185: right(); break;//right
			case 186: left(); break;//left
		}
	}
}

猜你喜欢

转载自blog.csdn.net/weixin_45050225/article/details/98515829