2048

来源:互联网 发布:js后退不刷新页面 编辑:程序博客网 时间:2024/06/06 08:49
今天用c++自己写了个2048,纯练手。记录一下~
//C.h 几乎各程序都需要用到的文件包含宏命令和使用名空间#ifndef _C_H_#define _C_H_#include <iostream>#include <fstream>#include <iomanip>#include <cmath>#include <string>#include <vector>#include <list>#include <stack>#include <queue>#include <bitset>#include <algorithm>#include <ctime>#include <cstdarg>#include <assert.h>using namespace std;#endif

//2048square.h方块类的定义#ifndef _2048SQUARE_H_#define _2048SQUARE_H_#define N 4template<typename T>class ASquare{private:T data[N][N];public:ASquare(){for(int i=0;i<N;i++)for(int j=0;j<N;j++)data[i][j]=0;}void NEW()//产生一个新数{int x=rand()%N,y=rand()%N;while(data[x][y]!=0){x=rand()%N;y=rand()%N;}data[x][y]=(rand()%2)*2+2;}void Print()const{system("cls");for(int i=0;i<N;i++){for(int j=0;j<N;j++)cout<<setw(5)<<data[i][j];cout<<endl;}return;}void Merge(char direct)//消去相同的 返回能否merge{switch((direct<='W'&&direct>='S')||(direct<='w'&&direct>='s')){    case 1://扫描每一列for(int i=0;i<N;i++)//i指示列{T *cur,*test;cur=&data[0][i];test=&data[1][i];while(test-&data[0][i]<=N*(N-1)){while(*cur==0){cur+=N;}while(test<=cur||*test==0){test+=N;}if(*cur==*test&&test-&data[0][i]<=N*(N-1)){*cur+=*test;*test=0;cur+=N;test+=N;}else if(*test!=0&&test-&data[0][i]<=N*(N-1)){cur=test;test+=N;}}}break;case 0://扫描每一行for(int i=0;i<N;i++)//i指示行{T *cur,*test;cur=&data[i][0];test=&data[i][1];while(test-&data[i][0]<N){while(*cur==0){cur+=1;}while(test<=cur||*test==0){test+=1;}if(*cur==*test&&test-&data[i][0]<N){*cur+=*test;*test=0;cur+=1;test+=1;}else if(*test!=0&&test-&data[i][0]<N){cur=test;test+=1;}}}break;}}void Move(char direct){T *loc;//指向空白位置switch(direct){case 'W':case 'w':{for(int i=0;i<N;i++)//i指示列{T *cur;loc=&data[0][i];cur=&data[1][i];while(cur-&data[0][i]<=N*(N-1)){while(*loc!=0){loc+=N;}while(cur<loc||*cur==0){cur+=N;}if(cur-&data[0][i]<=N*(N-1)){*loc=*cur;*cur=0;loc+=N;cur+=N;}}}break;}case 'S':case 's':{for(int i=0;i<N;i++)//i指示列{T *cur;loc=&data[N-1][i];cur=&data[N-2][i];while(&data[N-1][i]-cur<=N*(N-1)){while(*loc!=0){loc-=N;}while(cur>loc||*cur==0){cur-=N;}if(&data[N-1][i]-cur<=N*(N-1)){*loc=*cur;*cur=0;loc-=N;cur-=N;}}}break;}case 'A':case 'a':{for(int i=0;i<N;i++)//i指示行{T *cur;loc=&data[i][0];cur=&data[i][1];while(cur-&data[i][0]<N){while(*loc!=0&&(cur-&data[i][0]<N)){loc+=1;}while(*cur==0&&(cur-&data[i][0]<N)||cur<loc){cur+=1;}if(cur-&data[i][0]<N){*loc=*cur;*cur=0;loc+=1;cur+=1;}}}break;}case 'D':case 'd':{for(int i=0;i<N;i++)//i指示行{T *cur;loc=&data[i][N-1];cur=&data[i][N-2];while(&data[i][N-1]-cur<N){while(*loc!=0&&(&data[i][N-1]-cur<N)){loc-=1;}while(*cur==0&&(&data[i][N-1]-cur<N)||cur>loc){cur-=1;}if(&data[i][N-1]-cur<N){*loc=*cur;*cur=0;loc-=1;cur-=1;}}}break;}default:cout<<"wrong direction!"<<endl;}}bool GameOver()const{for(int i=0;i<N;i++)for(int j=0;j<N;j++){if(data[i][j]==16){cout<<"Succeed!"<<endl;return true;}}for(int i=0;i<N;i++)for(int j=0;j<N;j++){if(data[i][j]==0)return false;}cout<<"GAMEOVER!"<<endl;return true;//gameover}};#endif


#include "C.h"typedef int T;#include "2048square.h"void main(){ASquare<T>L;char order;L.NEW();while(!L.GameOver()){L.Print();cout<<"direction:";cin>>order;L.Merge(order);L.Print();L.Move(order);L.Print();L.NEW();}system("pause");}

0 0
原创粉丝点击