2011-01-07 28 views
7

Hey Leute. Ich hatte gehofft, dass jemand mir helfen könnte herauszufinden, wie man die Enumeration erhöhen kann. Ich habe ein Spiel, das Aufzählung verwendet, um die Punkte für das Töten eines Feindes zu erhalten. Ich möchte, dass der Wert des Feindes jedes Mal um 10 erhöht wird, wenn einer der Gegner getötet wird. Hier ist der Code, den ich für die Zählung haben:Was ist der beste Weg, um eine Enumeration zu erhöhen?

public enum gamescore// Enumeration to hold the score values of the enemies 

    { 

    Martian = 10, 

    Vesuvian = 20, 

    Mercurian = 30, 

    Meteor = 50, 

    MotherShip = 100, 

    Destroyer = 200 

    } 

und das Verfahren die Gäste aus einer anderen Klasse aufgerufen werden, wenn ein Feind stirbt:

public int GetScore()// The method that utilieses the enumeration to get the score for the enemy killed 
    { 

     if (this is Martian) 
     { 
      return (int)gamescore.Martian; 
     } 
     else if (this is Vesuvian) 
     { 
      return (int)gamescore.Vesuvian; 
     } 
     else if (this is Mercurian) 
     { 
      return (int)gamescore.Mercurian; 
     } 
     else if (this is Destroyer) 
     { 
      return (int)gamescore.Destroyer; 
     } 
     else if (this is Meteor) 
     { 
      return (int)gamescore.Meteor; 
     } 
     else if (this is Mothership) 
     { 
      return (int)gamescore.MotherShip; 
     } 
     return 0; 
    } 

Irgendwelche Vorschläge? Ich kann nur komplizierte Wege finden, dies zu tun, die ich glaube nicht einmal funktioniert.

Auch ich habe mich gefragt, ich habe eine Highscore-Label, die aktualisiert wird, wenn es weniger als Punktzahl ist, so Highscore wird Punktzahl, aber wenn die Anwendung neu gestartet wird, wenn das Spiel abgeschlossen ist oder wenn der Spieler von Leben ausgeht Highscore wird auf Null zurückgesetzt, gibt es eine Möglichkeit, den Highscore-Wert dort zu halten, sodass immer die höchste Punktzahl vorhanden ist?

Ich schätze all Ihre Hilfe mit meinen Fragen Jungs, ich tue wirklich.

Danke!

+1

Sie haben zwei Fragen hier, bitten sie in zwei aktuelle Fragen trennen. – sgriffinusa

+2

Zu # 1: Polymorphismus. Zeitraum. – delnan

+1

Was meinst du mit: "Ich möchte, dass der Wert des Feindes jedesmal um 10 erhöht wird, wenn einer der Gegner getötet wird"? –

Antwort

6

Dieses Design ist nicht sehr objektorientiert. Ein besserer Ansatz wäre eine IEnemy-Schnittstelle. Diese Schnittstelle würde eine Methode von GetScore (vermutlich unter anderen) erfordern. Diese Methode könnte dann den Wert des Feindes zurückgeben. Dann haben Sie eine separate Klasse für jeden Ihrer Feinde, die die IEnemy-Schnittstelle implementiert.

public interface IEnemy{ 
    int GetScore(); 
} 

public class Martian : IEnemy{ 
    int GetScore(){ return 10; } 
} 

public class Vesuvian : IEnemy{ 
    int GetScore(){ return 20; } 
} 
... 

Dies hat viele Vorteile gegenüber einer Aufzählung verwenden, zum Beispiel können Sie Feinde haben, die die gleiche Punktzahl haben, aber verschiedene andere Attribute.

+0

Das sieht nach einer großartigen Idee aus, danke, ich werde es versuchen und sehen, ob ich es zur Arbeit bringen kann. Vielen Dank! – deucalion0

6

In diesem Fall würde ich es nicht als Enum speichern - es klingt eher wie Entfernungsmarkierungen als diskrete Werte. Ich könnte haben einige Konstanten und eine Methode, die

if(score>100) return "awesome"; 
if(score>40) return "meh"; 

prüft Etc

Aber die Frage nach Inkrementieren eine ENUM zu beantworten: Sie es an die Basis-Typ umwandeln kann (in der Regel int):

myEnumValue = (MyEnum)((int)myEnumValue + 10); 
+0

Ich bin nicht der beste Programmierer, ich bin ein Anfänger, ich benutze Aufzählung, um die Punktzahl zu halten, da es der einzige Weg ist, wusste ich, wie das Mutterschiff und Zerstörer Chef Feinde sind Ich will ihre Calue um zehn Punkte zu erhöhen evrytime ich töte Sie. – deucalion0

+0

@ user567371 - etwas 'const int' könnte dafür ausreichen ... –

2

Warum Aufzählung verwenden? Warum nicht entweder die Schnittstelle IScorable erstellen, die nur die Eigenschaft GetScore hat und sie in Ihre "Enemies" -Klassen implementieren. Dann können Sie testen, ob Ihr Feind IScorable ist und wenn ja, lesen Sie diese Eigenschaft. Oder wenn alle deine gegnerischen Klassen von einem abstammen, dann lege es dort hinein.

Auch die Art, wie Sie Enumeration verwenden, ist falsch. Aufzählungen sind für ganz unterschiedliche Zwecke gedacht.

+0

Entschuldigung, ich wollte nicht zwei Fragen auf einmal erstellen, ich habe einfach nicht gemerkt, dass sie beide große Fragen waren, wenn ich wusste, wie man sie voneinander trennt Ich würde mich entschuldigen! – deucalion0

+0

Sie setzen Ihren Kommentar in falsche Textbox .. – Euphoric

+0

Sorry, ich war verwirrt mit allem auf einmal auf der Seite kommen. Wenn ich wüsste, wie ich es mit einer Schnittstelle erstellen würde, würde ich es mir anschauen! – deucalion0

2

Ich würde eine abstrakte Klasse namens Enemy erstellen, mit einer Eigenschaft namens KillScore (oder was auch immer Sie mögen).Leiten Sie jede Ihrer Gegnertypen aus, dass:

public abstract class Enemy 
{ 
    virtual public int KillScore 
    { 
     get { return 0; } 
    } 
} 

public class Martian : Enemy 
{ 
    public override int KillScore 
    { 
     get { return 10; } 
    } 
} 

// All the other classes here 

public class Destoyer : Enemy 
{ 
    public override int KillScore 
    { 
     get { return 200; } 
    } 
} 

Sie nur instanziiert Ihre einzelnen Klassen, zum Beispiel:

Martian martian = new Martian(); 
    Destoyer destroyer = new Destoyer(); 
    int score = GetScore(martian); 
    score = GetScore(destroyer); 

Dann Ihre GetScore Funktion wird sehr einfach:

public int GetScore(Enemy enemy) 
{ 
    // Debug Statement to show you what this enemy actually is 
    Console.WriteLine("{0} {1}", enemy.GetType(), enemy.KillScore); 
    return enemy.KillScore; 
} 

(Ein Schnittstelle würde auch funktionieren, aber das gibt Ihnen einige Kontrolle über Standardwerte, ermöglicht es Ihnen, einige allgemeine Funktionen in der Basisklasse zu tun, die in den untergeordneten Klassen usw .).

+0

Vielen Dank für deine Hilfe dabei, du hast mir einen großen Hinweis gegeben, wie ich das angehen soll, ich habe bereits die Erbschaft aus einer abstrakten Feindklasse, ich werde deine Idee mit dem GetScore versuchen. Vielen Dank! – deucalion0

+1

Haha, sie sind erstaunlich ähnlich. Große Köpfe denken ähnlich. Obwohl Benutzer567371 wahrscheinlich Ihre akzeptieren sollte, als Sie die Notiz über die Verwendung einer Schnittstelle Vs eine abstrakte Klasse hinzugefügt, die hilft, es zu erklären. –

+0

@Corith - große Köpfe denken gleich, und wir auch ... –

2

Wahrscheinlich wäre Ihre beste Wette Polymorphie zu verwenden. Du hättest also eine Basisklasse namens Feind und es wäre abstrakt.

public abstract class Enemy 
{ 
    public abstract int GetScore(); 
} 

Dann würden Sie von ihm für jedes Mal erben.

public class Martian : Enemy 
{ 
    public int GetScore() { return 10; } 
} 

public class Vesuvian : Enemy 
{ 
    public int GetScore() { return 20; } 
} 

dann in der Hauptmethode, die Sie müssen nur die richtige Art von Feind erstellen:

Enemy blah = new Martian(); 
Enemy blah1 = new Vesuvian(); 

int x = blah.GetScore(); // This is 10. 
int y = blah1.GetScore(); // This is 20. 
+0

+1 für die Beantwortung fast genau die gleiche Weise zur gleichen Zeit wie ich ... :) –

+0

HI, das macht Sinn, aber wie könnte man den Zerstörer bekommen und Mutterschiff um 10 mit deiner Idee zu erhöhen? Vielen Dank! – deucalion0

+0

Sie wären neue Klassen. Ich habe einfach nicht alle Klassen für die Kürze aufgenommen. Und anstatt 10 zurückzugeben, möchtest du dein enum als int zurückgeben. –

Verwandte Themen