1. 程式人生 > >2048小遊戲主要算法實現

2048小遊戲主要算法實現

mes 方向 時間限制 上下左右 print ron weight color ges

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;
}








2048小遊戲主要算法實現