首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >变量hp在20x20网格中不更新

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

Stack Overflow用户
提问于 2016-08-10 19:49:15
回答 3查看 76关注 0票数 2

我目前正在开发一个20x202d-Array,用户可以输入WASD来控制他们在网格周围的移动。我想这样做,以便他们的网格中的某些元素可以影响他们的hp,但是hp没有在我的网格上更新。请帮我看看出了什么问题。

下面的代码将某些字符的固定数目设置为数组,并将其余字符填充E。将有一个人站在一个用空格表示的随机位置上。然后,用户必须输入W、A、S或D,以控制人的移动。当人沿着网格移动时,他将与他所处的元素交互,因此他的hp将被更新,然后他所站的角色将被替换为一个空白。

代码语言:javascript
复制
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;    

    }        
}
EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2016-08-10 21:36:03

有几个问题,其他的答案提出,但既没有完全正确,也没有解释为什么你得到你的行为。

  • 看看这个片段: 如果(元素== 'S') { newhp = hp-3;} if ( == 'K') { newhp = hp-5;} if ( == 'C') { newhp = hp-5;} else { newhp = hp;}最后一个else只能替代最后一个if。因此,如果您的信是S,它将执行以下操作:
代码语言:javascript
复制
1. Check if the letter is `S`. Yes: `newhp = hp - 3`.
2. Check if the letter is `K`. No: do nothing.
3. Check if the letter is `C`. No: skip to its `else`.
4. `else`: newhp = hp.

所以你重新设置了你以前做过的事。将else放在除第一个if之外的所有方法之前。这样,就可以保证只采取1项行动。

  • 将错误的参数传递给updateHealth: updateHealth(板,惠普); 这将永远传递在(0, 1)的信。相反,您希望将当前位置作为 updateHealth(board[current][current1],hp);
  • 返回新hp值,但不更新旧的hp值: int =updateHealth(.,hp); 下一次调用它时,您将传递与上次相同的hp。您根本不需要newhp变量,只需使用hp即可。

额外:

  • 您的makeAMove方法编写得很奇怪: 整数y= 0;如果(移动== 'w') {y=y-1;} 是相同的 整数y= 0;如果(移动== 'w') {y-;/或y= -1;} 您正在检查无法达到的可能性,因为您也忘记了else的存在。试着做这样的事情: 公共静态int[] makeAMove(char MakeAMove){ int[] finalMove =新int2;if (move == 'w') { finalMove1 = -1;} if (move == 'a') { finalMove = -1;} finalMove如果(移动==‘s 's') { finalMove1 = 1;} else如果(move == 'd') {finalMove= 1;}返回finalMove;}
  • 做一个检查,当你移动到外面的板子,不允许这样做。否则你就会“撞毁”游戏。
  • 使用switch语句将有助于您的代码,而Map的帮助更大。
  • 您不需要在每次移动之后都给intializeGameBoard打电话。实际上,如果默认的字母是E,那么只需在数组的开头循环一遍,然后将它放在任何地方。当迭代一个数组时,使用它的length属性作为循环条件,而不是一个数字,因为当它在一个地方发生变化时,您将忘记在其他地方更改它。
票数 2
EN

Stack Overflow用户

发布于 2016-08-10 20:20:50

尝试将int newhp = updateHealth(board[0][1], hp)更改为int newhp = updateHealth(board[current[0]][current[1]], hp);

你每次都要传递相同的字符。您还应该在打印hp之后设置hp = newhp;

还将您的updateHealth方法更改为使用if/else。

票数 1
EN

Stack Overflow用户

发布于 2016-08-10 20:04:40

我认为问题是你使用了大量的if语句。您只需要并行使用一个if语句(相同的缩进),其余的则应该是。做一个开关(元素)/case也会更干净一些。以两种形式显示如下:

代码语言:javascript
复制
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;    
    }

使用开关(元素)/case:

代码语言:javascript
复制
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; 
    }
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/38882300

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档