|
马上注册,结交更多好友,享用更多功能^_^
您需要 登录 才可以下载或查看,没有账号?立即注册
x
这是一个关于游戏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[4][4];
- for(i = 0;i < 4;i ++)
- {
- for(j = 0;j < 4;j++)
- {
- scanf("%d",&matrix[i][j]);
- }
- }//initialization.
-
- //promate matrix.
- void enhance(int array[4][4],int x);
- void enhance(matrix[4][4],n);
-
- //deal matrix.
- for(i = 0;i < 4;i++){
- for(j = 0;j < 4;j++){
- printf("%d",matrix[i][j]);
- }
- printf("\n");
- }
- }
- void enhance(int array[4][4],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[c][d] == 0)
- {
- while(d > 0)
- {//当x=1时,该行内所有0移动到右侧。
- a = array[c][d-1];
- array[c][d-1] = array[c][d];
- array[c][d] = a;
- }
- }
- }
- }
- else
- {
- for(d = 3;d >= 0;d--)
- {
- if(array[c][d] == 0)
- {
- while(d < 3)
- {//当x=0时,该行内所有0移动到左侧。
- b = array[c][d+1];
- array[c][d+1] = array[c][d];
- array[c][d] = b;
- }
- }
- }
- }
- }
- }
复制代码
怎么修改,或者说怎样才正确
本帖最后由 tommyyu 于 2023-11-21 20:23 编辑
建议去学学指针,再往函数里面传数组
源程序里面的 bug 有点多,包括 函数的声明位置、函数的调用方式、函数的参数类型、函数内部的逻辑处理、以及输出时缺少的空格
- #include<stdio.h>
- void enhance(int* array[4],int x);
- int main()
- {
- int i,j;
- int n; scanf("%d",&n);
- int matrix[4][4];
- for(i = 0;i < 4;i ++)
- {
- for(j = 0;j < 4;j++)
- {
- scanf("%d",&matrix[i][j]);
- }
- }//initialization.
-
- //promate matrix.
- int *p[4] = {matrix[0], matrix[1], matrix[2], matrix[3]};
- enhance(p,n);
-
- //deal matrix.
- for(i = 0;i < 4;i++){
- for(j = 0;j < 4;j++){
- printf("%d ",matrix[i][j]);
- }
- printf("\n");
- }
- }
- void enhance(int* array[4],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[c][d] == 0)
- {
- e=d;
- while(e > 0)
- {//当x=1时,该行内所有0移动到右侧。
- a = array[c][e-1];
- array[c][e-1] = array[c][e];
- array[c][e] = a;
- e--;
- }
- }
- }
- }
- else
- {
- for(d = 3;d >= 0;d--)
- {
- if(array[c][d] == 0)
- {
- e=d;
- while(e < 3)
- {//当x=0时,该行内所有0移动到左侧。
- b = array[c][e+1];
- array[c][e+1] = array[c][e];
- array[c][e] = b;
- e++;
- }
- }
- }
- }
- }
- }
复制代码
|
|