zoukankan      html  css  js  c++  java
  • 2048

    随手写个2048全当练模拟了...上下左右,WASD都是可以的...你的操作会保存在 log.txt 中...

    顺手贴代码.

    #include<cstdio>
    #include<conio.h>
    #include<cstring>
    #include<cstdlib>
    #include<iostream>
    using namespace std;
    
    const int N = 4;
    const int M = 16;
    const int MUL = 8221;
    
    int seq;
    int w[M];
    FILE *fout=fopen("log.txt","w");
    
    void initSeed(int seed){ seq = seed; }
    int GetRand(){ return (seq = (seq * MUL) + (seq >> 16)) & 15; }
    //1 w 2 s 3 a 4 d
    int Read(char ch=getch()){
    	if(isascii(ch)){
    		switch(ch){
    			case 'w':case 'W':return 1;
    			case 's':case 'S':return 2;
    			case 'a':case 'A':return 3;
    			case 'd':case 'D':return 4;
    		}
    	}else{
    		ch=getch();
    		switch(ch){
    			case 72:return 1;
    			case 75:return 3;
    			case 77:return 4;
    			case 80:return 2;
    		}
    	}return -1;
    }
    void GetW(int x=GetRand()){ for(;w[x];x=GetRand());w[x]=2; }
    void Up(int a[]){
    	int u[5],b[5];
    	for(int i=0,j,c,t;i<4;i++){
    		memset(u,0,sizeof(u)),memset(b,0,sizeof(b));
    		for(c=0,j=i;j<16;j+=4) if(a[j]) b[++c]=a[j],a[j]=0;
    		for(j=1;j<=c;j++) if(!u[j]) if(b[j] == b[j+1]) b[j]+=b[j+1],u[j+1]=1;
    		for(j=1,t=i;j<=c;j++) if(!u[j]) a[t]=b[j],t+=4;
    	}
    }
    void Down(int a[]){
    	int u[5],b[5];
    	for(int i=0,j,c,t;i<4;i++){
    		memset(u,0,sizeof(u)),memset(b,0,sizeof(b));
    		for(c=0,j=i+12;j>=0;j-=4) if(a[j]) b[++c]=a[j],a[j]=0;
    		for(j=1;j<=c;j++) if(!u[j] && b[j]) if(b[j] == b[j+1]) b[j]+=b[j+1],u[j+1]=1;
    		for(j=1,t=i+12;j<=c;j++) if(!u[j]) a[t]=b[j],t-=4;
    	}
    }
    void Left(int a[]){
    	int u[5],b[5];
    	for(int i=0,j,c,t;i<16;i+=4){
    		memset(u,0,sizeof(u)),memset(b,0,sizeof(b));
    		for(c=0,j=i;j<i+4;j++) if(a[j]) b[++c]=a[j],a[j]=0;
    		for(j=1;j<=c;j++) if(!u[j] && b[j]) if(b[j] == b[j+1]) b[j]+=b[j+1],u[j+1]=1;
    		for(j=1,t=i;j<=c;j++) if(!u[j]) a[t]=b[j],t++;
    	}
    }
    void Right(int a[]){
    	int u[5],b[5];
    	for(int i=0,j,c,t;i<16;i+=4){
    		memset(u,0,sizeof(u)),memset(b,0,sizeof(b));
    		for(c=0,j=i+3;j>=i;j--) if(a[j]) b[++c]=a[j],a[j]=0;
    		for(j=1;j<=c;j++) if(!u[j] && b[j]) if(b[j] == b[j+1]) b[j]+=b[j+1],u[j+1]=1;
    		for(j=1,t=i+3;j<=c;j++) if(!u[j]) a[t]=b[j],t--;
    	}
    }
    
    void Copy(int a[],int b[]){ for(int i=0;i<16;i++) b[i]=a[i]; }
    int check(int a[],int b[]){ for(int i=0;i<16;i++) if(a[i]!=b[i]) return 1;return 0; }
    
    void Out(){
    	system("cls");
    	for(int i=1;i<=8;i++) putchar('
    ');
    	for(int i=0;i<M;i++){
    		if(!w[i]) printf("    -%c"," 
    "[(i+1)%4 == 0]);
    		else printf("%5d%c",w[i]," 
    "[(i+1)%4 == 0]);
    	}
    }
    int Over(){
    	int t[M];
    	Copy(w,t),Up(t);if(check(w,t)) return 0;
    	Copy(w,t),Down(t);if(check(w,t)) return 0;
    	Copy(w,t),Left(t);if(check(w,t)) return 0;
    	Copy(w,t),Right(t);if(check(w,t)) return 0;
    	return 1;
    }
    void Print(char c){ fprintf(fout,"%c",c); }
    void Play(int x){
    	initSeed(x),GetW(),GetW(),Out();
    	int cp[M];
    	for(;;){
    		int od=Read(),f=0;
    		switch(od){
    			case 1:Copy(w,cp),Up(cp);if(check(w,cp)) Up(w),f=1,Print('U');break;
    			case 2:Copy(w,cp),Down(cp);if(check(w,cp)) Down(w),f=1,Print('D');break;
    			case 3:Copy(w,cp),Left(cp);if(check(w,cp)) Left(w),f=1,Print('L');break;
    			case 4:Copy(w,cp),Right(cp);if(check(w,cp)) Right(w),f=1,Print('R');break;
    		}
    		if(f) GetW();
    		if(!Over()) Out();
    		else{ puts("You lose!");return; }
    	}
    }
    int main(){
    	for(int x;;){
    		cin>>x;
    		Play(x);
    	}return 0;
    }
  • 相关阅读:
    fiddler强大功能用法(二)
    fidder强大功能用法(一)
    fidder使用
    postman
    bug的一生:如何体现测试专业度?
    Fiddler无法抓到https的解决方法
    Fiddler工具安装下载使用
    z-index
    position:absolute
    ajax跨域,json,jsonp
  • 原文地址:https://www.cnblogs.com/beiyuoi/p/5978891.html
Copyright © 2011-2022 走看看