• 2048小游戏主要算法实现


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

    4681: 2048 分享至QQ空间 去爱问答提问或回答

    时间限制(普通/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
    ",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;
    }
    








  • 相关阅读:
    mmap文件修改内容的写回
    信号处理之物理信号和软件信号
    从printXX看tty设备(5)串口终端
    从printXX看tty设备(3)键盘输入处理
    LeetCode——Hamming Distance
    LeetCode——Add Strings
    计算树的高度和节点的个数
    LeetCode——Diameter of Binary Tree
    LeetCode——Number of Boomerangs
    九大排序算法总结
  • 原文地址:https://www.cnblogs.com/gccbuaa/p/6936550.html
Copyright © 2020-2023  润新知