Probleme beim Programmieren von Snake als Konsolenanwendung



  • Hallo an Alle,

    Ich habe einige Probleme und Bugs in meinem Snake-Programm, das ich für die Schule (Informationstechnisches Gymnasium, 11. Klasse) programmieren muss. Kriege einfach nicht raus was falsch läuft. Ich hoffe ihr könnt mir möglichst schnell helfen, da ich das Ding am Freitag abgeben muss.
    Ich poste einfach mal meinen Quellcode.
    Die Probleme stehen als kommentare neben dran.
    Freue mich über eure hilfe 🙂
    Danke im Vorraus!

    Also hier der Quellcode:

    #include <iostream>
    #include <conio.h>
    #include <windows.h>
    using namespace std;
    
    struct Koord
    {
    	int x, y;
    };
    
    int main()
    {
    	int dx=1, dy=0;
    	int weiter=1;
    	randomize();
    	int ax=random(53)+16 , ay=random(15)+6;
    	Koord z[90];
    
    	int laenge=5;
    	z[0].x=23;
    	z[0].y=10;
    	z[1].x=22;
    	z[1].y=10;
    	z[2].x=21;
    	z[2].y=10;
    	z[3].x=20;
    	z[3].y=10;
    	z[4].x=19;
    	z[4].y=10;
    
    	for (int i=15;i<=70;i++)
    	{
    	 gotoxy(i,5);
    	 cout<<"*";
    	 Sleep (3);
    	}
    
    	for (int i=5;i<=22;i++)
    	{
    	 gotoxy(70,i);
    	 cout<<"*";
    	 Sleep (3);
    	}
    
    	for (int i=70;i>=15;i--)
    	{
    	 gotoxy(i,22);
    	 cout<<"*";
    	 Sleep (3);
    	}
    
    	for (int i=22;i>=5;i--)
    	{
    	 gotoxy(15,i);
    	 cout<<"*";
    	 Sleep (3);
    	}
    
    	gotoxy(ax,ay);
    	cout<<"#";
    
    	for (int i=0;i<laenge;i++)
    	{
    	  gotoxy (z[i].x, z[i].y);
    	  cout<<"o";
    	}
    
    		while (weiter==1)
    		{
    			while (!kbhit()&&weiter==1)
    			{
    				gotoxy(z[laenge-1].x, z[laenge-1].y);
    				cout<<"  ";
    				for (int i=laenge-1;i>0;i--)
    				{
    					z[i]=z[i-1];
    				}
    
    			z[0].x=z[0].x+dx;
    			z[0].y=z[0].y+dy;
    
    				for (int i=0;i<laenge;i++)
    				   {
    					gotoxy(z[i].x, z[i].y);
    					cout<<"o";
    						if (i==0)
    						{
    						gotoxy(z[i].x, z[i].y);
    						cout<<"x";
    						}
    
    				   }
    
    					Sleep(80);
    
    						if (z[0].x>=70) break;
    						if (z[0].y>=22) break;
    						if (z[0].x<=15) break;
    						if (z[0].y<=5) break;
    
    						for (int i=1;i<90 ;i++ )
    						{
    							if (z[0].x == z[i].x && z[0].y == z[i].y)
    							{
    								weiter=0;
    							}
    
    						}
    
    						if (ax == z[0].x && ay == z[0].y)
    						{
    							ax=random(53)+16 , ay=random(15)+6;
    							gotoxy(ax,ay);
    							cout<<"#";
    
    							for (int i=0;i<=6 ;i++ )
    							{
    								if (ax == z[i].x && ay == z[i].y)
    								{
    									gotoxy(ax,ay);    //überschreibt beim
    									cout<<"#";        //"vorbeikriechen"
    								}                          //den Punkt zum
    							}                                   //fressen, also
    							laenge=laenge+2;                    //das "#" zeichen
    							         		                  //und den rechten
    						}                                            //Rand
    				}
    
    			if (z[0].x>=70)break;
    			if (z[0].y>=22) break;
    			if (z[0].x<=15)	break;
    			if (z[0].y<=5) break;
    
    		char x=getch();
    
    		if (x=='w'&&dy!=1)
    		{
    			dx=0;
    			dy=-1;
    		}
    		if (x=='a'&&dx!=1)
    		{
    			dx=-1;
    			dy=0;
    		}
    		if (x=='s'&&dy!=-1)
    		{
    			dx=0;
    			dy=1;
    		}
    		if (x=='d'&&dx!=-1)
    		{
    			dx=1;
    			dy=0;
    		}
    
    	}
    
    	clrscr();
    
    	do
    	{
    		gotoxy(34,12);
    		cout<<">>>>You Lost<<<<";
    		Sleep(50);
    		break;
    	}
    	while(true);         //Funktioniert nicht!
    			  //Ziel: Aufbau wie der Rand am Anfang
    
    	getchar();
    	return 0;
    }
    //---------------------------------------------------------------------------
    

    edit: code-tags hinzugefügt.



  • Danke im Vor-raus soll das oben heißen 😃
    Keine Ahnung warum es zensiert wurde..

    Gruß Krush



  • Krush schrieb:

    Danke im Vor-raus soll das oben heißen 😃
    Keine Ahnung warum es zensiert wurde..

    Weil es "voraus" heißt, mit einem R.

    Du solltest zudem dein Quellcode in CPP-Tags packen, sonst wird das kaum einer lesen können.

    Edit: Ah, hast du grad gemacht. Ist besser so 😃



  • Sorry bin ganz neu hier und nicht mit allem vertraut 😃

    Hoffe ihr könnt mir jetzt helfen 😛

    Gruß Krush



  • hallo und willkommen in diesem forum 🙂

    eins muss ich vorweg sagen:
    das spiel gefällt mir!
    das aufbauen des bildschirms und der nicht-ge-"o"te-kopf der schlange

    soooo zu deinem problem 🙂

    in zeile 80 schreibst du:

    cout<<"  ";
    

    das sind 2 leerzeichen. folglich nimmst du alles was rechts ist mit. 😃
    eins muss weg!

    viel spaß noch mit dem programm

    MfG helferlein



  • Hallo helferlein 🙂

    vielen Dank!
    Ich finde auch, dass es mir relativ gut gelungen ist 🙂

    Das mit den 2 Leerzeichen ist mir auch in den Sinn gekommen, nur ist das Problem:

    Wenn ich eines weg nehme bleibt immer ein "o" auf der strecke da meine schlange durch

    laenge=laenge+2;
    

    immer 2 länger wird...
    Dann brauch ich doch 2 Leerzeichen oder nicht?
    Leider eine Vorschrift unseres Lehrers 😞

    Gruß
    Krush



  • Du darfst die Länge nicht auf einmal um zwei ändern. Ich habe folgendes gemacht:
    1. Wie Helferlein anmerkte, nur eine Stelle löschen.
    2. Eine neue Variable inclen eingeführt:

    int main()
    {
    	 int inclen = 0;
    
        int dx=1, dy=0;
        int weiter=1;
    

    3. Die Länge immer nur um ein Feld pro Schlangenausgabe erhöht:

    while (!kbhit()&&weiter==1)
                {
                    gotoxy(z[laenge-1].x, z[laenge-1].y);
                    cout<<" ";
    
                    if(inclen)
                    {
                    	++laenge;
                    	--inclen;
                    }
    
                    for (int i=laenge-1;i>0;i--)
                    {
                        z[i]=z[i-1];
                    }
    

    und 4. dafür gesorgt, daß die Schlange insgesamt um 2 Felder verlängert wird:

    if (ax == z[0].x && ay == z[0].y)
                            {
                                ax=random(53)+16 , ay=random(15)+6;
                                gotoxy(ax,ay);
                                cout<<"#";
    
                                for (int i=0;i<=6 ;i++ )
                                {
                                    if (ax == z[i].x && ay == z[i].y)
                                    {
                                        gotoxy(ax,ay);    //überschreibt beim
                                        cout<<"#";        //"vorbeikriechen"
                                    }                          //den Punkt zum
                                }                                   //fressen, also
                                inclen = 2;                    //das "#" zeichen
                                                                   //und den rechten
                            }
    


  • Stimmt, mit einer neuen Variablen hab ichs noch garnicht probiert 😛

    Danke für die hilfe, funktioniert super!

    Könntet ihr mir noch nen kleinen tipp geben, wie ich ein Menü mit

    1.Spiel starten
    2.Highscore
    3.SPiel beenden

    erstellen kann?
    Müsste auch noch wissen wie man eine highscore speichert ohne eine neue unit mit klasse einzubinden..

    Danke für eure antworten!

    Gruß Krush



  • Ok ich habe jetzt eine highscore und ein Menü geschrieben.
    Hab das Programm jetzt doch etwas ausgeweitet und eine Klasse erstellt.
    Allerdings funktionieren wieder ein paar Sachen nicht, wie sie sollen 😡

    Ich poste mal den Code und die Problemstellen:

    Unit 1:

    #include<iostream>
    #include<conio.h>
    #include<windows.h>
    #include<fstream>
    using namespace std;
    #include"Snakespiel.h"
    
    struct Koord
    {
    	int x, y;
    };
    
    int main()
    {
    	Snakespiel s;
    	s.binspiel = true;
    	s.spielstart = false;
    	s.menu();
    	while (s.binspiel)
    	{
    	int dx=1, dy=0;
    	int score=0;
    	int geschauswahl=0;
    	int gesch=0;
    	int verl=0;
    	int weiter=1;
    	randomize();
    	int ax=random(53)+16 , ay=random(15)+6;
    	Koord z[90];
    	bool _inhighscore = s.inhighscore;
    	while (s.inhighscore);
    	if (_inhighscore) s.menu();
    
    	if (s.spielstart)
    
    	{
    	gotoxy(10,10);
    	cout<<"Welche Schwierigkeitsstufe wollen sie haben? "<<endl;
    	gotoxy(10,12);
    	cout<<"1 = Langsam, 2 = Mittel, 3 = Schnell, 4 = Sehr schnell "<<endl;
    	gotoxy(10,16);
    	cin>>geschauswahl;
    
    	if (geschauswahl == 1)
    	{
    		gesch=150;
    	}
    
    	if (geschauswahl == 2)
    	{
    		gesch=100;
    	}
    
    	if (geschauswahl == 3)
    	{
    		gesch=40;
    	}
    
    	if (geschauswahl == 4)
    	{
    		gesch=25;
    	}
    
    	clrscr();
    
    	for (int i=15;i<=70;i++)
    	{
    	 gotoxy(i,5);
    	 cout<<"*";
    	 Sleep (3);
    	}
    
    	for (int i=5;i<=22;i++)
    	{
    	 gotoxy(70,i);
    	 cout<<"*";
    	 Sleep (3);
    	}
    
    	for (int i=70;i>=15;i--)
    	{
    	 gotoxy(i,22);
    	 cout<<"*";
    	 Sleep (3);
    	}
    
    	for (int i=22;i>=5;i--)
    	{
    	 gotoxy(15,i);
    	 cout<<"*";
    	 Sleep (3);
    	}
    
    	gotoxy(ax,ay);
    	cout<<"#";
    	}
    
    	int laenge=5;
    	z[0].x=23;
    	z[0].y=10;
    	z[1].x=22;
    	z[1].y=10;
    	z[2].x=21;
    	z[2].y=10;
    	z[3].x=20;
    	z[3].y=10;
    	z[4].x=19;
    	z[4].y=10;
    
    	for (int i=0;i<laenge;i++)
    	{
    	  gotoxy (z[i].x, z[i].y);
    	  cout<<"o";
    	}
    
    		while (s.spielstart)
    		{
    			while (!kbhit()&&weiter==1)
    			{
    				gotoxy(z[laenge-1].x, z[laenge-1].y);
    				cout<<" ";
    
    				if (verl)
    				{
    					laenge++;
    					verl --;
    				}
    
    				for (int i=laenge-1;i>0;i--)
    				{
    					z[i]=z[i-1];
    				}
    
    			z[0].x=z[0].x+dx;
    			z[0].y=z[0].y+dy;
    
    				for (int i=0;i<laenge;i++)
    				   {
    					gotoxy(z[i].x, z[i].y);
    					cout<<"o";
    						if (i==0)
    						{
    						gotoxy(z[i].x, z[i].y);
    						cout<<"x";
    						}
    
    				   }
    
    					Sleep(gesch);
    
    						if (z[0].x>=70) { s.spielstart = false ;break; }
    						if (z[0].y>=22) { s.spielstart = false ;break; }
    						if (z[0].x<=15) { s.spielstart = false ;break; }
    						if (z[0].y<=5) { s.spielstart = false ;break; }
    
    						for (int i=1;i<90 ;i++ )
    						{
    							if (z[0].x == z[i].x && z[0].y == z[i].y)
    							{
    								weiter=0;
    							}
    
    						}
    
    							if (ax == z[0].x && ay == z[0].y)
    							{
    								ax=random(53)+16 , ay=random(15)+6;
    								gotoxy(ax,ay);
    								cout<<"#";
    
    								for (int i=0;i<=6 ;i++ )
    								{
    									if (ax == z[i].x && ay == z[i].y)
    									{
    										gotoxy(ax,ay);
    										cout<<"#";
    
    									}
    								}
    								score=score+7*geschauswahl;
    								verl = 2;
    
    							}
    				}
    
    			if (z[0].x>=70) { s.spielstart = false ;break; }
    			if (z[0].y>=22) { s.spielstart = false ;break; }
    			if (z[0].x<=15)	{ s.spielstart = false ;break; }
    			if (z[0].y<=5) { s.spielstart = false ;break; }
    
    		char x=getch();
    
    		if (x=='w'&&dy!=1)
    		{
    			dx=0;
    			dy=-1;
    		}
    		if (x=='a'&&dx!=1)
    		{
    			dx=-1;
    			dy=0;
    		}
    		if (x=='s'&&dy!=-1)
    		{
    			dx=0;
    			dy=1;
    		}
    		if (x=='d'&&dx!=-1)
    		{
    			dx=1;
    			dy=0;
    		}
    		}
    	clrscr();
    
    	for (int i=0;i<=4 ;i++ )
    	{
    
    		gotoxy(34,12);
    		cout<<">>>>You Lost<<<<";
    		Sleep(400);
    		clrscr();
    		Sleep(400);
    	}
    	clrscr();
    	while(!kbhit())
    	{
    	gotoxy(34,12);
    	cout<<"Ihre Punkte: "<<score;
    	}
    	clrscr();
    	s.binspiel = true;
    	s.spielstart = false;
    	weiter = 0;
    	s.menu();
    
    	}
    
    	getchar();
    	return 0;
    
    }
    //---------------------------------------------------------------------------
    

    Snakespiel.cpp

    //---------------------------------------------------------------------------
    
    #pragma hdrstop
    #include<iostream>
    #include<conio.h>
    #include<windows.h>
    #include<fstream>
    #include<string>
    using namespace std;
    
    #include "Snakespiel.h"
    //---------------------------------------------------------------------------
    #pragma package(smart_init)
    
    void Snakespiel::highs()
    {
    	inhighscore = true;
    	cout<<"TEST";
    	clrscr();
    	int w;
    	ifstream highscore ("SnakeScore.txt");
    	for (int w=0;w<=5 ;w++ )
    	{
    		highscore>>highscorefeld[w].name;
    		highscore>>highscorefeld[w].score;
    		highscore>>highscorefeld[w].platzierung;
    	}
    	cout<<highscorefeld[0].name;
    }
    
    void Snakespiel::highs2()
    {
    	int w;
    	ofstream highscore2 ("SnakeScore.txt");
    	for (int w;w<=5 ;w++ )
    	{
    		highscore2<<highscorefeld[w].name;
    		highscore2<<" ";
    		highscore2<<highscorefeld[w].score;
    		highscore2<<" ";
    		highscore2<<highscorefeld[w].platzierung;
    		highscore2<<" "<<endl;
    
    	}
    }
    
    void Snakespiel::hauptprogramm()
    {
    
    }
    
    void Snakespiel::menu()
    {
    int auswahl = 0;
    
    gotoxy(10,5);
    std::cout << "1. Neues Spiel" << std::endl;
    gotoxy(10,6);
    std::cout << "2. Highscore" << std::endl;
    gotoxy(10,7);
    std::cout << "3. Spiel beenden" << std::endl;
    
    gotoxy(10,10);
    cout<<"Treffen sie ihre Auswahl."<<endl;
    
    gotoxy(10,14);
    cin>>auswahl;
    
    clrscr();
    
    if (auswahl == 1) spielstart = true;
    else if (auswahl == 2) highs();
    else if (auswahl == 3) binspiel = false;
    
    }
    

    Snakespiel.h:

    //---------------------------------------------------------------------------
    
    #ifndef SnakespielH
    #define SnakespielH
    #include<iostream>
    #include<conio.h>
    #include<windows.h>
    #include<fstream>
    using namespace std;
    //---------------------------------------------------------------------------
    struct high
    {
    	string name;
    	int score;
    	int platzierung;
    };
    
    class Snakespiel
    {
    	private:
    				high highscorefeld[5];
    	public:
    				bool binspiel;
    				bool spielstart;
    				bool inhighscore;
    				void highs();
    				void highs2();
    				void hauptprogramm();
    				void menu();
    };
    #endif
    

    Soo..
    mit der Highscore klappt es noch nicht ich habe mit den fstreams keine Erfahrung.
    Wenn ich das Menü aufrufe und Highscore auswähle kommt nur ein leeres Fenster und eintragen kann man auch nichts.
    Habe schon probiert in die .txt Datei was einzutragen, es zeigt aber trotzdem nichts an 😞

    Problem mit dem Punkte-anzeigen gelöst 🙂
    Einfach das clrscr() vor der while(!kbhit())-Schleife in die for-Schleife des "You Lost" rein.
    dann klappts.

    Anderes Problem steht noch 😕

    Gruß Krush



  • erhöhe mal die werte in den sleeps - wahrscheinlich drückst du länger als 0.4 sekunden ne taste!? ^^

    bb


Anmelden zum Antworten