2 handstran handstran 于 2015.07.14 17:55 提问

2048代码解释,,小白看不懂 5C

#include
#include
#include
#include
#include
int random_number_2_4();//随机出2和4
int* random_number_16(int* p);//确定随机的格子,返回指针。
int main()
{
int end=0;
long mark=0;//总分
int i,j;
int c=0;//判误参数
char key;//键盘输入
int line,colum;
int temp1;//临时数组下标
int temp[4]={0};
int* blank=NULL;//指向空格子的指针
int interface[4][4]={0};//界面二维数组。

blank=random_number_16(&interface[0][0]);//开始出现的两个。
*blank=random_number_2_4();
blank=random_number_16(&interface[0][0]);
*blank=random_number_2_4();

while(1) //循环现实界面
{

system("cls");//清屏
for(i=0;i<4;i++)
{
    for(j=0;j<4;j++)
    {
    if(interface[i][j]==0)
    printf("%c\t",'-');
    else
    printf("%d\t",interface[i][j]);
    }
    printf("\n\n");
}printf("\n");


printf("\tMark=%lld\t",mark);//显示参数
printf("\n\n|*   上是w,下是s,左是a,右是d  *|\n\n\n|*    阿杜亲编,欢迎扩散~   *|\n\n");


/*输入是否合法*/

cannot://错误则返回的地方。
c=0;
do//错误就循环输入
{
key=getchar();
}while(key!='w' && key!='s' && key!='a' && key!='d');

/*上下左右都是一个原理,所以这里只介绍“上”——“w”*/

switch(key)

{
case 'w':
{
/*判断是否符合移动条件*/
for(colum=0;colum for(line=3;line>0;line--)
{
if((interface[line][colum]!=0&&interface[line-1][colum]==0)||(interface[line][colum]==interface[line-1][colum]))
{c++;break;}
}

    if(c==0)
    {
        goto cannot;//不能移动就回去再输入
    }


    /*判断是否有空位置,有则补上。*/
    //基本思想是通过把一行或者一列非零的赋值给临时全为0的一维数组,再把一维数组赋值回去。

    for(temp1=0;temp1<4;temp1++)//清空临时数组
    temp[temp1]=0;
    for(colum=0;colum<4;colum++)//先把一列赋值给一个一维数组
    {for(line=0,temp1=0;line<4;line++)
    {
        if(interface[line][colum])
        {
        temp[temp1]=interface[line][colum];
        temp1++;
        }
    }

    for(line=0,temp1=0;line<4;line++,temp1++)//再把数组赋值回去
    interface[line][colum]=temp[temp1];

    for(temp1=0;temp1<4;temp1++)//清空临时数组
        temp[temp1]=0;
    }

    /*先判断相邻的是否相等,然后相加。*/
    for(colum=0;colum<4;colum++)
    for(line=0;line<3;line++)
    {
    if(interface[line][colum]==interface[line+1][colum])
    {interface[line][colum]+=interface[line+1][colum];
        mark+=interface[line][colum];
        interface[line+1][colum]=0;
    }}
    /*再判断是否有空位置,有则补上。*/
    //基本思想是通过把一行或者一列非零的赋值给临时全为0的一维数组,再把一维数组赋值回去。

    for(temp1=0;temp1<4;temp1++)//清空临时数组
    temp[temp1]=0;

    for(colum=0;colum<4;colum++)//先把一列赋值给一个一维数组
    {for(line=0,temp1=0;line<4;line++)
    {
        if(interface[line][colum])
        {
        temp[temp1]=interface[line][colum];
        temp1++;
        }
    }

    for(line=0,temp1=0;line<4;line++,temp1++)//再把数组赋值回去
    interface[line][colum]=temp[temp1];

    for(temp1=0;temp1<4;temp1++)//清空临时数组
        temp[temp1]=0;
    }


}break;

case 's':
{
for(colum=0;colum<4;colum++)
for(line=0;line<3;line++)
{
if((interface[line][colum]!=0&&interface[line+1][colum]==0)||(interface[line][colum]==interface[line+1][colum]))
{c++;break;}
}
if(c==0)
{
goto cannot;
}

    for(temp1=0;temp1<4;temp1++)
    temp[temp1]=0;
    for(colum=0;colum<4;colum++)
    {for(line=3,temp1=3;line>=0;line--)
    {
        if(interface[line][colum])
        {
        temp[temp1]=interface[line][colum];
        temp1--;
        }
    }

    for(line=0,temp1=0;line<4;line++,temp1++)
    interface[line][colum]=temp[temp1];

    for(temp1=0;temp1<4;temp1++)
        temp[temp1]=0;
    }


    for(colum=0;colum<4;colum++)
    for(line=3;line>0;line--)
    {
    if(interface[line][colum]==interface[line-1][colum])
    {interface[line][colum]+=interface[line-1][colum];
        mark+=interface[line][colum];
       interface[line-1][colum]=0;
    }}


    for(temp1=0;temp1<4;temp1++)
    temp[temp1]=0;
    for(colum=0;colum<4;colum++)
    {for(line=3,temp1=3;line>=0;line--)
    {
        if(interface[line][colum])
        {
        temp[temp1]=interface[line][colum];
        temp1--;
        }
    }

    for(line=0,temp1=0;line<4;line++,temp1++)
    interface[line][colum]=temp[temp1];

    for(temp1=0;temp1<4;temp1++)
        temp[temp1]=0;
    }


}break;

case 'a':
{

    for(line=0;line<4;line++)
    for(colum=3;colum>0;colum--)
    {
        if((interface[line][colum]!=0&&interface[line][colum-1]==0)||(interface[line][colum]==interface[line][colum-1]))
          {c++;break;}
    }
    if(c==0)
    {
        goto cannot;
    }



    for(temp1=0;temp1<4;temp1++)
    temp[temp1]=0;
    for(line=0;line<4;line++)
    {for(colum=0,temp1=0;colum<4;colum++)
    {
        if(interface[line][colum])
        {
        temp[temp1]=interface[line][colum];
        temp1++;
        }
    }

    for(colum=0,temp1=0;colum<4;colum++,temp1++)
    interface[line][colum]=temp[temp1];

    for(temp1=0;temp1<4;temp1++)
        temp[temp1]=0;
    }


    for(line=0;line<4;line++)
    for(colum=0;colum<3;colum++)
    {
    if(interface[line][colum]==interface[line][colum+1])
    {interface[line][colum]+=interface[line][colum+1];
        mark+=interface[line][colum];
       interface[line][colum+1]=0;
    }}

    for(temp1=0;temp1<4;temp1++)
    temp[temp1]=0;

    for(line=0;line<4;line++)
    {for(colum=0,temp1=0;colum<4;colum++)
    {
        if(interface[line][colum])
        {
        temp[temp1]=interface[line][colum];
        temp1++;
        }
    }

    for(colum=0,temp1=0;colum<4;colum++,temp1++)
    interface[line][colum]=temp[temp1];

    for(temp1=0;temp1<4;temp1++)
        temp[temp1]=0;
    }


}break;

case 'd':
{

    for(line=0;line<4;line++)
    for(colum=0;colum<3;colum++)
    {
        if((interface[line][colum]!=0&&interface[line][colum+1]==0)||(interface[line][colum]==interface[line][colum+1]))
           {c++;break;}
    }
    if(c==0)
    {
        goto cannot;
    }




    for(temp1=0;temp1<4;temp1++)
    temp[temp1]=0;
    for(line=0;line<4;line++)
    {for(colum=3,temp1=3;colum>=0;colum--)
    {
        if(interface[line][colum])
        {
        temp[temp1]=interface[line][colum];
        temp1--;
        }
    }

    for(colum=0,temp1=0;colum<4;colum++,temp1++)
    interface[line][colum]=temp[temp1];

    for(temp1=0;temp1<4;temp1++)
        temp[temp1]=0;
    }


    for(line=0;line<4;line++)
    for(colum=3;colum>0;colum--)
    {
    if(interface[line][colum]==interface[line][colum-1])
    {interface[line][colum]+=interface[line][colum-1];
        mark+=interface[line][colum];
       interface[line][colum-1]=0;
    }}

    for(temp1=0;temp1<4;temp1++)
    temp[temp1]=0;
    for(line=0;line<4;line++)
    {for(colum=3,temp1=3;colum>=0;colum--)
    {
        if(interface[line][colum])
        {
        temp[temp1]=interface[line][colum];
        temp1--;
        }
    }

    for(colum=0,temp1=0;colum<4;colum++,temp1++)
    interface[line][colum]=temp[temp1];

    for(temp1=0;temp1<4;temp1++)
        temp[temp1]=0;
    }


}break;

}

 blank=random_number_16(&interface[0][0]);//随机给出一个数
*blank=random_number_2_4();

/*判断是不是已经挂了= =*/

    for(colum=0;colum<4;colum++)
    for(line=3;line>0;line--)
    {
        if(((interface[line][colum]!=0&&interface[line-1][colum]==0)||(interface[line][colum]==interface[line-1][colum])))
            end++;
    }

    for(colum=0;colum<4;colum++)
    for(line=0;line<3;line++)
    {
        if(((interface[line][colum]!=0&&interface[line+1][colum]==0)||(interface[line][colum]==interface[line+1][colum])))
               end++;
    }
    for(line=0;line<4;line++)
    for(colum=3;colum>0;colum--)
    {
        if(((interface[line][colum]!=0&&interface[line][colum-1]==0)||(interface[line][colum]==interface[line][colum-1])))
          end++;
    }
    for(line=0;line<4;line++)
    for(colum=0;colum<3;colum++)
    {
        if(((interface[line][colum]!=0&&interface[line][colum+1]==0)||(interface[line][colum]==interface[line][colum+1])))
           end++;
    }


        if(end==0)
        break;

        end=0;//重置end

/*显示最后结果*/
}

system("cls");//清屏
for(i=0;i<4;i++)
{
for(j=0;j<4;j++)
{
if(interface[i][j]==0)
printf("%c\t",'=');
else
printf("%d\t",interface[i][j]);
}
printf("\n\n");
}printf("\n");

printf("\tMark=%lld\t",mark);//显示参数
printf("\n\n|*   上是w,下是s,左是a,右是d  *|\n\n\n|*    阿杜亲编,欢迎扩散~   *|\n\n");
printf("\tGame Over!T_T");

while(1);
return 0;

}

/*以下为子函数*/

int random_number_2_4()//随机出2和4
{
int a,b;
srand(time(0));
a=rand()%2;
b=2*(a+1);
return b;
}

int* random_number_16(int* p)//确定随机的格子,返回指针。
{
int k;
int judge[16];
int i,j;
int L;
for(k=0;k<16;k++)
{
judge[k]=NULL;//存放界面指针的函数。
}
for(i=0,j=0;i<16;i++)//存放指针
{
if(
(p+i)==0)
{judge[j]=p+i;
j++;}
}
srand(time(0));//确定位置
L=rand()%j;

return (judge[L]);

}

10个回答

wenpinglaoyao
wenpinglaoyao   2015.07.15 14:50

楼主代码没贴全吧,那5个include分别包含的是什么文件?

baidu_25226775
baidu_25226775   2015.07.15 15:02

2048这些游戏,难的不是代码,而是想法。看看设计思路,再看代码吧。
思路最重要,不了解的话就像是天书。

handstran
handstran   2015.07.14 17:58

或者这个怎么简化呢?能不能缩到200行左右

caozhy
caozhy   Ds   Rxr 2015.07.14 18:23

既然你连代码都看不懂,你凭什么认为可以缩减到200行以内?
当然,C++允许你在一行内写多个语句,你完全可以删除所有的换行符,把代码堆在一起。

heathcliffchks
heathcliffchks   2015.07.14 18:27

既然你看不懂,我解释了你也不会懂,我估计你的C语言功底不行啊

iOS_And_Swift
iOS_And_Swift   2015.07.14 21:05

看不懂的话先从基础开始学c吧。都不难,if while switch int string 数组 这几个东西都懂了的话,基本这代码就能看懂了。

iOS_And_Swift
iOS_And_Swift 回复handstran:要求用的?大概思路是 先画出界面用数组,数组里面装了字母代表是否有数组,第一次进去先随机生成两个数字,然后就是输入了,其实就是移动的意思,输入之后再次判断是否可以移动,可以移动的话再判断移动的方向是否数字相等,相等的话再相加,不等的话紧紧是移动。等移动完了再次输出图案,然后检查是否死掉,就是是不是全图所有的都不能移动的情况,然后再走第一步,移动,检查是否可以移动。。。。。
2 年多之前 回复
iOS_And_Swift
iOS_And_Swift 要求用的?大概思路是 先画出界面用数组,数组里面装了字母代表是否有数组,第一次进去先随机生成两个数字,然后就是输入了,其实就是移动的意思,输入之后再次判断是否可以移动,可以移动的话再判断移动的方向是否数字相等,相等的话再相加,不等的话紧紧是移动。等移动完了再次输出图案,然后检查是否死掉,就是是不是全图所有的都不能移动的情况,然后再走第一步,移动,检查是否可以移动。。。。。
2 年多之前 回复
handstran
handstran 我是想弄一个流程图,要求用的
2 年多之前 回复
iOS_And_Swift
iOS_And_Swift   2015.07.14 21:05

看不懂的话先从基础开始学c吧。都不难,if while switch int string 数组 这几个东西都懂了的话,基本这代码就能看懂了。

u013427969
u013427969   2015.07.15 11:45

2048这些游戏,难的不是代码,而是想法。看看设计思路,再看代码吧
http://www.guokr.com/blog/748078/
这是高级版本的2048,试试吧,虐残你

f455176715
f455176715   2015.07.17 17:32

楼上的都说的很清楚,楼主看起来没有C语言功底,而C语言是程序的基础

就好像你想读懂一篇英文文章,而现在连单词都不认识,更别说语法,旁边的人即使懂该怎么给你解释?

所以还是建议从基础学起。从最基础的hello world代码学起,就好像学英文时从最简单的“what's your name”学起一样,

到后面再回头一看,你就会发现“哦原来这段代码挺简单的啊”

GKatHere
GKatHere   2015.07.15 01:20

呵呵.....看了下, 简单

Csdn user default icon
上传中...
上传图片
插入图片