2048游戏实现起来还是比较简单的,注意几个细节,调几个bug就好了。

直接上源码,需要的可以拿走(手动滑稽

/*
dos windows 25*80
*/
#include <algorithm>
#include <windows.h>
#include <iostream>
#include <cstring>
#include <cstdlib>
#include <conio.h>
#include <ctype.h>
#include <cstdio>
#include <cmath>
#include <ctime>
using namespace std;
int game_answer=0; /*
1 = 蓝色 9 = 淡蓝色
2 = 绿色 10 = 淡绿色
3 = 湖蓝色 11 = 淡浅绿色
4 = 红色 12 = 淡红色
5 = 紫色 13 = 淡紫色
6 = 黄色 14 = 淡黄色
7 = 白色 15 = 亮白色
*/
/*设置背景颜色*/int setBackColor(unsigned char bColor){
HANDLE hd = GetStdHandle(STD_OUTPUT_HANDLE);
CONSOLE_SCREEN_BUFFER_INFO csbInfo;
GetConsoleScreenBufferInfo(hd, &csbInfo);
return SetConsoleTextAttribute(hd, (bColor << 4) | (csbInfo.wAttributes&~0xF0));
}
/*设置字体颜色*/int setTextColor(unsigned char fColor){
HANDLE hd = GetStdHandle(STD_OUTPUT_HANDLE);
CONSOLE_SCREEN_BUFFER_INFO csbInfo;
GetConsoleScreenBufferInfo(hd, &csbInfo);
return SetConsoleTextAttribute(hd, fColor | (csbInfo.wAttributes&~0x0F));
} void appGetXY() //得到光标位置
{
HANDLE hStdout;
CONSOLE_SCREEN_BUFFER_INFO pBuffer;
hStdout = GetStdHandle(STD_OUTPUT_HANDLE);
GetConsoleScreenBufferInfo(hStdout, &pBuffer);
cout << pBuffer.dwCursorPosition.X <<" "<< pBuffer.dwCursorPosition.Y <<endl;;
}
void appGotoXY(int x,int y) //移动光标
{
swap(x,y);
CONSOLE_SCREEN_BUFFER_INFO csbiInfo;
HANDLE hConsoleOut;
hConsoleOut = GetStdHandle(STD_OUTPUT_HANDLE);
GetConsoleScreenBufferInfo(hConsoleOut,&csbiInfo);
csbiInfo.dwCursorPosition.X = x;
csbiInfo.dwCursorPosition.Y = y;
SetConsoleCursorPosition(hConsoleOut,csbiInfo.dwCursorPosition);
}
inline int Get_X(int x,int y){
if(x==1) return 5;
if(x==2) return 9;
if(x==3) return 13;
if(x==4) return 17;
}
inline int Get_Y(int x,int y){
if(y==1) return 24;
if(y==2) return 34;
if(y==3) return 44;
if(y==4) return 54;
} void HideCursor(){//隐藏光标
CONSOLE_CURSOR_INFO cursor_info = {1, 0};
SetConsoleCursorInfo(GetStdHandle(STD_OUTPUT_HANDLE), &cursor_info);
} int a[5][5];
bool if_game_over(){
for(int i=1;i<=4;i++)
for(int j=1;j<=4;j++)
if(!a[i][j])
return 1;
for(int i=2;i<=4;i++)
for(int j=1;j<=4;j++){
if(a[j][i]==a[j][i-1])
return 1;
if(a[i][j]==a[i-1][j])
return 1;
}
return 0;
}
bool vis[20]; void Pr_a_num_with_color(int x){
switch (x){/*
1 = 蓝色 9 = 淡蓝色
2 = 绿色 10 = 淡绿色
3 = 湖蓝色 11 = 淡浅绿色
4 = 红色 12 = 淡红色
5 = 紫色 13 = 淡紫色
6 = 黄色 14 = 淡黄色
7 = 白色 15 = 亮白色*/
case 2:setTextColor(9);printf("%4d",x);setTextColor(0);break ;
case 4:setTextColor(10);printf("%4d",x);setTextColor(0);break ;
case 8:setTextColor(11);printf("%4d",x);setTextColor(0);break ;
case 16:setTextColor(12);printf("%4d",x);setTextColor(0);break ;
case 32:setTextColor(13);printf("%4d",x);setTextColor(0);break ;
case 64:setTextColor(14);printf("%4d",x);setTextColor(0);break ;
case 128:setTextColor(15);printf("%4d",x);setTextColor(0);break ;
case 256:setTextColor(1);printf("%4d",x);setTextColor(0);break ;
case 512:setTextColor(2);printf("%4d",x);setTextColor(0);break ;
case 1024:setTextColor(3);printf("%4d",x);setTextColor(0);break ;
case 2048:setTextColor(4);printf("%4d",x);setTextColor(0);break ;
case 4096:setTextColor(5);printf("%4d",x);setTextColor(0);break ;
}
} void Pr_all_num(){
for(int i=1;i<=4;i++)
for(int j=1;j<=4;j++){
int x=Get_X(i,j),y=Get_Y(i,j);
appGotoXY(x,y);
if(a[i][j]==0)
printf(" ");
else{
Pr_a_num_with_color(a[i][j]);
//printf("%4d",a[i][j]);
}
}
return ;
}
//**************************************************
bool clear_up(){
bool bb=0;
for(int k=1;k<=4;k++)
for(int i=3;i>=1;i--)
for(int j=1;j<=4;j++)
if(a[i][j]==0&&a[i+1][j]!=0){
swap(a[i][j],a[i+1][j]);
bb=1;
}
if(bb==1)
return 1;
return 0;
}
bool do_up(){
if(!if_game_over())
return 1;
bool bb=1;
if(!clear_up())//没空间不能移动
bb=0;
for(int j=1;j<=4;j++){
int i=1;
while(i<4){
if(!a[i+1][j])
break ;
if(a[i][j]!=a[i+1][j]){
i++;
continue ;
}
if(a[i][j]==a[i+1][j]){
a[i][j]+=a[i+1][j]; game_answer+=a[i+1][j];
a[i+1][j]=0;
i+=2;
bb=1;//可以合并
}
}
}
if(bb==0)//没空间又不能合并
return 0;
clear_up();
return 1;
}
//**************************************************
bool clear_down(){
bool bb=0;
for(int k=1;k<=4;k++)
for(int i=2;i<=4;i++)
for(int j=1;j<=4;j++)
if(a[i][j]==0&&a[i-1][j]!=0){
swap(a[i][j],a[i-1][j]);
bb=1;
}
if(bb==1)
return 1;
return 0;
}
bool do_down(){
if(!if_game_over())
return 1;
bool bb=1;
if(!clear_down())
bb=0;
for(int j=1;j<=4;j++){
int i=4;
while(i>1){
if(!a[i-1][j])
break ;
if(a[i][j]!=a[i-1][j]){
i--;
continue ;
}
if(a[i][j]==a[i-1][j]){
a[i][j]+=a[i-1][j]; game_answer+=a[i-1][j];
a[i-1][j]=0;
i-=2;
bb=1;
}
}
}
if(bb==0)
return 0;
clear_down();
return 1;
}
//**************************************************
bool clear_left(){
bool bb=0;
for(int k=1;k<=4;k++)
for(int i=1;i<=4;i++)
for(int j=3;j>=1;j--)
if(a[i][j]==0&&a[i][j+1]!=0){
swap(a[i][j],a[i][j+1]);
bb=1;
}
if(bb==1)
return 1;
return 0;
}
bool do_left(){
if(!if_game_over())
return 1;
bool bb=1;
if(!clear_left())
bb=0;
for(int i=1;i<=4;i++){
int j=1;
while(j<4){
if(!a[i][j+1])
break ;
if(a[i][j]!=a[i][j+1]){
j++;
continue ;
}
if(a[i][j]==a[i][j+1]){
a[i][j]+=a[i][j+1]; game_answer+=a[i][j+1];
a[i][j+1]=0;
j+=2;
bb=1;
}
}
}
if(bb==0)
return 0;
clear_left();
return 1;
}
//**************************************************
bool clear_right(){
bool bb=0;
for(int k=1;k<=4;k++)
for(int i=1;i<=4;i++)
for(int j=2;j<=4;j++)
if(a[i][j]==0&&a[i][j-1]!=0){
swap(a[i][j],a[i][j-1]);
bb=1;
}
if(bb==1)
return 1;
return 0;
}
bool do_right(){
if(!if_game_over())
return 1;
bool bb=1;
if(!clear_right())
bb=0;
for(int i=1;i<=4;i++){
int j=4;
while(j>1){
if(!a[i][j-1])
break ;
if(a[i][j]!=a[i][j-1]){
j--;
continue ;
}
if(a[i][j]==a[i][j-1]){
a[i][j]+=a[i][j-1]; game_answer+=a[i][j-1];
a[i][j-1]=0;
j-=2;
bb=1;
}
}
}
if(bb==0)
return 0;
clear_right();
return 1;
} void START();
void END(); //后悔操作开始 struct regret{
int id;//id为进度
int rg[5][5];
}Regret[101];
int Rg_num,Rg_now;//num为数组下标,now为目前最高进度 void Cannot_regret(){
setBackColor(15);
setTextColor(0);
appGotoXY(21,30);
char s_1[30]="您目前不能撤回。";
for(int i=0;i<16;i++){
cout<<s_1[i];
Sleep(30);
}
Sleep(400);
appGotoXY(21,30);
printf(" ");
setBackColor(7);
return ;
} void Rg_watch_num();//反悔步数显示,先声明 void I_regret(){
if(!Rg_num||Rg_now-Regret[Rg_num].id>=10||(Rg_now<=10)){
Cannot_regret();
return ;
}
Rg_num--;
if(Rg_num==0&&Rg_now-Regret[100].id<=10)
Rg_num=100;
for(int i=1;i<=4;i++)
for(int j=1;j<=4;j++)
a[i][j]=Regret[Rg_num].rg[i][j]; //Pr_all_num;
//我也不知道为什么调用不了输出函数,只好手动输出
for(int i=1;i<=4;i++)
for(int j=1;j<=4;j++){
int x=Get_X(i,j),y=Get_Y(i,j);
appGotoXY(x,y);
if(a[i][j]==0)
printf(" ");
else{
Pr_a_num_with_color(a[i][j]);
}
}
Rg_watch_num();
return ;
} void Rg_watch_num(){//反悔步数显示
appGotoXY(2,54);
setBackColor(15);
printf("%2d",10-Rg_now+Regret[Rg_num].id);
setBackColor(7);
return ;
} //后悔操作结束 int main(){
srand(time(0));
HideCursor();//隐藏光标 START(); while(if_game_over()){
//system("cls");
//appGotoXY(0,0); int bb=0;//bb判断是否有空位
for(int i=1;i<=4;i++)
for(int j=1;j<=4;j++)
if(!a[i][j])
bb=1;
if(bb==1){
int num_new=rand()%10+1;//新出现4还是2
if(num_new==1) num_new=4;
else num_new=2;
int place_new=0,x=0,y=0;
while(1){
place_new=rand()%16+1;
x=(place_new-1)/4+1,y=place_new%4+1;
if(!a[x][y])
break ;
}
a[x][y]=num_new;
} Pr_all_num(); again:
char ch_1=getch(),ch_2;
if(ch_1=='r'){//regret
I_regret();
goto again;
}
if(ch_1!=-32){
appGotoXY(20,30);
char s_1[30]="您输入的字符不合法。";
for(int i=0;i<20;i++){
cout<<s_1[i];
Sleep(1);
}
Sleep(200);
for(int i=1;i<=19;i++)
printf("\b \b");
goto again;
}
ch_2=getch();
if(ch_2==72)//up
if(!do_up())
goto again;
if(ch_2==80)//down
if(!do_down())
goto again;
if(ch_2==75)//left
if(!do_left())
goto again;
if(ch_2==77)//right
if(!do_right())
goto again;
appGotoXY(20,30);
printf("您当前的总分为:%d",game_answer);
//regret_预处理
int Last=Rg_num;
Rg_num++;
if(Rg_num==101)
Rg_num=1;
Regret[Rg_num].id=Regret[Last].id+1;
Rg_now=max(Rg_now,Regret[Rg_num].id);
for(int i=1;i<=4;i++)
for(int j=1;j<=4;j++)
Regret[Rg_num].rg[i][j]=a[i][j];
Rg_watch_num();
}
appGotoXY(20,30);
printf(" ");
END();
return 0;
}
void START(){
appGotoXY(0,0);
setBackColor(15);//大背景颜色
for(int i=1;i<=26*80;i++)
cout<<" ";
appGotoXY(0,0);
cout<<" ";
appGotoXY(20,19);
setBackColor(7);//小背景颜色
for(int i=1;i<=42;i++)
cout<<" ";
setTextColor(0);//字体颜色
appGotoXY(3,19);
printf("┏━━━━┳━━━━┳━━━━┳━━━━┓\n");
appGotoXY(4,19);
printf("┃ ┃ ┃ ┃ ┃\n");
appGotoXY(5,19);
printf("┃ ┃ ┃ ┃ ┃\n");
appGotoXY(6,19);
printf("┃ ┃ ┃ ┃ ┃\n");
appGotoXY(7,19);
printf("┣━━━━╋━━━━╋━━━━╋━━━━┫\n");
appGotoXY(8,19);
printf("┃ ┃ ┃ ┃ ┃\n");
appGotoXY(9,19);
printf("┃ ┃ ┃ ┃ ┃\n");
appGotoXY(10,19);
printf("┃ ┃ ┃ ┃ ┃\n");
appGotoXY(11,19);
printf("┣━━━━╋━━━━╋━━━━╋━━━━┫\n");
appGotoXY(12,19);
printf("┃ ┃ ┃ ┃ ┃\n");
appGotoXY(13,19);
printf("┃ ┃ ┃ ┃ ┃\n");
appGotoXY(14,19);
printf("┃ ┃ ┃ ┃ ┃\n");
appGotoXY(15,19);
printf("┣━━━━╋━━━━╋━━━━╋━━━━┫\n");
appGotoXY(16,19);
printf("┃ ┃ ┃ ┃ ┃\n");
appGotoXY(17,19);
printf("┃ ┃ ┃ ┃ ┃\n");
appGotoXY(18,19);
printf("┃ ┃ ┃ ┃ ┃\n");
appGotoXY(19,19);
printf("┗━━━━┻━━━━┻━━━━┻━━━━┛\n");
//Sleep(100000);
appGotoXY(2,19);
setBackColor(15);
char s_1[40]="可按'r'键反悔。您还可反悔的步数为:";
for(int i=0;i<35;i++){
cout<<s_1[i];
Sleep(1);
}
setBackColor(7);
return ;
}
void END(){
setBackColor(15);
appGotoXY(21,30);
char s_1[30]="游戏结束,您的得分为:";
for(int i=0;i<22;i++){
cout<<s_1[i];
Sleep(30);
}
Sleep(500);
cout<<game_answer<<endl;
Sleep(500);
appGotoXY(22,30);
char s_2[30]="请按任意键结束游戏。";
for(int i=0;i<20;i++){
cout<<s_2[i];
Sleep(30);
}
}
/*
1┏━━━━┳━━━━┳━━━━┳━━━━┓
2┃ ┃ ┃ ┃ ┃
3┃ 0000 ┃ 0000 ┃ 0000 ┃ 0000 ┃
4┃ ┃ ┃ ┃ ┃
5┣━━━━╋━━━━╋━━━━╋━━━━┫
6┃ ┃ ┃ ┃ ┃
7┃ 0000 ┃ 0000 ┃ 0000 ┃ 0000 ┃
8┃ ┃ ┃ ┃ ┃
9┣━━━━╋━━━━╋━━━━╋━━━━┫
0┃ ┃ ┃ ┃ ┃
1┃ 0000 ┃ 0000 ┃ 0000 ┃ 0000 ┃
2┃ ┃ ┃ ┃ ┃
3┣━━━━╋━━━━╋━━━━╋━━━━┫
4┃ ┃ ┃ ┃ ┃
5┃ 0000 ┃ 0000 ┃ 0000 ┃ 0000 ┃
6┃ ┃ ┃ ┃ ┃
7┗━━━━┻━━━━┻━━━━┻━━━━┛
*/

/*
dos windows 25*80
*/
#include <algorithm>
#include <windows.h>
#include <iostream>
#include <cstring>
#include <cstdlib>
#include <conio.h>
#include <ctype.h>
#include <cstdio>
#include <cmath>
#include <ctime>
using namespace std;
int game_answer=0;

/*
1 = 蓝色   9  = 淡蓝色
2 = 绿色   10 = 淡绿色
3 = 湖蓝色 11 = 淡浅绿色
4 = 红色   12 = 淡红色
5 = 紫色   13 = 淡紫色
6 = 黄色   14 = 淡黄色
7 = 白色   15 = 亮白色
*/
/*设置背景颜色*/int setBackColor(unsigned char bColor){
    HANDLE hd = GetStdHandle(STD_OUTPUT_HANDLE);
    CONSOLE_SCREEN_BUFFER_INFO csbInfo;
    GetConsoleScreenBufferInfo(hd, &csbInfo);
    return SetConsoleTextAttribute(hd, (bColor << 4) | (csbInfo.wAttributes&~0xF0));
}
/*设置字体颜色*/int setTextColor(unsigned char fColor){
    HANDLE hd = GetStdHandle(STD_OUTPUT_HANDLE);
    CONSOLE_SCREEN_BUFFER_INFO csbInfo;
    GetConsoleScreenBufferInfo(hd, &csbInfo);
    return SetConsoleTextAttribute(hd, fColor | (csbInfo.wAttributes&~0x0F));
}

void appGetXY() //得到光标位置
{
    HANDLE hStdout;
    CONSOLE_SCREEN_BUFFER_INFO pBuffer;
    hStdout = GetStdHandle(STD_OUTPUT_HANDLE);
    GetConsoleScreenBufferInfo(hStdout, &pBuffer);
    cout << pBuffer.dwCursorPosition.X <<" "<< pBuffer.dwCursorPosition.Y <<endl;;
}
void appGotoXY(int x,int y)  //移动光标
{
    swap(x,y);
    CONSOLE_SCREEN_BUFFER_INFO    csbiInfo;                            
    HANDLE    hConsoleOut;
    hConsoleOut = GetStdHandle(STD_OUTPUT_HANDLE);
    GetConsoleScreenBufferInfo(hConsoleOut,&csbiInfo);
    csbiInfo.dwCursorPosition.X = x;                                    
    csbiInfo.dwCursorPosition.Y = y;                                    
    SetConsoleCursorPosition(hConsoleOut,csbiInfo.dwCursorPosition);   
}
inline int Get_X(int x,int y){
    if(x==1)    return 5;
    if(x==2)    return 9;
    if(x==3)    return 13;
    if(x==4)    return 17;
}
inline int Get_Y(int x,int y){
    if(y==1)    return 24;
    if(y==2)    return 34;
    if(y==3)    return 44;
    if(y==4)    return 54;
}

void HideCursor(){//隐藏光标
    CONSOLE_CURSOR_INFO cursor_info = {1, 0};
    SetConsoleCursorInfo(GetStdHandle(STD_OUTPUT_HANDLE), &cursor_info);
}

int a[5][5];
bool if_game_over(){
    for(int i=1;i<=4;i++)
        for(int j=1;j<=4;j++)
            if(!a[i][j])
                return 1;
    for(int i=2;i<=4;i++)
        for(int j=1;j<=4;j++){
            if(a[j][i]==a[j][i-1])
                return 1;
            if(a[i][j]==a[i-1][j])
                return 1;
        }
    return 0;
}
bool vis[20];

void Pr_a_num_with_color(int x){
    switch (x){/*
        1 = 蓝色   9  = 淡蓝色
        2 = 绿色   10 = 淡绿色
        3 = 湖蓝色 11 = 淡浅绿色
        4 = 红色   12 = 淡红色
        5 = 紫色   13 = 淡紫色
        6 = 黄色   14 = 淡黄色
        7 = 白色   15 = 亮白色*/
        case 2:setTextColor(9);printf("%4d",x);setTextColor(0);break ;
        case 4:setTextColor(10);printf("%4d",x);setTextColor(0);break ;
        case 8:setTextColor(11);printf("%4d",x);setTextColor(0);break ;
        case 16:setTextColor(12);printf("%4d",x);setTextColor(0);break ;
        case 32:setTextColor(13);printf("%4d",x);setTextColor(0);break ;
        case 64:setTextColor(14);printf("%4d",x);setTextColor(0);break ;
        case 128:setTextColor(15);printf("%4d",x);setTextColor(0);break ;
        case 256:setTextColor(1);printf("%4d",x);setTextColor(0);break ;
        case 512:setTextColor(2);printf("%4d",x);setTextColor(0);break ;
        case 1024:setTextColor(3);printf("%4d",x);setTextColor(0);break ;
        case 2048:setTextColor(4);printf("%4d",x);setTextColor(0);break ;
        case 4096:setTextColor(5);printf("%4d",x);setTextColor(0);break ;
    }
}

void Pr_all_num(){
    for(int i=1;i<=4;i++)
        for(int j=1;j<=4;j++){
            int x=Get_X(i,j),y=Get_Y(i,j);
            appGotoXY(x,y);
            if(a[i][j]==0)
                printf("    ");
            else{
                Pr_a_num_with_color(a[i][j]);
                //printf("%4d",a[i][j]);
            }
        }
    return ;
}
//**************************************************
bool clear_up(){
    bool bb=0;
    for(int k=1;k<=4;k++)
        for(int i=3;i>=1;i--)
            for(int j=1;j<=4;j++)
                if(a[i][j]==0&&a[i+1][j]!=0){
                    swap(a[i][j],a[i+1][j]);
                    bb=1;
                }
    if(bb==1)
        return 1;
    return 0;
}
bool do_up(){
    if(!if_game_over())
        return 1;
    bool bb=1;
    if(!clear_up())//没空间不能移动
        bb=0;
    for(int j=1;j<=4;j++){
        int i=1;
        while(i<4){
            if(!a[i+1][j])
                break ;
            if(a[i][j]!=a[i+1][j]){
                i++;
                continue ;
            }
            if(a[i][j]==a[i+1][j]){
                a[i][j]+=a[i+1][j]; game_answer+=a[i+1][j];
                a[i+1][j]=0;
                i+=2;
                bb=1;//可以合并
            }
        }
    }
    if(bb==0)//没空间又不能合并
        return 0;
    clear_up();
    return 1;
}
//**************************************************
bool clear_down(){
    bool bb=0;
    for(int k=1;k<=4;k++)
        for(int i=2;i<=4;i++)
            for(int j=1;j<=4;j++)
                if(a[i][j]==0&&a[i-1][j]!=0){
                    swap(a[i][j],a[i-1][j]);
                    bb=1;
                }
    if(bb==1)
        return 1;
    return 0;
}
bool do_down(){
    if(!if_game_over())
        return 1;
    bool bb=1;
    if(!clear_down())
        bb=0;
    for(int j=1;j<=4;j++){
        int i=4;
        while(i>1){
            if(!a[i-1][j])
                break ;
            if(a[i][j]!=a[i-1][j]){
                i--;
                continue ;
            }
            if(a[i][j]==a[i-1][j]){
                a[i][j]+=a[i-1][j];  game_answer+=a[i-1][j];
                a[i-1][j]=0;
                i-=2;
                bb=1;
            }
        }
    }
    if(bb==0)
        return 0;
    clear_down();
    return 1;
}
//**************************************************
bool clear_left(){
    bool bb=0;
    for(int k=1;k<=4;k++)
        for(int i=1;i<=4;i++)
            for(int j=3;j>=1;j--)
                if(a[i][j]==0&&a[i][j+1]!=0){
                    swap(a[i][j],a[i][j+1]);
                    bb=1;
                }
    if(bb==1)
        return 1;
    return 0;
}
bool do_left(){
    if(!if_game_over())
        return 1;
    bool bb=1;
    if(!clear_left())
        bb=0;
    for(int i=1;i<=4;i++){
        int j=1;
        while(j<4){
            if(!a[i][j+1])
                break ;
            if(a[i][j]!=a[i][j+1]){
                j++;
                continue ;
            }
            if(a[i][j]==a[i][j+1]){
                a[i][j]+=a[i][j+1];  game_answer+=a[i][j+1];
                a[i][j+1]=0;
                j+=2;
                bb=1;
            }
        }
    }
    if(bb==0)
        return 0;
    clear_left();
    return 1;
}
//**************************************************
bool clear_right(){
    bool bb=0;
    for(int k=1;k<=4;k++)
        for(int i=1;i<=4;i++)
            for(int j=2;j<=4;j++)
                if(a[i][j]==0&&a[i][j-1]!=0){
                    swap(a[i][j],a[i][j-1]);
                    bb=1;
                }
    if(bb==1)
        return 1;
    return 0;
}
bool do_right(){
    if(!if_game_over())
        return 1;
    bool bb=1;
    if(!clear_right())
        bb=0;
    for(int i=1;i<=4;i++){
        int j=4;
        while(j>1){
            if(!a[i][j-1])
                break ;
            if(a[i][j]!=a[i][j-1]){
                j--;
                continue ;
            }
            if(a[i][j]==a[i][j-1]){
                a[i][j]+=a[i][j-1];  game_answer+=a[i][j-1];
                a[i][j-1]=0;
                j-=2;
                bb=1;
            }
        }
    }
    if(bb==0)
        return 0;
    clear_right();
    return 1;
}

void START();
void END();

//后悔操作开始

struct regret{
    int id;//id为进度
    int rg[5][5];
}Regret[101];
int Rg_num,Rg_now;//num为数组下标,now为目前最高进度

void Cannot_regret(){
    setBackColor(15);
    setTextColor(0);
    appGotoXY(21,30);
    char s_1[30]="您目前不能撤回。";
    for(int i=0;i<16;i++){
        cout<<s_1[i];
        Sleep(30);
    }
    Sleep(400);
    appGotoXY(21,30);
    printf("                ");
    setBackColor(7);
    return ;
}

void Rg_watch_num();//反悔步数显示,先声明

void I_regret(){
    if(!Rg_num||Rg_now-Regret[Rg_num].id>=10||(Rg_now<=10)){
        Cannot_regret();
        return ;
    }
    Rg_num--;
    if(Rg_num==0&&Rg_now-Regret[100].id<=10)
        Rg_num=100;
    for(int i=1;i<=4;i++)
        for(int j=1;j<=4;j++)
            a[i][j]=Regret[Rg_num].rg[i][j];
            
    //Pr_all_num;  
    //我也不知道为什么调用不了输出函数,只好手动输出
    for(int i=1;i<=4;i++)
        for(int j=1;j<=4;j++){
            int x=Get_X(i,j),y=Get_Y(i,j);
            appGotoXY(x,y);
            if(a[i][j]==0)
                printf("    ");
            else{
                Pr_a_num_with_color(a[i][j]);
            }
        }
    Rg_watch_num();
    return ;
}

void Rg_watch_num(){//反悔步数显示
    appGotoXY(2,54);
    setBackColor(15);
    printf("%2d",10-Rg_now+Regret[Rg_num].id);
    setBackColor(7);
    return ;
}

//后悔操作结束

int main(){
    srand(time(0));
    HideCursor();//隐藏光标     
    
    START();
    
    while(if_game_over()){
        //system("cls");
        //appGotoXY(0,0);
    
        int bb=0;//bb判断是否有空位
        for(int i=1;i<=4;i++)
            for(int j=1;j<=4;j++)
                if(!a[i][j])
                    bb=1;
        if(bb==1){
            int num_new=rand()%10+1;//新出现4还是2
            if(num_new==1)    num_new=4;
            else    num_new=2;
            int place_new=0,x=0,y=0;
            while(1){
                place_new=rand()%16+1;
                x=(place_new-1)/4+1,y=place_new%4+1;
                if(!a[x][y])
                    break ;
            }
            a[x][y]=num_new;    
        }
        
        Pr_all_num();
        
    again:
        char ch_1=getch(),ch_2;
        if(ch_1=='r'){//regret
            I_regret();
                goto again;
        }
        if(ch_1!=-32){
            appGotoXY(20,30);
            char s_1[30]="您输入的字符不合法。";
            for(int i=0;i<20;i++){
                cout<<s_1[i];
                Sleep(1);
            }
            Sleep(200);
            for(int i=1;i<=19;i++)
                printf("\b \b");
            goto again;
        }
        ch_2=getch();
        if(ch_2==72)//up
            if(!do_up())
                goto again;
        if(ch_2==80)//down
            if(!do_down())
                goto again;
        if(ch_2==75)//left
            if(!do_left())
                goto again;
        if(ch_2==77)//right
            if(!do_right())
                goto again;
        appGotoXY(20,30);
        printf("您当前的总分为:%d",game_answer);
        //regret_预处理
        int Last=Rg_num;
        Rg_num++;
        if(Rg_num==101)
            Rg_num=1;
        Regret[Rg_num].id=Regret[Last].id+1;
        Rg_now=max(Rg_now,Regret[Rg_num].id);
        for(int i=1;i<=4;i++)
            for(int j=1;j<=4;j++)
                Regret[Rg_num].rg[i][j]=a[i][j];
        Rg_watch_num();
    }
    appGotoXY(20,30);
    printf("                     ");
    END();
    return 0;
}
void START(){
    appGotoXY(0,0);
    setBackColor(15);//大背景颜色
    for(int i=1;i<=26*80;i++)
        cout<<" ";
    appGotoXY(0,0);
    cout<<" ";
    appGotoXY(20,19);
    setBackColor(7);//小背景颜色
    for(int i=1;i<=42;i++)
        cout<<" ";
    setTextColor(0);//字体颜色
    appGotoXY(3,19);
    printf("┏━━━━┳━━━━┳━━━━┳━━━━┓\n");
    appGotoXY(4,19);
    printf("┃        ┃        ┃        ┃        ┃\n");
    appGotoXY(5,19);
    printf("┃        ┃        ┃        ┃        ┃\n");
    appGotoXY(6,19);
    printf("┃        ┃        ┃        ┃        ┃\n");
    appGotoXY(7,19);
    printf("┣━━━━╋━━━━╋━━━━╋━━━━┫\n");
    appGotoXY(8,19);
    printf("┃        ┃        ┃        ┃        ┃\n");
    appGotoXY(9,19);
    printf("┃        ┃        ┃        ┃        ┃\n");
    appGotoXY(10,19);
    printf("┃        ┃        ┃        ┃        ┃\n");
    appGotoXY(11,19);
    printf("┣━━━━╋━━━━╋━━━━╋━━━━┫\n");
    appGotoXY(12,19);
    printf("┃        ┃        ┃        ┃        ┃\n");
    appGotoXY(13,19);
    printf("┃        ┃        ┃        ┃        ┃\n");
    appGotoXY(14,19);
    printf("┃        ┃        ┃        ┃        ┃\n");
    appGotoXY(15,19);
    printf("┣━━━━╋━━━━╋━━━━╋━━━━┫\n");
    appGotoXY(16,19);
    printf("┃        ┃        ┃        ┃        ┃\n");
    appGotoXY(17,19);
    printf("┃        ┃        ┃        ┃        ┃\n");
    appGotoXY(18,19);
    printf("┃        ┃        ┃        ┃        ┃\n");
    appGotoXY(19,19);
    printf("┗━━━━┻━━━━┻━━━━┻━━━━┛\n");
    //Sleep(100000);
    appGotoXY(2,19);
    setBackColor(15);
    char s_1[40]="可按'r'键反悔。您还可反悔的步数为:";
    for(int i=0;i<35;i++){
        cout<<s_1[i];
        Sleep(1);
    }
    setBackColor(7);
    return ;
}
void END(){
    setBackColor(15);
    appGotoXY(21,30);
    char s_1[30]="游戏结束,您的得分为:";
    for(int i=0;i<22;i++){
        cout<<s_1[i];
        Sleep(30);
    }
    Sleep(500);
    cout<<game_answer<<endl;
    Sleep(500);
    appGotoXY(22,30);
    char s_2[30]="请按任意键结束游戏。";
    for(int i=0;i<20;i++){
        cout<<s_2[i];
        Sleep(30);
    }
}
/*
1┏━━━━┳━━━━┳━━━━┳━━━━┓
2┃        ┃        ┃        ┃        ┃
3┃  0000  ┃  0000  ┃  0000  ┃  0000  ┃
4┃        ┃        ┃        ┃        ┃
5┣━━━━╋━━━━╋━━━━╋━━━━┫
6┃        ┃        ┃        ┃        ┃
7┃  0000  ┃  0000  ┃  0000  ┃  0000  ┃
8┃        ┃        ┃        ┃        ┃
9┣━━━━╋━━━━╋━━━━╋━━━━┫
0┃        ┃        ┃        ┃        ┃
1┃  0000  ┃  0000  ┃  0000  ┃  0000  ┃
2┃        ┃        ┃        ┃        ┃
3┣━━━━╋━━━━╋━━━━╋━━━━┫
4┃        ┃        ┃        ┃        ┃
5┃  0000  ┃  0000  ┃  0000  ┃  0000  ┃
6┃        ┃        ┃        ┃        ┃
7┗━━━━┻━━━━┻━━━━┻━━━━┛
*/

C++ 2048游戏的更多相关文章

  1. 用javascript实现一个2048游戏

    早就想自己写一个2048游戏了,昨晚闲着没事,终于写了一个 如下图,按方向键开始玩吧. 如果觉得操作不方便,请直接打开链接玩吧: http://gujianbo.1kapp.com/2048/2048 ...

  2. powershell字符界面的,powershell加WPF界面的,2048游戏

    ------[序言]------ 1 2048游戏,有段时间很火,我在地铁上看有人玩过.没错,坐地铁很无聊,人家玩我就一直盯着看. 2 我在电脑上找了一个,试玩了以下,没几次格子就满了.我就气呼呼的放 ...

  3. [python] python实现2048游戏,及代码解析。

    我初学python,有不对之处望大家指教.转载请征得同意. 我在网络上也找了一些2048游戏代码的讲解,但都不是特别详细.所以我希望能够尽量详细的讲解.同时,有的地方我也不懂,希望大家能帮助补充.我会 ...

  4. Android项目开发实战-2048游戏

    <2048>是一款比较流行的数字游戏,最早于2014年3月20日发行.原版2048首先在GitHub上发布,原作者是Gabriele Cirulli,后被移植到各个平台.这款游戏是基于&l ...

  5. 对弈类游戏的人工智能(5)--2048游戏AI的解读

    前言: 闲得没事, 网上搜"游戏AI", 看到一篇<<2048游戏的最佳算法是?来看看AI版作者的回答>>的文章. 而这篇文章刚好和之前讲的对弈类游戏AI对 ...

  6. 最少javascript代码完成一个2048游戏

    原生javascript代码写的2048游戏.建议在谷歌浏览器下跑.'WASD'控制方向.演示地址请移步:http://runjs.cn/detail/bp8baf8b 直接贴代码~ html: &l ...

  7. cocos2d-x游戏开发实战原创视频讲座系列1之2048游戏开发

     cocos2d-x游戏开发实战原创视频讲座系列1之2048游戏开发 的产生 视持续更新中.... 视频存放地址例如以下:http://ipd.pps.tv/user/1058663622     ...

  8. 用Python做2048游戏 网易云课堂配套实验课。通过GUI来体验编程的乐趣。

    第1节 认识wxpython 第2节 画几个形状 第3节 再做个计算器 第4节 最后实现个2048游戏 实验1-认识wxpython 一.实验说明 1. 环境登录 无需密码自动登录,系统用户名shiy ...

  9. 一个用 C 语言写的迷你版 2048 游戏,仅仅有 500个字符

    Jay Chan 用 C 语言写的一个迷你版 2048 游戏,仅仅有 487 个字符. 来围观吧 M[16],X=16,W,k;main(){T(system("stty cbreak&qu ...

  10. android 2048游戏、kotlin应用、跑马灯、动画源码

    Android精选源码 2048游戏源码 android实现获取号码归属地和其他信息诈骗.骚扰 android kotlin仿开眼app源码 android多种reveal动画效果 android K ...

随机推荐

  1. MogileFS表说明

    MogileFS大致的表说明如下 checksum:用来存放文件的校验和class:文件分类定义device:主机上的可用设备定义,包括设备可用空间,使用的权重等信息domain:域定义信息file: ...

  2. java中的自动装箱和拆箱

    一.什么是自动装箱和拆箱: 我们知道java为8种基本类型分别提供了对应的包装类型,在Java SE5之前,如果要生成一个数值为10的Integer对象,必须这样进行: Integer i=new I ...

  3. Docker相关环境全套安装文档兼小技能

    Docker相关环境全套安装文档兼小技能 以下环境皆为ubuntu16.04,主要安装docker,docker-compose,docker仓库等. Docker安装 参考官方 A: 有源安装 Ub ...

  4. poj 1837 天平问题(01背包变种)

    题意:给你n个挂钩,m个砝码,要求砝码都用上,问有多少中方案数 题解:对于这道题目的状态,我们定义一个变量j为平衡度,当j=0的时候,表明天平平衡.定义dp[i][j]表达的含义为使用前n个砝码的时候 ...

  5. Java RadixSort

    Java RadixSort /** * <html> * <body> * <P> Copyright 1994-2018 JasonInternational ...

  6. Asp.Net Core 轻松学系列-1阅读指引目录

    https://www.cnblogs.com/viter/p/10474091.html 目录 前言 1. 从安装到配置 2. 业务实现 3. 日志 4. 测试 5. 缓存使用 6.网络和通讯 7. ...

  7. Shell学习笔记:awk实现group by分组统计功能

    日常部分数据以 txt 的文件格式提供,为避免入库之后再进行统计的麻烦,故学习 shell 进行处理,减少工作量. 1.样例数据 # test.txt YD5Gxxx|6618151|68254490 ...

  8. CSS伸缩布局

    1. 伸缩布局应用: 伸缩布局应用 主轴: Flex容器的主轴用来配置Flex项目,默认是水平方向 侧轴: 与主轴垂直的轴称为侧轴,默认还是垂直方向 方向: 默认是主轴从左向右, 侧轴默认是从上到下 ...

  9. sql查询并把数据更新到另一个表中

    update OpenBills set peopleCount=(select rtNumber from Rooms where obId='ZD201005223') where obId='Z ...

  10. Image Processing and Analysis_15_Image Registration:A survey of medical image registration——1998

    此主要讨论图像处理与分析.虽然计算机视觉部分的有些内容比如特 征提取等也可以归结到图像分析中来,但鉴于它们与计算机视觉的紧密联系,以 及它们的出处,没有把它们纳入到图像处理与分析中来.同样,这里面也有 ...