Gå til innhold

Anbefalte innlegg

Har kommet til et poeng hvor jeg har kjørt meg fast, og RedBull-lageret begynner å bli tynt, så jeg må ty til å åpne en tråd om også denne oppgaven.

 

Med innleveringsfrist i morgen så haster dette litt.

 

Oppgaven er ganske så spesifikk: vi har fått et løsningsforslag med halvferdig GUI og en del halvferdige metoder, som skal gjøres ferdig iht oppgaver (går primært på GUI, filhåndtering og unntak).

 

Mitt første problem er at jeg ikke får til å koble knapper i GUI opp mot metoder, da metoden jeg ønsker at den skal kjøre ligger i en annen klasse. .

public class GUI extends JFrame
{
    private BattleController bc;
    private Battleground battleground;
    private JPanel toolbarContainer;
    private Card PlayerCard, MonsterCard;
    private JPanel PlayerCardPanel, MonsterCardPanel, bgPanel;
    private JTextArea actionField;

    /**
     * Constructor for objects of class GUI. Takes a Battleground and sets up the GUI based on the Player and current Monster
     * @param bf The Battleground
     */
    public GUI(Battleground battleground)
    {
        this.battleground = battleground;
        this.MonsterCard = new Card(battleground.getCurrentMonster());
        this.PlayerCard = new Card(battleground.getPlayer());
        makeMenu();
        makeFrame();
        updateActionField("test");
    }

// IRRELEVANT KODE FJERNET


JButton attackButton = new JButton("Attack");
                attackButton.addActionListener(new ActionListener() {
                    public void actionPerformed(ActionEvent e) { attack(); }
});
gamebar.add(attackButton);

Der jeg nå bare har skrevet attack(), skal je få kjørt attackRound() som ligger i klassen BattleController.

    /**
     * Handles one round of attack. Logic that was previously in the Battleground class
     */
    public void attackRound() {
        Monster currentMonster = battleground.getCurrentMonster();
        Player player = battleground.getPlayer();

        if(currentMonster != null && currentMonster.isAlive()){
            if(player.isAlive()){
                int playerDamage = battleground.hit(player, currentMonster);
                updateGui(playerDamage, player, currentMonster);
                if(currentMonster.isAlive()){
                    int monsterDamage = battleground.hit(currentMonster, player);
                    updateGui(monsterDamage, currentMonster, player);
                    gui.updateActionField("You attack monster for " + monsterDamage +".");
                }

                else{
                    gui.updateActionField("Monster is dead");
                    battleground.removeMonster(currentMonster);
                    battleground.setRandomMonster();
                    gui.changeMonster(battleground.getCurrentMonster());
                }
            }

            else{
                gui.updateActionField("You are dead");
                gameOver();
            }
        } else {
                gui.updateActionField("No Monster selected. Selected for you");
                battleground.setRandomMonster();
                gui.changeMonster(battleground.getCurrentMonster());
        }
    }

Hovedmetoden som starter det hele ser forøvrig slik ut:

public class Main
{

    /**
     * Main method for this RPG
     * Creates a Player, a Battleground, some Monsters, a GUI and a BattleController to start the game
     * 
     * @param String[] args
     */
    public static void main(String[] args)
    {
        
        Player player = new Player("Bob", "Jedi", 2, 60, "bob.png");
        
        player.buyItem(new Weapon("Light saber", "Sharp, nasty thing", "cuts with", 2, 100, 20));
        player.buyItem(new Potion("Potion", "Bubbly liquid that restores health", "drinks", 2, 10, 50));
        player.buyItem(new Item("Hat", "Makes you look funny", "wears", 1, 1));
        
        ArrayList<Monster> monsters = new ArrayList<Monster>();
        
        monsters.add(new Monster("Robotic Squirrel", 100, 50, 20, 40, "roboSquirrel.png"));
        monsters.add(new Monster("Rabid Raccoon", 30, 15, 5, 8, "rabidRaccoon.png"));
        
        Battleground battleground = new Battleground(player, monsters);
        
        GUI gui = new GUI(battleground);
        BattleController bc = new BattleController(gui, battleground);

    }
}
Lenke til kommentar
Videoannonse
Annonse

Dette blir for dumt men.. Har du prøvd å bytte ut attack() med bc.attackRound()?

 

Du sier at metoden du ønsker ligger i en annen klasse BattleController, men det finnes ett objekt, bc, av denne i GUI-klassen du jobber på. Så da skal det bare være å kalle alle ønskelige metoder fra BattleController via bc.

Lenke til kommentar

Dette blir for dumt men.. Har du prøvd å bytte ut attack() med bc.attackRound()?

 

Du sier at metoden du ønsker ligger i en annen klasse BattleController, men det finnes ett objekt, bc, av denne i GUI-klassen du jobber på. Så da skal det bare være å kalle alle ønskelige metoder fra BattleController via bc.

Hehe, ja det har jeg prøvd. Var det jeg først gjorde, og jeg regnet med at det ville fungere. Det kompilerer fint, men fører til feilmelding så snart jeg prøver meg på noe med knappene. Har testet ved å erstatte attackRound() i BattleController med en random print-kommando. Fikk fortsatt feilmelding da, så jeg tror feilen ligger relatert til "bc.attackRound()".

 

d9d1fb081b251399c8f50ead4e0501f3.png

(trykk på bildet for større bilde)

Endret av Camorra
Lenke til kommentar

NullPointerException betyr at du prøver å bruke en variabel som ikke er instansiert.

Se nærmere på linje 90 i GUI klassen å se om det finnes en variabel der som aldri har blitt satt til noe.

Lenke til kommentar
  • 11 måneder senere...

Er det noen som har peiling på INFO132 oblig UIB.

Trenger hjelp:)

Det skal legges inn to ulike typer gjenstander (Item) i spillet:
a.
Våpen (Weapon) som en spiller kan utruste seg med for å øke skaden som

kan utføres. En spiller kan kun være utrustet med ett våpen, men kan ha flere våpen liggende i samlingen med gjenstander og spilleren skal kunne bytte
m e l l o m d i s s e . 

b.Helsedrikker (Potion) eller bandasje som spilleren kan bruke under kamp for åøkehelsensin.

c. Både våpen og helsegjenstander skal kunne ligge i spillerens samling med gjenstander.

2.Iklassene Opponent og Player finnes det flere felles egenskaper som skal refaktoreresinniensuperklassekaltCharacter.

3.Lag tester for alle metoder i Weapon (også de som arves fra Item) 

4.Item,CharacterogderessubklasserskalalleoverskrivetoString()-metodenog returnere all relevant informasjon. Subklasser skal overskrive superklassens

 

toString(), men likevel benytte seg av toString() fra superklassen i implementasjonen nårdetteredusererkodeduplisering.

5.Ide forrige oppgavene har alle metoder blitt satt som public. I denne oppgaven skal dere gå over alle metoder å bestemme om de bør være public, private eller protected. Vurder også om noen av klassene skal være abstrakte eller grensesnitt
( i n t e r f a c e ) 

6.Dere skal utvide kampmetoden så man kan bruke flere kommandoord. Legg til flere kommandoord enn de som kreves under etter behov.

a.Lag kommandoord for å drikke en potion eller å utruste seg med et våpen. Man skal for eksempel kunne skrive ”equip Sword” og "drink Vigor Tonic".

b. Lagetkommandoord“tactic”,dermankanvelgemellom“bold”,“agile”og “defensive”. Eksempel: “tactic bold”. Bold skal øke skade. Agile skal gi en 15% sjanse for å unngå opponenten sitt angrep fullstendig. Defensive skal minske skaden fienden påfører player. Når en oppnent velges skal den få en tilfeldig taktikk

 

c.Vågale spillere skal kunne velge å slåss mot den vanskeligste opponenten, rangertetterbådehelseogskade:”challengedeadliest”.(5%)

7.Når en kamp er over skal spilleren få valget om å slåss igjen eller å avslutte spillet. Dette betyr at spillet skal kunne fortsette til alle fiender er døde, så lenge player fortsatterilive

8.Som før trenger vi en main()-metode som oppretter en spiller med noen items, noen fienderienliste,samtsetterigangspillet.Herskalvihaminsttovåpenogto
p o t i o n s 

 

Lenke til kommentar
ublic class Weapon extends Item

{

    private int value;

    private int damage;

        

    /**

     * Constructor for objects of class Weapon

     * @param name The Item's name

     * @param description A description of the item

     * @param action The verb or expression to be printed when a player uses the item

     * @param value The item's value in gold

     * @param damage The damage the weapon adds to the player

     */

    public Weapon(String name, String description, String action, int value, int damage)

    {

        super(name,description, action, value);

        setDamage(damage);

    }

    

    /**

     * Prints information about the item to console

     */

    public void print(){

        System.out.println(this); 

    }

    

   

    /**

     * Sets an item's damage.

     * @param damage The damage of the item.

     */  

    public void setDamage(int damage){

        if(damage > 0){

            this.damage = damage;

        }

        else{

            damage = 0;

        }

    }

    

    /**

     * Gets an item's damage

     * @return The damage that the item adds to the players damage

     */    

    public int getDamage(){

        return damage;

    }

    

    /**

     * Returns the item information as a string.

     * @return a representation of the object as a String.

     */

    public String toString(){

        return name+ " ("+description+") Value: " + value + " gold, and gives you " + damage + " extra damage. \n"; 

    }

}
Lenke til kommentar

 

Har kommet til et poeng hvor jeg har kjørt meg fast, og RedBull-lageret begynner å bli tynt, så jeg må ty til å åpne en tråd om også denne oppgaven.

 

Med innleveringsfrist i morgen så haster dette litt.

 

Oppgaven er ganske så spesifikk: vi har fått et løsningsforslag med halvferdig GUI og en del halvferdige metoder, som skal gjøres ferdig iht oppgaver (går primært på GUI, filhåndtering og unntak).

 

Mitt første problem er at jeg ikke får til å koble knapper i GUI opp mot metoder, da metoden jeg ønsker at den skal kjøre ligger i en annen klasse. .

public class GUI extends JFrame
{
    private BattleController bc;
    private Battleground battleground;
    private JPanel toolbarContainer;
    private Card PlayerCard, MonsterCard;
    private JPanel PlayerCardPanel, MonsterCardPanel, bgPanel;
    private JTextArea actionField;

    /**
     * Constructor for objects of class GUI. Takes a Battleground and sets up the GUI based on the Player and current Monster
     * @param bf The Battleground
     */
    public GUI(Battleground battleground)
    {
        this.battleground = battleground;
        this.MonsterCard = new Card(battleground.getCurrentMonster());
        this.PlayerCard = new Card(battleground.getPlayer());
        makeMenu();
        makeFrame();
        updateActionField("test");
    }

// IRRELEVANT KODE FJERNET


JButton attackButton = new JButton("Attack");
                attackButton.addActionListener(new ActionListener() {
                    public void actionPerformed(ActionEvent e) { attack(); }
});
gamebar.add(attackButton);

Der jeg nå bare har skrevet attack(), skal je få kjørt attackRound() som ligger i klassen BattleController.

    /**
     * Handles one round of attack. Logic that was previously in the Battleground class
     */
    public void attackRound() {
        Monster currentMonster = battleground.getCurrentMonster();
        Player player = battleground.getPlayer();

        if(currentMonster != null && currentMonster.isAlive()){
            if(player.isAlive()){
                int playerDamage = battleground.hit(player, currentMonster);
                updateGui(playerDamage, player, currentMonster);
                if(currentMonster.isAlive()){
                    int monsterDamage = battleground.hit(currentMonster, player);
                    updateGui(monsterDamage, currentMonster, player);
                    gui.updateActionField("You attack monster for " + monsterDamage +".");
                }

                else{
                    gui.updateActionField("Monster is dead");
                    battleground.removeMonster(currentMonster);
                    battleground.setRandomMonster();
                    gui.changeMonster(battleground.getCurrentMonster());
                }
            }

            else{
                gui.updateActionField("You are dead");
                gameOver();
            }
        } else {
                gui.updateActionField("No Monster selected. Selected for you");
                battleground.setRandomMonster();
                gui.changeMonster(battleground.getCurrentMonster());
        }
    }

Hovedmetoden som starter det hele ser forøvrig slik ut:

public class Main
{

    /**
     * Main method for this RPG
     * Creates a Player, a Battleground, some Monsters, a GUI and a BattleController to start the game
     * 
     * @param String[] args
     */
    public static void main(String[] args)
    {
        
        Player player = new Player("Bob", "Jedi", 2, 60, "bob.png");
        
        player.buyItem(new Weapon("Light saber", "Sharp, nasty thing", "cuts with", 2, 100, 20));
        player.buyItem(new Potion("Potion", "Bubbly liquid that restores health", "drinks", 2, 10, 50));
        player.buyItem(new Item("Hat", "Makes you look funny", "wears", 1, 1));
        
        ArrayList<Monster> monsters = new ArrayList<Monster>();
        
        monsters.add(new Monster("Robotic Squirrel", 100, 50, 20, 40, "roboSquirrel.png"));
        monsters.add(new Monster("Rabid Raccoon", 30, 15, 5, 8, "rabidRaccoon.png"));
        
        Battleground battleground = new Battleground(player, monsters);
        
        GUI gui = new GUI(battleground);
        BattleController bc = new BattleController(gui, battleground);

    }
}

Initierer du egentlig Battlecontroller i GUI klassa de? 

 

// ta med denne i constructoren (veit ikke hvilke parametere klassa de tar)

bc = new Battlecontroller(..);

 

// dette gir deg tilgang til attackRound()

bc.attackRound();

 

Hvis dette ikke er problemet, så bør du legge inn hele koden om vi skal ha en sjans for å se hva som fører til at du får null pointer exception. Lykke til :)

Lenke til kommentar

Opprett en konto eller logg inn for å kommentere

Du må være et medlem for å kunne skrive en kommentar

Opprett konto

Det er enkelt å melde seg inn for å starte en ny konto!

Start en konto

Logg inn

Har du allerede en konto? Logg inn her.

Logg inn nå
  • Hvem er aktive   0 medlemmer

    • Ingen innloggede medlemmer aktive
×
×
  • Opprett ny...