每次尝试制作新节目时,我都会遇到同样的问题

时间:2015-02-08 23:10:32

标签: java oop

我当前的程序是一个简单的游戏..我试图帮助弄清楚如何正确使用OOP。但是每当我进入一个新程序时,我都会遇到同样的问题:

我在我的游戏中创建了一个实例。这个例子可以是任何东西 - 主要的英雄,怪物,无论如何。一切都很顺利,实例正是我想要的。也许我会稍微操纵一下。

然后我尝试使用另一个类,我想我创建了一个不同类的实例,试图进一步操作原始实例。也许我最初创造了我的英雄并且改变了他的统计数据,现在在这一点上我想让我的英雄根据所选择的统计数据说些什么。

这一点始终是我遇到障碍的地方。我似乎无法做我想做的事情 - 我无法使用我制作的原始实例,因为它只是一个实例而且我不知道如何操作它(或者即使我应该在一个新的课堂上。

所以..这是一个基本的设计问题/缺乏对OOP的理解 但是我觉得我对如何实际编程有很好的把握。我一直在阅读和阅读并获得建议,但我似乎无法克服这个障碍。

我知道这个网站上的人似乎不喜欢这样的帖子,但也许这里有人可以识别我不能理解的内容。

这是我正在谈论的一个例子,我现在想要制作的游戏。

package pkgnew.stupid.game;

import java.util.Scanner;

/**
 *
 * @author whyguy2
 */
public class Hero {
public static int heroattack = 1;
public static int herospeed = 1;
public static int heroarmorpen = 1;
public static int heroarmor = 1;
public static int herohealth = 5;
public static String inputstat;
public static int herothepoints = 0;

Hero(int points){
    spendpoint(points);
}





    public void attack(){

    }

    public void die(){
       System.exit(0);
    }

    public void winbattle(){
        System.out.println("You win the battle and have one new point to spend!");
        spendpoint(1);
        new NewEncounter();
    }

    public void levelup(){
        System.out.println("You have leveled up and receive 5 new points to spend");
        spendpoint(5);
        new NewEncounter();
    }

    public void spendpoint(int points){
        for(int x=0; x<points; x++){
    System.out.println("Available Points: " + points);
    System.out.println("Available Attributes:");
    System.out.println("attack: " + heroattack); 
    System.out.println("speed: " + herospeed);
    System.out.println("armorpen: " + heroarmorpen);
    System.out.println("armor: " + heroarmor);
    System.out.println("health: " + herohealth);
    System.out.println(points);
    System.out.println(x);
    Scanner keyboard = new Scanner( System.in );
    inputstat = keyboard.next( );
    if(inputstat.equals("attack")){
    heroattack = heroattack + 1;    
    }
    else if(inputstat.equals("speed")){
    herospeed = herospeed + 1;    
    }
    else if(inputstat.equals("armorpen")){
    heroarmorpen = heroarmorpen + 1;    
    }
    else if(inputstat.equals("armor")){
    heroarmor = heroarmor + 1;    
    }
    else if(inputstat.equals("health")){
    herohealth = herohealth + 5;    
    } 
    else{
    System.out.println("Please pick one of the stats");
    x = x-1;
    }
        }

    }

}





public class StartGame {

    StartGame(){                                                            //runs through output for a new game
   System.out.println("Welcome to the game");
   System.out.println("Pick your hero's starting stats");
   Hero thishero = new Hero(10);                                                             //spends your points

   System.out.println("Let's Begin!/n/n");
   new NewEncounter();                                                              //goes into the encounter loops
    }   

}

此时我尝试在NewEncounter课程中编写一个遭遇,但这是不可能的,因为我无法使用我创建的英雄实例。而且我很确定我的设计首先是不好的,我想我已经读过你应该尽可能少地尝试使用静态变量。我仍在阅读试图抓住这一点,但我已经阅读了很多,我觉得没有什么能帮助我。我实际上认为更多&#34;动手&#34;大型项目/教程可能对我有帮助,但我不知道。无论如何,感谢任何帮助和抱歉长篇/博客般的帖子。

1 个答案:

答案 0 :(得分:6)

在另一个类中使用一个类的实例的标准方法是存储对它的引用或将其传递给存储或使用它的方法。

例如:

class Encounter {
    private final Hero mainHero;
    private final List<Hero> participants;

    public Encounter(Hero mainHero) {
        this.mainHero = mainHero;
        participants = new ArrayList<>();
    }

    public void addParticipant(Hero hero) {
        participants.add(hero);
    }
}

允许:

Encounter encounter = new Encounter(hero);

或:

encounter.addParticipant(hero);

然后可以在课堂上使用它们。例如:

class Encounter {
    public void moveAllParticipants() {
        participants.forEach(Hero::move);
    }
}

我注意到你使用了很多公共静态类变量。这是不寻常的,使用它们的理由很少。一个是定义常量。如果这是您的意图,那么我建议您使用以下标准表格:

private static final int HERO_ATTACK = 1;

如果你打算将这些作为实例变量(即每个英雄不同),那么它们不应该是静态的,也不应该是公开的。

这是各种Java教程中详细介绍的区域。如果您有其他问题,我建议您通过其中一个并回到这里。