#include <iostream> #include <stdlib.h> #include <time.h> #include <stdio.h> using namespace std; class ErLingSiBa { private: int Map[4][4], tmp[4][4]; int k[4],result[4]; public: void init() { for(int i=0;i<4;i++) { for(int j=0;j<4;j++) { Map[i][j]=0; } } int pos=rand()%16; Map[pos/4][pos%4]=2; } void Rand() { int b[16], x=0; for(int i=0;i<4;i++) { for(int j=0;j<4;j++) { if(Map[i][j]==0) { b[x]=i*4+j; x++; } } } if(x>0) { int pos=rand()%x; Map[b[pos]/4][b[pos]%4]=2; } } void Merge() { for(int i=0;i<4;i++) result[i]=0; int x=0, last=0; for(int i=0;i<4;i++) { if(k[i]==0) continue; if(x==0) { result[x]=k[i]; x++; } else { if(last==0&&k[i]==result[x-1]) { result[x-1]=2*result[x-1]; last=1; } else { result[x]=k[i]; x++; last=0; } } } } void check() { bool flag=0; for(int i=0;i<4;i++) { for(int j=0;j<4;j++) { if(tmp[i][j]!=Map[i][j]) flag=1; } } if(flag==1) { for(int i=0;i<4;i++) { for(int j=0;j<4;j++) { Map[i][j]=tmp[i][j]; } } Rand(); } else { // cout<<"wu xiao"<<endl; } } void Up() { for(int j=0;j<4;j++) { for(int i=0;i<4;i++) k[i]=Map[i][j]; Merge(); for(int i=0;i<4;i++) tmp[i][j]=result[i]; } } void Down() { for(int j=0;j<4;j++) { for(int i=0;i<4;i++) k[3-i]=Map[i][j]; Merge(); for(int i=0;i<4;i++) tmp[i][j]=result[3-i]; } } void Left() { for(int i=0;i<4;i++) { for(int j=0;j<4;j++) k[j]=Map[i][j]; Merge(); for(int j=0;j<4;j++) tmp[i][j]=result[j]; } } void Right() { for(int i=0;i<4;i++) { for(int j=0;j<4;j++) k[3-j]=Map[i][j]; Merge(); for(int j=0;j<4;j++) tmp[i][j]=result[3-j]; } } bool Success() { for(int i=0;i<4;i++) { for(int j=0;j<4;j++) { if(Map[i][j]==2048) return 1; } } return 0; } bool die() { int sum=0; for(int i=0;i<4;i++) { for(int j=0;j<4;j++) { if(Map[i][j]!=0) sum++; } } if(sum!=16) return 0; for(int i=1;i<4;i++) { for(int j=1;j<4;j++) { if(Map[i][j]==Map[i][j-1]||Map[i][j]==Map[i][j+1]|| Map[i][j]==Map[i-1][j]||Map[i][j]==Map[i+1][j]) return 0; } } if(Map[0][0]==Map[0][1]||Map[0][1]==Map[0][2]||Map[0][2]==Map[0][3]|| Map[0][0]==Map[1][0]||Map[1][0]==Map[2][0]||Map[2][0]==Map[3][0]) return 0; return 1; } void Show() { system("cls");//屏幕清空 for(int i=0;i<4;i++) { for(int j=0;j<4;j++) { if(Map[i][j]==0) printf(" *"); else printf("%5d",Map[i][j]); } cout<<endl; cout<<endl; } } }; int main() { srand((unsigned) time(NULL)); ErLingSiBa _2048; _2048.init(); _2048.Show(); while(1) { char op; cin>>op; if(op=='U') _2048.Up(); else if(op=='D') _2048.Down(); else if(op=='L') _2048.Left(); else if(op=='R') _2048.Right(); else continue; _2048.check(); _2048.Show(); if(_2048.die()) { cout<<"die"<<endl; break; } if(_2048.Success()) { cout<<"win"<<endl; break;} } return 0; }
详解明天更啦 今天有 1.. 困啦 晚安!!