Zum Inhalt springen

Indizes für Waffenprobe vergleichen


Empfohlene Beiträge

Geschrieben

Guten Abend zusammen,

da ich im Netz keine wirklich zufriedenstellende Lösung auf meine Frage gefunden habe, wende ich mich wieder mal an dieses Forum. Wer es vielleicht noch weiss, verfolge ich ein gewisses Lernprojekt in Form eines Computerspiels.

Logischerweise gehören zu meinem Spiel auch Waffen. Bevor ein Spieler eine Waffe allerdings anlegen kann, soll er eine Waffenprobe ablegen. In meinem Beispiel habe ich 3 Werte genommen, welche der Spieler als auch die Waffe besitzten. Sollte ein Wert des Spielers zu gering für die gewünschte Waffe sein, so wird die Waffenprobe fehlschlagen und dem Spieler verwert die Waffe zu tragen. In meiner Idee habe ich die Werte des Spielers sowie die Werte der Waffe jeweils in ein Arrey gepackt, welche dann mittels Methode auf jeden einzelnen Index überprüft werden. Die meisten Antworten im Netz beziehen sich meist auf einen Vergleich der beiden Arreys (gleiche Größe u.s.w.). In meinem Fall muss allerdings jeder Index gegeneinander geprüft werden. In meinem code funktioniert dies auch soweit sehr gut, allerdings bin ich mir bei dem Lösungsweg nicht 100% sicher. Vielleicht bin ich bisher auch noch nicht weit genug fortgeschritten mit meinem Wissen, dennoch kommt mir der erschaffene code etwas sehr "rustikal" vor.

 

namespace ArreyTrainig
{
    class Program
    {
        static void Main(string[] args)
        {
            int _strength = 10;
            int _agilty = 25;
            int _knowledge = 20;

            int _wstrength = 10;
            int _wagility = 25;
            int _wknowledge = 40;

            int[] playerArrey = { _strength, _agilty, _knowledge };
            int[] weaponArrey = { _wstrength, _wagility, _wknowledge};

            WeaponCheck(playerArrey, weaponArrey);

            bool _checked = WeaponCheck(playerArrey, weaponArrey);

            if (_checked)
            {
                Console.WriteLine("Waffenprobe erfolgreich");
            }
            else Console.WriteLine("Waffenprobe fehlgeschlagen");

            Console.ReadKey();
        }

        static bool WeaponCheck(int[]player, int[] weapon)
        {
            bool arreyCheck = false;

            for(int i = 0; i < player.Length; i++)
            {
                for(int j = 0; j < weapon.Length; j++)
                {
                    if (player[0] >= weapon[0] && player[1] >= weapon[1] && player[2] >= weapon[2])
                    {
                        arreyCheck = true;
                    }
                }
            }

            return arreyCheck;
        }

    }

}

Ich würde gerne eure fachmännische Meinung dazu hören bzw. eventuelle elegantere Lösungsansätze kennenlernen um mein Wissen diesbezüglich zu erweitern.

mit freundlichen Grüßen

Gewinde 🙂

Geschrieben (bearbeitet)

Dein Code ergibt keinen Sinn, wozu brauchst du den Loop über `player` in `WeaponCheck`? Wenn du nur drei Werte hast, brauchst du nicht sowas kompliziertes, vergleiche einfach die drei Werte.

static bool WeaponCheck(int[]player, int[] weapon)
{
    // TODO: check if parameters are valid (player size == 3 && weapon size == 3)
    return player[0] >= weapon[0] && player[1] >= weapon[1] && player[2] >= weapon[2]
}

Alternativ kannst du für diese Attribute ein struct/object/class erstellen, welches diese Attribute beinhaltet und die Logik zur Überprüfung gekapselt hat. Das spielt dir in die Karten - sowohl im Punkt Testbarkeit als auch SRP.

Aber für den Anfang sollte so ein simpler Vergleich reichen.

 

Bearbeitet von r00t
Geschrieben
vor 10 Stunden schrieb r00t:

Alternativ kannst du für diese Attribute ein struct/object/class erstellen, welches diese Attribute beinhaltet und die Logik zur Überprüfung gekapselt hat. Das spielt dir in die Karten - sowohl im Punkt Testbarkeit als auch SRP.

Nicht nur alternativ, sondern sollte unbedingt gemacht werden. Wer versteht denn nach 2 Wochen, was das Array soll? Im Array stecken nun Werte, die nicht den gleichen Kontext haben. Sie haben zwar alle den gleichen Datentyp aber sie sind nun mal nicht gleich. Du müsstest also anfangen eine Dokumentation zu schreiben, wie das Array aufgebaut ist. Das ist sehr mühselig und sehr fehleranfällig. Man sieht ja schon die Problematik in deinem Code. Du fängst an, den Variablennamen einen Präfix zu vergeben, damit du sie auseinanderhalten kannst.

Der Name playerArray und WeaponArray suggieren auch, dass wir es hier mit mehreren Spielern und mehreren Waffen zu tun haben und nicht mit einem Spieler bzw einer Waffe. Warum also nicht zwei Klassen mit den Namen Player und Weapon anlegen, die dann ihre zugehörigen Eigenschaften besitzen?

Der Methodenname "WeaponCheck" ist auch nicht so toll, da der Name nicht sagt, was überprüft werden soll. Vielleicht eher sowas wie "CanPlayerHandleWeapon".

Und noch was: Variablen mit einem vorausgehenden Unterschrich im Namen, legt man an, wenn es Klassenvariablen sein sollen. Also Variablen, die überall in der Klasse verfügbar sein sollen. Du legst sie aber als lokale Variablen an.

Geschrieben

Hallo,

mein Beispiel ist im Zuge einfacher Tests zustande gekommen. Viele möglichkeiten sind für einen Laihen relativ schwer verständlich erklärt. Später soll eine ähnliche Methode in meinem Programm integriert werden, allerdings nicht so wie dort geschrieben (was die Variablen u.s.w. angeht), aber du hast diesbezüglich natürlich recht. Ich versuche mich demnächst mehr an die Konventionen zu halten. 🙂

In meiner Vorstellung, wird ein Objekt Character bei dem Versuch eine Waffe anlegen zuwollen, immer eine Waffenprobe durchführen müssen. Objekt Character vs. Objekt RngdWeapon oder Objekt Character vs. Objekt MeleeWeapon. Es sollen dabei aber nicht alle Werte der Objekte verglichen werden, sondern nur diese, welche für eine Probe wichtig sind. Daher bestand meine Idee darin, eine Methode in die Klasse zu integrieren, welche festgelegte Werte der beiden verschiedenen Klassen vergleicht. Wenn ich Objekt mit Objekt vergleiche, dann würde ich für mein Verständniss versuchen Werte des Objektes Character mit den nicht vorhandenen Werten im Objekt RngdWeapon zu vergleichen. Einen Wert Runspeed würde es z.B. im Objekt RngdWeapon nicht geben. Allerdings würde es eventuell die Werte z.B. RngdWeaponSpeed in beiden Objekten geben, welche aber nicht verglichen werden sollen.

Daher kam meine Idee mit dem Arrey zustande. Structs wurden in meinem Tutorial noch nicht durchgenommen, ich beginne jetzt mich langsam in die oop einzuarbeiten.

Lieben Gruß

Gewinde

Geschrieben
vor 33 Minuten schrieb Gewinde:

In meiner Vorstellung, wird ein Objekt Character bei dem Versuch eine Waffe anlegen zuwollen, immer eine Waffenprobe durchführen müssen.

Dann mach das doch. ;)

vor 33 Minuten schrieb Gewinde:

Objekt Character vs. Objekt RngdWeapon oder Objekt Character vs. Objekt MeleeWeapon. Es sollen dabei aber nicht alle Werte der Objekte verglichen werden, sondern nur diese, welche für eine Probe wichtig sind.

Nur weil du Objekte in eine Methode reinreichst, musst du doch nicht alle Eigenschaften eines Objektes benutzen. ;)

vor 53 Minuten schrieb Gewinde:

Wenn ich Objekt mit Objekt vergleiche, dann würde ich für mein Verständniss versuchen Werte des Objektes Character mit den nicht vorhandenen Werten im Objekt RngdWeapon zu vergleichen.

Du kannst sowieso ein Spieler nicht mit einer Waffe vergleichen. Du musst sowieso die Werte miteinander vergleichen.

public bool CanPlayerHandleWeapon(Player player, Weapon weapon)
{
  return player.Strength >= weapon.Strength
    && player.Agility >= weapon.Agility
    ...
}

 

 

Geschrieben

Ich glaube in manchen Situationen denke ich noch zu kompliziert. Manchmal ist die Lösung eigentlich recht simpel. Ich werde Diese Lösung so weiter verfolgen und in den Code integrieren. Allerdings dauert es bis dahin noch etwas, habe auf euer Raten nochmal die Grundkenntnisse mittels Videolernkurs vertieft und beginne gerade erneut mit der oop.

Danke vielmals 🙂

Dein Kommentar

Du kannst jetzt schreiben und Dich später registrieren. Wenn Du ein Konto hast, melde Dich jetzt an, um unter Deinem Benutzernamen zu schreiben.

Gast
Auf dieses Thema antworten...

×   Du hast formatierten Text eingefügt.   Formatierung wiederherstellen

  Nur 75 Emojis sind erlaubt.

×   Dein Link wurde automatisch eingebettet.   Einbetten rückgängig machen und als Link darstellen

×   Dein vorheriger Inhalt wurde wiederhergestellt.   Editor leeren

×   Du kannst Bilder nicht direkt einfügen. Lade Bilder hoch oder lade sie von einer URL.

Fachinformatiker.de, 2024 by SE Internet Services

fidelogo_small.png

Schicke uns eine Nachricht!

Fachinformatiker.de ist die größte IT-Community
rund um Ausbildung, Job, Weiterbildung für IT-Fachkräfte.

Fachinformatiker.de App

Download on the App Store
Get it on Google Play

Kontakt

Hier werben?
Oder sende eine E-Mail an

Social media u. feeds

Jobboard für Fachinformatiker und IT-Fachkräfte

×
×
  • Neu erstellen...