布尔元';t在if语句之后初始化,当从Java中的另一个类调用时仍然为false

布尔元';t在if语句之后初始化,当从Java中的另一个类调用时仍然为false,java,Java,我正在尝试制作一个基于文本的游戏。我把我学到的东西付诸实践 当你读到我的问题时,你可能会感到困惑。我的问题包含的方法尚未在它们的工作中解释。这样就不会太混乱了。每段代码都有一个描述,说明它有哪些方法以及它们的作用 我的问题:我有一个名为CharStartingPoint的类,这个类是我游戏的主要起点。在类内部,我调用choose();方法,它是来自类CharObe的方法,然后是setingnpc();和bbs();方法,这两个方法都来自CharWosna类。bbs();方法只返回一个布尔引用的p

我正在尝试制作一个基于文本的游戏。我把我学到的东西付诸实践

当你读到我的问题时,你可能会感到困惑。我的问题包含的方法尚未在它们的工作中解释。这样就不会太混乱了。每段代码都有一个描述,说明它有哪些方法以及它们的作用

我的问题:我有一个名为CharStartingPoint的类,这个类是我游戏的主要起点。在类内部,我调用choose();方法,它是来自类CharObe的方法,然后是setingnpc();和bbs();方法,这两个方法都来自CharWosna类。bbs();方法只返回一个布尔引用的player1hassieldbo,并打印出字符串player1hassield。(玩家1Hasshield和玩家1Hasshieldbo来自CharObe类,玩家2Hasshieldbo来自CharWosna类)。当选择()时;调用,并且玩家对问题“你有盾牌吗?”键入yes,如果if语句看到用户键入yes,它将调用名为setPlayerShieldTrue(布尔hassild)的方法;并传递player1hassieldbo,设置player1hassieldbo=true。如果我键入System.out.println(player1.player1hassieldbo);和
System.out.println(player1.player1HasShield);从类CharStartingPoint,它打印出true和yes。类CharStartingPoint访问CharObe的变量没有问题。当CharWosna类尝试访问CharObe的变量时,CharWosna可以访问它们,但它们没有初始化,为什么?????要查看此问题,当方法设置npc()时;调用时,如果player2hassieldbo为true,则player2hassieldbo设置为true。在本例中,player2HasShieldBo设置为false,因为类CharWosna从类CharObe访问了player1HasShieldBo,但是它没有初始化,尽管它在前面已经初始化过。从类CharWosna访问时,字符串播放器1hasshield打印空值。为什么

player1属于CharObe类型,并且具有CharObe构造函数。
player2属于CharWosna类型,并且具有CharWosna的构造函数

这是我的代码,分块讲解

类CharObe:

选择();方法:choose方法询问用户是否有防护罩。如果用户对问题键入“否”,您是否有防护罩?布尔Player1Hassieldbo设置为false。如果用户键入yes,则在If语句中输入setPlayerShieldTrue();方法被调用

布景播放机现场图(布尔值哈斯菲尔德);方法:此方法接受布尔值。在该布尔值中,局部变量HasField设置为true,然后分配给player1HasShieldBo

returnIfHasShield();方法:此方法仅返回布尔player1Hassieldbo

类charstart point,该类调用所有方法

我发现了CharObe的变量被初始化并且可以在这个类中很好地访问的原因,这是因为这个类调用choose();方法

接口CharInterface,尚未使用

public interface CharInterface {
  int hurt(int curHealth, int hurting);
  int damage(int hitDamage);
  int shield(int shieldHealth, int shielLevel);

}
*另一个问题是,当我在类CharObe中创建一个对象时,它会直接给我一个java.lang.StackOverflowerError,为什么*

我不知道我为什么会有这些问题。我可能只是有一些非常简单的事情把我的程序搞砸了,我不知道。

我尝试过的事情
-从类CharWosna直接访问布尔播放器1hassieldbo
-创建另一个布尔值,使其具有player1hassieldbo的值(当player1hassieldbo等于true时)
-从类CharObe初始化player1hassieldbo(结果并非如所愿,它始终等于true)

如果您想在此处查看我的所有代码,请参阅。

仪表盘

public interface CharInterface {

  int hurt(int curHealth, int hurting);
  int damage(int hitDamage);
  int shield(int shieldHealth, int shielLevel);

}
import java.util.Scanner;

public class CharObe implements CharInterface {

  int player1Level;
  int player1Damage;
  int player1Health;
  String player1HasShield;
  boolean player1HasShieldBo = false;
  int player1ShieldLevel;
  int player1ShieldHealth;
  boolean valid = false;
  Scanner keyBoard = new Scanner(System.in);

  CharObe f = new CharObe();

  //Letting the user pick the players level and whether it has a shield or 
  not.
  public void choose(){
      System.out.println("what is Your player level? (number from 1-20)");

      do{

          //asking user for the level of their player
          System.out.print("Enter level here > ");
          if(keyBoard.hasNextInt()){
              player1Level = keyBoard.nextInt();

              if(player1Level >= 1 && player1Level <= 20){
                valid = false;

            }else{
                System.out.println("Enter a number between 1 and 20!");
                valid = true;

            }

          }else{
              System.out.println("Only numbers are valid");
              keyBoard.next();
              valid = true;

          }

      }while(valid);


      do{
          //asking the user if they have a shield or not
          System.out.println("\ndo you have a shield? (if yes only type" + 
                          "'yes' if no type 'no')");
          System.out.print("Shield? yes or no? > ");
          if(keyBoard.hasNext()){
              player1HasShield = keyBoard.next();

              if(player1HasShield.equalsIgnoreCase("yes")){
                  System.out.println("You have a SHIELD!!!");
                  setPlayerShieldTrue(player1HasShieldBo);


                  System.out.println("What is your shield Level? (Only" + 
                                     "numbers 1-5)");
                  do{
                  System.out.print("Shield level > ");
                  if(keyBoard.hasNextInt()){
                      player1ShieldLevel = keyBoard.nextInt();

                     if(player1ShieldLevel >= 1 && player1ShieldLevel <= 5){
                         valid = false;

                      }else{
                         System.out.println("PLEASE only numbers from 1-5");
                         valid = true;

                      }
                  }else{
                      System.out.println("Only numbers are valid");
                      keyBoard.next();
                      valid = true;

                  }

                  }while(valid);


              }else{
                  System.out.println("You did not type 'yes'"
                          + " now you dont have a shield...");
                  player1ShieldLevel = 0;
                  valid = false;

              }

          }

      }while(valid);

      switch(player1Level){
      case 1: player1Health = 100; player1Damage = 10;  break;
      case 2: player1Health = 105; player1Damage = 11;  break;
      case 3: player1Health = 110; player1Damage = 12;  break;
      case 4: player1Health = 80;   player1Damage = 20;     break;
      case 5:   player1Health = 100; player1Damage = 15;    break;
      case 6:   player1Health = 150; player1Damage = 5;     break;
      case 7:   player1Health = 115; player1Damage = 17;    break;
      case 8:   player1Health = 130; player1Damage = 20;    break;
      case 9:   player1Health = 135; player1Damage = 15;    break;
      case 10: player1Health = 140; player1Damage = 23; break;
      case 11: player1Health = 160; player1Damage = 17; break;
      case 12: player1Health = 150; player1Damage = 28; break;
      case 13: player1Health = 180; player1Damage = 15; break;
      case 14: player1Health = 155; player1Damage = 30; break;
      case 15: player1Health = 115; player1Damage = 40; break;
      case 16: player1Health = 200; player1Damage = 20; break;
      case 17: player1Health = 250; player1Damage = 35; break;
      case 18: player1Health = 1000; player1Damage = 67;    break;
      case 19: player1Health = 550; player1Damage = 130;    break;
      case 20: player1Health = 9999; player1Damage = 479;   break;

      }

      if(player1HasShieldBo){
          switch(player1ShieldLevel){
          case 1:   player1ShieldHealth = 5;    break;
          case 2:   player1ShieldHealth = 7;    break;
          case 3:   player1ShieldHealth = 15;   break;
          case 4:   player1ShieldHealth = 20;   break;
          case 5:   player1ShieldHealth = 30;   break;

        }


      }else{
          player1ShieldHealth = 0;
      }

      if(player1HasShieldBo){
      System.out.println(
              "\nPlayer1's level: " + player1Level +
              "\nPlayer1's Health: " + player1Health + 
              "\nplayer1's damage: " + player1Damage +
              "\nPlayer1's shield level: "+ player1ShieldLevel +
              "\nplayer1's shield HP: " + player1ShieldHealth);
      }else{
          System.out.println(
              "\nPlayer1's level: " + player1Level +
              "\nPlayer1's Health: " + player1Health +
              "\nPlayer1's shield level: "+ player1ShieldLevel +
              "\nplayer1's damage: " + player1Damage);
      }

      System.out.println("\nSetting player2's variables...");


  }

  public void setPlayerShieldTrue(boolean HasSield){
      HasSield = true;
      player1HasShieldBo = HasSield;
  }


  public boolean returnIfHasShield(){
          return player1HasShieldBo;
  }


  @Override
  public int hurt(int curHealth, int hurting) {

      return curHealth;
  }

  @Override
  public int damage(int hitDamage) {

      return hitDamage;
  }

  @Override
  public int shield(int shieldHealth, int shielLevel) {

      return 0;
  }


}
类计费起始点

public class CharStartingPoint {

  public static void main(String[] args) {
      System.out.println("Welcome! Fellow traveler.");
      System.out.println("please input proper information in order to" 
                + " procceed to fight.\n");

      CharObe player1 = new CharObe();  
      CharWosna player2 = new CharWosna();

      player1.choose();
      player2.settingNPC();
      player2.bbs();
      System.out.println(player1.player1HasShieldBo);
      System.out.println(player1.player1HasShield);

  } 

}
夏洛贝级

public interface CharInterface {

  int hurt(int curHealth, int hurting);
  int damage(int hitDamage);
  int shield(int shieldHealth, int shielLevel);

}
import java.util.Scanner;

public class CharObe implements CharInterface {

  int player1Level;
  int player1Damage;
  int player1Health;
  String player1HasShield;
  boolean player1HasShieldBo = false;
  int player1ShieldLevel;
  int player1ShieldHealth;
  boolean valid = false;
  Scanner keyBoard = new Scanner(System.in);

  CharObe f = new CharObe();

  //Letting the user pick the players level and whether it has a shield or 
  not.
  public void choose(){
      System.out.println("what is Your player level? (number from 1-20)");

      do{

          //asking user for the level of their player
          System.out.print("Enter level here > ");
          if(keyBoard.hasNextInt()){
              player1Level = keyBoard.nextInt();

              if(player1Level >= 1 && player1Level <= 20){
                valid = false;

            }else{
                System.out.println("Enter a number between 1 and 20!");
                valid = true;

            }

          }else{
              System.out.println("Only numbers are valid");
              keyBoard.next();
              valid = true;

          }

      }while(valid);


      do{
          //asking the user if they have a shield or not
          System.out.println("\ndo you have a shield? (if yes only type" + 
                          "'yes' if no type 'no')");
          System.out.print("Shield? yes or no? > ");
          if(keyBoard.hasNext()){
              player1HasShield = keyBoard.next();

              if(player1HasShield.equalsIgnoreCase("yes")){
                  System.out.println("You have a SHIELD!!!");
                  setPlayerShieldTrue(player1HasShieldBo);


                  System.out.println("What is your shield Level? (Only" + 
                                     "numbers 1-5)");
                  do{
                  System.out.print("Shield level > ");
                  if(keyBoard.hasNextInt()){
                      player1ShieldLevel = keyBoard.nextInt();

                     if(player1ShieldLevel >= 1 && player1ShieldLevel <= 5){
                         valid = false;

                      }else{
                         System.out.println("PLEASE only numbers from 1-5");
                         valid = true;

                      }
                  }else{
                      System.out.println("Only numbers are valid");
                      keyBoard.next();
                      valid = true;

                  }

                  }while(valid);


              }else{
                  System.out.println("You did not type 'yes'"
                          + " now you dont have a shield...");
                  player1ShieldLevel = 0;
                  valid = false;

              }

          }

      }while(valid);

      switch(player1Level){
      case 1: player1Health = 100; player1Damage = 10;  break;
      case 2: player1Health = 105; player1Damage = 11;  break;
      case 3: player1Health = 110; player1Damage = 12;  break;
      case 4: player1Health = 80;   player1Damage = 20;     break;
      case 5:   player1Health = 100; player1Damage = 15;    break;
      case 6:   player1Health = 150; player1Damage = 5;     break;
      case 7:   player1Health = 115; player1Damage = 17;    break;
      case 8:   player1Health = 130; player1Damage = 20;    break;
      case 9:   player1Health = 135; player1Damage = 15;    break;
      case 10: player1Health = 140; player1Damage = 23; break;
      case 11: player1Health = 160; player1Damage = 17; break;
      case 12: player1Health = 150; player1Damage = 28; break;
      case 13: player1Health = 180; player1Damage = 15; break;
      case 14: player1Health = 155; player1Damage = 30; break;
      case 15: player1Health = 115; player1Damage = 40; break;
      case 16: player1Health = 200; player1Damage = 20; break;
      case 17: player1Health = 250; player1Damage = 35; break;
      case 18: player1Health = 1000; player1Damage = 67;    break;
      case 19: player1Health = 550; player1Damage = 130;    break;
      case 20: player1Health = 9999; player1Damage = 479;   break;

      }

      if(player1HasShieldBo){
          switch(player1ShieldLevel){
          case 1:   player1ShieldHealth = 5;    break;
          case 2:   player1ShieldHealth = 7;    break;
          case 3:   player1ShieldHealth = 15;   break;
          case 4:   player1ShieldHealth = 20;   break;
          case 5:   player1ShieldHealth = 30;   break;

        }


      }else{
          player1ShieldHealth = 0;
      }

      if(player1HasShieldBo){
      System.out.println(
              "\nPlayer1's level: " + player1Level +
              "\nPlayer1's Health: " + player1Health + 
              "\nplayer1's damage: " + player1Damage +
              "\nPlayer1's shield level: "+ player1ShieldLevel +
              "\nplayer1's shield HP: " + player1ShieldHealth);
      }else{
          System.out.println(
              "\nPlayer1's level: " + player1Level +
              "\nPlayer1's Health: " + player1Health +
              "\nPlayer1's shield level: "+ player1ShieldLevel +
              "\nplayer1's damage: " + player1Damage);
      }

      System.out.println("\nSetting player2's variables...");


  }

  public void setPlayerShieldTrue(boolean HasSield){
      HasSield = true;
      player1HasShieldBo = HasSield;
  }


  public boolean returnIfHasShield(){
          return player1HasShieldBo;
  }


  @Override
  public int hurt(int curHealth, int hurting) {

      return curHealth;
  }

  @Override
  public int damage(int hitDamage) {

      return hitDamage;
  }

  @Override
  public int shield(int shieldHealth, int shielLevel) {

      return 0;
  }


}
import java.util.Scanner;
公共类CharObe实现了CharInterface{
int播放器1级;
int player1损坏;
int Player1健康;
弦乐演奏者1哈斯希尔德;
布尔player1hassieldbo=false;
int PLAYER1屏蔽层;
int player1ShieldHealth;
布尔有效=假;
扫描仪键盘=新扫描仪(System.in);
CharObe f=新CharObe();
//让用户选择玩家的等级,以及是否有盾牌
不
公共空间选择(){
System.out.println(“你的玩家级别是多少?(1-20之间的数字)”;
做{
//询问用户其玩家的级别
System.out.print(“在此输入级别>”;
if(keyBoard.hasNextInt()){
player1Level=keyBoard.nextInt();

如果(player1Level>=1&&player1Level=1&&player1ShieldLevel首先,您的代码将用于设置布尔值。但是您有一些错误

stackOverflow是由于您在与属性相同的类中创建了CharObe对象而导致的。因此,要创建CharObe对象,需要创建CharObe等等

罪魁祸首:在夏洛贝班上

CharObe f = new CharObe();//remove this
第二件事,你不能仅仅为了读取属性而在CharWosna中创建一个CharObe对象

该代码也是罪魁祸首:

//CharObe object created for acquiring CharObe's variables in that class 
CharObe toGet = new CharObe();
在构造函数中创建player2时,尝试传递player1对象

就像在CharWonsa这样:

//CharObe object created for acquiring CharObe's variables in that class 
CharObe toGet;

public CharWosna(CharObe obe) {
  toGet=obe;
}
最后,在CharStartingPoint类中,创建如下对象:

CharObe player1 = new CharObe();  
CharWosna player2 = new CharWosna(player1);
另一个更好的方法是单独维护一个GameContext类,并拥有所有必要的数据,比如玩家,以及从那里访问


不客气。下次请准确回答您的问题。

您发布的代码似乎比您的问题合理的代码要多。请阅读并
//CharObe object created for acquiring CharObe's variables in that class 
CharObe toGet;

public CharWosna(CharObe obe) {
  toGet=obe;
}
CharObe player1 = new CharObe();  
CharWosna player2 = new CharWosna(player1);