• 大小: 15KB
    文件类型: .c
    金币: 1
    下载: 0 次
    发布日期: 2021-05-28
  • 语言: 其他
  • 标签: Linux  2048  

资源简介

Linux2048(详细注释版-验证可运行)

资源截图

代码片段和文件信息

// add your header comment here

#include 
#include 
#include 
#include 
#include 
// put any extra includes here but don‘t delete the ones above

#define SIZE    4

// add your function_prototypes here

// The functions moveLeft moveRight moveUp moveDown
// return -1 if the specified moving of numbers  is not possible.
// Otherwise they move the numbers as indicated and return
// the change to the score from combining adjacent identical numbers.
// They return 0 if no numbers were combined.

/*
    题目的意思是这样的,需要‘严格’判断能否移动,我用flag标示移动的时候在第二个判断的时候出错了!

    拿下移为例,if(cell==0)的时候直接判断可以移动是错误的,当下移的时候,如果只有

    上面第一行的某一个元素为0,下面所有行不出现合并的情况下是不能下移的。

        所以在上下左右移动的过程中,当if(cell==0)即当前元素为0时要使得能够移动,就必须限制这个为0的

    元素不是上面第一行(下移时)、左侧第一列(右移)、右侧第一列(左移)、下面第一行(上移)、

        所以修改每个move函数中判断if(cell==0)代码的i或者j的循环条件,以避开判断时0所在的特殊行位置

        具体修改看下面部分注释(修改的只有每个move函数中第二个for循环中的i或者j的循环条件)

*/

/**************************************移动判断部分*****************************************/
int moveLeft(int board[SIZE][SIZE]) {
    int ijscore=0flag=-1;
    for(i=0;i    {
        for(j=0;j        {
            int cell=board[i][j];//cell单词用的不太恰当,表示当前元素,你可以采用更有意义的命名
            if(cell!=0)//当前格子不为空
            {
                int k=j+1;
                while(k                {
                    int nextcell=board[i][k];//现在nextcell为cell左边的一个元素
                    if(nextcell!=0)
                    {
                        if(cell==nextcell)
                        {
                            flag=0;//相邻两个元素相同,就说明能移动,所以改变flag的值
                            board[i][j]+=board[i][k];
                            score+=board[i][j];
                            board[i][k]=0;
                        }
                        k=SIZE;//跳出双重循环(机智)
                        break;
                    }
                    k++;
                }
            }
        }
    }

    //修改部分:for循环中的i或者j的循环条件

    for(i=0;i    {
        for(j=0;j        {
            int cell=board[i][j];
            if(cell==0)//如果当前格子是空的
            {
                int k=j+1;
                while(k                {
                    int nextcell=board[i][k];
                    if(nextcell!=0)//直到找到一个元素
                    {
                        flag=0;//
                        board[i][j]=nextcell;//把那个元素移动到当前
                        board[i][k]=0;//把被移动元素的原位置上清空
                        k=SIZE;//直接跳出循环
                    }
                    k++;
                }
            }
        }
    }
    if(flag!=-1)
        return score;
    else
        return -1;
}

int moveRight(int board[SIZE][SIZE]) {
    int ijscore=0flag=-1;
    for(i=0;i    {
        for(j=SIZE-1;j>=0;j--)
        {
            int cell=board[i][j];
            if(cell!=0)
            {
  

评论

共有 条评论