Welche Array methode?

  • Themenstarter Themenstarter haruna
  • Beginndatum Beginndatum
H

haruna

Hallo, ich hab ein kleines Spiel programmiert und die Koordinaten der Gegner in zwei Arrays gespeichert also ArrayX und ArrayY.. in einer for schleife greif ich dann auch immer gleichzeitig mit ArrayX[ i ] und ArrayY[ i ] auf die Werte zurück und veränder sie..

da das spiel halbwegs jetzt läuft.. gehts ans aufräumen.. der code soll mehr "Programmierer like"-werden..

Erst dachte ich an ein mehrdimensionales Array.. aber nachdem ich in Google danach gesucht hab.. sind mir noch mehr Möglichkeiten aufgefallen. Was würdet ihr mir empfehlen?


Ganz nebenbei hätte ich noch ne Frage.. man soll ja immer den Speicher wiederfreigeben.. wenn man bilder lädt,usw.. was passiert wenn man das nicht tut**** Und was soll man alles freigeben.
 
Hi

Wozu mehrdimensionale Arrays? Willst du pro Gegner ein Array aus 2 ints, für X und Y?
Nimm doch ein Array aus structs
C++:
struct coord
{
    int x;
    int y;
};
oder ähnliches. Oder aus den Gegnern gleich eine Klasse machen
(die machen ja wahrscheinlich auch was, außer nur existieren)

Zum Speicher freigeben: Alles, was du mit malloc, calloc oder new erzeugt hast, musst du mit free bzw. delete wieder freigeben.

Wenn du das nicht machst und nur immer neuen Speicher anforderst, denkt das Betriebssystem, dass du den ganzen bisher angeforderten Speicher noch brauchst und sucht dir deshalb im RAM wieder was leeres raus.
Wenn man das sehr oft macht (ohne freigeben) ist der RAM irgendwann voll mit Speicher, den du als "brauche ich noch" gekennzeichnet hast, die anderen Programme bekommen dann nichts mehr davon.
Folge: Computer hängt sich auf. Strom weg und wieder einschalten zum Beheben.

Dein Spiel wird vermutlich nicht so viel reservieren, dass es dazu kommt, aber freigeben sollte man trotzdem wieder.

Je nach Betriebssystem gibts auch verschiedene Mechanismen, die nicht mehr genutzen Speicher von selbst aufräumen, aber verlassen sollte man sich beim Programmieren darauf nicht.

Nocheinmal zum Spiel: Wenn du willst, kannst du ja mal den Code zeigen. Dann kann man am Besten sagen, was zu verbessern wäre.

Gruß
 
danke dass mit struct kannte ich gar net.. hab bisher nur in java geschrieben..
mit coord.x greife ich wohl auf den wert zu..!?
und ich mache ein Array mit structs...****
also sozusagen

struct coord{int x; int y};
struct leben{int a;};
array[0]=coord;
array[1]=leben;

Hab mir nämlich auch überlegt ein Gegner hat ja auch mehr als die Koordinaten Werte..


den code möchte ich momentan noch nicht posten.. den hab ich straight einfach hingeschrieben ^^ .. ich möchte erste Mal ein wenig Ordnung rein bringen.. so versteht eh keiner was.. sollte man zwar eigentlich von anfang sauber programmieren.. aber naja..

Ich muss sagen ich hab OOP nie wirklich verstanden -.-

also ich hab jetzt lauter Funktionen die ich aus der main() ausrufe..
wenn ich denn eine Klasse für den Gegner erstelle..
(was ich ganz gut finde, dann lerne ich das endlich mal mit OOP..)
..wie ungefähr sieht denn sowas aus****

Ich deklariere im Header..
class Gegner
{..} <-- was kommt da noch rein?

include diese in mein main.cpp..

oke.. das wars anscheinend schon mit meinem Wissen.. muss mir umbedingt noch was dazu ergoogln..

Wie ruf ich die Klasse denn auf aus der main.cpp?Und wie übergeb ich Variablen..?
Muss ich mir das mit der Klasse so vorstellen wie eine Funktion**** ..etw. geschieht in der Main, sie springt zu Klasse und arbeitet sie ab und kehrt dann wieder zur Main****
Sorry, wenn ich soviele Fragen stelle.. aber ich werde mir das Thema auch noch selbst erarbeiten.. eine kleine Starthilfe wäre aber nett =D
 
Zum struct:
Meinte ich eher so:
C++:
struct gegner
{
    int x;
    int y;
    int leben;
};
...
struct gegner meinegegner[100];
meinegegner[0].x=...;
meinegegner[0].y=...;
meinegegner[0].leben=...;
Dann kommst du mit einem eindimensionalen Array aus.

Du kannst die Koordinaten natürlich auch herausgetrennt machen:
C++:
struct coord
{
    int x;
    int y;
};
struct gegner
{
    coord position;
    int leben;
};
...
gegner meinegegner[100];
meinegegner[0].position.x=...;
meinegegner[0].position.y=...;
meinegegner[0].leben=...;

Zum Vergleich mit Java: Ein struct ist im Prinzip eine Klasse ohne Methoden, ohne protected und private.
Also nur public-Variablen.
(Genau genommen ist zwar alles andere auch mit struct möglich, würde dann aber den Sinn verfehlen.
Dafür gibts dann "class" statt "struct").

Stell dir eine Klasse wie ein eigenständiges kleines Programm vor.
Sie hat eigene Variablen und eigene Funktionen, die niemanden "außerhalb" der Klasse was angehen, und ist unabhängig vom restlichen Programm rundherum. Wird dadurch auch in anderen Programmen wiederverwendbar.
Zusätzlich zu den ganzen privaten Sachen gibts noch ein/mehrere Funktionen, die von außen her aufgerufen werden können, irgendwas machen (und dabei ggf. die eigenen Funktionen und Variablen der Klasse verwenden) und dann das Ergebnis wieder nach außen zurückgeben.

Beim schreiben vom Hauptprogramm braucht man sich aber keine Gedanken mehr machen, was innerhalb der Klasse passiert, man gibt ihr nur Informationen, weiß was man als Ergebnis bekommen wird und bekommt das dann auch. Wie das Ergebnis zustande kommt, ist dabei egal. Um das kümmert sich die Klasse

Vorteile dadurch ist hauptsächlich die Abstraktion:
zB eine Klasse, die Töne abspielt; man schreibt sie zuerst, ohne auch nur an das Spiel zu denken, weil das nur verwirren würde. Beim Spiel selber sagt man dann nur noch: "In der Datei ist Musik, Spiel!" und braucht sich keine Gedanken mehr machen, wie das eigentlich zu programmieren wäre;

Weiterer Vorteil: Wiederverwendbarkeit (so eine Musikklasse kann man auch in anderen Spielen/Programmen weiterverwenden)

Zum Gegner: Was ist das eigentlich für ein Spiel? Was tut/kann so ein Gegner? Ohne das zu wissen, kann ich dir schwer Tipps geben.
 
Zuletzt bearbeitet:
hi danke für deine Hilfe ;-)

du sagst "Beim schreiben vom Hauptprogramm braucht man sich aber keine Gedanken mehr machen, was innerhalb der Klasse passiert, man gibt ihr nur Informationen, weiß was man als Ergebnis bekommen wird und bekommt das dann auch. "

das können doch funktionen auch**** man gibt ihnen werte.. kriegt ein Ergebnis und was drinnen passiert ist egal..
was ist denn hier der unterschied?

also das Spiel ist ein Shoot em up.. gegner bewegen sich grade nach unten... machen momentan nichts.. keine KI oder so..ich übergebe ihm aber bei jedem Frame zwei Werte eines Markers, die mit der Webcam getrackt werden.. an dieser Position ist dann die Spielfigur.. und wenn die Gegner mit ihr kollidieren verschwinden diese/bzw starten von neuem

aber ich dachte mir vllt mache ich dann aus den "Kugeln"(bullets) auch so ordentlichen Klassensystem.. macht das Sinn? Machen Klassen bei einem relativ kleinen Spiel überhaupt Sinn****
 
das können doch funktionen auch**** man gibt ihnen werte.. kriegt ein Ergebnis und was drinnen passiert ist egal..
was ist denn hier der unterschied?
Der Unterschied zu was?

also das Spiel ist ein Shoot em up.. gegner bewegen sich grade nach unten... machen momentan nichts.. keine KI oder so..ich übergebe ihm aber bei jedem Frame zwei Werte eines Markers, die mit der Webcam getrackt werden.. an dieser Position ist dann die Spielfigur.. und wenn die Gegner mit ihr kollidieren verschwinden diese/bzw starten von neuem
Man könnte zB eine move-Funktion machen, der man die Spielerkoorinaten übergibt.
Zurückgegeben wird, ob man den Gegner aus dem Array (oder wo man ihn eben speichert) rauslöschen kann, falls es ihn nicht mehr gibt.

Anderer Ansatz: Die Gegnerklasse speichert von sich aus alle Gegner (-Positionen und Leben etc etc)
Aufrufen musst du nur einmal irgendeine Tu-was-Funktion, der du die Koordinaten vom Spieler gibst.

In beiden Fällen könnte man auch was machen, dass sich die Gegner selbst zeichnen usw...

aber ich dachte mir vllt mache ich dann aus den "Kugeln"(bullets) auch so ordentlichen Klassensystem.. macht das Sinn? Machen Klassen bei einem relativ kleinen Spiel überhaupt Sinn****
Warum nicht? Wenn man erst bei großen Spielen damit anfängt, wird man an mangelnder Routine scheitern...

Gruß
 
Ich hätte da noch eine Frage zu Arrays ;-)

Also mein Prof sagt:" Im Gegensatz zu Java sollten Funktionen jedoch keine Arrays zurückgeben. Der Grund dafür ist, dass später die Freigabe des Speicherbereichs leicht vergessen wird."

Nun möchte ich aber aus der main() eine Funktion aufrufen, die den Wert an der Stelle [i] im Array ändert..
dies funktioniert bei mir, wenn das Array global zugänglich ist.. nun dachte ich es wäre besser wenn man alle globale Parameter nur für die main() zugänglich macht..

grober Code wenn Array global ist:
Code:
array[5]={0};

main()
{
    
     for(int i=0;i<5;i++)
     {
              setArray(i,10);
      }
}

void setArray(int i,int x)
{
     array[i]=x;
}


Wie würde es denn aussehen, wenn das Array in die main() verschwindet**** Am liebsten eine Lösung in C ;-)
 
Oke hab mein Problem gelöst ;-)

mit:
Code:
main()
{
       int myArray[3]={0};
	setArray(myArray);
}

void setArray(int* pArr)
{
	for(int i=0;i<3;i++)
	{
		pArr[i]=10;
	}
}

Nun sind mir pointer überhaupt nicht geheuer! Muss ich irgendetwas beachten? Muss ich irgendetwas deleten?
 
Das ist In Ordnung so.

Delete brauchst du nur für etwas, das du mit new angelegt hast. Also hier nicht.
Selbes gilt für free und malloc/calloc.
 
oke das mit dem deleten hab ich jetzt gecheckt :-)

Könntest du mir vllt noch das mit den Pointern,Arrays und Funktionen in ein mehrdimensionales Array ändern..?
ich bin da grad nur auf halber Höhe.. liegt vllt auch an der Uhrzeit :-)

Ich hab das mit Netz gefunden:

// Array und Spaltengrenze setzen
int brett[8][8]={ 0 }, Y_Max=8;

// Startposition
int *posStart = &brett[0][0];

// Testwert setzen
brett[2][4] = 2;

// Beschaffung Testwert mit Zeigerarithmetik
int *pos;
pos = posStart + (2 * Y_Max) + 4;

printf("%d\n", *pos );

was auch gut klappt. Aber ich kriegs komischerweise nicht in eine Funktion :-/
 
Zurück