2048小游戏主要算法实现

http://acm.tzc.edu.cn/acmhome/problemdetail.do?&method=showdetail&id=4681

4681: 2048

时间限制(普通/Java):1000MS/3000MS     内存限制:65536KByte

总提交: 45            测试通过:16

描述

2048是一款最近较为流行的数字游戏,很多同学在课堂上研究如何得到更高的积分,以至影响了学习效果,不如自己写下这款游戏吧,这样估计也就没有玩的兴趣了。游戏的规则是:给定一个4*4的方格,开始的时候只有若干个2, 每次可以选择上下左右其中一个方向去滑动,每滑动一次,所有的数字方块都会往滑动的方向靠拢外,系统也会在空白的地方乱数出现一个数字方块,相同数字的方块在靠拢、相撞时会相加,可以连续移动但不能连续相加。玩家的目标就是尽快凑出“2048”这个数字方块。

作为一个程序员,写一个2048游戏当然难不倒你,通过分析你发现主要问题是如何根据当前状态和滑动方向,确定出下一个方格状态即滑动后的结果(不考虑新加入的随机方格)。每个状态绘制出来便成了一个简单的2048游戏。

输入

输入数据有多组,每组数据的第一行为一个整数d(0表示向左滑,1表示向右滑,2表示向上滑,3表示向下滑)。

接下来有4行4列的方格,每个方格的值只能为0,2,4,8,16,32,64,128,256,512,1024,2048,其中0表示该格子为空白。

输出

每组输出滑动后的状态,即4行4列的格子值。

样例输入

2
0 0 0 0
0 0 0 0
0 2 2 0
2 0 0 0
0
2 2 2 0
0 0 2 0
0 0 0 0
0 0 0 0

样例输出

2 2 2 0
0 0 0 0
0 0 0 0
0 0 0 0
4 2 0 0
2 0 0 0
0 0 0 0
0 0 0 0
#include<iostream>
#include<cstdio>
#include<cstring>
#include<string>
#include<algorithm>
using namespace std;
int a[4][4],n;
void up_remove_blank(){
	int i,j,k;
	for(j=0;j<4;j++){
		for(i=1;i<4;i++){
			k=i;
			while(k-1>=0&&a[k-1][j]==0){//上面的那个为空
				swap(a[k][j],a[k-1][j]);
				k--;

			}
		}
	}
}
void down_remove_blank(){
	int i,j,k;
	for(j=0;j<4;j++){
		for(i=2;i>=0;i--){
			k=i;
			while(k+1<=3&&a[k+1][j]==0){//上面的那个为空
				swap(a[k][j],a[k+1][j]);
				k++;
			}
		}
	}
}
void left_remove_blank(){
	int i,j,k;
	for(i=0;i<4;i++){
		for(j=1;j<4;j++){
			k=j;
			while(k-1>=0&&a[i][k-1]==0){//上面的那个为空
				swap(a[i][k],a[i][k-1]);
				k--;
			}
		}
	}
}
void right_remove_blank(){
	int i,j,k;
	for(i=0;i<4;i++){
		for(j=2;j>=0;j--){
			k=j;
			while(k+1<=3&&a[i][k+1]==0){//上面的那个为空
				swap(a[i][k],a[i][k+1]);
				k++;
			}
		}
	}
}
void left(){
	int i,j;
	for(i=0;i<4;i++){
		for(j=0;j<3;j++){
			if(a[i][j]==a[i][j+1]){
				a[i][j]+=a[i][j+1];
				a[i][j+1]=0;
				left_remove_blank();
			}
		}
	}
}
void right(){
		int i,j;
	for(i=0;i<4;i++){
		for(j=3;j>=1;j--){
			if(a[i][j]==a[i][j-1]){
				a[i][j]+=a[i][j-1];
				a[i][j-1]=0;
				right_remove_blank();
			}
		}
	}
}
void up(){
	int i,j;
	for(j=0;j<4;j++){//每一列
		for(i=0;i<3;i++){
			if(a[i][j]==a[i+1][j]){
				a[i][j]=a[i][j]+a[i+1][j];
				a[i+1][j]=0;
				//移除空格
				up_remove_blank();
			}
		}
	}
}
void down(){
	int i,j;
	for(j=0;j<4;j++){//每一列
		for(i=3;i>=1;i--){
			if(a[i][j]==a[i-1][j]){
				a[i][j]=a[i][j]+a[i-1][j];
				a[i-1][j]=0;
				//移除空格
				down_remove_blank();
			}
		}
	}
}
void output(){
	int i,j;
	for(i=0;i<4;i++){
		for(j=0;j<4;j++){
			if(j==3) printf("%d\n",a[i][j]);
			else printf("%d ",a[i][j]);
		}
	}
}
int main(){
	int i,j;
	while(scanf("%d",&n)==1){
		for(i=0;i<4;i++){
			for(j=0;j<4;j++){
				scanf("%d",&a[i][j]);
			}
		}
		if(n==0){//左
			left_remove_blank();
			left();

		}else if(n==1){//右
			right_remove_blank();
			right();
		}else if(n==2){//上
			up_remove_blank();
			up();

		} else{//下
			down_remove_blank();
			down();
		}
		output();

	}
	return 0;
}
时间: 2024-10-17 04:46:52

2048小游戏主要算法实现的相关文章

【2048小游戏】——原生js爬坑之遍历算法显示二维数组内容

引言:做2048小游戏会将横纵方向的数字内容,存储在一个二维数组中,要将这个二维数组中的内容显示在页面上,就一定要用遍历算法来实现了. 一.二维数组存储    首先考虑用二维数组存储所有行数,列数  →  var  RN=4,CN=4; 然后再定义一个变量data 来保存这个二维数组  →  var  data; 游戏的所有主要执行程序都保存在start()函数下 → 启动游戏 保存存有行数,列数的二维数组到data中    关键代码 ↓ function start(){ data=[]; /

js实现2048小游戏二维数组更新算法

2048小游戏是当下比较流行的益智游戏了,而它最关键的模块莫过于当手指滑过或鼠标按下后如何确定更新的值. 首先该游戏可以看作一个4*4的二维数组的更新游戏,玩家通过控制数组内元素的合并来不断产生更大的数字,当方向确定时,每一行或每一列的计算方式实际上是一样的,例如,当我确定方向为向左时,每一行的计算方式都是一样的,这样,我们就可以将二维数组的计算简化为一维数组的计算了,然后通过循环计算其他行即可. 而一维数组中主要就是寻找相邻的两个非空值进行合并,相关函数可表示如下: // 一维数组合并相邻非空

C# 开发2048小游戏

这应该是几个月前,闲的手痒,敲了一上午代码搞出来的,随之就把它丢弃了,当时让别人玩过,提过几条更改建议,但是时至今日,我也没有进行过优化和更改(本人只会作案,不会收场,嘎嘎),下面的建议要给代码爱好的童鞋完成了. 更改建议: a.当数字超过四位数时,显示的时候有部分被它的容器TextBox遮挡了,能不能把显示的数值变小点?答案是可以的.代码里有一段通过矩阵数据填充TextBox值的操作,可以在填充时,判断下数值长度,然后修改TextBox的文字大小. b.玩游戏的时候,使用方向键移动时,焦点可能

2048小游戏(变态版哦)

近日,由于博主同学暑假有个作业是写个2048小游戏,我一听挺好玩的..然后就开始了.. 首先,2048在移动过程中的规则其实也没有特别难,但是感觉也不是一句话就能说完的.(不过玩的多--感觉总是有的) 废话不多说,其实博主同学提供了pdf描述了2048的算法. 各位筒子入坑前请先过几眼这个规则,以及其算法(当然我觉得算法第二点有点问题,后述) 那么在游戏的编写前,可以先对细枝末节做一些准备. 1.出现数字2/4的概率 int getRand() { int i = rand() % 10; if

2048小游戏(C语言版)

1 #include <climits> 2 #include <cstdio> 3 #include <cstring> 4 #include <stack> 5 #include <string> 6 #include <map> 7 #include <vector> 8 #include <cmath> 9 10 11 /* 12 玩法说明:编译运行后,输入一个整数n,表示自己想玩的游戏中是n*n的表格

canvas随笔之2048小游戏

HTML: <!DOCTYPE HTML> <html> <head> <title>2048小游戏</title> <meta charset="utf-8"> <meta name="viewport" content="width=device-width, initial-scale=1.0, minimum-scale=0.5, maximum-scale=2.0, u

如何在CentOS上安装一个2048小游戏

如何在centos上安装一个2048小游戏 最近在学习CentOS系统,就琢磨着玩点什么,然后我看到有人在玩2048小游戏,所有我就在想,为啥不装一个2048小游戏搞一下嘞,于是乎,我就开始工作啦 由于我个人的编程能力不强,所以我就在网上找到了一个C语言版的2048游戏小程序,我把它放到我的百度网盘上,可以供大家下载(链接:http://pan.baidu.com/s/1jIutb3g 密码:mu9z),然后我们把这个程序给复制到CentOS系统下,在进行下一步的工作.我们可以在CentOS上安

Swift实战之2048小游戏

上周在图书馆借了一本Swift语言实战入门,入个门玩一玩^_^正好这本书的后面有一个2048小游戏的实例,笔者跟着实战了一把. 差不多一周的时间,到今天,游戏的基本功能已基本实现,细节我已不打算继续完善,就这么整理一下过程中一些值得记录的点吧. 用的Swift版本是2.0,原书中的Swift版本会低一些,所以实践起来有些地方语法并不一样. 一.开始页面   在程序的第一张页面(Main.storyboard)上,只放了一个“开始游戏”按钮,点击按钮,弹出一个提示对话框,确认后,进入游戏页面. 1

2048小游戏-JS实现(BUG调试中)

刚刚学习JS的菜鸟,游戏没有实现滑动效果.希望有前辈能指点一下······ 定义的主要方法: 1.fuzhi()生成一对随机数,然后根据这对随机数取得一个随机单元格,先判断其是否为空,不为空,对其进行赋值为2的操作:为空,则再次调用fuzhi(). 2.secai()遍历表格,根据单元格的数值改变单元格的背景颜色. 3.score()遍历单元格,计算实时总得分. 4.keyDown()主要方法,根据用户按上下左右键来进行不同的数值相加.消除动作.这一段代码写得很冗余····· 1 <!DOCTY