不枉风来水顺 发表于 2023-11-21 19:38:57

求助大佬

这是一个关于游戏2048的简化程序
2048是比较流行的一款数字游戏。原版2048首先在github上发布,原作者是Gabriele Cirulli。它是基于1024和小3传奇的玩法开发而成的新型数字游戏。随后2048便出现各种版本,走红各大平台。
2048游戏规则很简单,游戏开始,在4X4的棋盘上随机出现两个数字,出现的数字仅可能为2或4;玩家可以选择上下左右四个方向,若棋盘内的数字出现位移或合并,视为有效移动;玩家选择的方向上若有相同的数字则合并,每次有效移动可以同时合并,但不可以连续合并;合并所得的所有新生成数字相加即为该步的有效得分;玩家选择的方向行或列前方有空格则出现位移;每有效移动一步,棋盘的空位(无数字处)随机出现一个数字(依然可能为2或4);棋盘被数字填满,无法进行有效移动,判负,游戏结束;棋盘上出现2048,判胜。

1.png

现请你写一段程序实现2048游戏中的两种移动。

输入格式:
共5行,第一行是一个整数,只可能是1或0,其中1代表向右边移动,0代表向左边移动。接下来4行每行均为4个用空格分隔的整数(每个整数都不超过2048),其中0代表空位,即无数字。

输出格式:
共4行,每行4个用空格分隔的整数,为移动后的结果(只移动数字,不用合并,不用随机生成一个新数字)。

样例解释:

第一行为1,代表向右移动,第二行所有数字均不为0,表示没有空位,无法移动,所以输出的第一行与此行相同;第三行仅最右边一个数字为0,所以前3个数字依次向右移动一格,第一个位置变为0;第4行最右侧有两个0,那么前两个数字依次向右移动两格,第1,2两个位置变为0;最后一行第2,4位置为空格,所以第3格的数字向右移动一格,第1格的数字向右移动2格,第1,2两个位置变为0。

如果第一行输入为0,向左移动,则与样例输入对应的输出为:

2 4 8 16
2 4 8 0
2 4 0 0
2 2 0 0

输入样例:
1
2 4 8 16
2 4 8 0
2 4 0 0
2 0 2 0

输出样例:
2 4 8 16
0 2 4 8
0 0 2 4
0 0 2 2

以下是我的代码,系统给出我在调用enhance函数时出错了!
#include<stdio.h>

int main()
{
        int i,j;
        int n; scanf("%d",&n);
        int matrix;
        for(i = 0;i < 4;i ++)
        {
                for(j = 0;j < 4;j++)
                {
                        scanf("%d",&matrix);
                }
        }//initialization.
       
        //promate matrix.
        void enhance(int array,int x);
        void enhance(matrix,n);
       
        //deal matrix.
        for(i = 0;i < 4;i++){
                for(j = 0;j < 4;j++){
                        printf("%d",matrix);
                }
                printf("\n");
        }
}

void enhance(int array,int x)
{
        int coun = 0;
        int a,b,c,d;
        for(c = 0;c < 4;c++)
        {
                //core code:
                if(x == 1)
                {
                        for(d = 0;d < 4;d++)
                        {
                                if(array == 0)
                                {
                                        while(d > 0)
                                        {//当x=1时,该行内所有0移动到右侧。
                                                a = array;
                                                array = array;
                                                array = a;
                                        }
                                }
                        }
                }
                else
                {
                        for(d = 3;d >= 0;d--)
                        {
                                if(array == 0)
                                {
                                        while(d < 3)
                                        {//当x=0时,该行内所有0移动到左侧。
                                                b = array;
                                                array = array;
                                                array = b;
                                        }
                                }
                        }
                }
        }
}

怎么修改,或者说怎样才正确

isdkz 发表于 2023-11-21 19:39:19

你的代码有几个问题。首先,你在主函数中调用了enhance函数的方式是错误的。其次,你在enhance函数的定义中使用了void关键字,这是不正确的。最后,你的算法实现也有一些问题。我来帮你修改一下。

#include <stdio.h>

void enhance(int array, int x);

int main()
{
    int i, j;
    int n;
    scanf("%d", &n);
    int matrix;
    for (i = 0; i < 4; i++)
    {
      for (j = 0; j < 4; j++)
      {
            scanf("%d", &matrix[ i]);
      }
    }

    enhance(matrix, n);

    for (i = 0; i < 4; i++)
    {
      for (j = 0; j < 4; j++)
      {
            printf("%d ", matrix[ i]);
      }
      printf("\n");
    }
    return 0;
}

void enhance(int array, int x)
{
    int i, j;
    if (x == 1) // 向右移动
    {
      for (i = 0; i < 4; i++)
      {
            for (j = 3; j > 0; j--)
            {
                if (array[ i] == 0)
                {
                  int k = j - 1;
                  while (k >= 0)
                  {
                        if (array[ i] != 0)
                        {
                            array[ i] = array[ i];
                            array[ i] = 0;
                            break;
                        }
                        k--;
                  }
                }
            }
      }
    }
    else // 向左移动
    {
      for (i = 0; i < 4; i++)
      {
            for (j = 0; j < 3; j++)
            {
                if (array[ i] == 0)
                {
                  int k = j + 1;
                  while (k < 4)
                  {
                        if (array[ i] != 0)
                        {
                            array[ i] = array[ i];
                            array[ i] = 0;
                            break;
                        }
                        k++;
                  }
                }
            }
      }
    }
}


这个修改后的代码中,我将enhance函数的参数改为了正确的形式,并且在主函数中正确调用了enhance函数。在enhance函数中,我使用了两个嵌套循环来遍历二维数组,根据输入的方向进行移动。

tommyyu 发表于 2023-11-21 20:20:32

本帖最后由 tommyyu 于 2023-11-21 20:23 编辑

建议去学学指针,再往函数里面传数组
源程序里面的 bug 有点多,包括 函数的声明位置、函数的调用方式、函数的参数类型、函数内部的逻辑处理、以及输出时缺少的空格
#include<stdio.h>
void enhance(int* array,int x);
int main()
{
    int i,j;
    int n; scanf("%d",&n);
    int matrix;
    for(i = 0;i < 4;i ++)
    {
      for(j = 0;j < 4;j++)
      {
            scanf("%d",&matrix);
      }
    }//initialization.
      
    //promate matrix.
    int *p = {matrix, matrix, matrix, matrix};
        enhance(p,n);
      
    //deal matrix.
    for(i = 0;i < 4;i++){
      for(j = 0;j < 4;j++){
            printf("%d ",matrix);
      }
            printf("\n");
        }
}

void enhance(int* array,int x)
{
    int coun = 0;
    int a,b,c,d,e;
   
    for(c = 0;c < 4;c++)
    {//printf("1");
      //core code:
      if(x == 1)
      {
            for(d = 0;d < 4;d++)
            {
                if(array == 0)
                {
                        e=d;
                  while(e > 0)
                  {//当x=1时,该行内所有0移动到右侧。
                        a = array;
                        array = array;
                        array = a;
                        e--;
                        }
                    }
                    }
            }
      else
      {
            for(d = 3;d >= 0;d--)
            {
                if(array == 0)
                {
                        e=d;
                  while(e < 3)
                  {//当x=0时,该行内所有0移动到左侧。
                        b = array;
                        array = array;
                        array = b;
                        e++;
                  }
                    }
            }
      }
    }
}
页: [1]
查看完整版本: 求助大佬