I AK IOI(不是机惨,是游戏名,2048))
  • 板块灌水区
  • 楼主_zhaosihan_qwq_
  • 当前回复16
  • 已保存回复16
  • 发布时间2025/1/22 10:08
  • 上次更新2025/1/22 12:23:18
查看原帖
I AK IOI(不是机惨,是游戏名,2048))
1287887
_zhaosihan_qwq_楼主2025/1/22 10:08

c++版IOI终于肝出来了

#include<iostream>
#include<cstdio>
#include<cstdlib>
#include<conio.h>
#include<ctime>
#include<cmath>
#include<windows.h>
bool ak;
using namespace std;
int score=0,best=0;
int premove[5][5];
void SCAB(int ForgC, int BackC){
    WORD wColor = ((BackC & 0x0F) << 4) + (ForgC & 0x0F);
    SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE), wColor);
}
char instruction[36][35]={
    "EDITION 1.03",
    "get AK to win!",
    " ",
    "Use arrow keys or",
    "WASD to move block",
    "Use R to restart game",
    "Use Q to quit game",
    " ",
    "BLOCKS",
    "CE=2 compile error",
    "@=4 judging",
    "RE=8 runtime error",
    "TLE=16 time limit exceeded",
    "MLE=32 memory limit exceeded",
    "ILE=64 idleness limit exceeded",
    "OLE=128 output limit exceeded",
    "UKE=256 unknown error",
    "WA=512 wrong answer",
    "PC=1024 partly correct",
    "AC=2048 accepted",
    "PE=4096 presentation error",
    "DOJ=8192 denial of judging",
    "SJE=16384 special judge error",
    "AU=32768",
    "AK=65536 (win)",
    "#=*1 pragma...",
    "O2=*2",
    "O3=*4",
    " ",
    "made by jiangpeiyuan",
    "original 2048:",
    "https://2048game.com/",
    "original AK-IOI:",
    "https://ak-ioi.com/apps/oi-2048/",
    " ",
    "Hope You Like It!"
};
char endskin[14][61]={
    "+----------------------------------------------------------+",
    "|                  A    FFFFF   OOO     !                  |",
    "|   #   #         A A   F      O   O    !          #   #   |",
    "|                A   A  FFFFF  O   O    !                  |",
    "|   /---\\        AAAAA  F      O   O               /---\\   |",
    "|  /     \\       A   A  F       OOO     !         /     \\  |",
    "+----------------------------------------------------------+",
    "+-+-+-+-+-+-+-+-+-+-+-+-+-+-+--+-+-+-+-+-+-+-+-+-+-+-+-+-+-+",
    "|.........................A....K..KK.......................|",
    "+...#...#................A.A...K.K.................#...#...+",
    "|................-----..A...A..KK.....-----................|",
    "+..\\...../..............AAAAA..K.K................\\...../..+",
    "|...\\---/...............A...A..K..KK...............\\---/...|",
    "+-+-+-+-+-+-+-+-+-+-+-+-+-+-+--+-+-+-+-+-+-+-+-+-+-+-+-+-+-+"
};
int color_type[20]={0,6,1,5,13,13,13,13,0,4,3,2,12,10,8,14,9,15,14,9};
char scorenum[9][41]={
    "----------------------------------------",
    "                                        ",
    "###  #  ##  ##  # # ###  ## ### ###  ## ",
    "# # ##    #   # # # #   #     # # # # # ",
    "# #  #   #  ##  ### ##  ##    #  #   ## ",
    "# #  #  #     #   #   # # #  #  # #   # ",
    "### ### ### ##    # ##  ##  #   ###   # ",
    "                                        ",
    "----------------------------------------"
};
char intro[9][30]={
    "@.@.@.@.@.@.@.@.@.@.@.@.@.@.@",
    ".                           .",
    "@   #   ]  ]]   III OOO III @",
    ".  # #  ] ]      I  O O  I  .",
    "@ #   # ]]    @  I  O O  I  @",
    ". ##### ] ]      I  O O  I  .",
    "@ #   # ]  ]]   III OOO III @",
    ".                           .",
    "@.@.@.@.@.@.@.@.@.@.@.@.@.@.@"
};
char endd[5][14]={
    " BBBB    JJJ ",
    " B   B    J  ",
    " BBBB     J  ",
    " B   B J  J  ",
    " BBBB   JJ   "
};
char better[36][16]={
    "~~~~~~~~~~~~~~~","~~~~~~~~~~~~~~~","~~~~~~~~~~~~~~~","~~~~~~~~~~~~~~~","~~~~~~~~~~~~~~~","~~~~~~~~~~~~~~~","~~~~~~~~~~~~~~~","~~~~~~~~~~~~~~~","~~~~~~~~~~~~~~~",
    "~~~~~~~~~~~~~~~","~~~~~~~~~~~~~~~","~~~~~~#~#~~~~~~","~~~~~#####~~~~~","~~~~~~#~#~~~~~~","~~~~~#####~~~~~","~~~~~~#~#~~~~~~","~~~~~~~~~~~~~~~","~~~~~~~~~~~~~~~",
    "~~~~~~~~~~~~~~~","~~~~~~~~~~~~~~~","~~&&&&&~&&&&&~~","~~&~~~&~~~~~&~~","~~&~~~&~&&&&&~~","~~&~~~&~&~~~~~~","~~&&&&&~&&&&&~~","~~~~~~~~~~~~~~~","~~~~~~~~~~~~~~~",
    "~~~~~~~~~~~~~~~","~~~~~~~~~~~~~~~","~~@#@#@~@#@#@~~","~~#~~~#~~~~~#~~","~~@~~~@~@#@#@~~","~~#~~~#~~~~~#~~","~~@#@#@~@#@#@~~","~~~~~~~~~~~~~~~","~~~~~~~~~~~~~~~"
};
char tiles[160][16]={
    "               ","               ","               ","               ","               ","               ","               ","               ","               ",
    "@@@@@@@@@@@@@@@","@             @","@  |||| ||||| @","@ |     |     @","@ |     ||||| @","@ |     |     @","@  |||| ||||| @","@             @","@@@@@@@@@@@@@@@",
    "@@@@@@@@@@@@@@@","@        *    @","@   $$$$$**   @","@  $     *    @","@             @","@    *     $  @","@   **$$$$$   @","@    *        @","@@@@@@@@@@@@@@@",
    "&&&&&&&&&&&&&&&","&             &","& !!!!  !!!!! &","& !   ! !     &","& !!!!  !!!!! &","& ! !   !     &","& !  !! !!!!! &","&             &","&&&&&&&&&&&&&&&",
    "&&&&&&&&&&&&&&&","&             &","& ### #   ### &","&  #  #   #   &","&  #  #   ### &","&  #  #   #   &","&  #  ### ### &","&             &","&&&&&&&&&&&&&&&",
    "###############","#.............#","#.%.%.%...%%%.#","#.%%%.%...%...#","#.%%%.%...%%%.#","#.%.%.%...%...#","#.%.%.%%%.%%%.#","#.............#","###############",
    "###############","#.............#","#.@@@.@...@@@.#","#..@..@...@...#","#..@..@...@@@.#","#..@..@...@...#","#.@@@.@@@.@@@.#","#.............#","###############",
    "]]]]]]]]]]]]]]]","].............]","].OOO.O...OOO.]","].O.O.O...O...]","].O.O.O...OOO.]","].O.O.O...O...]","].OOO.OOO.OOO.]","].............]","]]]]]]]]]]]]]]]",
    "]]]]]]]]]]]]]]]","].............]","].$.$.$.$.$$$.]","].$.$.$.$.$...]","].$.$.$$..$$$.]","].$.$.$.$.$...]","].$$$.$.$.$$$.]","].............]","]]]]]]]]]]]]]]]",
	"XXXXXXXXXXXXXXX","X-------------X","X-W-W-W---W---X","X-W-W-W--W-W--X","X-W-W-W-W---W-X","X-W-W-W-WWWWW-X","X--W-W--W---W-X","X-------------X","XXXXXXXXXXXXXXX",
	"XXXXXXXXXXXXXXX","X-------------X","X-@@@@---@@@@-X","X-@---@-@-----X","X-@@@@--@-----X","X-@-----@-----X","X-@------@@@@-X","X-------------X","XXXXXXXXXXXXXXX",
	"$$$$$$$$$$$$$$$","$-------------$","$---%----%%%%-$","$--%-%--%-----$","$-%---%-%-----$","$-%%%%%-%-----$","$-%---%--%%%%-$","$-------------$","$$$$$$$$$$$$$$$",
	"$$$$$$$$$$$$$$$","$-------------$","$-PPPP--PPPPP-$","$-P---P-P-----$","$-PPPP--PPPPP-$","$-P-----P-----$","$-P-----PPPPP-$","$-------------$","$$$$$$$$$$$$$$$",
    "///","/&&&&&&&&&&&&&/","/&..&&...&&&.&/","/&.&.&.&.&&&.&/","/&.&.&.&.&&&.&/","/&.&.&.&.&.&.&/","/&..&&...&&.&&/","/&&&&&&&&&&&&&/","///",
    "///","/&&&&&&&&&&&&&/","/&&  &&& &   &/","/& &&&&& & &&&/","/&& &&&& &   &/","/&&& & & & &&&/","/&  &&& &&   &/","/&&&&&&&&&&&&&/","///",
    "|-|-|-|-|-|-|-|","-@@@@@@@@@@@@@-","|@@@`@@@`@@@`@|","-@@`@`@@.@@@.@-","|@`@@@`@`@@@`@|","-@.`.`.@.@@@.@-","|@`@@@`@@.`.@@|","-@@@@@@@@@@@@@-","|-|-|-|-|-|-|-|",
    "---.---.---.---",".@#@#@#@#@#@#@.","-#@# #@# #@  #-",".@# # #@ @ @#@.","-# #@# #  @#@#-",".@     @ @ @#@.","-# #@# # #@  #-",".@#@#@#@#@#@#@.","---.---.---.---",
};
int a[5][5]={
    {1,3,2,1},
    {4,7,3,1},
    {6,10,4,2},
    {2,3,2,4}
};
char pressing;
void checkmovement(){
    int key;
    while(true){
        key=0;
        if(_kbhit) key=getch();
        if(key==72||key==119){
            pressing='u';
            break;
        }
        if(key==75||key==97){
            pressing='l';
            break;
        }
        if(key==115||key==80){
            pressing='d';
            break;
        }
        if(key==100||key==77){
            pressing='r';
            break;
        }
        if(key==113){
            pressing='Q';
            break;
        }
        if(key==114){
            pressing='R';
            break;
        }
    }
}
void print(){
    for(int i=0;i<9;i++){
        SCAB(color_type[i+9],0);
        printf("%s   ",intro[i]);
        int pf=1000000;
        while(pf){
            for(int j=score/pf%10*4;j<=score/pf%10*4+3;j++){
                if(score<pf) SCAB(8,0);
                else SCAB(7,0);
                printf("%c",scorenum[i][j]);
            }
            pf/=10;
        }
        printf("\n");
    }
    printf("\n");
    for(int i=0;i<4;i++){
        for(int j=0;j<9;j++){
            for(int k=0;k<4;k++){
                if(a[i][k]>=0){
                    SCAB(7,color_type[a[i][k]]);
                    printf("%s",tiles[a[i][k]*9+j]);
                }
                else{
                    SCAB(color_type[16+a[i][k]*-1],0);
                    printf("%s",better[-a[i][k]*9+j]);
                }
            }
            SCAB(7,0);
            printf(" ");
            if(i*9+j>=9&&i*9+j<=24)
                SCAB(color_type[i*9+j-8],0);
            if(i*9+j==16) SCAB(7,0);
            printf("%s",instruction[i*9+j]);
            printf("\n");
        }
    }
    printf("\n");
    for(int i=0;i<5;i++){
        SCAB(0,2);
        printf("%s",endd[i]);
        SCAB(0,0);
        printf("                   ");
        int pf=1000000;
        SCAB(0xe,0);
        while(pf){
            for(int j=best/pf%10*4;j<=best/pf%10*4+3;j++){
                printf("%c",scorenum[i+2][j]);
            }
            pf/=10;
        }
        printf("\n");
    }
}
int gameover;
void createrandomblock(){
    int emptyx[18],emptyy[18];
    int cnt=0;
    for(int i=0;i<4;i++){
        for(int j=0;j<4;j++){
            if(a[i][j]==0){
                cnt++;
                emptyx[cnt]=i;
                emptyy[cnt]=j;
            }
        }
    }
    srand(time(NULL));
    int num=rand()%cnt+1;
    int ran[16]={1,1,1,1,1,1,1,1,-2,-2,-2,2,2,-1,-1,-2};
    a[emptyx[num]][emptyy[num]]=ran[rand()%16];
}
void startgame(){
    ak=false;
    score=0;
    gameover=0;
    for(int i=0;i<4;i++){
        for(int j=0;j<4;j++)
            a[i][j]=0;
    }
    createrandomblock();
    createrandomblock();
}
void moveblock(){
    if(pressing=='l'){
        for(int i=0;i<4;i++){
            int putpoint=0;
            for(int j=0;j<4;j++){
                if(a[i][j]!=0){
                    a[i][putpoint]=a[i][j];
                    if(putpoint!=j) a[i][j]=0;
                    putpoint++;
                }
            }
            for(int j=0;j<4;j++){
                if(a[i][j]>0&&a[i][j]<16&&a[i][j]==a[i][j+1]){
                    a[i][j]++;
                    a[i][j+1]=0;
                    score+=pow(2,a[i][j]);
                }
                else if(a[i][j]==-2&&a[i][j]==a[i][j+1]){
                    a[i][j]=-3;
                    a[i][j+1]=0;
                    score+=pow(2,a[i][j]);
                }
                else if(a[i][j]<=-1&&a[i][j+1]>0&&a[i][j+1]<=17+a[i][j]){
                    if(premove[i][j]!=0&&premove[i][j+1]!=0){
                        a[i][j]=a[i][j+1]-a[i][j]-1;
                        a[i][j+1]=0;
                        score+=pow(2,a[i][j]);
                    }
                }
                else if(a[i][j+1]<=-1&&a[i][j]>0&&a[i][j]<=17+a[i][j+1]){
                    if(premove[i][j]!=0&&premove[i][j+1]!=0){
                        a[i][j]=a[i][j]-a[i][j+1]-1;
                        a[i][j+1]=0;
                        score+=pow(2,a[i][j]);
                    }
                }
            }
            putpoint=0;
            for(int j=0;j<4;j++){
                if(a[i][j]!=0){
                    a[i][putpoint]=a[i][j];
                    if(putpoint!=j) a[i][j]=0;
                    putpoint++;
                }
            }
        }
    }
    else if(pressing=='r'){
        for(int i=0;i<4;i++){
            int putpoint=3;
            for(int j=3;j>=0;j--){
                if(a[i][j]!=0){
                    a[i][putpoint]=a[i][j];
                    if(putpoint!=j) a[i][j]=0;
                    putpoint--;
                }
            }
            for(int j=3;j>=0;j--){
                if(a[i][j]>0&&a[i][j]<16&&a[i][j]==a[i][j-1]){
                    a[i][j]++;
                    a[i][j-1]=0;
                    score+=pow(2,a[i][j]);
                }
                else if(a[i][j]==-2&&a[i][j]==a[i][j-1]){
                    a[i][j]=-3;
                    a[i][j-1]=0;
                    score+=pow(2,a[i][j]);
                }
                else if(a[i][j]<=-1&&a[i][j-1]>0&&a[i][j-1]<=17+a[i][j]){
                    if(premove[i][j]!=0&&premove[i][j-1]!=0){
                        a[i][j]=a[i][j-1]-a[i][j]-1;
                        a[i][j+1]=0;
                        score+=pow(2,a[i][j]);
                    }
                }
                else if(a[i][j-1]<=-1&&a[i][j]>0&&a[i][j]<=17+a[i][j-1]){
                    if(premove[i][j]!=0&&premove[i][j-1]!=0){
                        a[i][j]=a[i][j]-a[i][j-1]-1;
                        a[i][j-1]=0;
                        score+=pow(2,a[i][j]);
                    }
                }
            }
            putpoint=3;
            for(int j=3;j>=0;j--){
                if(a[i][j]!=0){
                    a[i][putpoint]=a[i][j];
                    if(putpoint!=j) a[i][j]=0;
                    putpoint--;
                }
            }
        }
    }
    
    else if(pressing=='u'){
        for(int i=0;i<4;i++){
            int putpoint=0;
            for(int j=0;j<4;j++){
                if(a[j][i]!=0){
                    a[putpoint][i]=a[j][i];
                    if(putpoint!=j) a[j][i]=0;
                    putpoint++;
                }
            }
            for(int j=0;j<4;j++){
                if(a[j][i]>0&&a[j][i]<16&&a[j][i]==a[j+1][i]){
                    a[j][i]++;
                    a[j+1][i]=0;
                    score+=pow(2,a[j][i]);
                }
                else if(a[j][i]==-2&&a[j][i]==a[j+1][i]){
                    a[j][i]=-3;
                    a[j+1][i]=0;
                    score+=pow(2,a[j][i]);
                }
                else if(a[j][i]<=-1&&a[j+1][i]>0&&a[j+1][i]<=17+a[j][i]){
                    if(premove[j][i]!=0&&premove[j+1][i]!=0){
                        a[j][i]=a[j+1][i]-a[j][i]-1;
                        a[j+1][i]=0;
                        score+=pow(2,a[j][i]);
                    }
                }
                else if(a[j+1][i]<=-1&&a[j][i]>0&&a[j][i]<=17+a[j+1][i]){
                    if(premove[j][i]!=0&&premove[j+1][i]!=0){
                        a[j][i]=a[j][i]-a[j+1][i]-1;
                        a[j+1][i]=0;
                        score+=pow(2,a[j][i]);
                    }
                }
            }
            putpoint=0;
            for(int j=0;j<=3;j++){
                if(a[j][i]!=0){
                    a[putpoint][i]=a[j][i];
                    if(putpoint!=j) a[j][i]=0;
                    putpoint++;
                }
            }
        }
    }
    
    else if(pressing=='d'){
        for(int i=0;i<4;i++){
            int putpoint=3;
            for(int j=3;j>=0;j--){
                if(a[j][i]!=0){
                    a[putpoint][i]=a[j][i];
                    if(putpoint!=j) a[j][i]=0;
                    putpoint--;
                }
            }
            for(int j=3;j>=0;j--){
                if(a[j][i]>0&&a[j][i]<16&&a[j][i]==a[j-1][i]){
                    a[j][i]++;
                    a[j-1][i]=0;
                    score+=pow(2,a[j][i]);
                }
                else if(a[j][i]==-2&&a[j][i]==a[j-1][i]){
                    a[j][i]=-3;
                    a[j-1][i]=0;
                    score+=pow(2,a[j][i]);
                }
                else if(a[j][i]<=-1&&a[j-1][i]>0&&a[j-1][i]<=17+a[j][i]){
                    if(premove[j][i]!=0&&premove[j-1][i]!=0){
                        a[j][i]=a[j-1][i]-a[j][i]-1;
                        a[j-1][i]=0;
                        score+=pow(2,a[j][i]);
                    }
                }
                else if(a[j-1][i]<=-1&&a[j][i]>0&&a[j][i]<=17+a[j-1][i]){
                    if(premove[j][i]!=0&&premove[j-1][i]!=0){
                        a[j][i]=a[j][i]-a[j-1][i]-1;
                        a[j-1][i]=0;
                        score+=pow(2,a[j][i]);
                    }
                }
            }
            putpoint=3;
            for(int j=3;j>=0;j--){
                if(a[j][i]!=0){
                    a[putpoint][i]=a[j][i];
                    if(putpoint!=j) a[j][i]=0;
                    putpoint--;
                }
            }
        }
    }
}
void checkover(){
    bool flag1=true;
    for(int i=0;i<4;i++){
        for(int j=0;j<4;j++)
        {
            if(a[i][j]<=0) flag1=false;
        }
    }
    for(int i=0;i<4;i++){
        for(int j=0;j<4;j++){
            if(a[i][j]==a[i+1][j]&&a[i][j]!=0) flag1=false;
            if(a[i][j]==a[i][j+1]&&a[i][j]!=0) flag1=false;
        }
    }
    if(flag1) gameover=1;
}
void over();
void checkak(){
    bool flag=false;
    for(int i=0;i<4;i++){
        for(int j=0;j<4;j++)
            if(a[i][j]==16) flag=true;
    }
    if(flag){
        gameover=2;
        over();
        gameover=0;
        ak=true;
    }
}
void over(){
system("cls");
for(int i=0;i<9;i++){
        SCAB(color_type[i+9],0);
        printf("%s   ",intro[i]);
        int pf=1000000;
        while(pf){
            for(int j=score/pf%10*4;j<=score/pf%10*4+3;j++){
                if(score<pf) SCAB(8,0);
                else SCAB(7,0);
                printf("%c",scorenum[i][j]);
            }
            pf/=10;
        }
        printf("\n");
    }
    printf("\n");
    for(int i=0;i<4;i++){
        for(int j=0;j<9;j++){
            if(9*i+j>=15&&9*i+j<=21){
                if(gameover==1){
                    SCAB(0,12);
                    printf("%s",endskin[9*i+j-15]);
                }
                else{
                    SCAB(0,11);
                    printf("%s",endskin[9*i+j-15+7]);
                }
            }
            else{
                for(int k=0;k<4;k++){
                    if(a[i][k]>=0){
                        SCAB(7,color_type[a[i][k]]);
                        printf("%s",tiles[a[i][k]*9+j]);
                    }
                    else{
                        SCAB(color_type[16+a[i][k]*-1],0);
                        printf("%s",better[-a[i][k]*9+j]);
                    }
                }
            }
            SCAB(7,0);
            printf(" ");
            if(i*9+j>=9&&i*9+j<=24)
                SCAB(color_type[i*9+j-8],0);
            if(i*9+j==16) SCAB(7,0);
            printf("%s",instruction[i*9+j]);
            printf("\n");
        }
    }
    printf("\n");
    for(int i=0;i<5;i++){
        SCAB(0,2);
        printf("%s",endd[i]);
        SCAB(0,0);
        printf("                   ");
        int pf=1000000;
        SCAB(0xe,0);
        while(pf){
            for(int j=best/pf%10*4;j<=best/pf%10*4+3;j++){
                printf("%c",scorenum[i+2][j]);
            }
            pf/=10;
        }
        printf("\n");
    }
}

int main(){
    while(true){
        startgame();
        system("cls");
        print();
        while(!gameover){
            checkmovement();
            if(pressing=='Q') exit(0);
            if(pressing=='R') break;
            for(int i=0;i<4;i++){
                for(int j=0;j<4;j++)
                    premove[i][j]=a[i][j];
            }
            moveblock();
            system("cls");
            print();
            for(int i=1;i<=30000000;i++){
                i*=2;
                i/=2;
                i+=2;
                i-=2;
            }

            bool flag=false;
            for(int i=0;i<4;i++){
                for(int j=0;j<4;j++){
                    if(a[i][j]!=premove[i][j]){
                        flag=true;
                    }
                }
            }
            best=max(best,score);
            if(flag){
                score++;
                createrandomblock();
                best=max(best,score);
                system("cls");
                print();
            }
            if(!ak){
                checkak();
                if(ak){
                    checkmovement();
                    system("cls");
                    print();
                    if(pressing=='R') break;
                    if(pressing=='Q') return 0;
                }
            }
            checkover();
        }
        if(gameover!=0){
            over();
            checkmovement();
            if(pressing=='Q') exit(0);
        }
    }
    return 0;
}

2025/1/22 10:08
加载中...