2048 C++ 游戏

💖游戏简介

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

核心功能特性

1. 🌟玩法介绍

  • 基础规则:通过WASD键控制方块移动,相同数字合并得分,生成2或4。
  • 界面优化:使用控制台字符绘制动态棋盘,支持数字格式化显示
  • 倍速调节:按X键可设置移动速度倍率,支持极速模式。
  • 环境支持:windows7可正常运行

2. 🌟成就系统

成就名称 解锁条件
初出茅庐 完成第一次移动
如日中升 合成数字512
终极目标 合成数字2048
闪电战 50回合内结束游戏
幸运星 连续生成3次数字4
持久战 游戏持续300回合以上
超越极限 合成数字4096
改代码的狗 修改代码中的地图大小常量

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常量调整地图大小。
  • 扩展插件协议,实现更复杂的自动化策略。
  • 添加新成就或调整解锁条件。

👉注意事项

记录文件采用简单加密,直接修改可能导致数据损坏,建议通过游戏内菜单管理。

📖开发者信息

  • 作者:qihangxing
  • 版本:v2.0.0(2025.04.07)
  • 开源协议:MIT(允许自由修改和商用,但需保留原作者声明)

主体代码

#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;
}
posted @ 2025-08-10 09:28  Qi_Hang  阅读(79)  评论(2)    收藏  举报