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;
}

2048 C++ 游戲程序介紹及相關代碼
浙公網安備 33010602011771號