【模拟】2048

本文介绍了一个2048游戏的模拟实现方法,玩家通过上下左右滑动将出现的数字方块进行合并,目标是得到数值2048的方块。文章详细解释了如何用编程方式模拟游戏过程,并提供了具体的实现代码。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

DescriptionDescriptionDescription

此时,ConanConanConan却在一旁玩着204820482048
这是一个4∗44*444的矩阵,初始全为000。每次一个没有数字的格子中会随机出现一个222444,每次可以选择上下左右其中一个方向去滑动,每滑动一次,所有的数字方块都会往滑动的方向靠拢外,相同数字的方块在靠拢、相撞时会相加。
ConanConanConan想看看今天自己运气咋样,于是就闭着眼睛,在屏幕上随便滑来滑去。所以这个模拟的任务就交给你了。过了一会,他然后睁开眼睛,如果游戏没有结束(滑动后如果没有空格子,则游戏结束),请输出矩阵(格式参见样例),否则输出“Game“GameGame over!”over!”over!(不包含引号)。

InputInputInput

输入第一行包含一个整数N,表示ConanConanConan滑了几下。
接下来NNN行,x,y,v,fx, y, v, fx,y,v,f表示第xxx行与第yyy列出现数字为vvv后,ConanConanConan滑的方向为ffffff为字符,U,D,L,RU, D, L, RU,D,L,R分别表示向上下左右滑)。
行从上往下1-4标号,列从左往右1-4标号。
数据保证在游戏未结束时,只会在空白区域出现数字。

OutputOutputOutput

输出按题目描述。

SampleInputSample InputSampleInput

8
1 3 4 L
2 3 2 U
2 4 2 R
4 1 2 L
3 4 2 L
3 2 2 D
1 3 4 R
1 3 2 U

SampleOutputSample OutputSampleOutput

0 0 2 8
0 0 0 2
0 0 0 8
0 0 0 0

ExplainExplainExplain

对于100%的数据满足。

TrainTrainTrain OfOfOf ThoughtThoughtThought

我们可以定一个双重循环和一个ttt,有以下四种情况:
1.往左滑:t=1(初值),枚举行,然后第二个循环枚举列,只要找到一个数就往左边移动到ttt的位置,然后本身清零,在判断是否能和t−1t-1t1这个位置的合并
2.往右滑:t=4(初值),枚举行,然后第二个循环枚举列,只要找到一个数就往右边移动到ttt的位置,然后本身清零,在判断是否能和t+1t+1t+1这个位置的合并
3.往上滑,t=1(初值),枚举列,然后第二个循环枚举行,只要找到一个数就往上边移动到ttt的位置,然后本身清零,在判断是否能和t−1t-1t1这个位置的合并
4.往下滑,t=4(初值),枚举列,然后第二个循环枚举行,只要找到一个数就往下边移动到ttt的位置,然后本身清零,在判断是否能和t+1t+1t+1这个位置的合并
详细见codecodecode

CodeCodeCode

#include<cstdio>
#include<iostream>
#include<cstring>
using namespace std;
int a[1001][1001],n;
int x,y,z;
bool b[1001][1001],ppp;
void left()
{
	for (int i=1; i<=4; ++i)
	 {
		int t=1;
	 	for (int j=1; j<=4; ++j)
	 	 if (a[i][j]!=0)
	 	 {
	 	 	swap(a[i][j],a[i][t]);//移动到t
	 	 	if (a[i][t-1]==a[i][t] && b[i][t-1]==0) a[i][t]=0,a[i][t-1]*=2,b[i][t-1]=1,t--;//看看是否能合并
	 	 	++t;
	 	 }
	 }
	if (a[1][4]!=0 && a[2][4]!=0 && a[3][4]!=0 && a[4][4]!=0) ppp=1;//判断游戏是否结束
}
void right()
{
	for (int i=1; i<=4; ++i)
	{
		int t=4;
	 for (int j=4; j>=1; --j)
	 	if (a[i][j]!=0)
	 	{
	 		swap(a[i][j],a[i][t]);//移动到t
	 		if (a[i][t+1]==a[i][t] && b[i][t+1]==0) a[i][t]=0,a[i][t+1]*=2,b[i][t+1]=1,++t;//看看是否能合并
			--t; 
	 	}
   }
	if (a[1][1]!=0 && a[2][1]!=0 && a[3][1]!=0 && a[4][1]!=0) ppp=1; 
}
void up()
{
	for (int i=1; i<=4; ++i){	
	int t=1;
	 for (int j=1; j<=4; ++j)
	  if (a[j][i]!=0)
	  {
	  	swap(a[t][i],a[j][i]);//移动到t
	  	if (a[t-1][i]==a[t][i] && b[t-1][i]==0) a[t][i]=0,a[t-1][i]*=2,b[t-1][i]=1,--t;//看看是否能合并
		  ++t;  
	  }
	}
	if (a[4][1]!=0 && a[4][2]!=0 && a[4][3]!=0 && a[4][4]!=0) ppp=1;
}
void down()
{
	for (int i=1; i<=4; ++i){ 
		int t=4;
	 for (int j=4; j>=1; --j)
	 	if (a[j][i]!=0)
	 	{
	 		swap(a[t][i],a[j][i]);//意思同上
	 		if (a[t+1][i]==a[t][i] && b[t+1][i]==0) a[t+1][i]*=2,a[t][i]=0,b[t+1][i]=1,++t;//同上
	 		--t;
	 	}
	 }
	if (a[1][2]!=0 && a[1][4]!=0 && a[1][3]!=0 && a[1][1]!=0) ppp=1;
}
int main()
{
	int tt;
	char ch[1005];
	scanf("%d",&n);
	for (tt=1; tt<=n; ++tt)
	{
		scanf("%d%d%d ",&x,&y,&z);
		a[x][y]=z;
		scanf("%c",&ch[tt]);
		if (ch[tt]=='L') left();
		if (ch[tt]=='U') up();
		if (ch[tt]=='D') down();
		if (ch[tt]=='R') right();
		if (ppp==1) break;
		memset(b,0,sizeof(b));
	}
	if (ppp==1 && tt!=n) {printf("Game over!"); return 0;}
	for (int i=1; i<=4; ++i) {
	 printf("\n");
	 for (int j=1; j<=4; ++j)
	   printf("%d ",a[i][j]);
	}
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值