鱼C论坛

 找回密码
 立即注册
查看: 456|回复: 2

[已解决]求助大佬

[复制链接]
发表于 2023-11-21 19:38:57 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

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

  3. 1.png

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

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

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

  9. 样例解释:

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

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

  12. 2 4 8 16
  13. 2 4 8 0
  14. 2 4 0 0
  15. 2 2 0 0

  16. 输入样例:
  17. 1
  18. 2 4 8 16
  19. 2 4 8 0
  20. 2 4 0 0
  21. 2 0 2 0

  22. 输出样例:
  23. 2 4 8 16
  24. 0 2 4 8
  25. 0 0 2 4
  26. 0 0 2 2
复制代码


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

  2. int main()
  3. {
  4.         int i,j;
  5.         int n; scanf("%d",&n);
  6.         int matrix[4][4];
  7.         for(i = 0;i < 4;i ++)
  8.         {
  9.                 for(j = 0;j < 4;j++)
  10.                 {
  11.                         scanf("%d",&matrix[i][j]);
  12.                 }
  13.         }//initialization.
  14.        
  15.         //promate matrix.
  16.         void enhance(int array[4][4],int x);
  17.         void enhance(matrix[4][4],n);
  18.        
  19.         //deal matrix.
  20.         for(i = 0;i < 4;i++){
  21.                 for(j = 0;j < 4;j++){
  22.                         printf("%d",matrix[i][j]);
  23.                 }
  24.                 printf("\n");
  25.         }
  26. }

  27. void enhance(int array[4][4],int x)
  28. {
  29.         int coun = 0;
  30.         int a,b,c,d;
  31.         for(c = 0;c < 4;c++)
  32.         {
  33.                 //core code:
  34.                 if(x == 1)
  35.                 {
  36.                         for(d = 0;d < 4;d++)
  37.                         {
  38.                                 if(array[c][d] == 0)
  39.                                 {
  40.                                         while(d > 0)
  41.                                         {//当x=1时,该行内所有0移动到右侧。
  42.                                                 a = array[c][d-1];
  43.                                                 array[c][d-1] = array[c][d];
  44.                                                 array[c][d] = a;
  45.                                         }
  46.                                 }
  47.                         }
  48.                 }
  49.                 else
  50.                 {
  51.                         for(d = 3;d >= 0;d--)
  52.                         {
  53.                                 if(array[c][d] == 0)
  54.                                 {
  55.                                         while(d < 3)
  56.                                         {//当x=0时,该行内所有0移动到左侧。
  57.                                                 b = array[c][d+1];
  58.                                                 array[c][d+1] = array[c][d];
  59.                                                 array[c][d] = b;
  60.                                         }
  61.                                 }
  62.                         }
  63.                 }
  64.         }
  65. }
复制代码


怎么修改,或者说怎样才正确
最佳答案
2023-11-21 20:20:32
本帖最后由 tommyyu 于 2023-11-21 20:23 编辑

建议去学学指针,再往函数里面传数组
源程序里面的 bug 有点多,包括 函数的声明位置、函数的调用方式、函数的参数类型、函数内部的逻辑处理、以及输出时缺少的空格
  1. #include<stdio.h>
  2. void enhance(int* array[4],int x);
  3. int main()
  4. {
  5.     int i,j;
  6.     int n; scanf("%d",&n);
  7.     int matrix[4][4];
  8.     for(i = 0;i < 4;i ++)
  9.     {
  10.         for(j = 0;j < 4;j++)
  11.         {
  12.             scanf("%d",&matrix[i][j]);
  13.         }
  14.     }//initialization.
  15.         
  16.     //promate matrix.
  17.     int *p[4] = {matrix[0], matrix[1], matrix[2], matrix[3]};
  18.         enhance(p,n);
  19.         
  20.     //deal matrix.
  21.     for(i = 0;i < 4;i++){
  22.         for(j = 0;j < 4;j++){
  23.             printf("%d ",matrix[i][j]);
  24.         }
  25.             printf("\n");
  26.         }
  27. }

  28. void enhance(int* array[4],int x)
  29. {
  30.     int coun = 0;
  31.     int a,b,c,d,e;
  32.    
  33.     for(c = 0;c < 4;c++)
  34.     {//printf("1");
  35.         //core code:
  36.         if(x == 1)
  37.         {
  38.             for(d = 0;d < 4;d++)
  39.             {
  40.                 if(array[c][d] == 0)
  41.                 {
  42.                         e=d;
  43.                     while(e > 0)
  44.                     {//当x=1时,该行内所有0移动到右侧。
  45.                         a = array[c][e-1];
  46.                         array[c][e-1] = array[c][e];
  47.                         array[c][e] = a;
  48.                         e--;
  49.                         }
  50.                     }
  51.                     }
  52.             }
  53.         else
  54.         {
  55.             for(d = 3;d >= 0;d--)
  56.             {
  57.                 if(array[c][d] == 0)
  58.                 {
  59.                         e=d;
  60.                     while(e < 3)
  61.                     {//当x=0时,该行内所有0移动到左侧。
  62.                         b = array[c][e+1];
  63.                         array[c][e+1] = array[c][e];
  64.                         array[c][e] = b;
  65.                         e++;
  66.                     }
  67.                     }
  68.             }
  69.         }
  70.     }
  71. }
复制代码
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2023-11-21 19:39:19 | 显示全部楼层
你的代码有几个问题。首先,你在主函数中调用了enhance函数的方式是错误的。其次,你在enhance函数的定义中使用了void关键字,这是不正确的。最后,你的算法实现也有一些问题。我来帮你修改一下。

  1. #include <stdio.h>

  2. void enhance(int array[4][4], int x);

  3. int main()
  4. {
  5.     int i, j;
  6.     int n;
  7.     scanf("%d", &n);
  8.     int matrix[4][4];
  9.     for (i = 0; i < 4; i++)
  10.     {
  11.         for (j = 0; j < 4; j++)
  12.         {
  13.             scanf("%d", &matrix[ i][j]);
  14.         }
  15.     }

  16.     enhance(matrix, n);

  17.     for (i = 0; i < 4; i++)
  18.     {
  19.         for (j = 0; j < 4; j++)
  20.         {
  21.             printf("%d ", matrix[ i][j]);
  22.         }
  23.         printf("\n");
  24.     }
  25.     return 0;
  26. }

  27. void enhance(int array[4][4], int x)
  28. {
  29.     int i, j;
  30.     if (x == 1) // 向右移动
  31.     {
  32.         for (i = 0; i < 4; i++)
  33.         {
  34.             for (j = 3; j > 0; j--)
  35.             {
  36.                 if (array[ i][j] == 0)
  37.                 {
  38.                     int k = j - 1;
  39.                     while (k >= 0)
  40.                     {
  41.                         if (array[ i][k] != 0)
  42.                         {
  43.                             array[ i][j] = array[ i][k];
  44.                             array[ i][k] = 0;
  45.                             break;
  46.                         }
  47.                         k--;
  48.                     }
  49.                 }
  50.             }
  51.         }
  52.     }
  53.     else // 向左移动
  54.     {
  55.         for (i = 0; i < 4; i++)
  56.         {
  57.             for (j = 0; j < 3; j++)
  58.             {
  59.                 if (array[ i][j] == 0)
  60.                 {
  61.                     int k = j + 1;
  62.                     while (k < 4)
  63.                     {
  64.                         if (array[ i][k] != 0)
  65.                         {
  66.                             array[ i][j] = array[ i][k];
  67.                             array[ i][k] = 0;
  68.                             break;
  69.                         }
  70.                         k++;
  71.                     }
  72.                 }
  73.             }
  74.         }
  75.     }
  76. }
复制代码


这个修改后的代码中,我将enhance函数的参数改为了正确的形式,并且在主函数中正确调用了enhance函数。在enhance函数中,我使用了两个嵌套循环来遍历二维数组,根据输入的方向进行移动。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2023-11-21 20:20:32 | 显示全部楼层    本楼为最佳答案   
本帖最后由 tommyyu 于 2023-11-21 20:23 编辑

建议去学学指针,再往函数里面传数组
源程序里面的 bug 有点多,包括 函数的声明位置、函数的调用方式、函数的参数类型、函数内部的逻辑处理、以及输出时缺少的空格
  1. #include<stdio.h>
  2. void enhance(int* array[4],int x);
  3. int main()
  4. {
  5.     int i,j;
  6.     int n; scanf("%d",&n);
  7.     int matrix[4][4];
  8.     for(i = 0;i < 4;i ++)
  9.     {
  10.         for(j = 0;j < 4;j++)
  11.         {
  12.             scanf("%d",&matrix[i][j]);
  13.         }
  14.     }//initialization.
  15.         
  16.     //promate matrix.
  17.     int *p[4] = {matrix[0], matrix[1], matrix[2], matrix[3]};
  18.         enhance(p,n);
  19.         
  20.     //deal matrix.
  21.     for(i = 0;i < 4;i++){
  22.         for(j = 0;j < 4;j++){
  23.             printf("%d ",matrix[i][j]);
  24.         }
  25.             printf("\n");
  26.         }
  27. }

  28. void enhance(int* array[4],int x)
  29. {
  30.     int coun = 0;
  31.     int a,b,c,d,e;
  32.    
  33.     for(c = 0;c < 4;c++)
  34.     {//printf("1");
  35.         //core code:
  36.         if(x == 1)
  37.         {
  38.             for(d = 0;d < 4;d++)
  39.             {
  40.                 if(array[c][d] == 0)
  41.                 {
  42.                         e=d;
  43.                     while(e > 0)
  44.                     {//当x=1时,该行内所有0移动到右侧。
  45.                         a = array[c][e-1];
  46.                         array[c][e-1] = array[c][e];
  47.                         array[c][e] = a;
  48.                         e--;
  49.                         }
  50.                     }
  51.                     }
  52.             }
  53.         else
  54.         {
  55.             for(d = 3;d >= 0;d--)
  56.             {
  57.                 if(array[c][d] == 0)
  58.                 {
  59.                         e=d;
  60.                     while(e < 3)
  61.                     {//当x=0时,该行内所有0移动到左侧。
  62.                         b = array[c][e+1];
  63.                         array[c][e+1] = array[c][e];
  64.                         array[c][e] = b;
  65.                         e++;
  66.                     }
  67.                     }
  68.             }
  69.         }
  70.     }
  71. }
复制代码
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-5-1 03:18

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表