Du bist nicht angemeldet.

Stilllegung des Forums
Das Forum wurde am 05.06.2023 nach über 20 Jahren stillgelegt (weitere Informationen und ein kleiner Rückblick).
Registrierungen, Anmeldungen und Postings sind nicht mehr möglich. Öffentliche Inhalte sind weiterhin zugänglich.
Das Team von spieleprogrammierer.de bedankt sich bei der Community für die vielen schönen Jahre.
Wenn du eine deutschsprachige Spieleentwickler-Community suchst, schau doch mal im Discord und auf ZFX vorbei!

Werbeanzeige

Azasel

unregistriert

1

11.08.2016, 15:34

Ich möchte dieses Textadventure verbessern

Guten Tag,

Ich arbeite an ein Textadventure in Java.
Nun würde es mich mal interessieren, was ihr so an meinen Code auszusetzen hättet.
Vielleicht könntet ihr noch ein paar neue Idden nennen(bitte auch beschreiben, wie ich dabei vorgehen sollte).
Oder Verbesserung der Performence durch Strukturierung des Codes(auch hier bitte eine beschreibung).

Wären Klassen sinnvoll ?
Am besten testet ihr das Spiel einmal selbst aus, falls ihr mal Zeit und Lust dazu habt.

Quellcode

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
import java.util.Random;
import java.util.Scanner;

public class Main2 {

    static int enemyPlusHp;
    static int enemyPlusDmg;
    static int enemyHp;
    static int enemyDmg;
    
    static int sword;
    static boolean swordBoolean = true;
    static int swordChanse;
    static String swordText = "keins";
    
    static int playerHp = 200;
    static int playerPlusDmg = 25;
    static int playerDmg;
    
    static int tränke = 3;
    static int tränkeHp = 50;
    static int tränkeChanse;
    
    static int counter = 0;
    
    static boolean runable = true;
    static boolean alive = true;
    
    public static void main(String[] args){
        
        Scanner input = new Scanner(System.in);
        Random rand = new Random();
        
        System.out.println("\t Dungeon Crawler");
        System.out.println("\t ***************");
        
        
        String[] enemys = {"Zombie","Enderman","Skelett","Creeper","Spinne","Hexe"};
        
        while(runable == true && alive == true){
            String enemy = enemys[rand.nextInt(enemys.length)];
            
            if(enemy.equals("Zombie")){
                    enemyPlusHp = 50;
                    enemyPlusDmg = 10;
                
                    enemyHp = rand.nextInt(enemyPlusHp)+20;
                    enemyDmg = rand.nextInt(enemyPlusDmg)+10;
                
            }else if(enemy.equals("Enderman")){
                    enemyPlusHp = 70;
                    enemyPlusDmg = 10;
                    
                    enemyHp = rand.nextInt(enemyPlusHp)+20;
                    enemyDmg = rand.nextInt(enemyPlusDmg)+10;
                
            }else if(enemy.equals("Skelett")){
                    enemyPlusHp = 50;
                    enemyPlusDmg = 15;
                    
                    enemyHp = rand.nextInt(enemyPlusHp)+20;
                    enemyDmg = rand.nextInt(enemyPlusDmg)+10;
                    
            }else if(enemy.equals("Creeper")){
                    enemyPlusHp = 9;
                    enemyPlusDmg = 50;
                    
                    enemyHp = rand.nextInt(enemyPlusHp)+1;
                    enemyDmg = rand.nextInt(enemyPlusDmg)+50;
                        
            }else if(enemy.equals("Spinne")){
                    enemyPlusHp = 40;
                    enemyPlusDmg = 10;
                    
                    enemyHp = rand.nextInt(enemyPlusHp)+30;
                    enemyDmg = rand.nextInt(enemyPlusDmg)+10;
                            
            }else if(enemy.equals("Hexe")){
                    enemyPlusHp = 70;
                    enemyPlusDmg = 15;
                    
                    enemyHp = rand.nextInt(enemyPlusHp)+30;
                    enemyDmg = rand.nextInt(enemyPlusDmg)+10;
             }
            
            System.out.println("--------------------------------");
            System.out.println("Ein(e) "+enemy+" ist erschienen");  
            System.out.println("Dein Equip: "+swordText);
            
            while(enemyHp >= 1){
                playerDmg = rand.nextInt(playerPlusDmg)+10+sword;
                
            System.out.println(" ");
            System.out.println("Was wirst du jetzt machen ?");
            System.out.println("\t 1. angreifen");
            System.out.println("\t 2. blocken");
            System.out.println("\t 3. Heiltrank trinken("+tränke+")");
            System.out.println("\t 4. Spielanleitung");
            System.out.println("Dein Hp: "+playerHp);
            System.out.println("Name: "+enemy+". HP: "+enemyHp+".     (Dmg: "+enemyDmg+")");
            String eingabe = input.nextLine();
            System.out.println("-------------------------------");
            
            if(eingabe.equals("1")){
                enemyHp -= playerDmg;
                playerHp -= enemyDmg;
                
                System.out.println("Du hast "+enemy+" "+playerDmg+" Schaden zugefügt");
                System.out.println(enemy+" hat dir "+enemyDmg+" Schaden zugefügt");
                
            }
            if(eingabe.equals("2")){
                enemyHp -= playerDmg /3;
                playerHp -= enemyDmg /2;
                
                System.out.println("Du hast "+enemy+" "+playerDmg /3+" Schaden zugefügt");
                System.out.println(enemy+" hat dir "+enemyDmg /2+" Schaden zugefügt");
                
            }
            
            if(eingabe.equals("3")&& tränke > 0){
                System.out.print("Du hast ein Trank benutzt");
                playerHp += tränkeHp;
                tränke--;
                
                
            }
            
            if(eingabe.equals("4")){
                System.out.println("Hier gebe ich dir ein paar Daten mit, die nützlich seien können.");
                System.out.println("\t Blocken ist das selbe wie angreiffen bloß : Dein Damage verliert 1/3 der Stärke ...");
                System.out.println("\t ... Der Gegner allerding, zieht dir nur 1/2 weniger(nützlich bei Creeper)");
                System.out.println("Die Chanse ein Schwert einmalig zu droppen liegt bei 10%(ab 3 getöteten Gegnern)");
                System.out.println("Die Chanse ein Trank zu droppen liegt bei 20%");
                System.out.println("-------------------------------");
                System.out.println("Der Aufbau des Codes lehnt sich etwas einem YT Video an ...");
                System.out.println("... aber nur das Prinzip, etwa 4/5 des Codes habe ich eigenständing ...");
                System.out.println("... implementiert. Auch die Ideen mit dem Schwert und Gegnervariationen");
                System.out.println("\n zurück (z)");
                System.out.println("-------------------------------");
                
                String zurück = input.nextLine();
            }
            
            if(playerHp < 1){
                alive = false;
                break;
            }
            
            }
            counter++;
            tränkeChanse = rand.nextInt(100);
            if(tränkeChanse <= 20){
                System.out.println("Der Gegner "+enemy+" hat ein Trank fallen gelassen");
                tränke++;
                
            }
            swordChanse = rand.nextInt(100);
            if(counter >= 3 && swordBoolean == true && swordChanse <= 10){
                System.out.println("Der Gegner hat ein Schwert(+8 Dmg) fallen gelassen");
                sword = 8;
                swordBoolean = false;
            }
            if(swordBoolean == false){
                swordText = "Schwert";
                //System.out.println("Count:"+counter);
            }
            
        }
        
        System.out.println("Du bist gestorben");
        System.out.println("Du hast insgesamt "+counter+" Gegner besiegt");
        
        
        
        
        
        //Exit
    }
}

KeksX

Community-Fossil

Beiträge: 2 107

Beruf: Game Designer

  • Private Nachricht senden

2

11.08.2016, 16:00

Getestet habe ich das Spiel jetzt nicht, aber möchte dennoch ein bisschen Feedback zum Code geben:

Klassen wären definitiv sinnvoll. Jetzt ist natürlich die Frage "Welche"? Mein Vorschlag wäre eine Klasse zu haben, die für Out- und Input zuständig wäre (sowas wie eine Menüklasse bzw entsprechendes Interface), und eine die in der Lage ist Text basierend auf dem aktuellen Fortschritt auszugeben (und diesen Zustand zu verändern; Stichwort Finite State Machines).

Jetzt weiß ich natürlich nicht, wie gut deine Programmierkenntnisse sind. Falls dir Klassen selbst neu sind - und deine Frage nach Sinn lässt das vermuten - solltest du diese erstmal ordentlich lernen, damit du auch weißt, was du mit den oben genannten Stichworten anfangen sollst.
WIP Website: kevinheese.de

BlueCobold

Community-Fossil

Beiträge: 10 738

Beruf: Teamleiter Mobile Applikationen & Senior Software Engineer

  • Private Nachricht senden

3

11.08.2016, 19:07

Was mir als erstes in's Auge sprang war das grauenvolle if else (enemy.equals. Das ließe sich ganz prima lösen, indem es eine Klasse für einen Gegner gäbe, die im Konstruktor den Namen, sowie die entsprechenden Werte entgegen nimmt. Dann könnten in 6 Zeilen alle Gegner-Typen wunderbar kompakt erstellt werden.
Teamleiter von Rickety Racquet (ehemals das "Foren-Projekt") und von Marble Theory

Willkommen auf SPPRO, auch dir wird man zu Unity oder zur Unreal-Engine raten, ganz bestimmt.[/Sarkasmus]

Jar

Treue Seele

Beiträge: 197

Wohnort: Lübeck

Beruf: Softwareentwickler

  • Private Nachricht senden

4

12.08.2016, 08:50

Java ist eine objektorientierte Programmiersprache, also benutzte die Vorteile am beste auch.
Deine statischen Variablen resultieren auch nur aus der nicht vorhandenen Objektorientierung.
Performance sollte man erst untersuchen, wenn es zu Problemen kommt, sonst steckt man unnötige Arbeitszeit hinein.
Du sollest auch dafür sorgen, dass deine Daten und Logik von deiner View (Benutzeroberfläche, Ausgaben) getrennt ist. Stichwort MVC (https://de.wikipedia.org/wiki/Model_View_Controller)

Versuche am besten dich mit OO zu beschäftigen, bevor du versuchst dein Spiel weiter zu entwickeln.
Du kannst natürlich auch versuchen dein Spiel objektorientiert umzuschreiben.
Konkrete Tipps kann man dir erst geben, wenn du das geschafft hast. Vorher bringt es leider nichts.

Dein Spiel ist derzeit nur schwer erweiterbar oder wartbar.

Als kleines Beispiel, oder Frage.
Was müsstest du an deinem Programm verändert, um einen neuen Gegnertypen einzubauen?

Wenn dein Programm gut erweiterbar wäre, müsstest du nur einige wenige Minuten damit verbringen, wenn nicht sogar weniger als eine Minute.

Ich hoffe ich habe dich nicht abgeschreckt. Aber ein Textadventure kann genauso anspruchsvoll sein wie ein 3D RGP und braucht deshalb auch eine gute Architektur.

Beste Grüße,
Jar

Azasel

unregistriert

5

12.08.2016, 22:47

Klassen wären definitiv sinnvoll. Jetzt ist natürlich die Frage "Welche"? Mein Vorschlag wäre eine Klasse zu haben, die für Out- und Input zuständig wäre (sowas wie eine Menüklasse bzw entsprechendes Interface), und eine die in der Lage ist Text basierend auf dem aktuellen Fortschritt auszugeben (und diesen Zustand zu verändern; Stichwort Finite State Machines).


Ich glaube so weit bin ich noch nicht, dass ich schon mit FSM arbeiten sollte^^

Was mir als erstes in's Auge sprang war das grauenvolle if else (enemy.equals. Das ließe sich ganz prima lösen, indem es eine Klasse für einen Gegner gäbe, die im Konstruktor den Namen, sowie die entsprechenden Werte entgegen nimmt. Dann könnten in 6 Zeilen alle Gegner-Typen wunderbar kompakt erstellt werden.


Danke für dein hartes Feedback :D
Ich habe eine Klasse für Gegner implementiert, doch weiss jetzt nicht wie ich zufällig eins von den 2 erzeugten Klassen auswählen kann(siehe Code).
Schließlich sind Klassen kein Array in der Art, vermute ich.

Deine statischen Variablen resultieren auch nur aus der nicht vorhandenen Objektorientierung.


Heisst das, ich solte versuchen komplett auf Statische Variablen zu verzichten ?(



Für mich nur sehr schwer zu Begreifen, tut mir leid, vielleicht bin ich einfach zu Doff dafür, liegt nicht nur an meinen Englischkenntnissen.

------------------------------
Hier der Code:
Komme nicht mehr weiter wegen(Siehe Antwort an BlueCobold)

Quellcode

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
import java.util.Random;
import java.util.Scanner;

public class player {
    
    static Scanner input = new Scanner(System.in);
    static Random rand = new Random();
    
    static int playerHp = 200;
    static int playerDmg = 20;
    static int enemyDmg;

    public static void main(String[] args){
        enemy gegner1 = new enemy(100, 50, 50);
        enemy gegner2 = new enemy(80, 40, 40);
        
    }
}
class enemy{
    
    Random rand = new Random();
    
    int enemyHp;
    int enemyPlusDmg;
    int enemyDmg;
    
    enemy(int Hp, int Dmg, int PlusDmg){
        this.enemyHp = Hp;
        this.enemyDmg = Dmg;
        this.enemyPlusDmg = PlusDmg;
    }

}


Falls noch Interesse daran besteht mir zu helfen, bitte ich um noch mehr harte Kritik.
Ich werde versuchen es möglichst nach Bedarf umzusetzen.

Jar

Treue Seele

Beiträge: 197

Wohnort: Lübeck

Beruf: Softwareentwickler

  • Private Nachricht senden

6

15.08.2016, 09:10

Heisst das, ich solte versuchen komplett auf Statische Variablen zu verzichten

Ja, das soll es. Statische Variablen benutzt man im Idealfall für Constanten. Nur selten braucht man sie als Klassenattribute.

Am besten du schaust dir erstmal ein Buch oder ein Youtube Video zum Thema OO an.
Hier kann man das auch alles gut Nachschlagen: http://openbook.rheinwerk-verlag.de/oop/

Für mich nur sehr schwer zu Begreifen, tut mir leid, vielleicht bin ich einfach zu Doff dafür, liegt nicht nur an meinen Englischkenntnissen.

... Es ist noch kein Meister vom Himmel gefallen. Für den Anfang solltest du dir kleine Aufgaben suchen.

7

15.08.2016, 16:05

Statische Variablen müssen auch immer im RAM gehalten und können nicht vom Garbage Collector freigegeben werden, erzeugen somit also auch einen Overhead.
Da Java eine Objekt orientierte Programmiersprache ist, benötigt man static wohl eher selten, da es der prozedualen Programmierung wie in C / C++ (letzteres eher weniger) entspricht.
static solltest du vorallem bei Konstanten (zusammen mit final) einsetzen, sowie beim Design Pattern Singleton, wenn du nur eine Instanz der Klasse haben willst (die Klasse Player sollte aber nicht nur 1 Instanz besitzen können). Natürlich gibt es noch weitere Anwendungsfälle, auf die ich hier auf nicht genauer eingehen will - das würde wohl hier den Rahmen sprengen. :D

Hier mal ein Link dazu:
Verwendung von static

Außerdem wäre auch ein public, protected und private vor den Variablen / Methoden der Klasse zu empfehlen. :D

Quellcode

1
2
3
4
static int sword;
static boolean swordBoolean = true;
static int swordChance1;//wegen der Rechtschreibprüfung im Forum umbenannt
static String swordText = "keins";


Das könnte z.B. schon mal in eine Klasse:

Quellcode

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
class Sword {
  
  protected int sword = 0;
  protected boolean swordBoolean = true;
  protected int chance = 0;//wegen der Rechtschreibprüfung im Forum umbenannt
  protected String swordText = "keins";

  /*
  * default constructor
  */
  public void Sword (/* evtl. Initialvariablen hier übergeben ... */) {
    //...
  }

  //...

}


Folgende Klassen wären z.B. bei dir überlegenswert: Player, Enemy, Item, Traenke (ins englische übersetzen), Game (mit Eingaben und Ausgaben, als eine Art Controller)

Ich habe nicht den Sinn deiner Variablen überprüft, sondern das ganze einfach 1 : 1 übernommen und in eine Klasse gepackt - über eine sinnvolle Namensgebung solltest du also selbst nochmal nachdenken.

Bezüglich Naming Conventions:
Oracle Dokumentation

Die wichtigsten zusammengefasst:
  • Packages werden klein geschrieben
  • Interface- & Klassennamen beginnen immer groß, player --> Player
  • Variablennanen beginnen klein
  • Konstanten bekommen ein (public) static final davor (public - damit du von überall darauf zugreifen kannst, static - damit es nur eine Instanz gibt, final - damit es eine Konstante ist und das JDK / die JVM hier einiges weg optimieren kann, sowie das ganze Thread safe ist und im L2 Cache der CPU gecached werden darf)

Bezüglich Performance Optimierungen:
Das meiste optimiert das JDK / die JVM bereits für dich, hier musst du nur nochmal optimieren, wenn es notwendig ist - bei deinem Spiel wohl eher nicht.

Allerdings fällt mir noch folgendes auf:

Quellcode

1
2
3
4
5
6
7
if(enemy.equals("Zombie")){
  enemyPlusHp = 50;
  enemyPlusDmg = 10;
                
  enemyHp = rand.nextInt(enemyPlusHp)+20;
  enemyDmg = rand.nextInt(enemyPlusDmg)+10;
}


Die Variablen enemyPlusHp und enemyPlusDmg werden bei jedem Schleifendurchlauf neu erstellt, obwohl sich der Wert nicht ändert.
Diese Variablen sollten wohl - wenn überhaupt - eher Konstanten sein und aus der while Schleife entfernt werden.
Allerdings wären sie bei dir wohl eher in einer Enemy Klasse besser aufgehoben.
Indie Game-Dev Programmierer beim 2D MMORPG Pentaquin | Pentaquin Foren Vorstellung

BlueCobold

Community-Fossil

Beiträge: 10 738

Beruf: Teamleiter Mobile Applikationen & Senior Software Engineer

  • Private Nachricht senden

8

15.08.2016, 19:03

sowie beim Design Pattern Singleton, wenn du nur eine Instanz der Klasse haben willst
Ich führe das lieber nochmal explizit aus: Ein Singleton ist nicht dafür gedacht, dass man damit Variablen hält, von denen man nur eine haben will. Ein Singleton ist einzusetzen (und nur dann), wenn es unter gar keinen Umständen jemals mehr als eine Instanz davon geben darf. Jede andere Verwendung ist eine Pseudo-Klassen-Gestaltung einer globalen+statischen Variable. Das ist kein Objekt-Orientierungs-Globale-Variablen-Schönmach-Pattern.
Teamleiter von Rickety Racquet (ehemals das "Foren-Projekt") und von Marble Theory

Willkommen auf SPPRO, auch dir wird man zu Unity oder zur Unreal-Engine raten, ganz bestimmt.[/Sarkasmus]

Azasel

unregistriert

9

19.08.2016, 14:57

Hey ^^ ,

Ich bin schon seit Tagen dabei meinen Quellcode zu überarbeiten bzw. in Klassen zu packen.
Ich habe auch einigermaßen gelernt mit Klassen umzugehen.
Das hat dann auch gut hingehauen, bis auf ein paar Sachen, zu den komme ich gleich.

Folgende Klassen wären z.B. bei dir überlegenswert: Player, Enemy, Item, Traenke (ins englische übersetzen), Game (mit Eingaben und Ausgaben, als eine Art Controller)

Die Klasse Tränke und Item habe ich erstmal weggelassen(Siehe Code).

Hier der überarbeitete Code:

Quellcode

1
2
3
4
5
6
7
8
package dungeon;

public class Gamestarter {

    public static void main(String[] args){
        new Game();
    }
}


Quellcode

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
package dungeon;

import java.util.ArrayList;
import java.util.List;
import java.util.Random;
import java.util.Scanner;

public class Game {
    private Player player;
    private List<Enemy> enemies = new ArrayList<>();
    private Random rand = new Random();
    private Scanner input = new Scanner(System.in);
    
    private int pseudo;
    
    private boolean runable = true;
    private boolean alive = true;
    private boolean shopIn = true;
    
    public Game(){
        player = new Player(200, 5, 25);
    
    while(runable == true && alive == true){
        
    Enemy gegner1 = new Enemy("Zombie", 20, 10, 50, 10, 1, 10, 4, 10);
    Enemy gegner2 = new Enemy("Skelett", 20, 20, 50, 15, 1, 10, 4, 10);
    Enemy gegner3 = new Enemy("Creeper", 1, 50, 9, 50, 1, 10, 4, 10);
    Enemy gegner4 = new Enemy("Enderman", 20, 10, 70, 10, 5, 10, 5, 20);
    Enemy gegner5 = new Enemy("Spinne", 30, 10, 40, 10, 1, 10, 4, 10);
    Enemy gegner6 = new Enemy("Hexe", 30, 10, 70, 15, 5, 10, 5, 20);

    //Gegner in die Liste eintragen
    enemies.add(gegner1);
    enemies.add(gegner2);
    enemies.add(gegner3);
    enemies.add(gegner4);
    enemies.add(gegner5);
    enemies.add(gegner6);
    
    //zufällig einen Gegner auswählen
    pseudo = rand.nextInt(enemies.size());
    
    //neuer Gegner spawnen lassen
    System.out.println("--------------------------------");
    System.out.println("Ein(e) "+enemies.get(pseudo).getName()+" ist erschienen");  
    System.out.println("Dein Level: "+player.getLevel());
    
    while(enemies.get(pseudo).getHp() >= 1){
        
    System.out.println(" ");
    System.out.println("Was wirst du jetzt machen ?");
    System.out.println("\t 1. angreifen");
    System.out.println("\t 2. blocken");
    System.out.println("\t 3. Heiltrank trinken ("+player.getTränke()+")");
    System.out.println("\t 4. Bombe werfern ("+player.getBomben()+")");

    System.out.println("Dein Hp: "+player.getHp());
    System.out.println("Name: "+enemies.get(pseudo).getName()+". HP: "+enemies.get(pseudo).getHp()+".     (Dmg: "+enemies.get(pseudo).getDmg()+")");
    String eingabe = input.nextLine();
    System.out.println("-------------------------------");
    
    //angreifen 
if(eingabe.equals("1")){
    player.setHp(enemies.get(pseudo).getDmg());
    enemies.get(pseudo).setHp(player.getDmg());
    
    System.out.println("Du hast "+enemies.get(pseudo).getName()+" "+player.getDmg()+" Schaden zugefügt");
    System.out.println(enemies.get(pseudo).getName()+" hat dir "+enemies.get(pseudo).getDmg()+" Schaden zugefügt");
    
}
if(eingabe.equals("2")){
    player.setHp(enemies.get(pseudo).getDmg() /2);
    enemies.get(pseudo).setHp(player.getDmg() /3);
    
    System.out.println("Du hast "+enemies.get(pseudo).getName()+" "+player.getDmg()/3+" Schaden zugefügt");
    System.out.println(enemies.get(pseudo).getName()+" hat dir "+enemies.get(pseudo).getDmg()/2+" Schaden zugefügt");
    
}

if(eingabe.equals("3")&& player.getTränke() > 0){
    System.out.print("Du hast ein Trank benutzt");
    player.setHp(-50);
    player.setTränke(-1);
    
    
}
if(eingabe.equals("4")&& player.getBomben() >= 1){
    player.setBomben(1);
    enemies.get(pseudo).setHp(60);
    System.out.println("Du hast "+enemies.get(pseudo).getName()+" 60 Schaden zugefügt");
    
}
    }
    }
    }
}


Quellcode

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
package dungeon;

import java.util.Random;

public class Entity {
    
    private Random rand = new Random();

    private String name;
    private int hp;
    private int dmg;
    private int randomHp;
    private int randomDmg;
    private int plusHp;
    private int plusDmg;
    private int coints;
    private int xp;
    private int plusCoints;
    private int plusXp;
    private int randomCoints;
    private int randomXp;
    
    public Entity(String name, int plusHp, int plusDmg, int randomHp, int randomDmg, int plusCoints, int plusXp, int randomCoints, int randomXp){
        this.name = name;

        this.hp = rand.nextInt(randomHp)+plusHp;
        this.dmg = rand.nextInt(randomDmg)+plusDmg;
        this.coints = rand.nextInt(randomCoints)+plusCoints;
        this.xp = rand.nextInt(randomXp)+plusXp;
        
    }
    
    public Entity(int hp, int plusDmg, int randomDmg){
        this.hp = hp;
        this.dmg = rand.nextInt(randomDmg)+plusDmg;
    }
    
    public void setHp(int gegner){
        hp -= gegner;
    }
    
    public int getHp(){
        return hp;
    }
    
    public int getDmg(){
        return dmg;
    }
    
    public String getName(){
        return name;
    }
}


Quellcode

1
2
3
4
5
6
7
8
package dungeon;

public class Enemy extends Entity {
    
     public Enemy(String name, int plusHp, int plusDmg, int randomHp, int randomDmg, int plusCoints, int plusXp, int randomCoints, int randomXp){
        super(name, plusHp, plusDmg, randomHp, randomDmg, plusCoints, plusXp, randomCoints, randomXp);
    }
}


Quellcode

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
package dungeon;

public class Player extends Entity{
    
    private int coints = 0;
    private int xp = 0;
    private int level = 0;
    private int tränke = 3;
    private int bomben = 1;

    public Player(int hp, int plusDmg, int randomDmg) {
        super(hp, plusDmg, randomDmg);
    
    }
    
    public int getLevel(){
        return level;
    }
    
    public int getTränke(){
        return tränke;
    }
    
    public int getCoints(){
        return coints;
    }
    
    public int getBomben(){
        return bomben;
    }
    
    public void setTränke(int zahl){
        this.tränke += zahl;
    }
    
    public void setBomben(int zahl){
        this.bomben -= zahl;
    }
    
    public void setCoints(int zahl){
        this.coints += zahl;
    }
}


Das Problem ist folgendes:
Beim starten werden 6 Klasseninstanzen von Enemy angelegt und in die ArrayList() eingeordnet.
Danach wird zufällig ein Gegner aufgerufen.
Das Problem ist eigentlich, dass jedes mal von neuem 6 Klasseninstanzen erzeugt werden und ob dass der Performance schadet, weiss ich nicht.
Und ich hätte es gerne so, das die Playerinstanz jedes mal unterschiedlich viel Damage macht.
Ich glaube ich habe ein paar Fehler gemacht und bin etwas verwirrt, weil Klassen für mich noch etwas neu sind.
Hoffentlich bin ich nicht mit zu viel Code hier angekommen, bei Bedarf versuche ich den Code zu kürzen und nur die wichtigen Stellen rauszuschneiden.

Ps. Prozendual zu Arbeiten war für mich viel einfacher, sogar weniger Code aber auf Kosten von unsauberem Code :) .

10

19.08.2016, 21:46

Die Klassen werden von dir als Datenspeicher verwendet wie eine Datenstruktur. Da werden die Vorteile gegenüber prozeduraler Programmierung nicht so deutlich. Trotzdem gibt es für den Anfang bereits genug zu verstehen, das weitere Verständnis kann dann später kommen:

- Was ist der Unterschied zwischen der Definition einer Klasse und einer Instanz dieser Klasse (das liefert auch schon eine erste Erklärung zu statischen Variablen oder Routinen).
- Was ist der Unterschied zwischen einem einfachen Datentyp und einem Object?
- Welchen Gültigkeitsbereich hat eine Variable, wo ist der Unterschied bei Private, Protected und Public?
- Was ist Datenkapselung, Getter und Setter oder was ist eine Membervariable und was eine Property?

... und natürlich, was bringt es mir? Welchen Vorteil habe ich wenn ich Daten zusammenfasse und organisiere? Welchen Vorteil für mein aktuelles (Teil-)Problem?

Ein möglicher nächster Schritt wäre dann z.B. Methoden. Die Verarbeitungslogik hast du in deiner Spieleschleife (mit kleinen Ausnahmen). Hier ist wieder die Frage: welchen Vorteil habe ich wenn ich z.B. eine Methode "Entity-haut-Entity" implementiere? Warum die Methode in die Klasse Entity implementieren und nicht in die Klasse Player und Enemy? Solange du hier keinen Vorteil sieht würde ich es nicht machen und weiterhin prozedural vorgehen. Prozedural ist auch nicht schlecht, Parameter und Argumente, der Unterschied zwischen einer Funktion und einem Unterprogramm, Übergabe als Referenz oder Wert, all das ist auch in der objektorientierten Programmierung Handwerkszeug.

Deine Spieleschleife ist ganz ordentlich. In der ersten Schleife wird ein Gegner ausgesucht, in der zweiten Schleife rundenbasiert der Kampf ausgeführt. Das Leben kann negativ werden und der Spieler stirbt nie. Hier fehlt noch eine entsprechende Prüfung und verlassen der Schleife(n)
Die initialisierung der Enemy-Liste könntest du vor der ersten Schleife durchführen.
Entity enthält noch Variablen die nicht verwendet werden. Aber das ist nicht so schlimm.
Um variabel Schaden zuzufügen ersetze den Wert durch einen Zufallswert. Zufallswerte verwendest du bereits, es gibt sicher eine Möglichkeit einen Min/Max-Wert anzugeben (Sorry ich hab keine Ahnung von Java).

Wie soll es denn weitergehen mit deinem Spiel? Im Moment sieht es ein wenig nach einem Pokemon-Kampf aus, man steht den Gegner gegenüber und kann dann eine Aktion wählen und ausführen bis einer von beiden tot ist.

Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von »IsaacCohen« (19.08.2016, 22:00)


Werbeanzeige