变量 hp 未在 20x20 网格中更新
Variable hp not updating in 20x20 grid
我目前正在研究一个 20x20 二维数组,用户可以在其中输入 WASD 来控制他们在网格周围的移动。我想让它们网格中的某些元素可以影响它们的 hp,但是,hp 没有在我的网格上更新。请帮我看看哪里出了问题。
下面的代码将固定数量的某些字符设置为一个数组,其余的用E填充。将有一个人站在随机的位置,用空白表示space。然后用户将必须输入 W、A、S 或 D 来控制人的移动。当人沿着网格移动时,他将与他所站的元素进行交互,因此他的 hp 将更新,然后他所站的角色将被替换为空白 space.
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;
}
}
我认为问题在于您正在使用大量 if 语句。您只需要并行使用一个 if 语句(相同缩进),其余的应该是 else 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;
}
使用开关(元素)/案例:
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;
}
尝试将 int newhp = updateHealth(board[0][1], hp)
更改为 int newhp = updateHealth(board[current[0]][current[1]], hp);
您每次都传递相同的字符。您还应该在打印 hp 后设置 hp = newhp;
。
同时更改您的 updateHealth 方法以使用 if/else。
其他答案提出了一些问题,但既没有完全正确也没有解释为什么你会这样。
看看这个片段:
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.
所以你重置了之前的操作。在方法中除第一个 if
之外的所有内容之前放置一个 else
。这样可以保证只执行1个动作
您将错误的参数传递给 updateHealth
:
updateHealth(board[0][1], hp);
这将始终传递 (0, 1)
处的字母。相反,您想将当前位置传递为
updateHealth(board[current[0]][current[1]], hp);
你return新的生命值,但你不更新旧的:
int newhp = updateHealth(..., 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;
}
当你移动到板的边缘之外时进行检查并禁止这样做。否则你"crash"游戏。
使用 switch
语句将有助于您的代码,Map
s 更是如此。
您无需在每次移动后都调用 intializeGameBoard
。事实上,如果默认字母是 E
,只需在开始时遍历数组并将那个字母放在各处即可。当遍历一个数组时,使用它的 length
属性 作为循环条件而不是数字,因为当它在一个地方改变时你会忘记在其他地方改变它。
我目前正在研究一个 20x20 二维数组,用户可以在其中输入 WASD 来控制他们在网格周围的移动。我想让它们网格中的某些元素可以影响它们的 hp,但是,hp 没有在我的网格上更新。请帮我看看哪里出了问题。
下面的代码将固定数量的某些字符设置为一个数组,其余的用E填充。将有一个人站在随机的位置,用空白表示space。然后用户将必须输入 W、A、S 或 D 来控制人的移动。当人沿着网格移动时,他将与他所站的元素进行交互,因此他的 hp 将更新,然后他所站的角色将被替换为空白 space.
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;
}
}
我认为问题在于您正在使用大量 if 语句。您只需要并行使用一个 if 语句(相同缩进),其余的应该是 else 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;
}
使用开关(元素)/案例:
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;
}
尝试将 int newhp = updateHealth(board[0][1], hp)
更改为 int newhp = updateHealth(board[current[0]][current[1]], hp);
您每次都传递相同的字符。您还应该在打印 hp 后设置 hp = newhp;
。
同时更改您的 updateHealth 方法以使用 if/else。
其他答案提出了一些问题,但既没有完全正确也没有解释为什么你会这样。
看看这个片段:
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.
所以你重置了之前的操作。在方法中除第一个
if
之外的所有内容之前放置一个else
。这样可以保证只执行1个动作- 检查字母是否为
您将错误的参数传递给
updateHealth
:updateHealth(board[0][1], hp);
这将始终传递
(0, 1)
处的字母。相反,您想将当前位置传递为updateHealth(board[current[0]][current[1]], hp);
你return新的生命值,但你不更新旧的:
int newhp = updateHealth(..., 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; }
当你移动到板的边缘之外时进行检查并禁止这样做。否则你"crash"游戏。
使用
switch
语句将有助于您的代码,Map
s 更是如此。您无需在每次移动后都调用
intializeGameBoard
。事实上,如果默认字母是E
,只需在开始时遍历数组并将那个字母放在各处即可。当遍历一个数组时,使用它的length
属性 作为循环条件而不是数字,因为当它在一个地方改变时你会忘记在其他地方改变它。