Der beste Weg zum Spieleprogrammieren



  • cooky451 schrieb:

    • Strukturen

    Benutzt man die in C++ überhaupt noch großartig? Lohnt sich es nicht stattdessen direkt ne Klasse zu benutzen?



  • @Holymagic:
    Also ich habe schon manchmal noch klassische "structs".

    Also Klassen die halt nur öffentliche Member haben, was jetzt nicht heisst dass diese Member alle eingebaute Typen sein müssen.

    z.B. als Ersatz für elendig lange Parameterlisten macht das IMO Sinn, macht alles etwas leichter zu lesen.

    Klar könnte man sowas auch mit "class" machen, und dann halt gleich "public:" nach der "{" schreiben (und kein "protected" oder "private"), nur... wozu? "struct" sagt für mich schön "das ist ne dumme Sammlung von Werten, mehr nicht".



  • cooky451 schrieb:

    Na, eine Tabelle zum Abarbeiten, was?

    • Variablen
    • Funktionen
    • Abfragen (if, switch)
    • Schleifen
    • Arrays
    • Casts
    • Pointer
    • Speichermanagement bzw. Lebenszeit von Objekten. (Stack, Heap, static sind Stichworte)
    • Strukturen
    • Ein / Ausgabe. // Bis hier hin ist es eher C, aber das sollte natürlich auch für C+++ bekannt sein.
    • Standardcontainer (insbesondere: string, vector, map)
    • Klassen mit allem was dazu gehört. (private, protected, public, Vererbung, virtual, pure virtual, ..)
    • Iteratoren
    • Templates
    • Exceptions
    • Ein paar Dinge aus <algorithm>

    Das wären so in etwa die Grundlagen.

    Dann fange ich mal gleich mit dem Abarbeiten an 😃 .

    cooky451 schrieb:

    Das variiert sehr stark und ist abhängig davon, wie "low-level" du programmieren möchtest. Das kann von "WinAPI mit DirectX" bis zur Einarbeitung in eine bestimmte Engine gehen. Das solltest du dir überlegen, wenn du die Grundlagen hast.

    Ok, dann werde ich nach den Grundlagen wahrscheinlich nochmal dazu fragen wenn ich mir da wieder unsicher bin(und google mir nicht hilft).

    Danke für eure Hilfe 👍

    -Skotchy



  • Ich bin soweit mit der Liste durch, einige Dinge konnte ich schon vorher(wusste nur nicht wie die heißen) und bei manchen Dingen brauche ich noch Hilfe. Ab dem Punkt 'Standardcontainer' finde ich alles(außer Klassen) recht kompliziert.
    Deshalb frage ich hier einmal nach Seiten- und Tutorialempfehlungen(bitte Links)und nach einer Buchempfehlung(hab mir da auch schon eins rausgesucht: C++ von A bis Z und C++ für Spieleprogrammierer . Allerdings habe ich immer bedenken bei den negativen Rezensionen).
    Weiterhin danke für eure Antworten.

    -Skotchy



  • Standardcontainer musst du nur benutzen und nicht verstehen. (Zumindest nicht im Detail, ein gewisses Verständnis sollte natürlich auch zum Benutzen da sein.)
    Dafür sollte eigentlich http://www.cplusplus.com/reference/stl/ reichen.
    Auch sonst kann ich dir die Seite empfehlen, die haben zu allem was:
    http://www.cplusplus.com/doc/tutorial/classes/
    http://www.cplusplus.com/doc/tutorial/templates/
    http://www.cplusplus.com/doc/tutorial/exceptions/
    http://www.cplusplus.com/reference/algorithm/
    Iteratoren guckst du dir am besten gleich mit den <algorithm> Sachen an, auf der Seite stehen auch Beispielimplementierungen, da bekommt man ein gutes Gefühl für Iteratoren.



  • Danke für die Seiten, die sind zwar auf englisch aber ich müsste da mit meinen Englisch-Kenntnissen relativ gut durchkommen.

    Edit: Nebenbei hätte ich da noch eine Frage(es werden immer mehr :)):
    Könnte mir jemand auch so eine Art Aufgabe geben damit ich das gelernte auch wiedergebe?
    Also ich stelle mir das so vor das ich in einem Programm möglichst viel des Gelernten nutze um zu sehen was ich schon kann und was nicht, in 'Schwierigkeitsstufen' unterteilt( leicht, mittel, schwer) wäre nett 🙂

    Danke für die Hilfe.

    -Skotchy



  • Schreibe eine Funktion, die eine Datei einließt, die folgendermaßen aufgebaut ist:

    Schlüssel Wert
    Schlüssel Wert
    ...
    

    Gib anschließend jeden Schlüssel und den dazugehörigen Wert aus.
    Da hätten wir dann schon mal: Variablen, Funktionen, Schleifen, (Pointer/Referenzen?), Standardcontainer, Iteratoren. 🙂



  • Meinst du soetwas?

    #include <iostream>
    #include <map>
    #include <conio.h>
    
    using namespace std;
    
    int main()
    {
    	int zahl[5];
    
    	cout << "Gib 5 Zahlen ein\n";
    	for (int i = 0; i != 5; i++)
    		cin >> zahl[i];
    
    	map<char, int> _map;
    	for (int i = 0; i != 5; i++)
    		_map[i] = zahl[i];
    
    	for (int i = 0; i != 5; i++)
    		cout << "_map[" << i << "] ist: " << zahl[i] << endl;
    
    	getch();
    	return 0;
    }
    

    Oder habe ich da etwas falsch verstanden oder einen anderen Fehler gemacht?

    Weiterhin danke für Hilfe.

    -Skotchy



  • Skotchy schrieb:

    Meinst du soetwas?

    #include <iostream>
    #include <map>
    #include <conio.h> // kein Standardheader, raus damit, da für Aufgabe irrelevant ;)
    
    #include <limits> // std::numeric_limits<T>
    #include <ostream> // operator<< für std::ostream
    
    using namespace std;
    
    int main()
    {
    	int zahl[5];
    
    	cout << "Gib 5 Zahlen ein\n";
    	for (int i = 0; i != 5; i++)
    		cin >> zahl[i];
    
    	map<char, int> _map; // leading underscores sind reserviert, _map ist zudem nichtsaussagend
    	for (int i = 0; i != 5; i++)
    		_map[i] = zahl[i];
    
    	for (int i = 0; i != 5; i++)
    		cout << "_map[" << i << "] ist: " << zahl[i] << endl;
    
    	getch(); // --> cin.clear(); cin.ignore(numeric_limits<streamsize>::max(), '\n'); cin.getline();
    	return 0;
    }
    

    Oder habe ich da etwas falsch verstanden oder einen anderen Fehler gemacht?

    Weiterhin danke für Hilfe.

    -Skotchy

    Ich hab mal ein paar Sachen markiert, die du demnächst ändern solltest.

    In der Aufgabe war aber nicht das Einlesen von 5 Werten, sondern das Auslesen von beliebig vielen Datenpaaren aus einer Datei gefragt 😉

    Tipp: ofstream und getline zum Einlesen in einen string , zeilenweise Verarbeitung der Daten, Einfügen in die map , Iterieren über die Map, um die Ergebnisse auszugeben



  • Sorry, ifstream meinte ich natürlich 😉



  • helper() {cout<<MY_ schrieb:

    In der Aufgabe war aber nicht das Einlesen von 5 Werten, sondern das Auslesen von beliebig vielen Datenpaaren aus einer Datei gefragt 😉

    Aus welcher Datei soll ich denn Auslesen?
    Muss ich in dem Programm erst eine Datei erstellen die ich dann Auslesen soll?

    Danke für eure Hilfe.

    -Skotchy



  • Schreib dir doch einfach im Editor eine kleine Testdatei. Dafür brauchst du kein Programm schreiben.



  • Ok, nun hab ich zwei Programme zusammengebastelt:

    Einmal das:

    #include <iostream>
    #include <map>
    #include <limits>
    #include <fstream>
    #include <string>
    
    using namespace std;
    
    int main()
    {
    	string sText;
    	string::iterator itText;
    
    	map<char, string> mText;
    	ifstream MeineDatei ("TestDokument.txt");
    
    	if (MeineDatei.is_open())
    	{
    		getline (MeineDatei, sText);
    		int DatenGroesse = sText.size();
    		for (int i = 0; i != DatenGroesse; i++)
    		{
    			mText[i] = sText;
    		}
    		MeineDatei.close();
    	}
    	else
    		cout << "Fehler";
    
    	for (itText = sText.begin(); itText < sText.end(); itText++)
    	{
    		cout << *itText;
    	}
    
    	cin.clear();
    	cin.ignore(numeric_limits<streamsize>::max(), '\n');
    	return 0;
    }
    

    und einmal das:

    #include <iostream>
    #include <map>
    #include <limits>
    #include <fstream>
    #include <string>
    
    using namespace std;
    
    int main()
    {
    	string sText;
    
    	map<char, string> mText;
    	ifstream MeineDatei ("TestDokument.txt");
    
    	if (MeineDatei.is_open())
    	{
    		getline (MeineDatei, sText);
    		int DatenGroesse = sText.size();
    		for (int i = 0; i != DatenGroesse; i++)
    		{
    			mText[i] = sText[i];
    			cout << mText[i];
    		}
    		MeineDatei.close();
    	}
    	else
    		cout << "Fehler";
    
    	cin.clear();
    	cin.ignore(numeric_limits<streamsize>::max(), '\n');
    	return 0;
    }
    

    Beide haben den Fehler das sie nur die erste Zeile des Dokuments wiedergeben.
    Wo ist da der Fehler und hab ich dieses Mal die Aufgabe erfüllt(abgesehen von dem Fehler 😉 )?

    Weiterhin danke für eure Hilfe.

    -Skotchy



  • Jain. Immerhin liest du jetzt aus einer Datei, so wie es vorgesehen war. Aber du hast die std::map leider noch gar nicht verstanden. Zudem würde sich bei dieser Aufgabe der operator >> zum Auslesen aus der Datei anbieten. Und es war gefordert, den "Auslesen" Teil in eine Funktion zu packen.

    Aber wie gesagt, das Hauptproblem besteht einfach darin, dass du die std::map nicht verstanden hast, die solltest du dir noch mal angucken.
    Du hast dich wohl etwas zu nah an diesem Beispiel gehalten, scheinbar ohne wirklich verstanden zu haben, wie die map funktioniert. Ein Tipp: Sowohl Schlüssel als auch Wert sollten hier vom Typ std::string sein!

    Und kleine Schönheitsfehler:
    globales using namespace std;, pack das lieber in die Funktion rein oder schreibe gleich std::.
    Und "Fehler" ist keine aussagekräftige Fehlermeldung.

    Edit:
    Und nenne deine Variablen ruhig einfach text oder so, ein "Typen-Prefix", auch als Ungarische Notation bekannt, ist nicht gern gesehen.

    Edit2:
    Und warum schließt du deine Datei innerhalb der Schleife? 😮 Warum liest du nur ein mal etwas aus?



  • Wenn dort mal eine Schleife wäre 😉



  • Th69 schrieb:

    Wenn dort mal eine Schleife wäre 😉

    LOL, irgendwie hat mein Auge da eine Schleife hingebaut.



  • cooky451 schrieb:

    Th69 schrieb:

    Wenn dort mal eine Schleife wäre 😉

    LOL, irgendwie hat mein Auge da eine Schleife hingebaut.

    Macht man das jetzt so? Augmented Programming oder was? 😉 😃



  • So nun müsste es doch richtig sein:

    #include <iostream>
    #include <map>
    #include <limits>
    #include <fstream>
    #include <string>
    
    void Auslesen()
    {
    	using namespace std;
    
    	string Text;
    
    	ifstream MeineDatei;
    	MeineDatei.open ("TestDokument.txt");
    	map <string, string> text;
    
    	while (MeineDatei.good())
    	{
    		text["meintext"] = MeineDatei.get();
    		cout << text["meintext"];
    	}
    
    	MeineDatei.close();
    }
    
    int main()
    {
    	using namespace std;
    	ifstream MeineDatei;
    	MeineDatei.open ("TestDokument.txt");
    	if (MeineDatei.is_open())
    		Auslesen();
    
    	else
    		cout << "Fehler beim Auslesen der Daten!" << endl 
    		<< "Bitte pruefen sie ob \"TestDokument.txt\" existiert und im richtigen Ordner ist!";
    
    	MeineDatei.close();
    	cin.clear();
    	cin.ignore(numeric_limits<streamsize>::max(), '\n');
    }
    

    Ich habe die Fehlermeldung aussagekräftiger gemacht,
    eine Void-Funktion benutzt (zuerst dachte ich das ich alles in der main-Funktion ausgeben sollte),
    den Fehler behoben bei dem ich nur die erste Zeile zu lesen bekam
    und (so denke ich) habe map verstanden (ich lasse mich auch gern eines besseren belehren).

    Ich freue mich auch über eine Korrektur der 'Schönheitsfehler' oder auch anderen Fehlern, von denen es bestimmt genug gibt.

    Weiterhin danke für eure Hilfe.

    -Skotchy



  • Skotchy schrieb:

    und (so denke ich) habe map verstanden (ich lasse mich auch gern eines besseren belehren).

    Dann werde ich das mal machen. 🙂
    Bedenke noch einmal:

    map<string, string> m;
    m[SCHLUESSEL] = WERT.
    

    Wie sieht jetzt noch gleich die Datei aus?

    Die Datei schrieb:

    Schlüssel Wert
    Schlüssel Wert
    ...
    

    So wie du es jetzt machst, änderst du immer nur den Wert des Schlüssels "meintext".

    Dann noch kleine Anmerkungen:
    ifstream hat einen Konstruktor, da brauchst du dann kein open mehr:

    ifstream datei("text.txt");
    

    Das close am Ende kannst du hier auch sparen, das macht der Destruktor. (RAII ist schon was Tolles. :p)

    Zudem sollte die Funktion (hätte ich vielleicht deutlicher machen sollen) nur auslesen, aber nichts ausgeben. Das soll dann wieder in der main() geschehen.



  • Und die nächste Version des Programms ist raus:

    #include <iostream>
    #include <map>
    #include <limits>
    #include <fstream>
    #include <string>
    
    void Auslesen()
    {
        using namespace std;
    
    	int i = 0;
    
        ifstream MeineDatei ("TestDokument.txt", ios::in);
        map <int, string> text;
    
    	while(getline (MeineDatei, text[i]))
    		i++;
    
    	for (int j = 0; j != text.size() - 1; j++)
    		cout << "Text " << j << " ist " << text[j] << endl;
    }
    
    int main()
    {
        using namespace std;
        ifstream MeineDatei ("TestDokument.txt");
        if (MeineDatei.is_open())
    	{
            Auslesen();
    
    	}
    
        else
            cout << "Fehler beim Auslesen der Daten!" << endl
            << "Bitte pruefen sie ob \"TestDokument.txt\" existiert und im richtigen Ordner ist!";
    
    	cin.clear();
        cin.ignore(numeric_limits<streamsize>::max(), '\n');
    }
    

    Allerdings habe ich immer noch ein Problem:
    ich bekomme die maps nicht aus der Funktion und kann sie deswegen nich in der mein() Funktion ausgeben.
    Allerdings habe ich map jetzt verstanden (oder?!).

    Weiterhin danke für eure Hilfe.

    -Skotchy


Anmelden zum Antworten