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

11

13.09.2009, 13:41

Und ein weiteres Mal brauche ich Start-Hilfe...

Ich habe meine Klasse CGame, die die Funktion CRobot::MoveRobot aufruft. MoveRobot soll unter bestimmten Voraussetzungen alle CRobot-Instanzen durchgehen und deren Koordinaten prüfen.

C-/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
class CRobot
{
public:
int XPos, YPos;

void MoveRobot(//welche Parameter?)

{
for (int i=0; i<vRobot.size(); i++)
//alle vRobot-Instanzen durchgehen und deren Koordinaten prüfen

}
};

class CGame
{
vector<CRobot> vRobot//die Größe wird im Konstruktor festgelegt, siehe vorheriger Beitrag);


void MoveRobots()
{
for (int i=0; i<vRobot.size(); i++) {
vRobot.at(i).MoveRobot(/*welche Parameter?*/);
}
}
};


CGame::MoveRobots wird aus main() heraus aufgerufen.

Meine Frage ist nun, wie ich CRobot::MoveRobot klar mache, was ich mit vRobot meine?
Vielen Dank für die schnelle, kompetente und geduldige Hilfe hier!
PPretzel

12

13.09.2009, 14:25

Der Roboter selbst sollte nichts über die anderen wissen, also braucht er auch keine Container oder ähnliches zu kennen. Die Parameter hängen halt davon ab, wie du ihm eine Bewegung mitteilen willst, ich kenne deine Absichten diesbezüglich auch nicht.

Ein Beispiel, um das verständlich zu machen:

C-/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
27
28
29
class Robot
{
    private:
        int XPos, YPos; // evtl. besser privat, und public Setter/Getter


    public:
        void Move(int x, int y)
        {
            XPos += x;
            YPos += y;
        }
};

class Game
{
    private:
        std::vector<Robot> vRobot;

    public:
        void MoveRobots()
        {
            // Iteratoren sind flexibler als Indizes, wenn du z.B. mal

            // den Containertyp wechseln willst

            for (std::vector<Robot>::iterator Itr = vRobot.begin(), End = vRobot.end(); Itr != End; ++Itr)
            {
                Itr->Move(3, 2);
            }
        }
};    

tnecniv

Treue Seele

Beiträge: 164

Wohnort: BERLIN

  • Private Nachricht senden

13

13.09.2009, 14:34

hm.. glaub am besten wäre es, wenn du jedem robot noch einen zeiger auf die game-klassen instanz übergibst. dann kannst du über die auf die anderen robots zugreifen. frage ist nur, ob das wirklich nötig ist, oder ob du die überprüfung nciht einfach schon in game.moverobots machst. kommt dann halt drauf an wie komplex das ganze wird, damits übersichtlich bleibt...

edit: hehe, da war ich wohl zulangsam
Sagt der igel zu dem dachs:
willst du größer sein, dann wachs!
- alte Fritz weisheit

14

13.09.2009, 14:38

Zitat von »"tnecniv"«

hm.. glaub am besten wäre es, wenn du jedem robot noch einen zeiger auf die game-klassen instanz übergibst. dann kannst du über die auf die anderen robots zugreifen.
Würde ich nicht machen, denn so schafft man sich nur eine unnötige Abhängigkeit. Wenn man schon eine Klasse hat, die Roboter verwaltet, wieso sollte ein Roboter selbst noch auf andere zugreifen können?

Falls ein Roboter andere direkt beeinflussen soll: Das kann man sauberer lösen, indem man in der zentralen Verwaltungsklasse entsprechende Schnittstellen einrichtet, um Roboter miteinander kommunizieren zu lassen.

tnecniv

Treue Seele

Beiträge: 164

Wohnort: BERLIN

  • Private Nachricht senden

15

13.09.2009, 14:41

jo, stimmt schon. finde es kommt auch immer auf den umfang und die absichten an. von wegen mit spatzen auf kanonen.. oder so :)
Sagt der igel zu dem dachs:
willst du größer sein, dann wachs!
- alte Fritz weisheit

16

13.09.2009, 14:49

Die Sache ist ein bisschen komplizierter. CRobot::MoveRobot soll nicht nur die Koordinaten des Roboters ändern, sondern dessen Bewegungsrichtung auf den Spieler zu ermitteln und dann schauen, ob auf dem ermittelten neuen Feld ein anderer Roboter steht (bei einer Kollision werden beide Roboter vernichtet). Ich habe mir halt gedacht, dass es dafür am einfachsten ist, CRobot::MoveRobot alle anderen Roboter durchzugehen, deren Koordinaten anzuschauen und bei Kollision dann entsprechend zu reagieren.
Konkret sieht das folgendermaßen aus:

C-/C++-Quelltext

1
2
3
4
5
6
7
8
9
10
11
CRobot::MoveRobot(char Spielfeld[XRange][YRange], int PlayerXPos, int PlayerYPos)
{
int NewX, NewY;

//Die Koordinaten des Felds in Richtung des Spielers bestimmen und in NewX NewY speichern


for (int i=0; i<vRobot.size(); i++) {
if (vRobot.at(i).XPos==XPos&&vRobot.at(i).YPos==YPos&&vRobot.at(i).ID!=ID)//Die ID ist ein Member von CRobot

//auf Kollision reagieren. 

}
}


Diese Funktion möchte ich nun aus CGame heraus aufrufen und dabei dafür sorgen, dass die Funktion weiß, was mit vRobot gemeint ist - nur weiß ich eben nicht, wie das geht. Vielleicht kann mir jemand da einen Tip geben?

Ich bin noch total am Anfang, vielleicht ist das ganze Konzept auch nicht so glücklich gewählt, aber ich würde es trotzdem gerne mal zum Laufen bringen ;)

edit: und während man hier so vor sich hin schreibt, sind schon drei andere Antworten da ;)

17

13.09.2009, 15:13

Das meinte ich mit Kommunizieren. Erstens mal würde ich eine Art Vektorklasse einsetzen, um Koordinaten zu speichern.

C-/C++-Quelltext

1
2
3
4
5
6
struct Coordinate
{
    int x;
    int y;
    Coordinate(int x, int y);
};

Dann gibt die Move-Funktion die Zielkoordinaten des Roboters zurück. Wobei dann der Name "Move" schlecht gewählt ist, besser wäre "GetDestination" oder sowas. Vermeide wenn möglich Seiteneffekte und deklarier die Funktion als const:

C-/C++-Quelltext

1
Coordinate Robot::GetDestination() const;

Die Game-Klasse ruft dann die Funktion auf und prüft das Feld. Eventuell werden dann weitere Funktionen von Robot aufgerufen (tatsächliches Bewegen, Zerstören, ...).

18

14.09.2009, 00:04

Ok, vielen Dank euch allen für die Hilfestellungen! Werde dann die Prüfung in der Game-Klasse durchführen. Zusammen mit den anderen Verbesserungen läuft das mal wieder auf eine Umstrukturierung des Codes hinaus ;)
Wie ist das eigentlich, wenn ihr ein Projekt angeht: Plant ihr vorher so genau, dass ihr hinterher quasi nur noch den richtigen Code eintippen müsst, oder verändert ihr euer Konzept während des Programmierens weiter, je nachdem, welche neuen Ideen und Probleme auftauchen?

19

14.09.2009, 14:22

Zitat von »"ppretzel"«

Wie ist das eigentlich, wenn ihr ein Projekt angeht: Plant ihr vorher so genau, dass ihr hinterher quasi nur noch den richtigen Code eintippen müsst, oder verändert ihr euer Konzept während des Programmierens weiter, je nachdem, welche neuen Ideen und Probleme auftauchen?
Ich versuche, das grobe Konzept im Voraus zu planen. Also etwa, welche wichtigen Klassen vorkommen, wie diese in Beziehung zueinander stehen und wer für welche Aufgabenbereiche verantwortlich ist. Auf diese Weise hat man beim Programmieren auch etwas, an dem man sich orientieren kann, und codet nicht einfach wild drauf los.

Klar kann man nicht alles vorher planen - oft kommen nämlich auch Hindernisse und neue Herausforderungen dazu, die man anfänglich nicht bedacht hat. Auch kleine Hilfsklassen, die keinen wahnsinnigen Einfluss auf das grundlegende Design haben, kann man ruhig erst während des Programmierens entwickeln. Aber so eine Grundstruktur sollte man sich vorstellen können, am besten auch auf eine mögliche Erweiterung ausgelegt.

Bei einem Projekt habe ich zwar im Voraus geplant, doch nach einiger Zeit merkte ich, dass der Code eine grosse Änderung benötigt, um weiteres Entwickeln sinnvoll zu ermöglichen. In solchen Situationen ist es wichtig, kurzfristig viel Zeit in ordentliches Design zu investieren, denn sobald die Basis schlecht durchdacht ist, muss auch darauf aufbauender Code angepasst werden, und das schlechte Design zieht sich durch das ganze Projekt. Langfristig bringt eine Anpassung jedoch mehr und kann unter Umständen viel Motivation und Nerven (Debugging, Wartung) erhalten.

Hier habe ich auch mal einen Beitrag diesbezüglich geschrieben.

Werbeanzeige