Algorithmus für ein Spiel



  • way schrieb:

    Kuldren[]

    Vorallendingen hörte es sich so an, als htte er es nichtmal versucht...

    Ein erkanntes Problem ist ein gelöstes 😉
    Vor allem, wo er die Lösung mit der Problemstellung schon mitliefert 😉



  • XHansWurstX schrieb:

    way schrieb:

    Kuldren[]

    Vorallendingen hörte es sich so an, als htte er es nichtmal versucht...

    Ein erkanntes Problem ist ein gelöstes 😉
    Vor allem, wo er die Lösung mit der Problemstellung schon mitliefert 😉

    Eigentlich enthält sein Beitrag auch keinerlei Bitte oder eine Aufforderung ihm zu helfen...
    Er schreibt nur dass er ein Problem hat, beschreibt es und bedankt sich dann..(vlt für die Aufmerksamkeit?)

    Mal ehrlich...ich meine wenn ich ein Problem habe und keinen Lösungsansatz frage ich auch gerne mal nach, aber wenn man praktisch schon weiß was zu tun ist und dann jmd anderen fragt, ist es eher Faulheit...



  • Vieleicht wollte er auch nur ein paar Leute irgendwie beschäftigen und hat genau dass erreicht 😉


  • Mod

    ich glaube, die erste antwort (von Blue-Tiger) hat es ausreichend auf den punkt gebracht, bitte nicht weiter wiederholen und drauf rumreiten. danke.



  • ich habe den algorithmus zwar beschrieben, bin aber leider noch nicht auf die idee gekommen wie ich dies machen soll. habe mir da schon nen paar stunden den kopf darüber zerbrochen aber komme zu keiner vernünftigen schnellen lösung und genau deswegen habe ich mein problem hier rein gestellt umd eine vernünftige lösung zu bekommen. wäre sehr hilfreich wenn ich nen kleinen code abschnitt bekommen könnte, mit dem ich das problem dann lösen könnte.



  • jontef schrieb:

    ich habe den algorithmus zwar beschrieben, bin aber leider noch nicht auf die idee gekommen wie ich dies machen soll. habe mir da schon nen paar stunden den kopf darüber zerbrochen aber komme zu keiner vernünftigen schnellen lösung und genau deswegen habe ich mein problem hier rein gestellt umd eine vernünftige lösung zu bekommen. wäre sehr hilfreich wenn ich nen kleinen code abschnitt bekommen könnte, mit dem ich das problem dann lösen könnte.

    Einfach Zeile für Zeile und Spalte für Spalte durchlaufen lassen - und dabei counter für die Zahlen 0-4 hochzählen wenn du solch eine findest. Nebenbei die Position der Zahl speichern usw....
    Wenn du dann in einer Zeile/Spalte bei einem der counter mehr als 4 hast löscht du die entsprechenden Zahlen..oder was auch immer du damit machen willst.

    Wenn die Zahlen allerdings direkt neben/untereinander stehen müssen musst du das natürlich vorher prüfen



  • Sry jontef, aber Code wirst du hier nicht kriegen. Deine Beschriebung ist in Ordnung, die Codeumsetzung ist auch nicht wirklich schwer, aber wenn du daran schon scheiterst und erst recht nichtmal einen kleinen Versuch postest...da wirds haarig. Falls du der Materie bishierher noch nicht gewachsen bist, solltest du vielleicht überlegen, deine aktuellen Kenntnisse zu erweitern 😉

    Ich möchte rapso nicht provozieren, aber so schauts aus.



  • Einfach Zeile für Zeile und Spalte für Spalte durchlaufen lassen - und dabei counter für die Zahlen 0-4 hochzählen wenn du solch eine findest. Nebenbei die Position der Zahl speichern usw....
    Wenn du dann in einer Zeile/Spalte bei einem der counter mehr als 4 hast löscht du die entsprechenden Zahlen..oder was auch immer du damit machen willst.

    Wenn die Zahlen allerdings direkt neben/untereinander stehen müssen musst du das natürlich vorher prüfen

    danke Kuldren, hast mich auf eine gute idee gebracht. werde mal probieren das so ähnlich umzusetzen, hätte auch selber auf die idee kommen können aber hatte da mal wieder nen brett vorm kopf ^^

    werde mein ergbeniss mal posten wenn ich es fertig habe

    Sry jontef, aber Code wirst du hier nicht kriegen. Deine Beschriebung ist in Ordnung, die Codeumsetzung ist auch nicht wirklich schwer, aber wenn du daran schon scheiterst und erst recht nichtmal einen kleinen Versuch postest...da wirds haarig. Falls du der Materie bishierher noch nicht gewachsen bist, solltest du vielleicht überlegen, deine aktuellen Kenntnisse zu erweitern 😉

    Ich möchte rapso nicht provozieren, aber so schauts aus.

    also ich denke schon das ich der materie ein wenig gewachsen bin, aber erweitere meine kenntnisse gern und ich denke doch das so ein forum/board dafür da ist um sich tipps und anregen zu beschaffen oder meinst nicht ?



  • also ich denke schon das ich der materie ein wenig gewachsen bin, aber erweitere meine kenntnisse gern und ich denke doch das so ein forum/board dafür da ist um sich tipps und anregen zu beschaffen oder meinst nicht ?

    "Meinst nicht", dass es schwachsinnig ist, sich den Code vorgefressen in den Mund legen zu lassen? Tips und Anregungen hast du bereits bekommen und nur weil du noch keine einzelne Zeile Code gesehen hast (Obwohl du mit großen Augen darauf wartest), haste gleich Probleme sie in die Tat umzusetzen? Ich sags ungern, aber ohne irgendeinen Stückchen Code vorzulegen, mit dem du gleichzeitig beweist, dass du dich wenigstens daran versucht hast, wirst du nicht mehr viel erreichen. Die wichtigsten Tips hast du bereits von meinen Vorgängern erhalten 😉



  • so nun hab ich eine lösung für das problem. ist erstmal eine vorläufige lösung, welche vlt noch nicht perfekt ist aber sie funktioniert wenigstens erstmal. über kritik oder verbesserungen würde ich mich freuen.
    hoffe man kann es verstehen was ich da gemacht habe.

    #include <iostream>
    #include <vector>
    
    #define xmax 12
    #define ymax 14
    
    void main()
    {
    	int farbfeld[xmax][ymax];
    
    	for(int y=0;y<ymax;y++)
    	{
    		for(int x=0;x<xmax;x++)
    		{
    			farbfeld[x][y]=rand()%5;
    		}
    	}
    
    	for(int y=0;y<ymax;y++)
    	{
    		for(int x=0;x<xmax;x++)
    		{
    			if(farbfeld[x][y]!=4)
    				std::cout<<farbfeld[x][y]<<"  ";
    			else
    				std::cout<<"   ";
    		}
    		std::cout<<"\n";
    	}
    
    	std::vector<int>xelement;
    	std::vector<int>yelement;
    	std::vector<int>::iterator xanfang,xende,yanfang;
    	int aktfarbe=4;
    	int farbcounter=0;
    
    	for(int y=0;y<ymax;y++)
    	{	
    		aktfarbe=farbfeld[0][0];
    		for(int x=0;x<xmax;x++)
    		{							
    			if(aktfarbe==farbfeld[x][y]&&aktfarbe!=4)
    			{
    				farbcounter++;
    				xelement.push_back(x);
    				yelement.push_back(y);
    			}
    			if(farbcounter>=3)
    			{
    				xanfang=xelement.begin();
    				xende=xelement.end();
    				yanfang=yelement.begin();
    				for(;xanfang<xende;xanfang++)
    				{					
    					farbfeld[*xanfang][*yanfang]=4;
    					yanfang++;
    				}
    				xelement.clear();
    				yelement.clear();
    			}
    			if(aktfarbe!=farbfeld[x+1][y])
    			{
    				aktfarbe=farbfeld[x+1][y];
    				farbcounter=0;
    				xelement.clear();
    				yelement.clear();
    			}
    		}
    		farbcounter=0;
    	}	
    
    	for(int x=0;x<xmax;x++)
    	{	
    		aktfarbe=farbfeld[0][0];
    		for(int y=0;y<ymax;y++)
    		{							
    			if(aktfarbe==farbfeld[x][y]&&aktfarbe!=4)
    			{
    				farbcounter++;
    				xelement.push_back(x);
    				yelement.push_back(y);
    			}
    			if(farbcounter>=3)
    			{
    				xanfang=xelement.begin();
    				xende=xelement.end();
    				yanfang=yelement.begin();
    				for(;xanfang<xende;xanfang++)
    				{					
    					farbfeld[*xanfang][*yanfang]=4;
    					yanfang++;
    				}
    				xelement.clear();
    				yelement.clear();
    			}
    			if(aktfarbe!=farbfeld[x][y+1])
    			{
    				aktfarbe=farbfeld[x][y+1];
    				farbcounter=0;
    				xelement.clear();
    				yelement.clear();
    			}
    		}
    		farbcounter=0;
    	}
    
    	std::cout<<"\n\n\n";
    	for(int y=0;y<ymax;y++)
    	{
    		for(int x=0;x<xmax;x++)
    		{
    			if(farbfeld[x][y]!=4)
    				std::cout<<farbfeld[x][y]<<"  ";
    			else
    				std::cout<<"   ";
    		}
    		std::cout<<"\n";
    	}
    }
    

    "Meinst nicht", dass es schwachsinnig ist, sich den Code vorgefressen in den Mund legen zu lassen? Tips und Anregungen hast du bereits bekommen und nur weil du noch keine einzelne Zeile Code gesehen hast (Obwohl du mit großen Augen darauf wartest), haste gleich Probleme sie in die Tat umzusetzen? Ich sags ungern, aber ohne irgendeinen Stückchen Code vorzulegen, mit dem du gleichzeitig beweist, dass du dich wenigstens daran versucht hast, wirst du nicht mehr viel erreichen. Die wichtigsten Tips hast du bereits von meinen Vorgängern erhalten 😉

    wie du siehst setzte ich mich sehr wohl damit auseinander und habe es auch erstmal hinbekommen. ich wollte den code nicht vorgesetzt bekommen haben, außerdem hätte ich den auf mein programm eh nicht 1zu1 übernehmen können. deswegen hätte ich mir schon den code angeschaut um mir das klar zu machen aber hab es jetzt ja durch die hilfe von den anderen postern hier hinbekommen. danke allen

    schaut euch mein programm aber mal an und sagt was ihr dazu meint



  • Da Du meinst, daß die Funktionalität erst mal gegeben ist, will ich Dir dass glauben.

    Die Aufgabe der 2ten Schleife solltest Du auch in der ersten unterkriegen.

    jontef schrieb:

    void main()
    {
    	int farbfeld[xmax][ymax];
    
    	for(int y=0;y<ymax;y++)
    	{
    		for(int x=0;x<xmax;x++)
    		{
    			farbfeld[x][y]=rand()%5;
    		}
    	}
            // an sich dieselbe Schleife ;)
    	for(int y=0;y<ymax;y++)
    	{
    		for(int x=0;x<xmax;x++)
    		{
    			if(farbfeld[x][y]!=4)
    				std::cout<<farbfeld[x][y]<<"  ";
    			else
    				std::cout<<"   ";
    		}
    		std::cout<<"\n";
    	}
    

    Ich sehe auch gerade, daß am Ende noch mal dieselbe Schleife kommt wie die 2te hier oben. Das solltest Du in eine extra Funktion packen, dann schreibst Du es nur einmal und kannst es immer wieder aufrufen. Macht das Programm kürzer und übersichtlicher...
    ansonsten solltest Du Dir mal die Suchfunktionen für Container aus der STL ansehen, dann sparts du dir die durch itererierung "per hand",... Stichwort <algorithm> und <vector>. EInfach mal die Doku's lesen



  • Ansonsten, ein einfaches:

    using namespace std;
    

    vor die Main, und Du sparst Dir die ganzen std::

    #define MAX_X 12     // bei defines würde ich Großschreibung vorziehen
    

    Weiterhin: Wenigstens ein paar Kommentare würden auch Dir helfen 😉
    Eine kurze Bemerkung, was gemacht wird, evtl auch warum. In 2 Monaten hast Du vergessen was die Massen von for() schleifen und if()`s da eigentlich machen.

    Wie oben schon gesagt, bau dir mehr Funktionen. Dann sieht die Main evtl so aus

    int main()
    {
        FuelleFeld();
        PrüfeFeld();
        ZeigeFeld();
    }
    

    Ich glaube, eine Variable letzte_farbe oder (bei dir) nächste_farbe neben aktuelle_farbe könnte dein programm auch übersichtlicher machen...

    Und für die Zukunft: Wie eigentlich alle einstimmig meinten: Du hast das Problem erkannt und die Lösung beschrieben. Fang danach Schritt für Schritt an, genau diese Ideen umzusetzen. Wenn dann was nicht läuft, stelle Fragen. Sie werden hier gerne beantwortet.
    Ansonsten ist das kein Problem speziell für Spieleprogrammierer. Im C++ Forum ist mehr los, da wird dir schneller geholfen.



  • void main() // solltest du ändern in:
    
    int main(){
    
       return 0;
    }
    


  • danke für anregungen und verbersserungsvorschläge. werde das beim implementieren des codes berücksichtigen, denn der wird in eine art tetris verwendet.

    C/C++ Code:
    void main() // solltest du ändern in:

    int main(){

    return 0;
    }

    warum sollte ich das so verwenden ?


  • Mod



  • jontef schrieb:

    danke für anregungen und verbersserungsvorschläge. werde das beim implementieren des codes berücksichtigen, denn der wird in eine art tetris verwendet.

    Dazu ein gut gemeinter Tip: Mach Dir schon vorher Gedanken, wie die Art Tetris aufgebaut werden soll!!!
    Einfache Skizzen, welche Klassen/ Objekte du brauchst. Wo kann man sinnvoll Polymorphie/ Vererbung einbauen? Wie kommunizieren die Objekte(Schnittstellen)?
    Evtl. eine GameStateEngine um ein Zentrales Steuerungssystem für Events und Bildschirm zeichnen zu haben?
    Das ist nicht gerade wenig...Aber evtl erkennst Du dadurch schon vorher Probleme die auftreten könnten...

    Solltest Du allerdings schon locker mal eben TicTacToe oder Schiffe Versenken schreiben können vergiß es, das sind imo ähnliche Projekte, die einem aber nicht so schnell über den Kopf wachsen 😉


Anmelden zum Antworten