码迷,mamicode.com
首页 > 其他好文 > 详细

2048小游戏主要算法实现

时间:2014-10-08 17:46:15      阅读:280      评论:0      收藏:0      [点我收藏+]

标签:style   blog   http   color   io   os   ar   java   for   

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

4681: 2048 bubuko.com,布布扣 bubuko.com,布布扣

时间限制(普通/Java):1000MS/3000MS     内存限制:65536KByte
总提交: 45            测试通过:16

描述

2048是一款最近较为流行的数字游戏,很多同学在课堂上研究如何得到更高的积分,以至影响了学习效果,不如自己写下这款游戏吧,这样估计也就没有玩的兴趣了。游戏的规则是:给定一个4*4的方格,开始的时候只有若干个2, 每次可以选择上下左右其中一个方向去滑动,每滑动一次,所有的数字方块都会往滑动的方向靠拢外,系统也会在空白的地方乱数出现一个数字方块,相同数字的方块在靠拢、相撞时会相加,可以连续移动但不能连续相加。玩家的目标就是尽快凑出“2048”这个数字方块。
作为一个程序员,写一个2048游戏当然难不倒你,通过分析你发现主要问题是如何根据当前状态和滑动方向,确定出下一个方格状态即滑动后的结果(不考虑新加入的随机方格)。每个状态绘制出来便成了一个简单的2048游戏。
 bubuko.com,布布扣

输入

输入数据有多组,每组数据的第一行为一个整数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;
}








2048小游戏主要算法实现

标签:style   blog   http   color   io   os   ar   java   for   

原文地址:http://blog.csdn.net/liang5630/article/details/39895087

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!