#include <graphics.h>
#include <bits/stdc++.h>
using namespace std;
const int size=4,winsize=size*5+10;
int Map[10][10],Map2[10][10];
int mode=0,score=0,best=0;
map <int,string> nte;
map <int,string> nte2;
map <int,string> nte3;
int k=16;
void EvaluationStatus(int x,int y,int a,int mod) {
string str;
if(mode==0) {
str=nte[a];
setbkmode(1),setcolor(WHITE);
if(str=="RI ")setfillcolor(EGERGB(120,120,120));
else if(str=="CE ")setfillcolor(EGERGB(253,208,0));
else if(str=="UKE")setfillcolor(EGERGB(13,49,66));
else if(str=="TLE")setfillcolor(EGERGB(27,62,143));
else if(str=="MLE")setfillcolor(EGERGB(27,62,143));
else if(str=="OLE")setfillcolor(EGERGB(27,62,143));
else if(str=="RE ")setfillcolor(EGERGB(138,0,138));
else if(str=="WA ")setfillcolor(RED);
else if(str=="PC ")setfillcolor(EGERGB(236,118,0));
else if(str=="AC ")setfillcolor(GREEN);
else if(str=="AK ")setfillcolor(BLUE);
else setfillcolor(EGERGB(56,56,56));
} else if(mode==1) {
str=nte2[a];
setbkmode(1),setcolor(WHITE);
if(str=="商")setfillcolor(EGERGB(236,227,226)),setcolor(BLACK);
else if(str=="周")setfillcolor(EGERGB(233,219,178)),setcolor(BLACK);
else if(str=="秦")setfillcolor(EGERGB(238,171,130));
else if(str=="汉")setfillcolor(EGERGB(250,147,83));
else if(str=="唐")setfillcolor(EGERGB(250,114,83));
else if(str=="宋")setfillcolor(EGERGB(243,82,46));
else if(str=="元")setfillcolor(EGERGB(247,218,138));
else if(str=="明")setfillcolor(EGERGB(244,205,102));
else if(str=="清")setfillcolor(EGERGB(249,203,80));
else if(str=="民")setfillcolor(EGERGB(249,201,72));
else if(str=="now")setfillcolor(EGERGB(249,198,63));
else setfillcolor(EGERGB(204,190,179));
} else if(mode==2) {
str=to_string(a);
setbkmode(1),setcolor(WHITE);
if(str=="2")setfillcolor(EGERGB(236,227,226)),setcolor(BLACK);
else if(str=="4")setfillcolor(EGERGB(233,219,178)),setcolor(BLACK);
else if(str=="8")setfillcolor(EGERGB(238,171,130));
else if(str=="16")setfillcolor(EGERGB(250,147,83));
else if(str=="32")setfillcolor(EGERGB(250,114,83));
else if(str=="64")setfillcolor(EGERGB(243,82,46));
else if(str=="128")setfillcolor(EGERGB(247,218,138));
else if(str=="256")setfillcolor(EGERGB(244,205,102));
else if(str=="512")setfillcolor(EGERGB(249,203,80));
else if(str=="1024")setfillcolor(EGERGB(249,201,72));
else if(str=="2048")setfillcolor(EGERGB(249,198,63));
else setfillcolor(EGERGB(204,190,179));
}
ege_fillrect(x*k,y*k,5*k,5*k);
if(str!=" "&&str!="0")outtextxy((x+2-(str.size()/4))*k,(y+2)*k,str.c_str());
}
void init() {
nte[0]=" ",nte[2]="RI ",nte[4]="CE ",nte[8]="UKE";
nte[16]="TLE",nte[32]="MLE",nte[64]="OLE",nte[128]="RE ";
nte[256]="WA ",nte[512]="PC ",nte[1024]="AC ",nte[2048]="AK ";
nte2[0]=" ",nte2[2]="商",nte2[4]="周",nte2[8]="秦";
nte2[16]="汉",nte2[32]="唐",nte2[64]="宋",nte2[128]="元";
nte2[256]="明",nte2[512]="清",nte2[1024]="民",nte2[2048]="now";
initgraph(size*5*k+10*k,size*5*k+10*k,false),srand(time(0));
}
int check() {
int s=0;
for(int i=1; i<=size; i++)for(int j=1; j<=size; j++)if(Map[i][j]==2048)return -1;
for(int i=1; i<=size; i++)for(int j=1; j<=size; j++)
if(Map[i][j]==Map[i-1][j]||Map[i][j]==Map[i+1][j]
||Map[i][j]==Map[i][j-1]||Map[i][j]==Map[i][j+1])return 1;
else if(Map[i][j])s++;
return s!=size*size;
}
void op_input(char x) {
if(x!='w'&&x!='s'&&x!='a'&&x!='d')return;
queue <int> q[10],ans[10];
if(x=='w')for(int i=1; i<=size; i++)for(int j=1; j<=size; j++)if(Map[j][i])q[i].push(Map[j][i]);
if(x=='s')for(int i=1; i<=size; i++)for(int j=size; j>=1; j--)if(Map[j][i])q[i].push(Map[j][i]);
if(x=='a')for(int i=1; i<=size; i++)for(int j=1; j<=size; j++)if(Map[i][j])q[i].push(Map[i][j]);
if(x=='d')for(int i=1; i<=size; i++)for(int j=size; j>=1; j--)if(Map[i][j])q[i].push(Map[i][j]);
for(int i=1; i<=size; i++)for(int j=1; j<=size; j++)Map2[i][j]=Map[i][j];
memset(Map,0,sizeof(Map));
for(int i=1; i<=size; i++) {
int top1,top2,pa;
if(!q[i].empty()) {
top1=q[i].front(),q[i].pop();
while(!q[i].empty()) {
top2=q[i].front(),q[i].pop();
if(top1==top2) {
score+=top1+top2;
best=max(best,score);
ans[i].push(top1*2),top1=0;
if(!q[i].empty())top1=q[i].front(),q[i].pop();
else break;
} else ans[i].push(top1),top1=top2;
}
ans[i].push(top1);
}
if(x=='w'||x=='a')pa=0;
else pa=size+1;
if(x=='w')while(!ans[i].empty())Map[++pa][i]=ans[i].front(),ans[i].pop();
if(x=='s')while(!ans[i].empty())Map[--pa][i]=ans[i].front(),ans[i].pop();
if(x=='a')while(!ans[i].empty())Map[i][++pa]=ans[i].front(),ans[i].pop();
if(x=='d')while(!ans[i].empty())Map[i][--pa]=ans[i].front(),ans[i].pop();
}
for(int i=1; i<=size; i++)for(int j=1; j<=size; j++)if(Map[i][j]!=Map2[i][j]) {
int x2=rand()%size+1,y=rand()%size+1;
while(Map[x2][y])x2=rand()%size+1,y=rand()%size+1;
Map[x2][y]=2;
return;
}
}
void print_game() {
if(mode==0)setbkcolor(BLACK);
else if(mode==1)setbkcolor(EGERGB(248,244,234));
else if(mode==2)setbkcolor(EGERGB(248,244,234));
else if(mode==3)setbkcolor(EGERGB(248,244,234));
cleardevice();
if(mode==0)setfillcolor(EGERGB(30,30,30)),setcolor(EGERGB(150,150,150));
if(mode==1)setfillcolor(EGERGB(173,156,135)),setcolor(EGERGB(203,194,173));
if(mode==2)setfillcolor(EGERGB(173,156,135)),setcolor(EGERGB(203,194,173));
if(mode==3)setfillcolor(EGERGB(173,156,135)),setcolor(EGERGB(203,194,173));
ege_fillrect(winsize*k-10*k,2*k,5*k,3*k);
ege_fillrect(winsize*k-16*k,2*k,5*k,3*k);
ege_fillrect(winsize*k-22*k,2*k,5*k,3*k);
setbkmode(1);
outtextxy(winsize*k-9*k,2*k," score");
outtextxy(winsize*k-15*k,2*k," best");
outtextxy(winsize*k-21*k,2*k," mode");
outtextxy(winsize/2*k-10*k,winsize*k-1*k,"Space 更改模式 Use Space to change modes");
}
int main() {
ifstream fr;
ofstream fw;
init();
Map[rand()%size+1][rand()%size+1]=2;
memset(Map2,-1,sizeof(Map2));
setcaption("2048 For Programmers");
print_game();
fr.open("C:/ggcc/saves/2048saves.txt");
fr>>best;
fr.close();
do {
print_game();
setcolor(WHITE);
string s=to_string(score),b=to_string(best),m;
if(mode==0)m="程序员";
else if(mode==1)m="朝代版";
else if(mode==2)m="数字版";
outtextxy(winsize*k-8*k-(s.size()/4)*k,4*k,(s+' ').c_str());
outtextxy(winsize*k-14*k-(b.size()/4)*k,4*k,(b+' ').c_str());
outtextxy(winsize*k-21*k,4*k,m.c_str());
for(int i=1; i<=size; i++)for(int j=1; j<=size; j++)
EvaluationStatus(j*5,i*5+2,Map[i][j],mode);
char get=getch();
if(get==' ') {
mode=(mode+1)%3;
memset(Map2,-1,sizeof(Map2));
} else op_input(tolower(get));
} while(check()==1);
string s=to_string(score),b=to_string(best),m;
if(mode==0)m="程序员";
else if(mode==1)m="朝代版";
else if(mode==2)m="数字版";
setcolor(WHITE);
outtextxy(winsize*k-8*k-(s.size()/4)*k,4*k,(s+' ').c_str());
outtextxy(winsize*k-14*k-(b.size()/4)*k,4*k,(b+' ').c_str());
outtextxy(winsize*k-21*k,4*k,m.c_str());
for(int i=1; i<=size; i++)for(int j=1; j<=size; j++)
EvaluationStatus(j*5,i*5+2,Map[i][j],mode);
setbkmode(0),setbkcolor(BLUE);
fw.open("C:/ggcc/saves/2048saves.txt");
fw<<best;
fw.close();
if(check()==-1)outtextxy(12*k,15*k,"You win!"),Sleep(1000000);
else outtextxy(10*k,15*k,"Emmm.You failed..."),Sleep(1000000);
}
没有合适的资源?快使用搜索试试~ 我知道了~
[C++原创游戏实例]EGE2048程序员版
共2个文件
exe:1个
cpp:1个
需积分: 23 0 下载量 199 浏览量
2023-02-05
17:31:34
上传
评论
收藏 716KB ZIP 举报
温馨提示
基于EGE开发的2048项目,数字由洛谷提交状态”AC","WA","TLE","MLE"等代替,程序简单,支持存档。版权所有,请勿转载,违者必究。
资源推荐
资源详情
资源评论
收起资源包目录
2048程序员版.zip (2个子文件)
2048程序员版
2048程序员版-EGE.exe 2.55MB
2048程序员版-EGE.cpp 7KB
共 2 条
- 1
资源评论
匿名用户__
- 粉丝: 250
- 资源: 7
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功