# noch drei Stunden zeit Bugfehlersuche, textbasiertes Rollenspiel



## Sofasurfer (7. Dez 2014)

Hallo, 
nachdem ich jetzt das Spiel abgabefertig formatiert habe, scheint sich ein bug eingeschlichen zu haben, ich finde ihn nicht! Ich wäre echt super glücklich wenn ihm jmd findet.

zur Aufgabe wir sollten ein textbasiertes Rollenspiel programmieren indem ein Monster und ein Spieler gegeneinander kämpfen: Die Eingaben kommen über die Konsole.

Das Problem: Das Spiel endet obwohl der Monster und/oder Spieler noch HPs haben. Die Abgabe ist heute um 00:00h

```
import java.util.Scanner;

/**
 *Die ist ein textbasiertes Rollenspiel in dem ein Spieler und ein Monster aufeinander treffen.
 *
 *@param Eingabewert in der Konsole
 *

 */

public class Rollenspiel {
    /**
     *Das Rollenspiel funktioniert indem ein Monster un ein Spieler gegeneinander antreten,
     *Sie haben vorher definierte Atrribute, durch Texteingabe koennen Aktionen ausgeführt werden.
     *DIe Angriffe werden durch einen Verlgleich mit einem Zufallswert ausgeloest, 
     *es stehen drei Heilungen zur Verfuegung
     *@param args
     */
    public static void main(String[] args) {
        int spielerHp    = 140;// Leben des Spielers
        int spielerAtk   = 30;// Angriffstaerke des Spielers
        double spielerHit   = 0.6;// Hitwert des Spielers
        int monsterHp    = 150;// Leben des Monsters
        int monsterAtk   = 35;// Angriffsstaerke des Monsters
        double monsterHit   = 0.45;// Hitwert des Monsters der verlgichen wird
        int spielerMaxHp = 140;// maximale HP des Spielers
        int item         = 3;// Anzahl der Items
        int heil         = 15;// Bonus der Heilung
        Scanner sc = new Scanner(System.in);// (System.in) Parameter für Konsoleneingabe
        System.out.println("Spieler -- Hp140 -- Atk30");
        System.out.println("Gegner -- Hp150 -- Atk35");
        while (spielerHp > 0 && monsterHp > 0) {/*wiederholt die Aktionen in der Schleife,
                                               * solange die Spieler oder Monster am Leben sind bekaempfen sie sich
                                               */
            System.out.println("Moegliche Aktionen:");// moegliche ausfuehrbare Aktionen
            System.out.println("1 -> Angriff");
            System.out.println("2 -> item" + "(" + item + "verbleibend)");
            System.out.println("Welche Aktion?:");
            int antwort = sc.nextInt();
            // die Antwort soll eingegeben werden ,entweder 1 oder 2, nextInt liest integer Wert ein
            switch (antwort) {
                default: /*
                          * abweichende Eingaben von 1 und 2 werden als fehlerhaft deklariert
                          * danach greift das Monster an
                          */
                    System.out.println("Fehlerhafte Aktion! " + "Monster greift an");
                    double w = 0.0; //*Vergleich Gleitkommazahlen und gibt ganzzahligen Wert aus
                    w = Math.random();//es gibt eine Zufallszahl zwischen 0 und 1 aus 
                    if (w > monsterHit) {//vergleicht w mit dem Hit-Wert
                        System.out.println("Monster verfehlt Spieler");
                        System.out.println("Spieler --" + "Hp" + spielerHp + "-- Atk30");
                        System.out.println("Monster --" + "Hp" + monsterHp + "--Atk35");
                    } else {
                        double min = 1.0;
                        double max = 2.0;
                        double zf  = (Math.random() * (max-min)) + min;
                        // Neuberechnung des Zf-Wertes
                        spielerHp -= (monsterAtk * zf);
                        System.out.println("Spieler --" + "Hp" + spielerHp + "-- Atk30");
                       // gibt den neuen spielerHp nach der Attacke an
                        System.out.println("Monster --" + "Hp" + monsterHp + "--Atk35");
                    }

                    break;
                case 2:
                    if (item > 0) { // Item soll maximal 3 mal eingesetzt werden können
                        spielerHp += heil;
                        System.out.println("Spieler --" + "Hp" + spielerHp + "-- Atk30");
                        // gibt den neuen Spieler-Hp-Wert aus
                        System.out.println("Monster --" + "Hp" + monsterHp + "-- Atk35");
                        // das Statusattribut des Monsters wechselt nicht
                        item -= 1;//Item wird um eins vermindert
                    } else {
                        System.out.println("Nicht genuegend Heiltränke");
                        System.out.println("Spieler --" + "Hp" + spielerHp + "-- Atk30");
                        System.out.println("Monster --" + "Hp" + monsterHp + "-- Atk35");
                     // denn nur der Hp-wert variiert
                    }
                    System.out.println("Monster greift an");
                    double x = 0.0;
                    x = Math.random();// es gibt eine Zufallszahl zwischen 0 und 1 aus 
                    if (x > monsterHit) {// vergleich x mit dem Hit-Wert
                        System.out.println("Monster verfehlt Spieler");
                        System.out.println("Spieler --" + "Hp" + spielerHp + "--Atk30");
                        System.out.println("Monster --" + "Hp" + monsterHp + "-- Atk35");
                    } else {
                        double min = 1.0;
                        double max = 2.0;
                        double zf  = (Math.random() * (max-min)) + min;
                        // rechnet und gibt den Zufallszahl zwischen 1 und 2 aus
                        spielerHp -= (monsterAtk * zf);
                        System.out.println("Spieler --" + "Hp" + spielerHp + "-- Atk30");
                        // gibt den neuen spielerHp nach der Attacke aus
                        System.out.println("Monster --" + "Hp" + monsterHp + "-- Atk35");
                    }

                    break;
                case 1:
                    double y = 0.0;
                    y = Math.random();// es gibt eine Zufallszahl zwischen 0 und 1 aus
                    if (y > spielerHit) {// vergleicht y mit dem Hit-Wert 
                        System.out.println("Spieler verfehlt Monster");//so trifft die Attacke nicht
                        System.out.println("Spieler --" + "Hp" + spielerHp + "-- Atk30");
                        System.out.println("Monster --" + "Hp" + monsterHp + "-- Atk35");
                    } else {
                        double min = 1.0;
                        double max = 2.0;
                        double zf  = (Math.random() * (max-min)) + min;
                            // Neuberechnung des zf-Wertes
                        monsterHp -= (spielerAtk * zf);
                        System.out.println("Spieler greift an");
                        System.out.println("Spieler --" + "Hp" + spielerHp + "-- Atk30");
                        System.out.println("Monster --" + "Hp" + monsterHp + "--Atk35");
                        // gibt den neuen monsterHp nach der Attacke aus
                    }
                    System.out.println("Monster greift an");
                    double z = 0.0;
                    z = Math.random();// es gibt eine Zufallszahl zwischen 0 und 1 aus 
                    if (z > monsterHit) {// vergleicht z mit dem Hit-Wert
                        System.out.println("Monster verfehlt Spieler");// so trifft die Attacke nicht
                        System.out.println("Spieler --" + "Hp" + spielerHp + "-- Atk30");
                        System.out.println("Monster --" + "Hp" + monsterHp + "--Atk35");
                    } else {
                        double min = 1.0;
                        double max = 2.0;
                        double zf  = (Math.random() * (max-min)) + min;
                        // Neuberechnung des Zf-Wertes
                        spielerHp -= (monsterAtk * zf);
                        System.out.println("Spieler --" + "Hp" + spielerHp + "-- Atk30");
                       // gibt den neuen spielerHp nach der Attacke an
                        System.out.println("Monster --" + "Hp" + monsterHp + "--Atk35");
                    }
                    break;     
            }
            if (spielerHp <= 0) {
                System.out.println("Monster gewinnt");
                continue;
            }
            if (monsterHp <= 0) {
                System.out.println("Spieler gewinnt");
                continue;
            }
        }
    }
}
```


----------



## JavaMeister (7. Dez 2014)

Hmm....

Und wie endet es?


----------



## Sofasurfer (7. Dez 2014)

Es gibt die Ausgabe dass jmd gewonnen hat aber die HPs sind nicht null sondern nur gering


----------



## Saheeda (7. Dez 2014)

@Sofasurfer

Ich habe jetzt mehrere Testläufe gemacht und bekomme das richtige Ergebnis. Was mir nur aufgefallen ist: 
Die Lebenspunkte werden in jedem Fall hingeschrieben, selbst wenn sie negativ sind, sodass gerade gegen Ende solche Ausgaben zustande kommen:



> Spieler greift an
> Spieler --Hp79-- Atk30
> Monster --Hp-31--Atk35
> Monster greift an
> ...



Monster hat hier -31 Lebenspunkte, ist also tot und damit gewinnt der Spieler.
Hast du dich vielleicht einfach nur verguckt?


----------



## Sofasurfer (7. Dez 2014)

Oh mein Gott, ich bin wohl etwas überarbeitet, ich habe das nicht gesehen wegen diesen ganzen Bindestrichen in meiner Ausgabe


----------



## Saheeda (7. Dez 2014)

Wenn du noch etwas Zeit hast, solltest du vielleicht noch ein paar Sachen ändern. Du wiederholst z.B. ziemlich oft die Ausgabe der Lebenspunkte. schreibe dafür ne eigene Methode mit den Punkten als Parameter und ruf nur die auf.


----------



## Sofasurfer (7. Dez 2014)

Ja vielen Dank aber damit werde ich jetzt nicht mehr fertig, bin froh das es läuft und mache jetzt schluss


----------



## mischa16000 (7. Dez 2014)

Hey! hab auch bei Strucki  liegt daran, dass ein Angriff mit mehr ATK als HP noch übrig sind egtl nicht möglich ist. Daran hat er beim aufsetzen der Hausaufgabe sicher nicht gedacht.


----------



## Saheeda (8. Dez 2014)

@mischa

Ich denke schon, dass euer Dozent (?) daran gedacht hat. Aber sowas zu ver- und bearbeiten ist Aufgabe des Programmierers, nicht des Kunden.
Wenn Interesse besteht, ich hab den Code oben mal bisschen umgebaut. Ist sicherlich noch verbesserungswürdig, aber imho übersichtlicher als vorher:



```
import java.util.Scanner;

public class Rollenspiel {
	public static Actor player;
	public static Actor monster;

	public static void main(String[] args) {
		player = new Actor("Spieler", 140, 30, 0.6);
		monster = new Actor("Monster", 150, 35, 0.45);

		while (player.heartPoints > 0 && monster.heartPoints > 0) {
			runGame();
		}
	}

	private static void runGame() {
		Scanner sc = new Scanner(System.in);

		System.out.println("\r\nMoegliche Aktionen:");
		System.out.println("1 -> Angriff");
		System.out.println("2 -> item" + "(" + player.potions.size()
				+ " verbleibend)");
		System.out.println("Welche Aktion?:");

		int chosen = sc.nextInt();
		switch (chosen) {
		case 1:
			player.attack(monster);
			monster.attack(player);
			break;
		case 2:
			player.heal();
			monster.attack(player);
			break;
		default:
			System.out.println("Fehlerhafte Aktion!");
			monster.attack(player);
			break;
		}
		if (player.heartPoints <= 0) {
			System.out.println("Monster gewinnt");			
		}
		if (monster.heartPoints <= 0) {
			System.out.println("Spieler gewinnt");			
		}
	}	
}
```


```
import java.util.ArrayList;

public class Actor {
	public int heartPoints;
	public int damage;
	public int maximumHp;
	public double chance;
	public String name;
	public ArrayList<Item>potions;

	public Actor(String name, int heartPoins, int damage, double chance) {
		this.heartPoints = heartPoins;
		this.damage = damage;
		this.maximumHp = 140;
		this.chance = chance;
		this.name = name;
		this.potions = new ArrayList<Item>();
		this.potions.add(new Item(15));
		this.potions.add(new Item(15));
		this.potions.add(new Item(15));	
			
		this.showLifepoints();
	}
	
	public void showLifepoints() {
		if(this.heartPoints < 0) {
			this.heartPoints = 0;
		} 
		System.out.println(name + " -- HP "+this.heartPoints + " --- ATK " + this.damage);
	}
	
	public void calculateDamage(int damagePointsOfEnemy) {
		double min = 1.0;
		double max = 2.0;
		double zf = (Math.random() * (max - min)) + min;
		this.heartPoints -= (damagePointsOfEnemy * zf);
		
	}
	
	public void heal() {
		if(potions.size() == 0) {
			System.out.println("Nicht genuegend Heiltränke");
		} else {
			this.heartPoints += this.potions.get(0).healingPoints;
			this.potions.remove(0);			
		}		
	}
	
	public void attack(Actor enemy) {
		System.out.println(this.name + " greift an.");
		double w = Math.random();
		if(w > this.chance) {
			System.out.println(this.name + " verfehlt " + enemy.name);
		} else {
			this.calculateDamage(enemy.damage);
		}		
		this.showLifepoints();
		enemy.showLifepoints();		
	}
}
```


```
public class Item {
	public int healingPoints;

	public Item(int healingPoints) {
		this.healingPoints = healingPoints;
	}
}
```


----------



## Sofasurfer (9. Dez 2014)

ui Vielen Dank, der ist wirklich um einiges übersichtlicher


----------

