我目前正在开发一个20x20二维阵列,用户可以输入WASD来控制它们在网格周围的移动。我想这样做,以便他们的网格中的某些元素可以影响他们的HP,但是,hp不会在我的网格上更新。请帮我看看有什么不对。
以下代码将固定数量的某些字符设置为数组,并用E填充其余字符。将有一个人站在随机位置,用空格表示。然后,用户必须输入W,A,S或D,以控制人的移动。当人沿着网格移动时,他将与他所站立的元素进行交互,因此他的hp将被更新,然后他所站立的角色将被替换为空白区域。
package quest;
import java.util.*;
public class Quest
{
public static void main(String[] args)
{
Scanner sc = new Scanner (System.in);
char[][] board = new char[20][20];
int [] current = new int[2];
int hp = 100;
int food = 0;
int weapon = 0;
int health = 0;
int threats = 0;
int turns = (int)(Math.random() * 76) + 25;
int turnsCount = turns;
System.out.println(turns);
for (int i = 0; i < 10; i++)
{
int x = (int)(Math.random() * 20);
int y = (int)(Math.random() * 20);
while (board[x][y] != '\u0000')
{
x = (int)(Math.random() * 20);
y = (int)(Math.random() * 20);
}
board[x][y] = 'F';
}
for (int i = 0; i < 10; i++)
{
int x = (int)(Math.random() * 20);
int y = (int)(Math.random() * 20);
while (board[x][y] != '\u0000')
{
x = (int)(Math.random() * 20);
y = (int)(Math.random() * 20);
}
board[x][y] = 'W';
}
for (int i = 0; i < 10; i++)
{
int x = (int)(Math.random() * 20);
int y = (int)(Math.random() * 20);
while (board[x][y] != '\u0000')
{
x = (int)(Math.random() * 20);
y = (int)(Math.random() * 20);
}
board[x][y] = 'M';
}
for (int i = 0; i < 5; i++)
{
int x = (int)(Math.random() * 20);
int y = (int)(Math.random() * 20);
while (board[x][y] != '\u0000')
{
x = (int)(Math.random() * 20);
y = (int)(Math.random() * 20);
}
board[x][y] = 'G';
}
for (int i = 0; i < 5; i++)
{
int x = (int)(Math.random() * 20);
int y = (int)(Math.random() * 20);
while (board[x][y] != '\u0000')
{
x = (int)(Math.random() * 20);
y = (int)(Math.random() * 20);
}
board[x][y] = 'S';
}
for (int i = 0; i < 10; i++)
{
int x = (int)(Math.random() * 20);
int y = (int)(Math.random() * 20);
while (board[x][y] != '\u0000')
{
x = (int)(Math.random() * 20);
y = (int)(Math.random() * 20);
}
board[x][y] = 'K';
}
for (int i = 0; i < 10; i++)
{
int x = (int)(Math.random() * 20);
int y = (int)(Math.random() * 20);
while (board[x][y] != '\u0000')
{
x = (int)(Math.random() * 20);
y = (int)(Math.random() * 20);
}
board[x][y] = 'C';
}
for (int i = 0; i < 1; i++)
{
int x = (int)(Math.random() * 20);
int y = (int)(Math.random() * 20);
while (board[x][y] != '\u0000')
{
x = (int)(Math.random() * 20);
y = (int)(Math.random() * 20);
}
board[x][y] = 'P';
}
for (int i = 0; i < 1; i++)
{
int x = (int)(Math.random() * 20);
int y = (int)(Math.random() * 20);
while (board[x][y] != '\u0000')
{
x = (int)(Math.random() * 20);
y = (int)(Math.random() * 20);
}
board[x][y] = ' ';
current[0] = x;
current[1] = y;
}
for (int x = 0; x < 20; x++)
{
for (int y = 0; y < 20; y++)
{
board[x][y] = intializeGameBoard(board[x][y]);
System.out.print(board[x][y]+" ");
}
System.out.println();
}
for (int j = 0; j < turns; j++)
{
char move =sc.next().charAt(0);
int finalMove[] = makeAMove(move);
current[0] = current[0]+finalMove[1];
current[1] = current[1]+finalMove[0];
int newhp = updateHealth(board[0][1], hp);
board[current[0]][current[1]] = ' ';
turnsCount = turnsCount - 1;
for (int x = 0; x < 20; x++)
{
for (int y = 0; y < 20; y++)
{
board[x][y] = intializeGameBoard(board[x][y]);
System.out.print(board[x][y]+" ");
}
System.out.println();
}
System.out.println("Turns left: " + turnsCount);
System.out.println("Health: " + newhp);
}
}
public static char intializeGameBoard(char element)
{
if (element == '\u0000')
{
element = 'E';
}
return element;
}
public static int[] makeAMove(char move)
{
int x = 0;
int y = 0;
if (move == 'w')
{
y = y - 1;
}
if (move == 'a')
{
x = x - 1;
}
if (move == 's')
{
y = y + 1;
}
if (move == 'd')
{
x = x + 1;
}
int [] finalMove = new int [2];
finalMove[0] = x;
finalMove[1] = y;
return finalMove;
}
public static int updateHealth(char element, int hp)
{
int newhp;
if (element == 'F')
{
newhp = hp+5;
}
if (element == 'M')
{
newhp = hp+10;
}
if (element == 'G')
{
newhp = 0;
}
if (element == 'S')
{
newhp = hp-3;
}
if (element == 'K')
{
newhp = hp-5;
}
if (element == 'C')
{
newhp = hp-5;
}
else
{
newhp = hp;
}
return newhp;
}
}
答案 0 :(得分:2)
其他答案提出了一些问题,但既没有完全正确也没有解释为什么你会得到你的行为。
请看这个片段:
if (element == 'S')
{
newhp = hp-3;
}
if (element == 'K')
{
newhp = hp-5;
}
if (element == 'C')
{
newhp = hp-5;
}
else
{
newhp = hp;
}
最后else
只是最后一个if
的替代选择。因此,如果您的信件是S
,它将执行以下操作:
S
。是的:newhp = hp - 3
。K
。不:什么都不做。C
。否:跳至其else
。else
:newhp = hp。所以你重置了之前做过的事情。除了方法中的第一个else
之外,在if
之前放置updateHealth
。这样就可以保证只采取一项行动。
您将错误的参数传递给updateHealth(board[0][1], hp);
:
(0, 1)
这将始终通过updateHealth(board[current[0]][current[1]], hp);
处的字母。相反,您希望将当前位置作为
int newhp = updateHealth(..., hp);
您返回新的hp值,但不更新旧值:
hp
下次你打电话给你时,你会传递你上次通过的newhp
。您根本不需要hp
变量,只需使用makeAMove
。
<强>附加强>
您的int y = 0;
if (move == 'w') {
y = y - 1;
}
方法写得很奇怪:
int y = 0;
if (move == 'w') {
y--; // or y = -1;
}
与
相同else
你正在检查无法达到的可能性,因为你也忘记了public static int[] makeAMove(char move) {
int[] finalMove = new int[2];
if (move == 'w') {
finalMove[1] = -1;
}
else if (move == 'a') {
finalMove[0] = -1;
}
else if (move == 's') {
finalMove[1] = 1;
}
else if (move == 'd') {
finalMove[0] = 1;
}
return finalMove;
}
。尝试这样的事情:
switch
当您移出棋盘边缘并进行检查时,请进行检查。否则你会“崩溃”游戏。
使用Map
语句将有助于您的代码,intializeGameBoard
更是如此。
每次搬家后都无需致电E
。实际上,如果默认字母是length
,只需在开头循环遍历数组并将其放在任何地方。迭代数组时,使用其{{1}}属性作为循环条件而不是数字,因为当它在一个地方发生变化时,您将忘记在其他地方更改它。
答案 1 :(得分:1)
尝试将int newhp = updateHealth(board[0][1], hp)
更改为int newhp = updateHealth(board[current[0]][current[1]], hp);
每次都传递相同的角色。您还应该在打印hp后设置hp = newhp;
。
同时更改您的updateHealth方法,如果/ else。
答案 2 :(得分:0)
我认为问题在于您正在使用if语句。您只需要并行使用一个if语句(相同的缩进),其余的则应该是if。做开关(元件)/外壳也有点干净。以下两种形式显示:
public static int updateHealth(char element, int hp)
{
int newhp;
if (element == 'F')
{
newhp = hp+5;
}
else if (element == 'M')
{
newhp = hp+10;
}
else if (element == 'G')
{
newhp = 0;
}
else if (element == 'S')
{
newhp = hp-3;
}
else if (element == 'K')
{
newhp = hp-5;
}
else if (element == 'C')
{
newhp = hp-5;
}
else
{
newhp = hp;
}
return newhp;
}
使用switch(element)/ case:
public static int updateHealth(char element, int hp)
{
int newhp;
switch(element){
case(F):
newhp=hp+5
break;
case(M):
newhp=hp+10
break;
case(G):
newhp=0
break;
case(S):
newhp=hp-3
break;
case(K):
newhp=hp-5
break;
case(C):
newhp=hp-5
break;
default:
newhp = hp;
}
return newhp;
}