2048 (C语言)

#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");
	printf("=========2048========\n\n");

	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");
	printf("\nR:继续上次游戏\n");
	printf("\nS:保存并退出游戏\n");
	printf("\nQ:退出游戏\n\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 save()
{
	FILE *fwp = fopen("2048.txt","w");
	for(int i=0;i<4;i++)
	{
		for(int j = 0;j<4;j++)
		{
			fprintf(fwp,"%d ",arr[i][j]);
		}
	}
	
}

//继续上次游戏
void last()
{
	FILE *frp=fopen("2048.txt","r");
	for(int i=0;i<4;i++)
	{
		for(int j = 0;j<4;j++)
		{
			fscanf(frp,"%d",&arr[i][j]);
		}
}
}



int main()
{
	// 设置随机数获取位置
	srand(time(NULL));

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

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
2048 游戏可以使用 C 语言进行开发。以下是一个简单的代码示例: ```c #include <stdio.h> #include <stdlib.h> #include <time.h> #define SIZE 4 #define TARGET 2048 int board[SIZE][SIZE]; void init_board() { srand(time(NULL)); int x1 = rand() % SIZE; int y1 = rand() % SIZE; int x2 = rand() % SIZE; int y2 = rand() % SIZE; while (x1 == x2 && y1 == y2) { x2 = rand() % SIZE; y2 = rand() % SIZE; } board[x1][y1] = 2; board[x2][y2] = 2; } void print_board() { printf("\n"); for (int i = 0; i < SIZE; i++) { for (int j = 0; j < SIZE; j++) { printf("%d\t", board[i][j]); } printf("\n"); } } int can_move(int x, int y, int dx, int dy) { if (x + dx < 0 || x + dx >= SIZE || y + dy < 0 || y + dy >= SIZE) { return 0; } if (board[x + dx][y + dy] == 0 || board[x + dx][y + dy] == board[x][y]) { return 1; } return 0; } void move(int x, int y, int dx, int dy) { if (can_move(x, y, dx, dy)) { if (board[x + dx][y + dy] == 0) { board[x + dx][y + dy] = board[x][y]; board[x][y] = 0; } else if (board[x + dx][y + dy] == board[x][y]) { board[x + dx][y + dy] *= 2; board[x][y] = 0; } } } void move_left() { for (int i = 0; i < SIZE; i++) { for (int j = 1; j < SIZE; j++) { move(i, j, 0, -1); } } } void move_right() { for (int i = 0; i < SIZE; i++) { for (int j = SIZE - 2; j >= 0; j--) { move(i, j, 0, 1); } } } void move_up() { for (int i = 1; i < SIZE; i++) { for (int j = 0; j < SIZE; j++) { move(i, j, -1, 0); } } } void move_down() { for (int i = SIZE - 2; i >= 0; i--) { for (int j = 0; j < SIZE; j++) { move(i, j, 1, 0); } } } int game_over() { int count = 0; for (int i = 0; i < SIZE; i++) { for (int j = 0; j < SIZE; j++) { if (board[i][j] == 0) { return 0; } if (board[i][j] == TARGET) { return 1; } if (i > 0 && board[i][j] == board[i - 1][j]) { count++; } if (j > 0 && board[i][j] == board[i][j - 1]) { count++; } } } if (count == 0) { return 1; } return 0; } int main() { init_board(); print_board(); while (!game_over()) { char c = getchar(); switch (c) { case 'a': move_left(); break; case 'd': move_right(); break; case 'w': move_up(); break; case 's': move_down(); break; default: break; } print_board(); } printf("Game over!\n"); return 0; } ``` 该代码使用二维数组 `board` 来存储游戏棋盘,其中 0 表示空格,2 表示初始的两个方块。游戏的核心逻辑在 `move` 函数中,用于判断是否可以移动并更新棋盘状态。在 `main` 函数中,根据用户输入来调用相应的移动函数,并在每次移动后打印当前的棋盘状态。游戏结束的判断逻辑在 `game_over` 函数中,当棋盘上没有空格并且没有相邻的方块可以合并时,游戏结束。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值