2048 C++ 游戏程序

· · 休闲·娱乐

2048 v2.0.0 游戏程序介绍(C++实现)

游戏简介

这是一款基于C++开发的2048游戏增强版,集成了成就系统插件扩展游戏记录倍速调节等功能,支持Windows控制台运行。代码结构清晰,包含完整的游戏逻辑、界面渲染和扩展接口,适合学习或二次开发。

核心功能特性

  1. 玩法介绍

    • 基础规则:通过WASD键控制方块移动,相同数字合并得分,生成2或4。
    • 界面优化:使用控制台字符绘制动态棋盘,支持数字格式化显示
    • 倍速调节:按X键可设置移动速度倍率,支持极速模式。
    • 环境支持:windows7可正常运行
  2. 成就系统(8项挑战) 成就名称 解锁条件
    初出茅庐 完成第一次移动
    如日中升 合成数字512
    终极目标 合成数字2048
    闪电战 50回合内结束游戏
    幸运星 连续生成3次数字4
    持久战 游戏持续300回合以上
    超越极限 合成数字4096
    改代码的狗 修改代码中的地图大小常量(ab
  3. 插件扩展支持

    • 移动辅助插件:通过移动插件.txt实现自动托管,支持自定义移动策略。
    • 输入辅助插件:通过输入插件.txt模拟按键输入,适合自动化测试或特殊玩法。
    • 接口说明:插件通过文本文件与主程序交互,格式简单易扩展。
  4. 游戏记录与存档

    • 自动保存最近20局游戏记录,包含得分、棋盘状态和成就进度。
    • 记录加密存储(通过数学变换防止篡改),支持错误校验。
  5. 技术细节

    • 开发环境:C++,依赖Windows.h(控制台控制)、conio.h(按键读取)、fstream(文件操作)。
    • 可配置项:地图大小(ab常量,默认4x4)、成就提示时长(time_au)、随机数种子(基于系统时间)。
    • 性能优化:使用Sleep()控制动画帧率,动态计算棋盘状态避免冗余渲染。

代码结构说明

// 核心模块划分
- 界面层:`home()`主菜单、`out()`棋盘渲染、`day()`更新日志  
- 逻辑层:`game()`游戏主循环、`over()`结束判断、`unl()`成就解锁检测  
- 工具层:`de()`插件状态读取、`last_out()`记录存档、`ass_co()`插件初始化  
- 扩展接口:插件通信(`in_i()`输入代理、`ma()`地图数据导出)  

快速开始

  1. 编译运行

    • 直接编译运行即可。
    • 首次运行会自动生成配置文件(记录、插件状态等)。
  2. 操作指南

    • 主菜单:1开始游戏,2查看记录,3操作说明,4成就列表,5插件管理,6更新日志。
    • 游戏中:WASD移动,X调倍速,E结束游戏,支持插件自动操作(需提前配置插件文件)。
  3. 二次开发建议

    • 修改ab常量调整地图大小(需同步修改界面渲染逻辑)。
    • 扩展插件协议,实现更复杂的自动化策略(如AI路径规划)。
    • 添加新成就或调整解锁条件(修改unl()函数)。

注意事项

开发者信息

主代码如下

#include<bits/stdc++.h>
#include<windows.h>
#include<conio.h>
#include<fstream>
#include<string>
/*
    成就: 
    1.初出茅庐:  完成第一次移动
    2.如日中升:  合成数字512
    3.终极目标:  合成数字2048
    4.闪电战:    游戏在50回合内结束 
    5.幸运星:    连续生成3次数字4 
    6.持久战:    游戏持续300回合以上 
    7.超越极限:  合成数字4096
    8.改代码的狗:更改代码数据 
*/
using namespace std;
const int ab=4,m=8;
double s,s_;
bool flag_ach[m+1],ove,ma_flag=0,in_flag=0,game_f=1;
char in;
long long mp[ab+1][ab+1],last[ab+1][ab+1][25];
int last_f[25],f,num4=0,H,time_start,flag_au=0,time_au=3;
char in_i(){
    if(in_flag==1){
        bool flag_in;
        string str;
        char in_i;
        ifstream inFile("输入插件.txt");
        inFile>>in_flag>>str>>in_i>>flag_in;
        if(str=="main"&&flag_in){
            ofstream outfile("输入插件.txt");
            outfile<<in_flag<<" "<<"main "<<in_i<<" 0";
            outfile.close();
            return in_i;
        }
        else
            return ' ';
        inFile.close();
    }
    else{
        return getch();
    }
} 
void home(){
    cout<<"欢迎来到2048 v.2.0.0\n\n\n";
    cout<<"1.开始游戏     2.检索记录     3.使用需知\n\n";
    cout<<"4.成就列表     5.插件管理     6.更新日志\n\n";
    do in=in_i(); while(in==' ');
}
void de_1(){
    ifstream inFile("移动插件.txt");
    if(inFile.good()){
        inFile>>ma_flag;
    }
    inFile.close();
}
void de_2(){
    ifstream inFile("输入插件.txt");
    if(inFile.good()){
        inFile>>in_flag;
    }
    inFile.close();
} 
void de(){
    de_1();
    de_2();
}
void ass(){
    ifstream inFile("记录.txt");
    if(!inFile.good()){
        ofstream outfile("记录.txt");
        outfile<<"0\n";
        for(int i=1;i<=m;i++){
            outfile<<"0 ";
        }
        outfile.close();
    }
    inFile.close();
    for(int i=1;i<=ab;i++){
        for(int j=1;j<=ab;j++){
            mp[i][j]=0;
        }
    }
    system("title 2048 v.2.0.0");
    srand(time(0));
}
void ass_co1(){
    ifstream inFile("移动插件.txt");
    if(inFile.good()){
        ofstream outfile("移动插件.txt");
        outfile<<"0\n";
        outfile.close();
    }
    inFile.close();
} 
void ass_co2(){
    ifstream inFile("输入插件.txt");
    if(inFile.good()){
        ofstream outfile("输入插件.txt");
        outfile<<"0\n";
        outfile.close();
    }
    inFile.close();
}
void ass_co(){
    ass_co1();
    ass_co2();
}
void ma(){
    if(ma_flag){
        ofstream outfile("地图.txt");
        outfile<<ove<<"\n";
        for(int i=1;i<=ab;i++){
            for(int j=1;j<=ab;j++){
                outfile<<mp[i][j]<<" ";
            }
            outfile<<"\n";
        }
        outfile.close();
    }
}
void out(){
    system("cls");
    cout<<f<<"\t*"<<s_<<"\t第"<<H<<"回合\n\n";
    if(time(0)<time_start+time_au){
        if(flag_au==1) cout<<"解锁成就:初出茅庐"; 
        if(flag_au==2) cout<<"解锁成就:如日中升"; 
        if(flag_au==3) cout<<"解锁成就:终极目标"; 
        if(flag_au==5) cout<<"解锁成就:幸运星"; 
        if(flag_au==6) cout<<"解锁成就:持久战"; 
        if(flag_au==7) cout<<"解锁成就:超越极限"; 
        if(flag_au==8) cout<<"解锁成就:改代码的狗"; 
    }
    else{
        time_start=0;
    }
    cout<<"\n\n";
    for(int i=1;i<=8*(ab+1)+3;i++){
        cout<<"_";
    }
    for(int i=1;i<=ab;i++){
        cout<<"\n│\t";
        for(int j=1;j<=ab;j++){
            if(mp[i][j]==0){
                cout<<"  ";
            }
            else if(mp[i][j]<10000){
                cout<<mp[i][j];
            }
            else if(mp[i][j]<1000000){
                cout<<mp[i][j]/1000<<"K";
            }
            else{
                cout<<mp[i][j]/1000000<<"B";
            }
            cout<<"\t ";
        }
        cout<<"│\n";
    }
    for(int i=1;i<=8*(ab+1)+3;i++){
        cout<<"_";
    }
    cout<<"\n";
}
bool over(){
    bool flag=0;
    for(int i=1;i<=ab;i++){
        for(int j=1;j<=ab;j++){
            if(mp[i][j]==0){
                flag=1;
                break;
            }
            else if(i>1&&mp[i-1][j]==mp[i][j]){
                flag=1;
                break;
            }
            else if(j>1&&mp[i][j-1]==mp[i][j]){
                flag=1;
                break;
            }
            else if(i<ab&&mp[i+1][j]==mp[i][j]){
                flag=1;
                break;
            }
            else if(j<ab&&mp[i][j+1]==mp[i][j]){
                flag=1;
                break;
            }
        }
    }
    return flag;
}
void last_in(){
    system("cls");
    int n;
    ifstream inFile("记录.txt");
    if(!inFile.good()){
        ofstream outfile("记录.txt");
        outfile<<"0\n";
        for(int i=1;i<=m;i++){
            outfile<<"0 ";
        }
        outfile.close();
    }
    inFile>>n;
    for(int i=1;i<=n;i++){
        inFile>>last_f[i];
        if(last_f[i]%3||(last_f[i]/3-2)%2){
            cout<<"记录读取错误\n\n";
            return ;
        }
        last_f[i]=(last_f[i]/3-2)/2; 
        for(int a=1;a<=ab;a++){
            for(int b=1;b<=ab;b++){
                inFile>>last[a][b][i];
                if(last[a][b][i]%3||(last[a][b][i]/3-2)%2){
                    cout<<"记录读取错误\n\n";
                    return ;
                }
                last[a][b][i]=(last[a][b][i]/3-2)/2;
            }
        }
    }
    for(int i=1;i<=m;i++){
        inFile>>flag_ach[i];
    }
    inFile.close();
}
void last_in_out(){
    int n;
    ifstream inFile("记录.txt");
    inFile>>n;
    inFile.close();
    if(n==0){
        cout<<"当前暂无记录,快开始游戏吧\n\n";
    }
    else{
        cout<<"检索到"<<n<<"个记录\n\n\n";
    }
    for(int i=1;i<=n;i++){
        if(i!=1){
            cout<<"\n\n\n";
        }
        cout<<i<<".";
        cout<<"共计"<<last_f[i]<<"分\n\n地图如下\n";
        for(int a=1;a<=ab;a++){
            for(int b=1;b<=ab;b++){
                if(last[a][b][i]<10000){
                    cout<<last[a][b][i];
                }
                else if(last[a][b][i]<1000000){
                    cout<<last[a][b][i]/1000<<"K";
                }
                else{
                    cout<<last[a][b][i]/1000000<<"B";   
                }
                cout<<"\t";
            }
            cout<<"\n";
        }
    }
    cout<<"\n\n按任意键返回主界面\n\n";
    while(in_i()==' ') continue;
}
void last_out(bool fla){
    int n;
    ifstream inFile("记录.txt");
    if(!inFile.good()){
        ofstream outfile("记录.txt");
        outfile<<"0\n";
        for(int i=1;i<=m;i++){
            outfile<<"0 ";
        }
        outfile.close();
    }
    inFile>>n;
    for(int i=1;i<=n;i++){
        inFile>>last_f[i];
        if(last_f[i]%3||(last_f[i]/3-2)%2){
            cout<<"记录读取错误\n\n";
            return ;
        }
        last_f[i]=(last_f[i]/3-2)/2; 
        for(int a=1;a<=ab;a++){
            for(int b=1;b<=ab;b++){
                inFile>>last[a][b][i];
                if(last[a][b][i]%3||(last[a][b][i]/3-2)%2){
                    cout<<"记录读取错误\n\n";
                    return ;
                }
                last[a][b][i]=(last[a][b][i]/3-2)/2;   //x=(x*2+2)*3
            }
        }
    }
    ofstream outFile("记录.txt");
    if(fla){
        outFile<<min(20,n+1)<<"\n\n";
        outFile<<(f*2+2)*3<<"\n";
        for(int a=1;a<=ab;a++){
            for(int b=1;b<=ab;b++){
                outFile<<(mp[a][b]*2+2)*3<<" ";
            }
            outFile<<"\n";
        }
        outFile<<"\n";
    }
    else{
        outFile<<n<<"\n\n";
    }
    for(int i=1;i<=n&&i<=20;i++){
        outFile<<(last_f[i]*2+2)*3<<"\n";
        for(int a=1;a<=ab;a++){
            for(int b=1;b<=ab;b++){
                outFile<<(last[a][b][i]*2+2)*3<<" ";
            }
            outFile<<"\n";
        }
        outFile<<"\n";
    }
    outFile<<"\n";
    for(int i=1;i<=m;i++){
        outFile<<flag_ach[i]<<" ";
    }
    outFile<<"\n";
    outFile.close();
}
void ach(){
    start:
    last_in();
    bool flag=0;
    system("cls");
    cout<<"成就\n\n\n";
    for(int i=1;i<=m;i++){
        if(flag_ach[i]==1){
            if(i==1) cout<<"1.初出茅庐:  完成第一次移动\n\n"; 
            if(i==2) cout<<"2.如日中升:  合成数字512\n\n"; 
            if(i==3) cout<<"3.终极目标:  合成数字2048\n\n"; 
            if(i==4) cout<<"4.闪电战:    游戏在50回合内结束\n\n"; 
            if(i==5) cout<<"5.幸运星:    连续生成3次数字4\n\n"; 
            if(i==6) cout<<"6.持久战:    游戏持续300回合以上\n\n"; 
            if(i==7) cout<<"7.超越极限:  合成数字4096\n\n";
            if(i==8) cout<<"8.改代码的狗:更改代码数据\n\n";
            flag=1; 
        }
    }
    if(flag==0){
        cout<<"暂未解锁成就,快去游戏吧\n\n";
    }
    cout<<"\n解锁成就提示 ";
    if(time_au>0) cout<<"yes";
    else cout<<"no ";
    cout<<" (按x更改)\n";
    cout<<"\n\n按其他键返回主界面\n\n";
    last_out(0);
    if(in_flag==1){
        char x;
        do x=in_i(); while(x==' ');
        if(x=='x'){
            if(time_au>0) time_au=-1;
            else time_au=3;
            goto start;
        }   
    }
    else
        while(in_i()==' ') continue;
}
void unl(){
    bool fl=0;
    for(int i=1;i<=ab;i++){
        for(int j=1;j<=ab;j++){
            if(mp[i][j]>=512&&flag_ach[2]==0){
                flag_ach[2]=1;
                flag_au=2;
                fl=1;
            }
            if(mp[i][j]>=2048&&flag_ach[3]==0){
                flag_ach[3]=1;
                flag_au=3;
                fl=1;
            }
            if(mp[i][j]>=4096&&flag_ach[7]==0){
                flag_ach[7]=1;
                flag_au=7;
                fl=1;
            }
        }
    }
    if(num4>=3&&flag_ach[5]==0){
        flag_ach[5]=1;
        flag_au=5;
        fl=1;
    }
    if(H<=50&&ove==0&&flag_ach[4]==0){
        flag_ach[4]=1;
    }
    if(H>=300&&ove==1&&flag_ach[6]==0){
        flag_ach[6]=1;
        flag_au=6;
        fl=1;
    }
    if(ab!=4&&flag_ach[8]==0){
        flag_ach[8]=1;
        flag_au=8;
        fl=1;
    } 
    if(fl==1){
        time_start=time(0);
    }
} 
void day(){
    system("cls");
    cout<<"qihangxing制作\n\n\n"; 
    cout<<"2025.3.08  v.1.0.0   完成基本的移动和合成\n\n";
    cout<<"2025.3.10  v.1.1.0   美化界面,并优化效率\n\n";
    cout<<"2025.3.11  v.1.2.0   添加倍速,主界面及日志\n\n";
    cout<<"2025.3.11  v.1.2.5   添加结束,修复已知BUG\n\n";
    cout<<"2025.3.12  v.1.4.0   添加记录,修复已知BUG\n\n";
    cout<<"2025.3.13  v.1.4.5   添加操作需知\n\n";
    cout<<"2025.3.13  v.1.5.0   优化记录功能\n\n";
    cout<<"2025.3.16  v.1.5.5   更改部分名称,修复已知BUG\n\n";
    cout<<"2025.3.16  v.1.6.0   添加成就功能\n\n";
    cout<<"2025.3.17  v.1.6.5   添加成就提示,优化游戏机制\n\n";
    cout<<"2025.3.20  v.1.7.0   适配 [2048 移动辅助插件] \n\n";
    cout<<"2025.3.20  v.1.7.5   替换 [建议收集] 为 [插件管理] \n\n";
    cout<<"2025.3.21  v.1.8.0   修复已知BUG\n\n";
    cout<<"2025.3.29  v.1.8.5   适配 [2048 输入辅助插件] \n\n";
    cout<<"2025.3.30  v.1.9.0   美化界面,优化游戏机制\n\n";
    cout<<"2025.3.31  v.1.9.5   添加3个成就和成就存档功能\n\n";
    cout<<"2025.4.07  v.2.0.0   修复已知BUG,调整操作需知\n\n";
    cout<<"\n\n按任意键返回主界面\n\n";
    while(in_i()==' ') continue;
}
void help(){
    system("cls");
    cout<<"操作需知:\n\n";
    cout<<"1.按 w,a,s,d   移动\n\n";
    cout<<"2.按 x         调整倍速\n\n";
    cout<<"3.按 e         结束游戏\n\n";
    cout<<"\n功能注意:\n\n";
    cout<<"1.存档的地图大小不同会导致读取错误哦!\n\n";
    cout<<"2.移动插件按 [ e ] 退出才会退出托管\n\n";
    cout<<"\n\n按任意键返回主界面\n\n";
    while(in_i()==' ') continue;
}
void game(){
    H=0;ove=1;f=0;s=1;s_=1;num4=0;
    unl();
    while(1){
        ma();
        de();
        char x; 
        int i=1;
        if(x!='e'&&x!='x'){
            while(i<=ab*ab){
                int a=rand()%ab+1,b=rand()%ab+1;
                if(mp[a][b]==0){
                    mp[a][b]=4-2*bool(rand()%4);
                    if(mp[a][b]==4) num4+=1;
                    else num4=0;
                    break;
                }
                else i++;
            }
        }
        out();
        Sleep(750);
        a:
        if(ma_flag){
            ifstream inFile("移动插件.txt");
            inFile>>ma_flag>>game_f;
            if(game_f==0){
                s=0; s_=0;
                inFile>>x;
            }
            inFile.close();
        }
        else if(in_flag){
            do x=in_i(); while(x==' ');
        }
        else{
            x=in_i();
        }
        if(x=='w'){
            if(flag_ach[1]==0){
                flag_ach[1]=1;
                flag_au=1;
                time_start=time(0);
            }
            for(int i=1;i<=ab;i++){
                for(int j=1;j<=ab;j++){
                    int X=i;
                    while(mp[X][j]!=0&&X>1&&(mp[X-1][j]==0||mp[X-1][j]==mp[X][j])){
                        if(mp[X-1][j]==0){
                            mp[X-1][j]=mp[X][j];
                            mp[X][j]=0;
                        }
                        else{
                            f+=mp[X][j]*2;
                            mp[X-1][j]=mp[X][j]*2;
                            mp[X][j]=0;
                        }
                        X--;
                        out();
                        Sleep(int(100*s)); 
                    }
                }
            }
            H++;
        }
        else if(x=='a'){
            if(flag_ach[1]==0){
                flag_ach[1]=1;
                flag_au=1;
                time_start=time(0);
            }
            for(int j=1;j<=ab;j++){
                for(int i=1;i<=ab;i++){
                    int Y=j;
                    while(mp[i][Y]!=0&&Y>1&&(mp[i][Y-1]==0||mp[i][Y-1]==mp[i][Y])){
                        if(mp[i][Y-1]==0){
                            mp[i][Y-1]=mp[i][Y];
                            mp[i][Y]=0;
                        }
                        else{
                            f+=mp[i][Y]*2;
                            mp[i][Y-1]=mp[i][Y]*2;
                            mp[i][Y]=0;
                        }
                        Y--;
                        out();
                        Sleep(int(100*s)); 
                    }
                }
            }
            H++;
        }
        else if(x=='s'){
            if(flag_ach[1]==0){
                flag_ach[1]=1;
                flag_au=1;
                time_start=time(0);
            }
            for(int i=ab;i>=1;i--){
                for(int j=1;j<=ab;j++){
                    int X=i;
                    while(mp[X][j]!=0&&X<ab&&(mp[X+1][j]==0||mp[X+1][j]==mp[X][j])){
                        if(mp[X+1][j]==0){
                            mp[X+1][j]=mp[X][j];
                            mp[X][j]=0;
                        }
                        else{
                            f+=mp[X][j]*2;
                            mp[X+1][j]=mp[X][j]*2;
                            mp[X][j]=0;
                        }
                        X++;
                        out();
                        Sleep(int(100*s)); 
                    }
                }
            }
            H++;
        }
        else if(x=='d'){
            if(flag_ach[1]==0){
                flag_ach[1]=1;
                flag_au=1;
                time_start=time(0);
            }
            for(int j=ab;j>=1;j--){
                for(int i=1;i<=ab;i++){
                    int Y=j;
                    while(mp[i][Y]!=0&&Y<ab&&(mp[i][Y+1]==0||mp[i][Y+1]==mp[i][Y])){
                        if(mp[i][Y+1]==0){
                            mp[i][Y+1]=mp[i][Y];
                            mp[i][Y]=0;
                        }
                        else{
                            f+=mp[i][Y]*2;
                            mp[i][Y+1]=mp[i][Y]*2;
                            mp[i][Y]=0;
                        }
                        Y++;
                        out();
                        Sleep(int(100*s)); 
                    }

                }
            }
            H++;
        }
        else if(x=='x'){
            cout<<"\n倍速调节\n\n";
            cin>>s_;
            if(s_==0){
                s=0;
            }
            else{
                s=1/s_;
            }
        }
        else if(x=='e'){
            cout<<"确定退出本局游戏 (y/n)\n\n";
            char y;
            cin>>y;
            if(y=='y'){
                out();
                break;
            }
        } 
        else{
            cout<<"重新输入";
            Sleep(500); 
            out();
            goto a;
        }
        if(over()==0){
            ove=0;
            out();
            unl();
            break;
        }
        unl();
    }
    unl();
    ma();
    last_out(1);
    cout<<"本局游戏共"<<f<<"分\n\n";
    cout<<"\n\n按任意键返回主界面\n\n";
    while(in_i()==' ') continue;
} 
void co(){
    de();
    bool flag_co=0;
    system("cls");
    if(ma_flag==1){
        if(flag_co==0){
            cout<<"已连接插件:\n\n";
            flag_co=1;
        }
        cout<<"2048 移动辅助插件\n\n";
    }
    if(in_flag==1){
        if(flag_co==0){
            cout<<"已连接插件:\n\n";
            flag_co=1;
        }
        cout<<"2048 输入辅助插件\n\n";
    }
    if(flag_co==0){
        cout<<"暂未连接到插件\n\n";
    } 
    cout<<"\n\n按任意键返回主界面\n\n";
    while(in_i()==' ') continue;
}
int main(){
    ass_co();
    while(1){
        system("cls"); 
        de();
        ass();
        home();
        if(in=='1'){
            game();
        }
        else if(in=='2'){
            last_in();
            last_in_out();
        }
        else if(in=='3'){
            help();
        }
        else if(in=='4'){
            ach(); 
        }
        else if(in=='5'){
            co();
        }
        else if(in=='6'){
            day();
        }
    }
    return 0;
}

移动辅助插件 v.1.3.0 代码如下:

#include<bits/stdc++.h>
#include<windows.h>
#include<conio.h>
#include<fstream>
using namespace std;
const int ab=4,qz=1;
long long mp[ab+1][ab+1];
bool mp_f[ab+1][ab+1],game=0;
char game_f='0';
void ass(){
    system("title 2048 移动辅助插件 v.1.3.0");
    ofstream outfile("地图.txt");
    outfile<<"1\n";
    for(int i=1;i<=ab;i++){
        for(int j=1;j<=ab;j++){
            outfile<<"0 ";
        }
        outfile<<"\n";
    }
    outfile.close();
}
void ass_pl(){
    ofstream outfile("移动插件.txt");
    outfile<<"1 1\n";
    outfile.close();
}
void mp_in(){
    ifstream inFile("地图.txt");
    inFile>>game;
    for(int i=1;i<=ab;i++){
        for(int j=1;j<=ab;j++){
            inFile>>mp[i][j];
            mp_f[i][j];
        }
    }
    inFile.close();
}
void mp_out(){
    int fw=0,fa=0,fs=0,fd=0,fw_=0,fa_=0,fs_=0,fd_=0;
    mp_in();
    for(int i=1;i<=ab;i++){
        for(int j=1;j<=ab;j++){
            if(i>1&&mp[i-1][j]==mp[i][j]){
                fw_-=mp[i][j]*qz;
            }
            else if(j>1&&mp[i][j-1]==mp[i][j]){
                fw_-=mp[i][j]*qz;
            }
            else if(i<ab&&mp[i+1][j]==mp[i][j]){
                fw_-=mp[i][j]*qz;
            }
            else if(j<ab&&mp[i][j+1]==mp[i][j]){
                fw_-=mp[i][j]*qz;
            }
        }
    }
    for(int i=1;i<=ab;i++){
        for(int j=1;j<=ab;j++){
            int X=i;
            while(mp[X][j]!=0&&X>1&&(mp[X-1][j]==0||mp[X-1][j]==mp[X][j])){
                if(mp[X-1][j]==0){
                    mp[X-1][j]=mp[X][j];
                    mp[X][j]=0;
                }
                else{
                    fw+=mp[X][j]*2;
                    fw_+=mp[X][j]*2;
                    mp[X-1][j]=mp[X][j]*2;
                    mp[X][j]=0;
                }
                X--;
                mp_f[X][j]=1;
                mp_f[X+1][j]=1;
            }   
        }
    }
    for(int i=1;i<=ab;i++){
        for(int j=1;j<=ab;j++){
            if(mp_f[i][j]){
                if(i>1&&mp[i-1][j]==mp[i][j]){
                    fw_+=mp[i][j]*qz;
                }
                else if(j>1&&mp[i][j-1]==mp[i][j]){
                    fw_+=mp[i][j]*qz;
                }
                else if(i<ab&&mp[i+1][j]==mp[i][j]){
                    fw_+=mp[i][j]*qz;
                }
                else if(j<ab&&mp[i][j+1]==mp[i][j]){
                    fw_+=mp[i][j]*qz;
                }
            }
        }
    }
    mp_in();
    for(int i=1;i<=ab;i++){
        for(int j=1;j<=ab;j++){
            if(i>1&&mp[i-1][j]==mp[i][j]){
                fa_-=mp[i][j]*qz;
            }
            else if(j>1&&mp[i][j-1]==mp[i][j]){
                fa_-=mp[i][j]*qz;
            }
            else if(i<ab&&mp[i+1][j]==mp[i][j]){
                fa_-=mp[i][j]*qz;
            }
            else if(j<ab&&mp[i][j+1]==mp[i][j]){
                fa_-=mp[i][j]*qz;
            }
        }
    }
    for(int j=1;j<=ab;j++){
        for(int i=1;i<=ab;i++){
            int Y=j;
            while(mp[i][Y]!=0&&Y>1&&(mp[i][Y-1]==0||mp[i][Y-1]==mp[i][Y])){
                if(mp[i][Y-1]==0){
                    mp[i][Y-1]=mp[i][Y];
                    mp[i][Y]=0;
                }
                else{
                    fa+=mp[i][Y]*2;
                    fa_+=mp[i][Y]*2;
                    mp[i][Y-1]=mp[i][Y]*2;
                    mp[i][Y]=0;
                }
                Y--;
                mp_f[i][Y]=1;
                mp_f[i][Y+1]=0;
            }
        }
    }
    for(int i=1;i<=ab;i++){
        for(int j=1;j<=ab;j++){
            if(mp_f[i][j]){
                if(i>1&&mp[i-1][j]==mp[i][j]){
                    fa_+=mp[i][j]*qz;
                }
                else if(j>1&&mp[i][j-1]==mp[i][j]){
                    fa_+=mp[i][j]*qz;
                }
                else if(i<ab&&mp[i+1][j]==mp[i][j]){
                    fa_+=mp[i][j]*qz;
                }
                else if(j<ab&&mp[i][j+1]==mp[i][j]){
                    fa_+=mp[i][j]*qz;
                }
            }
        }
    }
    mp_in();
    for(int i=1;i<=ab;i++){
        for(int j=1;j<=ab;j++){
            if(i>1&&mp[i-1][j]==mp[i][j]){
                fs_-=mp[i][j]*qz;
            }
            else if(j>1&&mp[i][j-1]==mp[i][j]){
                fs_-=mp[i][j]*qz;
            }
            else if(i<ab&&mp[i+1][j]==mp[i][j]){
                fs_-=mp[i][j]*qz;
            }
            else if(j<ab&&mp[i][j+1]==mp[i][j]){
                fs_-=mp[i][j]*qz;
            }
        }
    }
    for(int i=ab;i>=1;i--){
        for(int j=1;j<=ab;j++){
            int X=i;
            while(mp[X][j]!=0&&X<ab&&(mp[X+1][j]==0||mp[X+1][j]==mp[X][j])){
                if(mp[X+1][j]==0){
                    mp[X+1][j]=mp[X][j];
                    mp[X][j]=0;
                }
                else{
                    fs+=mp[X][j]*2;
                    fs_+=mp[X][j]*2;
                    mp[X+1][j]=mp[X][j]*2;
                    mp[X][j]=0;
                }
                X++; 
                mp_f[X][j]=1;
                mp_f[X-1][j]=1;
            }
        }
    }
    for(int i=1;i<=ab;i++){
        for(int j=1;j<=ab;j++){
            if(mp_f[i][j]){
                if(i>1&&mp[i-1][j]==mp[i][j]){
                    fs_+=mp[i][j]*qz;
                }
                else if(j>1&&mp[i][j-1]==mp[i][j]){
                    fs_+=mp[i][j]*qz;
                }
                else if(i<ab&&mp[i+1][j]==mp[i][j]){
                    fs_+=mp[i][j]*qz;
                }
                else if(j<ab&&mp[i][j+1]==mp[i][j]){
                    fs_+=mp[i][j]*qz;
                }
            }
        }
    }
    mp_in();
    for(int i=1;i<=ab;i++){
        for(int j=1;j<=ab;j++){
            if(i>1&&mp[i-1][j]==mp[i][j]){
                fd_-=mp[i][j]*qz;
            }
            else if(j>1&&mp[i][j-1]==mp[i][j]){
                fd_-=mp[i][j]*qz;
            }
            else if(i<ab&&mp[i+1][j]==mp[i][j]){
                fd_-=mp[i][j]*qz;
            }
            else if(j<ab&&mp[i][j+1]==mp[i][j]){
                fd_-=mp[i][j]*qz;
            }
        }
    }
    for(int j=ab;j>=1;j--){
        for(int i=1;i<=ab;i++){
            int Y=j;
            while(mp[i][Y]!=0&&Y<ab&&(mp[i][Y+1]==0||mp[i][Y+1]==mp[i][Y])){
                if(mp[i][Y+1]==0){
                    mp[i][Y+1]=mp[i][Y];
                    mp[i][Y]=0;
                }
                else{
                    fd+=mp[i][Y]*2;
                    fd_+=mp[i][Y]*2;
                    mp[i][Y+1]=mp[i][Y]*2;
                    mp[i][Y]=0;
                }
                Y++; 
                mp_f[i][Y]=1;
                mp_f[i][Y-1]=0;
            }
        }
    }
    for(int i=1;i<=ab;i++){
        for(int j=1;j<=ab;j++){
            if(mp_f[i][j]){
                if(i>1&&mp[i-1][j]==mp[i][j]){
                    fd_+=mp[i][j]*qz;
                }
                else if(j>1&&mp[i][j-1]==mp[i][j]){
                    fd_+=mp[i][j]*qz;
                }
                else if(i<ab&&mp[i+1][j]==mp[i][j]){
                    fd_+=mp[i][j]*qz;
                }
                else if(j<ab&&mp[i][j+1]==mp[i][j]){
                    fd_+=mp[i][j]*qz;
                }
            }
        }
    }
    int ma=max(max(fw+fw_,fa+fa_),max(fs+fs_,fd+fd_));
    cout<<"建议: ";
    ofstream outfile("移动插件.txt");
    outfile<<"1 ";
    if(game_f!='0') outfile<<"1 ";
    else outfile<<"0 ";
    if(ma==fw+fw_){
        cout<<"w ";
        outfile<<"w ";
    }
    if(ma==fa+fa_){
        cout<<"a ";
        outfile<<"a ";
    }
    if(ma==fs+fs_){
        cout<<"s ";
        outfile<<"s ";
    }
    if(ma==fd+fd_){
        cout<<"d ";
        outfile<<"d ";
    }
    cout<<"\n详细:\n\n";
    cout<<"w  当下:  "<<fw<<"  \t发展:"<<fw_<<"  \t综合:"<<fw+fw_<<"\n";
    cout<<"a  当下:  "<<fa<<"  \t发展:"<<fa_<<"  \t综合:"<<fa+fa_<<"\n";
    cout<<"s  当下:  "<<fs<<"  \t发展:"<<fs_<<"  \t综合:"<<fs+fs_<<"\n";
    cout<<"d  当下:  "<<fd<<"  \t发展:"<<fd_<<"  \t综合:"<<fd+fd_<<"\n";
}
void day(){
    system("cls");
    cout<<"qihangxing制作\n\n\n"; 
    cout<<"2025.3.18  v.1.0.0   完成基本的算法推荐\n\n";
    cout<<"2025.3.19  v.1.1.0   美化界面并优化算法\n\n";
    cout<<"2025.3.20  v.1.2.0   添加设置\n\n";
    cout<<"2025.3.21  v.1.3.0   修复已知BUG\n\n";
    cout<<"按任意键返回主界面\n\n";
    getch();
}
void co(){
    system("cls");
    ofstream outfile("移动插件.txt");
    outfile<<"1 ";
    outfile.close();
    cout<<"已发送请求\n\n按任意键返回主界面\n\n";
    getch();
}
void pl(){
    system("cls");
    while(game){
        mp_out();
        Sleep(100);
        system("cls");
    }
}
void sz(){
    start:
    system("cls");
    cout<<"设置\n\n托管模式: ";
    if(game==1) cout<<"yes";
    else cout<<"no ";
    cout<<" (按x更改)\n\n按其他键返回主界面\n\n";
    char x=getch();
    if(x=='x'){
        if(game==1) game=0;
        else game=1;
        goto start;
    }
}
void exi(){
    ofstream outfile("移动插件.txt");
    outfile<<"0 ";
    outfile.close();
}
int main(){
    while(1){
        system("cls");
        ass();
        cout<<"欢迎使用2048 移动辅助插件 v.1.3.0\n\n";
        cout<<"1.连接主程     2.插件设置\n\n";
        cout<<"3.启动插件     4.更新日志\n\n";
        char in=getch();
        if(in=='1'){
            co();
        }
        else if(in=='2'){
            sz();
        }
        else if(in=='3'){
            pl();
        } 
        else if(in=='4'){
            day();
        }
        else if(in=='e'){
            exi();
            break;
        }
    }
    return 0;
}

输入辅助插件 v.1.0.0 代码如下:

#include<bits/stdc++.h>
#include<windows.h>
#include<conio.h>
#include<fstream>
#include<string>
using namespace std;
string dx[5]={"","main","maco"};
int t=1,s=2;
char in=' ';
string _dx=dx[t];
void ass(){
    system("title 2048 输入辅助插件 v.1.0.0");
    ofstream outfile("输入插件.txt");
    outfile<<"1 ";
    outfile.close();
}
void out(){
    system("cls");
    cout<<_dx;
    if(in!=' '&&in!='-')
        cout<<" << "<<in<<"\n\n";
    in=getch();
    if(in=='-'){
        if(t+1>s)
            t=1;
        else
            t+=1;
        _dx=dx[t];
    }
    else{
        ofstream outfile("输入插件.txt");
        outfile<<"1 "<<_dx<<" "<<in<<" 1";
        outfile.close();
    }
} 
int main(){
    ass();
    while(1){
        out();
    } 
    return 0;
}