变量hp不在20x20网格中更新

时间:2016-08-10 19:49:16

标签: java

我目前正在开发一个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;    

    }        
}

3 个答案:

答案 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,它将执行以下操作:

    1. 检查字母是否为S。是的:newhp = hp - 3
    2. 检查字母是否为K。不:什么都不做。
    3. 检查字母是否为C。否:跳至其else
    4. else:newhp = hp。
    5. 所以你重置了之前做过的事情。除了方法中的第一个else之外,在if之前放置updateHealth。这样就可以保证只采取一项行动。

    6. 您将错误的参数传递给updateHealth(board[0][1], hp);

      (0, 1)

      这将始终通过updateHealth(board[current[0]][current[1]], hp); 处的字母。相反,您希望将当前位置作为

      传递
      int newhp = updateHealth(..., hp);
      
    7. 您返回新的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; 
    }