Autor Beitrag
stes
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 36
Erhaltene Danke: 6

Win 95, Win XP, Win 7 64-bit
C# (VS 2010, #Develop), Java (eclipse)
BeitragVerfasst: Fr 04.03.11 15:18 
Hallo zusammen,

ich möchte euch gerne mein neues Projekt vorstellen.

Angelehnt an eine Aufgabe aus dem Informatikunterricht (mit Java) habe ich ein kleines C# Programm entwickelt, mit dem sich zwei (oder auch mehr) Programmierer "duellieren" können.

Wie das geht?

Die GUI besteht prinzipiell aus einem Spielfeld mit Start + Stop Button. Auf dem Spielfeld sind die Spielfiguren, der Wolf und der Jäger, in Form von zwei verschiedenfarbigen Symbolen zu sehen.
Ziel des Wolfs ist es, dem Jäger möglichst lange davonzulaufen; Ziel des Jäger ist es, den Wolf möglichst schnell zu fangen.
Sprich: Ein Spieler programmiert das Verhalten des Wolfs, der andere das des Jägers.

Hierzu habe ich einige Events implementiert, wie z. B. den Zusammenprall mit einer Spielfeldkante oder der Ausführung einer Bewegung. Die Objekte kennen jeweils nur die Entfernung zum anderen Objekt (und sollten auch nichts anderes benutzen, das ist die Regel ) und sollen anhand der Veränderungen an der Entfernung ihre Wege so anpassen, wie es für sie am günstigsten ist. Zudem können sie natürlich auf die eigenen Eigenschaften wie Richtung und Position zugreifen.

Hier nochmal die Regeln im Überblick:
1. Die Objekte dürfen lediglich die Entfernung zum Zielobjekt abfragen
2. Die Objekte haben freien Zugriff auf all ihre Eigenschaften, mit Ausnahme der Active-Eigenschaft, die angibt, ob das Objekt gefangen wurde bzw das andere gefangen hat.
3. Hat sich der Jäger bis auf (momentan) 10 Pixel genähert, ist der Wolf gefangen.
Der verantwortliche Eventhandler darf entsprechend nicht verändert werden.
[Die Liste wird ggf. noch ergänzt]

Alles in allem finde ich das Prinzip ganz interessant, es gibt ja auch schon andere Spiele mit ähnlichen Ansätzen.
Ich hoffe, dass sich einige von euch ebenfalls für diese Art des "Computerspiels" begeistern kann und ihr evtl. weitere Codedateien für Wolf und/oder Jäger hier der Allgemeinheit zugänglich macht
Meine Bitte: Wenn ihr etwas verändern & hochladen wollt, dann bitte NUR Wolf und Jäger. Werden die anderen Klassen verändert, bekommen wir bald Probleme mit der Kompatibiliät der Codeschnipsel

Ihr könnt mir gern auch eine Mail an stes94@ymail.com schicken.

Frohes Schaffen!

stes
Einloggen, um Attachments anzusehen!
_________________
"Das Internet ist ein großer Misthaufen, in dem man allerdings auch kleine Schätze und Perlen finden kann." Joseph Weizenbaum
Kha
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 3803
Erhaltene Danke: 176

Arch Linux
Python, C, C++ (vim)
BeitragVerfasst: Fr 04.03.11 17:06 
:welcome: in der EE und erst einmal Hut ab für die tolle Idee :zustimm: !
Auch an der Umsetzung gibt es nichts zu meckern, aber ich frage mich, ob komplexere KIs nicht doch darauf hinauslaufen, die Position der anderen Spielfigur abzuschätzen :) . Gegen einfacher gestrickte Jäger sollte sich dagegen mein im Kreis laufender Wolf nicht schlecht schlagen ;) :
ausblenden C#-Quelltext
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:
    #region Specific fields
    const int radius = 100;
    const int midPoint = 200;
    double _oldDistance;
    int _turnDirection = 1;
    #endregion
    
    #region Eventhandler
    /// <summary>
    /// Invoked when the object moves
    /// </summary>
    /// <param name="sender"></param>
    /// <param name="e"></param>
    public override void ChaseObject_HasMoved(object sender, EventArgs e)
    {
      StepSize = 10.0;

      if (this.Distance() + 5 < _oldDistance)
        _turnDirection *= -1;
      _oldDistance = this.Distance();

      double angle = Math.Atan2(Location.Y - midPoint, Location.X - midPoint) + _turnDirection * Math.Atan(10.0 / radius);
      PointF target = new PointF((float)(midPoint + radius * Math.Cos(angle)), (float)(midPoint + radius * Math.Sin(angle)));
      Direction = (int)(Math.Atan2(target.Y - Location.Y, target.X - Location.X) * 180 / Math.PI);
    }
...


Edit: Schön wäre es natürlich, wenn man seine Klassen einfach als Assemblies zur Exe hinzuschmeißen könnte und das Programm diese dann dynamisch einbindet. Falls dir Reflection schon bekannt ist :) .

_________________
>λ=
stes Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 36
Erhaltene Danke: 6

Win 95, Win XP, Win 7 64-bit
C# (VS 2010, #Develop), Java (eclipse)
BeitragVerfasst: Fr 04.03.11 17:57 
Hallo Kha,

vielen Dank für deine Antwort. Ich habe diesbezüglich ein paar Anmerkungen:

user profile iconKha hat folgendes geschrieben Zum zitierten Posting springen:
:welcome: in der EE und erst einmal Hut ab für die tolle Idee :zustimm: !

Danke, aber wie gesagt, "so ganz meine Idee" wars dann doch nicht :D Ich nehm das Lob trotzdem mal gerne entgegen ^^

user profile iconKha hat folgendes geschrieben Zum zitierten Posting springen:

Auch an der Umsetzung gibt es nichts zu meckern, aber ich frage mich, ob komplexere KIs nicht doch darauf hinauslaufen, die Position der anderen Spielfigur abzuschätzen :)

Darauf wird es hinauslaufen, es geht aber einfach darum, dass die Spielfiguren nicht direkt auf die Position des anderen zugreifen können ;) Sonst wärs schließlich langweilig..

user profile iconKha hat folgendes geschrieben Zum zitierten Posting springen:

Gegen einfacher gestrickte Jäger sollte sich dagegen mein im Kreis laufender Wolf nicht schlecht schlagen ;)

Das stimmt :D Der "Standard"-Jäger, den ich probehalber ins Programm gestellt hab (und zugegeben, der ist doch eher etwas blöd) verzweifelt jedenfalls..
Ich überlege schon, wie man deinen Wolf möglichst effektiv überlisten könnte :D
Auf jeden Fall vielen Dank für deinen Beitrag, sieht schon gut aus ^^

user profile iconKha hat folgendes geschrieben Zum zitierten Posting springen:

Edit: Schön wäre es natürlich, wenn man seine Klassen einfach als Assemblies zur Exe hinzuschmeißen könnte und das Programm diese dann dynamisch einbindet. Falls dir Reflection schon bekannt ist :) .


In einem anderen Forum habe ich bereits den gleichen Tipp bekommen ;) Ich habe wirklich noch wirklich nicht mit der Reflection beschäftigt, aber ich werde die Gelegenheit dazu gerne an dieser Stelle nutzen und das Programm verbessern ;)

Viele Grüße
stes

_________________
"Das Internet ist ein großer Misthaufen, in dem man allerdings auch kleine Schätze und Perlen finden kann." Joseph Weizenbaum