C++基于EasyX图形库实现2048小游戏
C++和EasyX图形库,实现2048小游戏,供大家参考,具体内容如下
MainGame2048.cpp
/**Name:Game2048CoreClass*/ #include#include #include #include #include #include #include"Game2048.h" #defineBLOCK_SIZE60 #defineSIZE_COL10 #defineSIZE_ROW10 usingnamespacestd; voidDisplayMap(Game2048&mygame); intGetMove(); intmain(intargc,char*argv[]) { HWNDhwnd=initgraph(SIZE_COL*BLOCK_SIZE,SIZE_ROW*BLOCK_SIZE); setbkmode(TRANSPARENT); setbkcolor(RGB(180,180,180)); settextcolor(RGB(0,180,80)); cleardevice(); while(1) { Game2048mygame(SIZE_ROW,SIZE_COL); while(1) { DisplayMap(mygame); intmov=GetMove(); cout< Game2048.h
#ifndef_GAME2048_H_ #define_GAME2048_H_ /*Forexample: Game2048mygame(10,10); intmain(intargc,char*argv[]) { while(1) { DisplayMap(); intmov=GetMove(); cout<#include typedefintMoveDirect; #defineMOV_NULL0 #defineMOV_UP8 #defineMOV_DOWN5 #defineMOV_LEFT4 #defineMOV_RIGHT6 classGame2048 { public: Game2048(intline=5,intcol=5); ~Game2048(); boolRun(MoveDirectmov); intGetCols(); intGetLines(); intMapAt(intrindex,intcindex);//return>=0istrue,-1isbadindex,0meanspace,othermeannumber. intGetStep(); intGetScore(); intGetUsedTime(); intGetMaxNum(); voidclear(); private: voidCreateNew(); voidMoveAndResult(MoveDirectmov); boolIsDead(); //运行图和运行时环境 int*Map; intlines; intcols; intstep; intcore; longruntime; intusetime; intmaxnum; }; #endif//_GAME2048_H_ Game2048.cpp
#include"Game2048.h" Game2048::Game2048(intline,intcol) { this->lines=line; this->cols=col; this->step=0; this->core=0; this->runtime=0; this->usetime=0; this->maxnum=2; this->Map=(int*)malloc(sizeof(int)*(this->lines)*(this->cols)); runtime=time(NULL);//记录开始时间,用于算总时长 srand((unsigned)time(NULL)); for(inti=0;ilines;i++) { for(intj=0;j cols;j++) { Map[i*this->cols+j]=0; } } CreateNew(); } Game2048::~Game2048() { free(this->Map); } voidGame2048::clear() { this->step=0; this->core=0; this->runtime=0; this->usetime=0; this->maxnum=2; runtime=time(NULL);//记录开始时间,用于算总时长 srand((unsigned)time(NULL)); for(inti=0;i lines;i++) { for(intj=0;j cols;j++) { Map[i*this->cols+j]=0; } } CreateNew(); } boolGame2048::Run(MoveDirectmov) { CreateNew(); MoveAndResult(mov); if(step>(lines*cols*2)) if(IsDead()==1) returnfalse; usetime=time(NULL)-runtime; returntrue; } intGame2048::GetCols() { returnthis->cols; } intGame2048::GetLines() { returnthis->lines; } intGame2048::MapAt(intrindex,intcindex) { if(rindex<0||cindex<0||rindex>=this->lines||cindex>=this->cols) return-1; returnMap[rindex*this->cols+cindex]; } intGame2048::GetStep() { returnthis->step; } intGame2048::GetScore() { returnthis->core; } intGame2048::GetUsedTime() { returnthis->usetime; } intGame2048::GetMaxNum() { returnthis->maxnum; } voidGame2048::CreateNew() { inthasfull=1; for(inti=0;i cols+j]==0) hasfull=0;//判断是否满了,不满才创建 } } if(hasfull==1) return; intsi,sj; si=rand()%lines; sj=rand()%cols; while(Map[si*this->cols+sj]!=0) { si=rand()%lines; sj=rand()%cols; } Map[si*this->cols+sj]=2; } boolGame2048::IsDead() { for(inti=0;i lines+j]==0) returnfalse;//如果存在空的格则肯定不结束 intup,down,right,left; up=i-1; down=i+1; right=j+1; left=j-1;//四个方向进行判定 while(up>=0&&Map[up*this->lines+j]==0) up--; if(Map[up*this->lines+j]==Map[i*this->lines+j]&&up!=-1)//只要一个方向可以合并则不结束 returnfalse; while(down lines+j]==0) down--; if(Map[down*this->lines+j]==Map[i*this->lines+j]&&down!=lines) returnfalse; while(right lines+right]==0) right++; if(Map[i*this->lines+right]==Map[i*this->lines+j]&&right!=cols) returnfalse; while(left>=0&&Map[i*this->lines+left]==0) left--; if(Map[i*this->lines+left]==Map[i*this->lines+j]&&left!=-1) returnfalse; } } returntrue;//排除所有情况不结束,肯定结束了 } voidGame2048::MoveAndResult(MoveDirectmov) { if(mov==MOV_NULL) return; step++;//步数增加 intffind,nfind; if(mov==MOV_UP) { for(inti=0;i cols+i]==0) k++; if(k!=lines) ffind=k; k++; while(k lines+i]==0) k++; if(k!=lines) nfind=k;//获取第一个不为零和下一个不为零 if(ffind!=-1&&nfind!=-1) { if(ffind!=nfind) { if(Map[ffind*this->lines+i]==Map[nfind*this->lines+i])//两个获取相等则叠加 { Map[ffind*this->lines+i]*=2; if(Map[ffind*this->lines+i]>maxnum) maxnum=Map[ffind*this->lines+i]; Map[nfind*this->lines+i]=0; core++;//分数增加 } } } } intcount=0; for(intj=0;j lines+i]!=0) { inttemp=Map[j*this->lines+i]; Map[j*this->lines+i]=0; Map[count*this->lines+i]=temp; count++; } } } } elseif(mov==MOV_DOWN) { for(inti=0;i =0;j--) { intk=j; while(k>=0&&Map[k*this->cols+i]==0) k--; if(k!=-1) ffind=k; k--; while(k>=0&&Map[k*this->cols+i]==0) k--; if(k!=-1) nfind=k; if(ffind!=-1&&nfind!=-1) { if(ffind!=nfind) { if(Map[ffind*this->cols+i]==Map[nfind*this->cols+i]) { Map[ffind*this->cols+i]*=2; if(Map[ffind*this->cols+i]>maxnum) maxnum=Map[ffind*this->cols+i]; Map[nfind*this->cols+i]=0; core++; } } } } intcount=lines-1; for(intj=lines-1;j>=0;j--) { if(Map[j*this->cols+i]!=0) { inttemp=Map[j*this->cols+i]; Map[j*this->cols+i]=0; Map[count*this->cols+i]=temp; count--; } } } } elseif(mov==MOV_LEFT) { for(inti=0;i cols+k]==0) k++; if(k!=cols) ffind=k; k++; while(k cols+k]==0) k++; if(k!=cols) nfind=k; if(ffind!=-1&&nfind!=-1) { if(ffind!=nfind) { if(Map[i*this->cols+ffind]==Map[i*this->cols+nfind]) { Map[i*this->cols+ffind]*=2; if(Map[i*this->cols+ffind]>maxnum) maxnum=Map[i*this->cols+ffind]; Map[i*this->cols+nfind]=0; core++; } } } } intcount=0; for(intj=0;j cols+j]!=0) { inttemp=Map[i*this->cols+j]; Map[i*this->cols+j]=0; Map[i*this->cols+count]=temp; count++; } } } } elseif(mov==MOV_RIGHT) { for(inti=0;i =0;j--) { intk=j; while(k>=0&&Map[i*this->cols+k]==0) k--; if(k!=-1) ffind=k; k--; while(k>=0&&Map[i*this->cols+k]==0) k--; if(k!=-1) nfind=k; if(ffind!=-1&&nfind!=-1) { if(ffind!=nfind) { if(Map[i*this->cols+ffind]==Map[i*this->cols+nfind]) { Map[i*this->cols+ffind]*=2; if(Map[i*this->cols+ffind]>maxnum) maxnum=Map[i*this->cols+ffind]; Map[i*this->cols+nfind]=0; core++; } } } } intcount=cols-1; for(intj=cols-1;j>=0;j--) { if(Map[i*this->cols+j]!=0) { inttemp=Map[i*this->cols+j]; Map[i*this->cols+j]=0; Map[i*this->cols+count]=temp; count--; } } } } } 以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持毛票票。
声明:本文内容来源于网络,版权归原作者所有,内容由互联网用户自发贡献自行上传,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任。如果您发现有涉嫌版权的内容,欢迎发送邮件至:czq8825#qq.com(发邮件时,请将#更换为@)进行举报,并提供相关证据,一经查实,本站将立刻删除涉嫌侵权内容。