自创c++小游戏--2048

回复帖子

@lzr20040310 2016-10-06 20:09 回复
2048测试版(内存大约为1.37MB)
安装方法:创建一个新的文件夹,放入一个cpp源码文件,再自己创建一个排行txt文本,名字自拟
然后打开cpp源码,找到92,121和144三行文件操作,将上面的地址改成排行txt文本的地址(必须是精确地址,以硬盘名开头,以txt文本名结尾,中间的'\'用'\\'代替),然后编译并打开即可使用
玩法:打开exe文本稍等片刻,或者拖动exe窗口,等输出了一个4*4的格子即可游戏
默认为wasd操作,如需修改在196~203行将'w''a''s''d'修改为你所需要的键即可(必须是非操作键),每输入完一个字母回车即可(注意输出0表示没有数字)
最后如果中途退出/认输可以直接退出或输入g即可
游戏结束后需要输入名字,作为记录
查看排行需要手动查看,这点之后会改进的
@lzr20040310 2016-10-06 20:10 回复 举报
#include<iostream>
#include<cstdio>
#include<cstring>
#include<cstdlib>
#include<ctime>
using namespace std;
int x[4+10][4+10];
char c[11+10];
int up( ){
    int i,j,k,s=0;
    for(i=1;i<5;i++)
        for(j=1;j<5;j++)
            if(x[i][j]!=0)
                for(k=i-1;k>0;k--){
                    if(x[k][j]==0){
                        x[k][j]=x[k+1][j];
                        x[k+1][j]=0;
                    }
                    else if(x[k][j]==x[k+1][j]){
                        x[k][j]*=2;
                        s+=x[k][j];
                        x[k+1][j]=0;
                    }
                    else
                        break;
                }
    return s;
}
int down( ){
    int i,j,k,s=0;
    for(i=4;i>0;i--)
        for(j=1;j<5;j++)
            if(x[i][j]!=0)
                for(k=i+1;k<5;k++){
                    if(x[k][j]==0){
                        x[k][j]=x[k-1][j];
                        x[k-1][j]=0;
                    }
                    else if(x[k][j]==x[k-1][j]){
                        x[k][j]*=2;
                        s+=x[k][j];
                        x[k-1][j]=0;
                    }
                    else
                        break;
                }
    return s;
}
int left( ){
    int i,j,k,s=0;
    for(i=1;i<5;i++)
        for(j=1;j<5;j++)
            if(x[i][j]!=0)
                for(k=j-1;k>0;k--){
                    if(x[i][k]==0){
                        x[i][k]=x[i][k+1];
                        x[i][k+1]=0;
                    }
                    else if(x[i][k]==x[i][k+1]){
                        x[i][k]*=2;
                        s+=x[i][k];
                        x[i][k+1]=0;
                    }
                    else
                        break;
                }
    return s;
}
int right( ){
    int i,j,k,s=0;
    for(i=1;i<5;i++)
        for(j=4;j>0;j--)
            if(x[i][j]!=0)
                for(k=j+1;k<5;k++){
                    if(x[i][k]==0){
                        x[i][k]=x[i][k-1];
                        x[i][k-1]=0;
                    }
                    else if(x[i][k]==x[i][k-1]){
                        x[i][k]*=2;
                        s+=x[i][k];
                        x[i][k-1]=0;
                    }
                    else
                        break;
                }
    return s;
}
void ran(int s){
    printf("Write Your Name Are There\n");
    gets(c);
    freopen("C:\\Documents and Settings\\Administrator\\桌面\\2048\\2048ranking.txt","r",stdin);
    int i,j,k,sco[10+10]={0};
    char str[10+10][100+10]={0},nam[10+10][100+10]={0};
    for(i=1;i<11;i++){
        gets(str[i]);
        sscanf(str[i],"%*s:%s:%d",nam[i],sco[i]);
    }
    fclose(stdin);
    for(i=10;i>0;i--){
        if(s<=sco[i]){
            if(i==10){
                printf("Sorry,You Doesn\'t Have Ranking!");
                getchar( );
                return;
            }
            else{
                for(j=10;j>i+1;j--){
                    for(k=0;k<strlen(nam[j-1]);k++)
                        nam[j][k]=nam[j-1][k];
                    for(k=strlen(nam[j-1]);k<strlen(nam[j]);k++)
                        nam[j][k]=0;
                    sco[j]=sco[j-1];
                }
                sco[i+1]=s;
                printf("You Are No.%d!",i+1);
                for(j=0;j<strlen(c);j++)
                    nam[i+1][j]=c[j];
                for(j=strlen(c);j<strlen(nam[i+1]);j++)
                    nam[i+1][j]=0;
                freopen("C:\\Documents and Settings\\Administrator\\桌面\\2048\\2048ranking.txt","w",stdout);
                for(j=1;j<11;j++)
                    printf("No.%d:%s:%d",j,nam[j],sco[j]);
                fclose(stdout);
                getchar( );
                return;
            }
        }
    }
    for(j=10;j>1;j--){
        for(k=0;k<strlen(nam[j-1]);k++)
            nam[j][k]=nam[j-1][k];
        for(k=strlen(nam[j-1]);k<strlen(nam[j]);k++)
            nam[j][k]=0;
        sco[j]=sco[j-1];
    }
    sco[1]=s;
    printf("You Are No.1!");
    gets(nam[1]);
    for(j=0;j<strlen(c);j++)
        nam[1][j]=c[j];
    for(j=strlen(c);j<strlen(nam[1]);j++)
        nam[1][j]=0;
    freopen("C:\\Documents and Settings\\Administrator\\桌面\\2048\\2048ranking.txt","w",stdout);
    for(j=1;j<11;j++)
        printf("No.%d:%s:%d\n",j,nam[j],sco[j]);
    fclose(stdout);
    getchar( );
    return;
}
int main( ){
    srand((unsigned)time(NULL));
    int i,j,n,m,s=0,w=4,v;
    bool p,q,u,d,l,r;
    n=rand( )%4+1;
    m=rand( )%4+1;
    x[n][m]=(rand( )%2)*2+2;
    while(1){
        n=rand( )%4+1;
        m=rand( )%4+1;
        if(x[n][m]==0){
            x[n][m]=(rand( )%2)*2+2;
            break;
        }
    }
    for(i=1;i<5;i++){
        for(j=1;j<5;j++)
            printf("%d ",x[i][j]);
        putchar('\n');
    }
    while(1){
        u=false;
        d=false;
        l=false;
        r=false;
        for(i=1;i<5;i++)
            for(j=1;j<5;j++)
                if(x[i][j]!=0){
                    if((!u) && i>1 && (x[i-1][j]==0 || x[i-1][j]==x[i][j]))
                        u=true;
                    if((!d) && i<4 && (x[i+1][j]==0 || x[i+1][j]==x[i][j]))
                        d=true;
                    if((!l) && j>1 && (x[i][j-1]==0 || x[i][j-1]==x[i][j]))
                        l=true;
                    if((!r) && j<4 && (x[i][j+1]==0 || x[i][j+1]==x[i][j]))
                        r=true;
                }
        if(!(u || d || l || r)){
            printf("Game Over!\nThe Score is %d\nDo You See The Ranking?\n",s);
            gets(c);
            if(c[0]=='y' || c[0]=='Y')
                ran(s);
            return 0;
        }
        gets(c);
        if((c[0]=='w' && u) || (c[0]=='s' && d) || (c[0]=='a' && l) || (c[0]=='d' && r)){
            if(c[0]=='w' && u)
                s+=up( );
            else if(c[0]=='s' && d)
                s+=down( );
            else if(c[0]=='a' && l)
                s+=left( );
            else if(c[0]=='d' && r)
                s+=right( );
            while(1){
                n=rand( )%4+1;
                m=rand( )%4+1;
                if(x[n][m]==0){
                    x[n][m]=(rand( )%2)*2+2;
                    break;
                }
            }
            for(i=1;i<5;i++){
                for(j=1;j<5;j++)
                    printf("%4d ",x[i][j]);
                putchar('\n');
            }
            printf("The Score is %d\n",s);
        }
        else if(c[0]=='g' || c[0]=='G'){
            printf("Game Over!\nThe Score is %d\nDo You See The Ranking?\n",s);
            gets(c);
            if(c[0]=='y' || c[0]=='Y')
                ran(s);
            return 0;
        }
    }
    return 0;
}
@lzr20040310 2016-10-06 20:12 回复 举报

对于这款游戏有任何问题都可以私信我或在本帖@我

如果有P党想要Pas版的……你也按上一行的做吧,我尽量帮忙

@wh_ZH 2016-10-06 20:20 回复 举报

挺有趣,谢谢,但是源代码我不怎么能看得懂,或许是我太弱了=_=

@wh_ZH 2016-10-06 20:32 回复 举报

建议楼主在

while(1){
                n=rand( )%4+1;
                m=rand( )%4+1;
                if(x[n][m]==0){
                    x[n][m]=(rand( )%2)*2+2;
                    break;
                }
            }

之后(也就是输出前) 加上system ("cls");清屏

(鄙人的愚见,个人认为屏幕上太多的矩阵看的难过)

@wh_ZH 2016-10-06 20:32 回复 举报

@ lzr20040310

建议楼主在

while(1){
                n=rand( )%4+1;
                m=rand( )%4+1;
                if(x[n][m]==0){
                    x[n][m]=(rand( )%2)*2+2;
                    break;
                }
            }

之后(也就是输出前) 加上system ("cls");清屏

(鄙人的愚见,个人认为屏幕上太多的矩阵看的难过)

反馈
如果你认为某个帖子有问题,欢迎向洛谷反馈,以帮助更多的同学。



请具体说明理由,以增加反馈的可信度。