脑子一热写了个2048
简直就是大模拟,比ACM好写多了
借助ncurses库
编译
g++ 2048.cpp D:\pdcurs36\wincon\pdcurses.a -I D:\pdcurs36\ -o 2048
#include<bits/stdc++.h>
#include <curses.h>
using namespace std;
const int N=4,WIN=3,LOSE=2,GAMING=1;
typedef vector<int> V;
void initialize() {
initscr();cbreak();
noecho();curs_set(0);
srand(time(NULL));
}
void shutdown() {endwin();}
void draw(int x,int y,char c){move(x,y);addch(c);}
class Game{
private:
int data[5][5],empty,statue;
void drawboundry(){
for(int i=0;i<=N;++i)for(int j=0;j<N;++j)for(int k=1;k<=5;++k)draw(i*3,j*6+k,'_');
for(int i=0;i<=N;++i)for(int j=1;j<=12;++j)draw(j,i*6,'|');
}
void drawnum(int x,int y,int val){
if(val==0)return;
if(val<10) {draw(x*3-1,y*6-3,val+'0');return;}
if(val<100) {draw(x*3-1,y*6-4,val/10+'0');draw(x*3-1,y*6-3,val%10+'0');return;}
if(val<1000) {draw(x*3-1,y*6-4,val/100+'0');draw(x*3-1,y*6-3,(val/10)%10+'0');draw(x*3-1,y*6-2,val%10+'0');return;}
draw(x*3-1,y*6-5,val/1000+'0');draw(x*3-1,y*6-4,val/100%10+'0');draw(x*3-1,y*6-3,(val/10)%10+'0');draw(x*3-1,y*6-2,val%10+'0');return;
}
void updatestatue(){
for(int i=1;i<=N;++i)for(int j=1;j<=N;++j)if(data[i][j]==2048){statue=WIN;return;}
if(empty>0){statue=GAMING;return;}
int ans=0;
for(int i=1;i<=N;++i)for(int j=2;j<=N;++j){
if(data[i][j]==data[i][j-1]){ans=1;break;}
if(data[j][i]==data[j-1][i]){ans=1;break;}
}
if(ans==1)statue=GAMING;
else statue=LOSE;
}
void addpoint(){
if(empty==0)return;
int co=rand()%empty+1;
for(int i=1;i<=N;++i){
for(int j=1;j<=N;++j){
if(data[i][j]==0)--co;
if(co==0){change(i,j,2);return;}
}
}
}
void change(int x,int y,int val){
if(data[x][y]==0&&val>0)--empty;
if(data[x][y]>0&&val==0)++empty;
data[x][y]=val;
}
void combine(){
for(int i=1;i<=N;++i){
V tmp;
for(int j=1;j<=N;++j)if(data[i][j]>0)tmp.push_back(data[i][j]);
for(int j=1;j<tmp.size();++j)if(tmp[j]==tmp[j-1])tmp[j-1]+=tmp[j],tmp[j]=0;
int now=1;for(int j=0;j<tmp.size();++j)if(tmp[j]>0)change(i,now++,tmp[j]);
while(now<=N)change(i,now++,0);
}
}
void rotate(){
int tmp[5][5];
for(int i=1;i<=N;++i)for(int j=1;j<=N;++j)tmp[N-j+1][i]=data[i][j];
for(int i=1;i<=N;++i)for(int j=1;j<=N;++j)data[i][j]=tmp[i][j];
}
public:
int getstatue(){updatestatue();return statue;}
void getstart(){
memset(data,0,sizeof data);empty=16;
addpoint();addpoint();statue=GAMING;
update();
}
void update(){
drawboundry();
for(int i=1;i<=N;++i)for(int j=1;j<=N;++j)drawnum(i,j,data[i][j]);
mvprintw(13,0, "r:reset q:quit w,s,a,d:control");
}
void move(char c){
if(c=='a'){combine();addpoint();return;}
if(c=='s'){rotate();rotate();rotate();combine();rotate();addpoint();return;}
if(c=='d'){rotate();rotate();combine();rotate();rotate();addpoint();return;}
if(c=='w'){rotate();combine();rotate();rotate();rotate();addpoint();return;}
}
}G2048;
int main() {
char c;
initialize();
G2048.getstart();
while(c=getch()){
if(c=='r')G2048.getstart();
if(c=='q')break;
if(c=='a'||c=='s'||c=='d'||c=='w')G2048.move(c);
clear();
G2048.update();
if(G2048.getstatue()==LOSE)mvprintw(15, 2, "Little Brother,You Lose!");
if(G2048.getstatue()==WIN)mvprintw(15, 2, "You Win So Slowly!");
}
shutdown();
}