Rückfragen zu Quellcodes / Verbesserungsvorschläge?

    Diese Seite verwendet Cookies. Durch die Nutzung unserer Seite erklären Sie sich damit einverstanden, dass wir Cookies setzen. Weitere Informationen

    • Rückfragen zu Quellcodes / Verbesserungsvorschläge?

      Ich habe mir gedacht ein Thread wo man Quellcodes posten kann um sich ein Feedback zu holen oder eventuell sogar Verbesserungsvorschläge macht zumindest für solche Anfänger wie mich Sinn :-).

      Also hier einfach mal der erste Teil mit dem ich bis jetzt fertig bin (nachfolgend muss ich mich in Markierungen reinwuseln das dauert noch 1-2 Tage bis der nächste Teil kommt ^^) :

      Quellcode

      1. using System;
      2. using System.Collections.Generic;
      3. using AntMe.Deutsch;
      4. // Füge hier hinter AntMe.Spieler einen Punkt und deinen Namen ohne Leerzeichen
      5. // ein! Zum Beispiel "AntMe.Spieler.WolfgangGallo".
      6. namespace AntMe.Spieler.Loki
      7. {
      8. // Das Spieler-Attribut erlaubt das Festlegen des Volk-Names und von Vor-
      9. // und Nachname des Spielers. Der Volk-Name muß zugewiesen werden, sonst wird
      10. // das Volk nicht gefunden.
      11. [Spieler(
      12. Volkname = "Loki",
      13. Vorname = "",
      14. Nachname = ""
      15. )]
      16. // Das Typ-Attribut erlaubt das Ändern der Ameisen-Eigenschaften. Um den Typ
      17. // zu aktivieren muß ein Name zugewiesen und dieser Name in der Methode
      18. // BestimmeTyp zurückgegeben werden. Das Attribut kann kopiert und mit
      19. // verschiedenen Namen mehrfach verwendet werden.
      20. // Eine genauere Beschreibung gibts in Lektion 6 des Ameisen-Tutorials.
      21. [Kaste(
      22. Name = "Sammler",
      23. GeschwindigkeitModifikator = 0,
      24. DrehgeschwindigkeitModifikator = -1,
      25. LastModifikator = 2,
      26. ReichweiteModifikator = 0,
      27. SichtweiteModifikator = 0,
      28. EnergieModifikator = 0,
      29. AngriffModifikator = -1
      30. )]
      31. [Kaste(
      32. Name = "Krieger",
      33. GeschwindigkeitModifikator = -1,
      34. DrehgeschwindigkeitModifikator = -1,
      35. LastModifikator = -1,
      36. ReichweiteModifikator = -1,
      37. SichtweiteModifikator = 1,
      38. EnergieModifikator = 1,
      39. AngriffModifikator = 2
      40. )]
      41. [Kaste(
      42. Name = "Späher",
      43. GeschwindigkeitModifikator = 1,
      44. DrehgeschwindigkeitModifikator = 1,
      45. LastModifikator = -1,
      46. ReichweiteModifikator = 0,
      47. SichtweiteModifikator = 1,
      48. EnergieModifikator = -1,
      49. AngriffModifikator = -1
      50. )]
      51. public class MeineAmeise1 : Basisameise
      52. {
      53. #region Kaste
      54. /// <summary>
      55. /// Bestimmt die Kaste einer neuen Ameise.
      56. /// </summary>
      57. /// <param name="anzahl">Die Anzahl der von jeder Kaste bereits vorhandenen
      58. /// Ameisen.</param>
      59. /// <returns>Der Name der Kaste der Ameise.</returns>
      60. ///
      61. private string lastKaste;
      62. public override string BestimmeKaste(Dictionary<string, int> anzahl)
      63. {
      64. if (lastKaste == "Krieger" && anzahl["Späher"] < 20)
      65. {
      66. return "Späher";
      67. }
      68. else if (lastKaste == "Sammler" && anzahl["Krieger"] < 30)
      69. {
      70. return "Krieger";
      71. }
      72. else
      73. {
      74. return "Sammler";
      75. }
      76. }
      77. #endregion
      78. #region Fortbewegung
      79. /// <summary>
      80. /// Wird wiederholt aufgerufen, wenn der die Ameise nicht weiss wo sie
      81. /// hingehen soll.
      82. /// </summary>
      83. public override void Wartet()
      84. {
      85. if (Kaste == "Krieger" || Kaste == "Sammler")
      86. {
      87. Wartet();
      88. }
      89. else
      90. {
      91. GeheGeradeaus();
      92. }
      93. }
      94. /// <summary>
      95. /// Wird einmal aufgerufen, wenn die Ameise ein Drittel ihrer maximalen
      96. /// Reichweite überschritten hat.
      97. /// </summary>
      98. public override void WirdMüde()
      99. {
      100. if ((Kaste == "Sammler" || Kaste == "Späher") && EntfernungZuBau == Reichweite - ZurückgelegteStrecke)
      101. {
      102. GeheZuBau();
      103. }
      104. }
      105. #endregion
      Alles anzeigen



      Hoffe habe nicht allzu große Fehler oder Fehlinterpretationen drin.

      Feedback gern gesehn :)
    • Hast du das schon mal getestet. Ich sehe einige Fehler: Der Variable lastKaste wird nie ein Wert zugewiesen und deshalb werden bestimmt nur Späher erzeugt. Außerdem: Wieso rufst du in der Methode Wartet() wieder Wartet() auf? Die Krieger und Sammler werden nur warten!

      Bitte teste deinen Code, bevor du ihn hier postest. Am besten, du schreibst nur die Stelle, an der du Schwierigkeiten hast, denn sonst ist es irgendwie zu viel Text. (Soll jetzt kein Vorwurf sein; nur für später!)

      Und kannst du den Code vielleicht etwas sinnvoller einrücken? Das geht am besten im Quellcode, sonst funktioniert es irgendwie nicht richtig! :)
    • alsooo

      das einrücken tut mir leid....In Ms Visual war das alles logischer Eingerückt ^^....irgentwie xD


      zu
      dem in der funktion wartet .... ich wollte eig auch erreichen das die
      Krieger und Sammler erstmal auf Markierung von den Spähern warten....
      oder macht man das anders?


      und zu dem andern wie müsste ich das denn umschreiben das der nicht nur Späher ausspuckt?




      (ich
      habe den bis dahin ganzen Quellcode gepostet weil ich mir nicht sicher
      bin ob das ganze so Sinn macht.....ob man irgentetwas vllt noch besser
      oder anders machen lassen kann etc. und da ging es mir nicht um einen
      spezifischen teil sondern einfach um die bitte das jemand einmal ganz
      rüberguckt ....oder hab ich da jetzt irgent einen Fehler gemacht?)
      It is our imperfections.....

      .....that make us so perfect
    • Damit du nicht nur Späher kriegst, müsstest du auf jeden Fall der Variable lastKaste einen Wert zuweisen. Sonst bleibt sie immer null.
      Das könnte dann so aussehen:

      C-Quellcode

      1. // C#-Quelltext
      2. private string lastKaste;
      3. public override string BestimmeKaste(Dictionary<string, int> anzahl)
      4. {
      5. if (anzahl["Späher"] < 20) // Auf jeden Fall mindestens 20 Späher
      6. {
      7. return "Späher";
      8. }
      9. else if (lastKaste == "Sammler" && anzahl["Krieger"] < 30) // Wenn zuletzt Sammler erzeugt wurden und die Anzahl an Kriegern kleiner als 30 ist; es werden also max. 30 Krieger erzeugt.
      10. {
      11. lastKaste = "Krieger"; // Zuweisung der Variable lastKaste
      12. return "Krieger";
      13. }
      14. else // sonst, also wenn es mehr als 20 Späher gibt und zuletzt ein Sammler erzeugt wurde oder* die Anzahl an Kriegern größer/gleich 30 ist.
      15. {
      16. lastKaste = "Sammler"; // Zuweisung der Variable lastKaste
      17. return "Sammler";
      18. }
      19. }
      20. // * Bei Verneinung wird aus dem Und im zweiten else if ein Oder.
      Alles anzeigen


      Das wäre jetzt mein Vorschlag. Ich weiß nicht, ob du damit einverstanden bist. :S 8)

      Bei der Wartet() Methode habe ich noch nicht ganz verstanden, was du willst. Ich glaube, da musst du noch was in der region Kommunikation einfügen, damit das funktioniert. :)

      Aber, bitte, bitte, poste nicht jedesmal dein ganzes Projekt. Zuerst mal solltest du versuchen, deine Fehler mit Hilfe von Debugging etc. zu finden. ;)
    • Alles klar.

      Für die Hilfe bei der zuweisung lastKaste schonmal vielen vielen Dank.

      Wenn ich jetzt die Anzahlen der zu erzeugenen Späher,Krieger,Sammler ändern will muss ich einfach nur die Zahlen in den Bedingungen von if / else if ändern oder?

      Und so wie es jetzt da steht werden erst 20 Späher erschaffen und dann immer Abwechselnd Krieger und Sammler. Bis zu dem Punkt an dem 30 Krieger (und logischerweise vorher schon 20 Späher) vorhanden sind. Habe ich das richtig verstanden?

      Wenn ja war es genau das was ich ursprünglich erreichen wollte ^^ und nochmals vielen Dank.

      Aber, wie kann ich das ganze so anpassen ( kam mir grade beim schreiben die Idee (ist glaube etwas sinnvoller)), dass erst immer abwechselnd 5 Späher, dann 5 Sammler und dann 5 Krieger erstellt werden? (das ganze dann solange bis zu einem Zeitpunkt von x Spähern ( in dem Beispiel unten wären es 20 ) und dann das verteilungsschema das unten is?)


      Und mit der Funktion wartet() wollte ich machen, dass alle Späher in verschiedene Richtungen loslaufen ( und hallt Spähen ) und alle Sammler und Krieger erst einmal nichts tun und auf Signale der Späher warten.

      Hab mir überlegt um die Effizients zu steigern müsste ich spezialisieren und konkrete aufgaben zuweisen und wenn jemand etwas macht, macht der auch nichts anderes.

      Sprich:

      Sammler und Krieger bleiben am Anfang beide am Bau stehen und das so lange bis die erste für sie jeweils relevante Markierung kommt.

      - Sammler reagieren immer nur auf Markierungen von Obst (nur dann wenn in der Markierung die Info vorhanden ist, dass noch Ameisen gebraucht werden und noch nicht die benötigte Anzahl Ameisen unterwegs ist) und Zucker und dass auch nur wenn die nichts tun. Dies ist dann der Fall wenn die ihre vorherige Aufgabe abgearbeitet haben, also auf die nächste warten.

      - Eine bestimmte Anzahl Krieger steht immer am Bau (um diesen zu Verteidigen (da ich gesehen habe, dass der Bau einen Lebensbalken hat muss ich doch auch mit der Chance rechnen das dieser angegriffen wird oder?))und die anderen warten auch erst auf die zu ihnen passende Markierung. Wenn das Signal kommt, dass ein Feind ( Wanze oder feindliche Ameise ) da und da steht, dann wollte ich dehnen sagen das für eine Wanze so und so viele Krieger auf das Ziel ausschwärmen und es Angreifen und für eine feindliche Ameise so und so viele das gleiche tun. Die meisten Krieger bleiben nach erledigter Aufgabe an Ort und Stelle stehen um ein möglichst schnelles eingreifen zu gewährleisten ( hierbei gefragt ist das sinnvoll? also ist eine optimale Abdeckung der Karte durch Zufallsprinzip gewährleistet? oder müsste man jeder einzelnen Ameisen einen Punkt X zuweisen um eine Rasterabdeckung der Map zu erzielen) Nur falls der Fall eintritt das weniger als x Krieger am Bau sind wollte ich der entsprechend Fehlenden Anzahl den Befehl geben zurück zum Bau zu gehen, zu warten und auf Feinde zu achten.


      Deswegen habe ich vorerst geschrieben das die warten sollen wenn die nichts zu tun haben ( es sei denn es sind Späher dann sollen die hallt laufen bis zum erbrechen xD ) .....das erreiche ich doch in dem ich sage :

      Quellcode

      1. public override void Wartet()
      2. {
      3. if (Kaste == "Krieger" || Kaste == "Sammler")
      4. {
      5. Wartet();
      6. }
      7. else
      8. {
      9. GeheGeradeaus();
      10. }
      11. }
      Alles anzeigen



      oder?


      An dieser Stelle sei gesagt ich möchte vorerst nicht das mir irgentwer beim coden an sich hilft bei dem was ich noch mit Sammlern, Kriegern und Spähern vorhabe. Wenn es irgentwie geht möchte ich mir das selbst erarbeiten und falls ich nicht mehr weiterkomme werde ich in diesem Thread konkrete Fragen stellen.
      Ich habe das zum 1. geschrieben um zu erklären warum ich da erstmal wartet () reingeschrieben habe und zweitens als kleine Bitte damit mir gesagt wird ob das so, wie ich mir das alles Vorstelle überhaupt möglich ist.


      Ich weiß ich bombadiere Mit Fragen über Fragen.

      Daher vielen Dank das mir hier so helfend zu seite gestanden wird :)

      Mit freundlichem Gruß

      der Bartlebe
      It is our imperfections.....

      .....that make us so perfect
    • Ob das so möglich ist, das kann ich dir leider immer noch nicht beantworten ;) . Auf jeden Fall hast du dir da sehr viel vorgenommen!

      Wie gesagt, du musst dann halt in der RiechtFreund-Methode den anderen Ameisen sagen, was sie tun sollen, aber das ist ja auch dein Vorhaben.

      Das der Bau angegriffen wird, habe ich allerdings noch nicht gehört. Keine Ahnung, vielleicht geht das ja wirklich, aber wer sollte den denn angreifen. Es gibt keine Möglichkein zu sagen "greifeAn(bau)" oder sowas und die Wanzen machen den eigentlich auch nicht kaputt. ?(
    • Alles klar dann geht das nicht.

      Habe ich mir eine unütze Kompenente bei der Ressourcenverteilung doch schon erspart ^^ vielen dank :)


      Achja die eine Frage ist noch ungeklärt wie ich den quellcode dahingehend meiner obrigen Verbesserungsvorschläge anpasse^^
      It is our imperfections.....

      .....that make us so perfect
    • Bartlebe schrieb:

      Für die Hilfe bei der zuweisung lastKaste schonmal vielen vielen Dank.

      Wenn ich jetzt die Anzahlen der zu erzeugenen Späher,Krieger,Sammler ändern will muss ich einfach nur die Zahlen in den Bedingungen von if / else if ändern oder?

      Und so wie es jetzt da steht werden erst 20 Späher erschaffen und dann immer Abwechselnd Krieger und Sammler. Bis zu dem Punkt an dem 30 Krieger (und logischerweise vorher schon 20 Späher) vorhanden sind. Habe ich das richtig verstanden?

      Wenn ja war es genau das was ich ursprünglich erreichen wollte ^^ und nochmals vielen Dank.

      Aber, wie kann ich das ganze so anpassen ( kam mir grade beim schreiben die Idee (ist glaube etwas sinnvoller)), dass erst immer abwechselnd 5 Späher, dann 5 Sammler und dann 5 Krieger erstellt werden? (das ganze dann solange bis zu einem Zeitpunkt von x Spähern ( in dem Beispiel unten wären es 20 ) und dann das verteilungsschema das unten is?)
      die da ^^ xD
      It is our imperfections.....

      .....that make us so perfect
    • und noch ne nachfrage ^^

      (kann das beim austesten schlecht erkennen ....irwie sind die ameisen nur laufende punkte )

      bei dieser ausdrucksweise:

      Quellcode

      1. public override void WirdMüde()
      2. {
      3. if ((Kaste == "Sammler" || Kaste == "Späher") && EntfernungZuBau == Reichweite - ZurückgelegteStrecke)
      4. {
      5. GeheZuBau();
      6. }
      7. else if (EntfernungZuBau == (Reichweite * 0.75) - ZurückgelegteStrecke)
      8. {
      9. GeheZuBau();
      10. }
      11. }
      Alles anzeigen


      und den vorraussetzungen das sammler und späher reichtweitewert von 0 und krieger von -1 haben

      dürften die doch nie an hunger sterben oder?

      also immer wenn der weg zum bau = restweg ist machen die sich sofort aufn weg zum bau

      sammler und späher reichweitenwert von 0 und krieger von -1
      It is our imperfections.....

      .....that make us so perfect
    • Puh, wieso willst du denn nicht, das die immer abwechselnd erzeugt werden? Wäre auf jeden Fall einfacher!
      Aber gut: Du könntest eine Variable deklarieren, die mitzählt, wie viele Ameisen schon erzeugt wurden. Wenn die dann größer als 5 oder 10 ist werden jeweils andere Ameisen erzeugt.

      C-Quellcode

      1. // C#-Quelltext
      2. private int count = 0;
      3. public override string BestimmeKaste(Dictionary<string, int> anzahl)
      4. {
      5. count++;
      6. if (anzahl["Späher"] < 20 && count < 5) // Solange count kleiner 5 && ...
      7. {
      8. return "Späher";
      9. }
      10. else if (anzahl["Krieger"] < 30 && count <10) // Solange count kleiner 10 (und natürlich >= 5) && ...
      11. {
      12. return "Krieger";
      13. }
      14. else // count >= 10
      15. {
      16. if (count >= 15) // Wenn count >= 15 ist, wird es wieder auf 0 gesetzt und es beginnt von vorne
      17. count = 0;
      18. return "Sammler";
      19. }
      20. }
      Alles anzeigen


      Ich hoffe, es ist gut genug dokumentiert, das du verstehst, was ich damit bewirke. Die Variable lastKaste brauchst du dann übriges nicht mehr.