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 schlangesoooo 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 beendenerstellen 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(); }; #endifSoo..
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