小游戏之2048

脑子一热写了个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();
}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值