Problem bei einem Spiel
-
Hi!
Bin gerade dabei ein Spiel zu schreiben. Bisher sieht der Code so aus:#include <cstdlib> #include <iostream> #include <conio.h> #include <windows.h> ////////////ALLE VARIABLEN//////////////////// int ilaenge,ifarben,isettings,ibreite,ihoehe,iauswahlspiel,ilaenge1,ihoehe1,ianzahl,istelle; int ispielsteuerung; int izr,izrs,izl,izls,izh,izhs,izh1,izr1,izd,izds,istellelinks,istellerechts,istellehoch,istellerunter,inaechstehoehe,istellefix; COORD pos; HANDLE hConsole; ////////////ALLE VARIABLEN//////////////////// void stelle(int ilaenge, int ihoehe) { istelle=ilaenge*pos.Y+pos.X+1; istellerechts=ilaenge*pos.Y+pos.X+1+1; istellelinks=ilaenge*pos.Y+pos.X+1-1; istellehoch=ilaenge*pos.Y+pos.X+1-ilaenge; istellerunter=ilaenge*pos.Y+pos.X+1+ilaenge; inaechstehoehe=pos.Y*ilaenge+ilaenge+1; } void spielfeld(int ilaenge, int ihoehe) { hConsole = GetStdHandle(STD_OUTPUT_HANDLE); ifarben=3; system("cls"); ianzahl=ilaenge*ihoehe; int iarray[ianzahl]; int izaehler; ilaenge1=ilaenge; ihoehe1=ihoehe; ianzahl=1; for(ihoehe1=0; ihoehe1<ihoehe; ihoehe1++) { for(ilaenge1=0; ilaenge1<=ilaenge-1; ilaenge1++) { iarray[ianzahl]=rand()%ifarben+1; SetConsoleTextAttribute(hConsole, iarray[ianzahl]); printf("%i",iarray[ianzahl]); ianzahl++; } printf("\n"); } getch(); ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// pos.X = 0; // x-Position pos.Y = 0; // y-Position SetConsoleCursorPosition(GetStdHandle(STD_OUTPUT_HANDLE), pos); do { stelle(ilaenge,ihoehe); ispielsteuerung=getch(); switch(ispielsteuerung) { case 72: if(pos.Y>=1) { pos.X = pos.X; // x-Position pos.Y = pos.Y-1; // y-Position SetConsoleCursorPosition(GetStdHandle(STD_OUTPUT_HANDLE), pos); } else { 1; } break; case 75: if(pos.X>=1) { pos.X = pos.X-1; // x-Position pos.Y = pos.Y; // y-Position SetConsoleCursorPosition(GetStdHandle(STD_OUTPUT_HANDLE), pos); } else { 1; } break; case 80: if(pos.Y<ihoehe-1) { pos.X = pos.X; // x-Position pos.Y = pos.Y+1; // y-Position SetConsoleCursorPosition(GetStdHandle(STD_OUTPUT_HANDLE), pos); } else { 1; } break; case 77: if(pos.X<ilaenge-1) { pos.X = pos.X+1; // x-Position pos.Y = pos.Y; // y-Position SetConsoleCursorPosition(GetStdHandle(STD_OUTPUT_HANDLE), pos); } else { 1; } break; case 13: istellefix=istelle; izrs=istellerechts; izr1=0; izh1=0; for(izh=0;izh!=pos.Y;izh++) { 1; } do { if(izrs<inaechstehoehe) { izr++; izrs++; } else { break; } }while(iarray[izrs]==iarray[istellerechts]); izr=izr+1; int ix; if(iarray[istellefix]==iarray[istellerechts]) { for(ix=0;ix<=izh;ix++) { if(pos.Y!=0) { do { iarray[istelle]=iarray[istellehoch]; pos.X=pos.X+1; SetConsoleCursorPosition(GetStdHandle(STD_OUTPUT_HANDLE), pos); istelle=ilaenge*pos.Y+pos.X+1; istellehoch=ilaenge*pos.Y+pos.X+1-ilaenge; izr1++; }while(izr1<izr); pos.Y=pos.Y-1; pos.X=pos.X-izr1; SetConsoleCursorPosition(GetStdHandle(STD_OUTPUT_HANDLE), pos); istelle=ilaenge*pos.Y+pos.X+1; istellehoch=ilaenge*pos.Y+pos.X+1-ilaenge; izr1=0; } else { for(ix=0;ix<=izr-1;ix++) { istelle=ilaenge*pos.Y+pos.X+1; iarray[istelle]=0; pos.X=pos.X+1; SetConsoleCursorPosition(GetStdHandle(STD_OUTPUT_HANDLE), pos); } } } } else { break; } system("cls"); ianzahl=1; for(ihoehe1=0; ihoehe1<ihoehe; ihoehe1++) { for(ilaenge1=0; ilaenge1<=ilaenge-1; ilaenge1++) { SetConsoleTextAttribute(hConsole, iarray[ianzahl]); printf("%i",iarray[ianzahl]); ianzahl++; } printf("\n"); } izh=0; izr=0; } }while(1); } void settings() // EINSTELLUNGEN GROESSE UND FARBE { system("cls"); printf("Bitte geben Sie die Breite des Spielfelds an: "); scanf("%i",&ilaenge); printf("Bitte geben Sie die Hoehe des Spielfelds an: "); scanf("%i",&ihoehe); printf("Bitte geben Sie die Anzahl der Farben an: "); scanf("%i",&ifarben); system("cls"); printf("Einstellungen\n\n"); printf("Laenge: %i\n",ilaenge); printf("Hoehe: %i\n",ihoehe); printf("Farben: %i\n\n",ifarben); printf("Sind Sie mit diesen Einstellungen zufrieden?\n\n"); printf("[1] - Ja\n"); printf("[2] - Nein\n"); isettings=getch(); switch(isettings) { case '1': spielfeld(ilaenge,ihoehe); break; case '2': settings(); break; } } void festlegung() //STANDARDEINSTELLUNGEN { ilaenge=15; ihoehe=15; ifarben=3; } void spielanfang() { system("cls"); festlegung(); printf("Einstellungen\n\n"); printf("Laenge: %i\n",ilaenge); printf("Hoehe: %i\n",ihoehe); printf("Farben: %i\n\n",ifarben); printf("[1] - Spiel starten\n"); printf("[2] - Einstellungen aendern\n"); iauswahlspiel=getch(); switch(iauswahlspiel) { case '1': spielfeld(ilaenge,ihoehe); break; case '2': settings(); break; } } void steuerung() { char causwahl; causwahl = getch(); switch(causwahl) { case '1': spielanfang(); break; case '2': printf("Spiel laden"); break; case '3': printf("Highscore"); break; case '4': settings(); break; case '5': printf("Spiel beenden"); break; } getch(); }
ist ein Modul.
Und die main:
#include <cstdlib> #include <iostream> #include <conio.h> #include <windows.h> #include "module.h" using namespace std; int main(int argc, char *argv[]) { srand ( time(NULL) ); printf("\n[1.] - Spiel starten\n"); printf("[2.] - Spiel Laden \n"); printf("[3.] - Highscore \n"); printf("[4.] - Einstellungen\n"); printf("[5.] - Spiel beenden\n"); steuerung(); }
Bei dem Spiel werden, wenn zwei Zahlen nebeneinander stehen und man Enter drückt, die Zahlen rausgelöscht und die darüber heruntergeholt.
Das Problem ist, dass wenn sich der Cursor unter pos.Y=3 befindet, also in den oberen 4 Reihen, alles Perfekt funktioniert und an jeder Stelle darunter das Spiel einfach abstürzt.
Kennt jemand das Problem/Weiß jemand woran es liegt?
-
Der Problemkern dürfte irgendwo hier liegen:
case 13: if(iarray[istellefix]==iarray[istellerechts]) { for(ix=0;ix<=izh;ix++) { if(pos.Y!=0) { do { iarray[istelle]=iarray[istellehoch]; pos.X=pos.X+1; SetConsoleCursorPosition(GetStdHandle(STD_OUTPUT_HANDLE), pos); istelle=ilaenge*pos.Y+pos.X+1; istellehoch=ilaenge*pos.Y+pos.X+1-ilaenge; izr1++; }while(izr1<izr); pos.Y=pos.Y-1; pos.X=pos.X-izr1; SetConsoleCursorPosition(GetStdHandle(STD_OUTPUT_HANDLE), pos); istelle=ilaenge*pos.Y+pos.X+1; istellehoch=ilaenge*pos.Y+pos.X+1-ilaenge; izr1=0; } else { for(ix=0;ix<=izr-1;ix++) { istelle=ilaenge*pos.Y+pos.X+1; iarray[istelle]=0; pos.X=pos.X+1; SetConsoleCursorPosition(GetStdHandle(STD_OUTPUT_HANDLE), pos); } } } } else { break; } system("cls"); ianzahl=1; for(ihoehe1=0; ihoehe1<ihoehe; ihoehe1++) { for(ilaenge1=0; ilaenge1<=ilaenge-1; ilaenge1++) { SetConsoleTextAttribute(hConsole, iarray[ianzahl]); printf("%i",iarray[ianzahl]); ianzahl++; } printf("\n"); }
-
Hab das mal überflogen:
Benötigst du die c++ Header im Quelltext? Wenn nein, weg damit.Nur zum main:
#include <stdio.h> #include <time.h> #include "module.h" // Der restliche Quelltext in der Headerdatei ist nicht gut // packe die Funktionen in eine C-Datei int main(int argc, char *argv[]) { srand ( time(NULL) ); printf("\n[1.] - Spiel starten\n"); printf("[2.] - Spiel Laden \n"); printf("[3.] - Highscore \n"); printf("[4.] - Einstellungen\n"); printf("[5.] - Spiel beenden\n"); steuerung(); }
Die Aufteilung des Quelltextes sollte noch mal überdacht werden.
Die Formatierung in deinem ersten Quelltext bereitet mir Kopfschmerzen -> überarbeite die mal.Globale Variable in der Anzahl sind und mit teilweise dem selben Namen wie Variable an anderer Stelle - muss das sein.
Teile den Quelltext mal nach Optik und Einstellungen und dann deutlich getrennt im Quelltext nach der Spiellogik. Dann kann man das einfacher auswerten.
MfG f.-th.
Edit by SideWinder: Code-Tags hinzugefügt.
-
hab die Codetags vergessen.
hast ja noch etwas geschrieben. Wenn du das noch mal zeigst, mache die Formatierung übersichtlicher.