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.


Anmelden zum Antworten