class A
{
private static void Main()
{
char cz = char.Parse(Console.ReadLine());
if (cz == 'a')
{
cz = (char)1;
}
if (cz == 'd')
{
cz = (char)2;
}
if (cz == 'w')
{
cz = (char)3;
}
if (cz == 's')
{
cz = (char)4;
}
int[,] sz = new int[4, 4]
{
{0,4,0,0 },
{2,8,2,2 },
{16,8,4,2 },
{32,16,8,4 },
};
int[] x1 = new int[4] { 0, 4, 0, 0 };
int[] x2 = new int[4] { 2, 8, 2, 2 };
int[] x3 = new int[4] { 16, 8, 4, 2 };
int[] x4 = new int[4] { 32, 16, 8, 4 };
int[] x5a = new int[4] { 0, 0, 4, 0 };
int[] x6a = new int[4] { 2, 2, 8, 2 };
int[] x7a = new int[4] { 2, 4, 8, 16 };
int[] x8a = new int[4] { 4, 8, 16, 32 };
int[,] sz1 = new int[4, 4]
{
{ x1[0],x1[1],x1[2],x1[3] },
{ x2[0],x2[1],x2[2],x2[3] },
{ x3[0],x3[1],x3[2],x3[3] },
{ x4[0],x4[1],x4[2],x4[3] },
};
Hs1( x1, x2, x3, x4, cz);
Console.WriteLine(sz1);
}
private static int[] Hs1( int[] x1, int[] x2, int[] x3, int[] x4, int cz)
{
if (cz == 1)
{
for (int i = 0; i < 3; i++)
{
if (x1[i] == x1[i + 1])
{
x1[i] += x1[i + 1];
x1[i + 1] = 0;
if (x1[i] == 0 || x1[i + 1] == 0)
{
int t = x1[3];
x1[3] = x1[i];
x1[i] = t;
for (int j = i; j < 3 - 1; j++)
{
x1[j] = x1[j + 1];
x1[3] = t;
}
}
return x1;
}
if (x2[i] == x2[i + 1])
{
x2[i] += x2[i + 1];
x2[i + 1] = 0;
if (x2[i] == 0 || x2[i + 1] == 0)
{
int t = x2[3];
x2[3] = x2[i];
x2[i] = t;
for (int j = i; j < 3 - 1; j++)
{
x2[j] = x2[j + 1];
x2[3] = t;
}
}
return x2;
}
if (x3[i] == x3[i + 1])
{
x3[i] += x3[i + 1];
x3[i + 1] = 0;
if (x3[i] == 0 || x3[i + 1] == 0)
{
int t = x3[3];
x3[3] = x3[i];
x3[i] = t;
for (int j = i; j < 3 - 1; j++)
{
x3[j] = x3[j + 1];
x3[3] = t;
}
}
return x3;
}
if (x4[i] == x4[i + 1])
{
x4[i] += x4[i + 1];
x4[i + 1] = 0;
if (x4[i] == 0 || x4[i + 1] == 0)
{
int t = x4[3];
x4[3] = x4[i];
x4[i] = t;
for (int j = i; j < 3 - 1; j++)
{
x4[j] = x4[j + 1];
x4[3] = t;
}
}
return x4;
}
}
}
}
}
我卡了两天了,基本都是没反应或者说说报错,以及把0后置的操作好像也不对。
回答申明:包含AI辅助答案参考ChatGPT Plus版
根据你提供的代码,我看到你正在尝试实现一个2048游戏的左右移动功能。以下是我对你提供的代码进行了一些修改来实现左右移动的逻辑:
using System;
class A
{
private static void Main()
{
char cz = char.Parse(Console.ReadLine());
if (cz == 'a')
{
cz = (char)1;
}
if (cz == 'd')
{
cz = (char)2;
}
if (cz == 'w')
{
cz = (char)3;
}
if (cz == 's')
{
cz = (char)4;
}
int[,] sz = new int[4, 4]
{
{0,4,0,0 },
{2,8,2,2 },
{16,8,4,2 },
{32,16,8,4 },
};
Hs1(sz, cz);
for (int i = 0; i < 4; i++)
{
for (int j = 0; j < 4; j++)
{
Console.Write(sz[i, j] + " ");
}
Console.WriteLine();
}
}
private static void Hs1(int[,] sz, int cz)
{
if (cz == 1) // 左移
{
for (int i = 0; i < 4; i++)
{
int[] row = new int[4];
int newRowIdx = 0;
for (int j = 0; j < 4; j++)
{
if (sz[i, j] != 0)
{
if (newRowIdx > 0 && row[newRowIdx - 1] == sz[i, j])
{
row[newRowIdx - 1] *= 2;
}
else
{
row[newRowIdx] = sz[i, j];
newRowIdx++;
}
}
}
for (int j = 0; j < 4; j++)
{
sz[i, j] = row[j];
}
}
}
else if (cz == 2) // 右移
{
for (int i = 0; i < 4; i++)
{
int[] row = new int[4];
int newRowIdx = 3;
for (int j = 3; j >= 0; j--)
{
if (sz[i, j] != 0)
{
if (newRowIdx < 3 && row[newRowIdx + 1] == sz[i, j])
{
row[newRowIdx + 1] *= 2;
}
else
{
row[newRowIdx] = sz[i, j];
newRowIdx--;
}
}
}
for (int j = 3; j >= 0; j--)
{
sz[i, j] = row[j];
}
}
}
}
}
在上述修改后的代码中,我对 Hs1
方法进行了修改,以实现左移(cz == 1
)和右移(cz == 2
)的逻辑。左移和右移都使用了一个新的一维数组 row
来保存移动后的行数据,并最后将其复制回原始
的二维数组 sz
中。
请注意,上述代码中只包含了左移和右移的逻辑,你仍然需要根据需要添加上下移动的逻辑。另外,你可能还需要处理用户输入以及游戏结束等其他相关的逻辑。这里只提供了移动部分的代码实现。
class A
{
private static void Main()
{
char cz = char.Parse(Console.ReadLine());
if (cz == 'a')
{
cz = (char)1; // left
}
if (cz == 'd')
{
cz = (char)2; // right
}
if (cz == 'w')
{
cz = (char)3;
}
if (cz == 's')
{
cz = (char)4;
}
int[,] sz = new int[4, 4]
{
{0,4,0,0 },
{2,8,2,2 },
{16,8,4,2 },
{32,16,8,4 },
};
int[] x1 = new int[4] { 0, 4, 0, 0 };
int[] x2 = new int[4] { 2, 8, 2, 2 };
int[] x3 = new int[4] { 16, 8, 4, 2 };
int[] x4 = new int[4] { 32, 16, 8, 4 };
int[] x5a = new int[4] { 0, 0, 4, 0 };
int[] x6a = new int[4] { 2, 2, 8, 2 };
int[] x7a = new int[4] { 2, 4, 8, 16 };
int[] x8a = new int[4] { 4, 8, 16, 32 };
int[,] sz1 = new int[4, 4]
{
{ x1[0],x1[1],x1[2],x1[3] },
{ x2[0],x2[1],x2[2],x2[3] },
{ x3[0],x3[1],x3[2],x3[3] },
{ x4[0],x4[1],x4[2],x4[3] },
};
int[] ret = Hs1(x1, x2, x3, x4, cz);
Console.WriteLine(sz1);
}
private static int[] Hs1( int[] x1, int[] x2, int[] x3, int[] x4, int cz)
{
if (cz == 1) // left
{
for (int i = 0; i < 3; i++)
{
if (x1[i] == x1[i + 1])
{
// ... 合并数组中的相同值
}
int[] tmp = new int[4];
int idx = 0;
for (int j = 0; j < 4; j++)
{
if (x1[j] != 0) tmp[idx++] = x1[j];
}
while (idx < 4) tmp[idx++] = 0;
x1 = tmp;
}
// x2,x3,x4 同样进行左移并合并
}
else if (cz == 2) // right
{
// 右移代码,原理同左移
}
return x1; // 返回左移或右移后的数组
}
}
这个代码实现了:
substring(8)和substring(0, 8)方法的不同,直接上图…
package com.zr;
public class Demo6 {
public static void main(String[] args) {
String s = "123456789";
System.out.println(s.substring(8));
System.out.println(s.substring(0, 8));
}
}
抱歉,参考资料与问题不相关,无法给出具体的解决方案。