Variablen aktuallisieren?



  • Hallo,
    Ich denke nicht, dass dir jemand helfen kann wenn du nicht den code zeigst, mit dem du iKartenWert aktualisieren möchtest...

    mfg



  • Ok, ich weiß nicht ob es das ist was gemeint ist aber ich habe halt diese Funktion:

    int Button::handle_events( int *iZeiger )
    

    dadrin ist

    *iZeiger = 0;
    

    und ich habe dann halt if-else Verzweigungen á la

    if( rand() %52 == 1 && bGeklickt == false )
    				{
    					Button myButton1( 610, 512, 300, 500 );
    					apply_Surface( 610,  512, card_Heart, screen, &clipOpen[ 0 ] );
    					bGeklickt = true;
    				   *iZeiger = 2;               //Das wäre dann ja die akutallisierung
    				}
    

    so läuft das dann halt weiter. Am ende der Funktion ist *iZeiger halt der Rückgabewert.
    In der main-Funktion hab ich dann die Variable für den Kartenwert und den Zeiger:

    int iKartenWert = 0;
    int *ipZeiger = &iKartenWert;
    

    Dann in der Programmschleife halt solange ein Ereignis da ist wird das hier gemacht:

    stringstream anzeige;
    anzeige << "Kartensumme: " << iKartenWert;
    punkte	= TTF_RenderText_Solid( schrift, anzeige.str().c_str(), textColor );
    myButton1.handle_events( &iKartenWert );
    myButton2.handle_events2();
    apply_Surface( 1500, 0, punkte, screen );        //Liegt hier vielleicht das Problem?
    SDL_Flip( screen ); //UpdateFunktion
    

    Mfg



  • ElGreco schrieb:

    Genau, es geht mir aber ja darum wie ich den Wert richtig aktualisiere

    Ich dachte der richtige Wert steht da, nur über dem alten?
    Du musst in deinem Programm eine Schleife haben, die immer wieder den Bildpuffer ganz (oder teilweise leert) - vllt. fehlt das bei dir - und dann alles (oder das, was sich verändert hat) neu zeichnet, nachdem du Events wie Karten ziehen etc. verarbeitet hast.



  • Ja genau das meinte ich ja mit "aktualisieren".

    Also ich könnte ja einen Boolean einbauen z.b "bAktualisiert" der in den if else Verzweigungen dann auf true gesetzt wird und das der Buffer geleert wird wenn der true ist?



  • Ja, z.B. Und auch, dass das Zeichnen nur dann passiert, denn das kostet die meiste Zeit.



  • Das Problem ist ich kenne keine Funktion die den Buffer löscht, weil die Surface, also "punkte" kann ich zwar leeren oder füllen, aber das ändert nichts am Variablen Wert. D.h wenn ich nach dem Aufruf der myButton Funktion die Surface leere und dann neu zeichne, wird der alte Wert gezeichnet



  • Ok ok... ich hab jetzt eine Idee... Ich hab rausgefunden wie man die Surface überspielt... Der Plan ist halt: var 1 beinhaltet kartenwert und "punkte" rendert das. Dann erfolgt aufruf der Funktion myButton...der neue Wert wird übergeben, dann wird die alte "punkte" surface geleert und neu definiert.

    Zur besseren übersicht hab ich gemacht das var 1 nur "Kartenwert: " ausgibt und beim 2. mal "Kartenwert: " << iKartenwert; und "punkte" neu angewandt wird.
    Jetzt gibt er aber sofort die 2. variante aus, daraus folgt das ich idiot ja sagen muss "mach die 2. variante nur wenn myButton... gemacht wurde". Nur wie würde ich das kontrollieren? if( blablabla == true) ABER die Funktion ist ja ein integer und kein boolean, weil die muss ja den Zeiger zurück geben...was ist wenn ich dann sage if( blablabla == 1 ) und als Rückgabewert in der Funktion "1" in allen Verzweigungen mache? Aber die Idee ist doch gut oder?



  • Wie mein Vorredner schon sagte, poste doch mal mehr von dem Code.
    So wie du das beschreibst, verstehe ich im Moment nicht so richtig, was du meinst. Mein Verdacht ist aber, dass der Code an einigen Stellen noch unnötig kompliziert und "um die Ecke gedacht" ist.
    Vorab als Tip schonmal: if (b) statt if (b == true) und if (!b) statt if (b == false). Das macht es wesentlich leserlicher.



  • ElGreco schrieb:

    Der Plan ist halt: var 1 beinhaltet kartenwert und "punkte" rendert das.

    Was ist var1 (das hast du wohl gemeint). Eine neue Variable? Warum, du hast doch iKartenwert?

    ElGreco schrieb:

    die Funktion ist ja ein integer und kein boolean, weil die muss ja den Zeiger zurück geben...

    Was gibt sie jetzt zurück, einen Zeiger oder einen int?

    ElGreco schrieb:

    was ist wenn ich dann sage if( blablabla == 1 ) und als Rückgabewert in der Funktion "1" in allen Verzweigungen mache?

    Verstehe ich nicht (wo steht das if ( blablabla == 1 ))? Von welcher Funktion redest du? Wenn du eh in "allen Verweigungen" 1 zurückgibst, warum dann überhaupt der Rückgabewert? Bisher habe ich das so verstanden, dass da der Kartenwert zurückgegeben werden soll.
    Du schreibst, wie als würden wir alle hier den Code und das Problem sehr gut kennen und genau wissen was du meinst, aber dem ist nicht so. Versuch dich mal in uns reinzuversetzen und mehr und genauere Informationen zu geben.
    Ja du kannst Vergleiche wie if ( i == 1 ), if ( i >= 1 ) oder if ( i > 1 ) machen, klar.

    ElGreco schrieb:

    Aber die Idee ist doch gut oder?

    Hört sich wie gesagt unnötig kompliziert an.



  • ElGreco schrieb:

    Ok, ich weiß nicht ob es das ist was gemeint ist aber ich habe halt diese Funktion:

    int Button::handle_events( int *iZeiger )
    

    dadrin ist

    *iZeiger = 0;
    

    und ich habe dann halt if-else Verzweigungen á la

    if( rand() %52 == 1 && bGeklickt == false )
    				{
    					Button myButton1( 610, 512, 300, 500 );
    					apply_Surface( 610,  512, card_Heart, screen, &clipOpen[ 0 ] );
    					bGeklickt = true;
    				   *iZeiger = 2;               //Das wäre dann ja die akutallisierung
    				}
    

    Ist das die komplette Funktion?

    Ich würde mal an verschiednen Stellen Testausgaben in die Konsole machen, mit den Werten deiner Variablen und an welchen Stellen etc. und dann kommst du vielleicht auch selbst drauf, wo etwas nicht nach Plan läuft.



  • Ok ich hab wohl bisschen für unklarheiten gesorgt, das wollt ich nicht sorry^^

    Also es gibt keine var 1 und die Funktion "blablabla" ist "Mybutton", hatte nur keine Lust alles zu schreiben. Die hält halt auch die Kartenkoordinaten der Karten und teilt den sprite sheet der karten. Aber die if else sachen sind so wie beschrieben. Als Rückgabewert ist "int *Zeiger1" Aber wie gesagt ich bin mir 99% sicher, wo das Problem ist. Die neue loop ist jetzt ( vielleicht unnötige Code verschwendung ) so:

    if( SDL_PollEvent( &event ) )
    		{
    			myButton1.handle_events( &iKartenWert );
    			if( myButton1.handle_events( &iKartenWert ) == 0 )
    			{
    			stringstream anzeige;
    			anzeige << "Kartensumme: ";
    			punkte	= TTF_RenderText_Solid( schrift, anzeige.str().c_str(), textColor );
    			myButton1.handle_events( &iKartenWert );
    			myButton2.handle_events2();
    			apply_Surface( 1500, 0, punkte, screen );
    			apply_Surface( 100, 750, text[0], screen );
    			apply_Surface( 0, 0, text[1], screen );
    			apply_Surface( 1325, 50, text[2], screen );
    
    			SDL_Flip( screen );
    			}
    
    			else if( myButton1.handle_events( &iKartenWert ) == 1 )
    			{
    			SDL_FillRect(punkte, NULL, 0x000000);
    			stringstream anzeige2;
    			anzeige2 << "Kartensumme: " << iKartenWert;
    			punkte	= TTF_RenderText_Solid( schrift, anzeige2.str().c_str(), textColor );
    			myButton2.handle_events2();
    			apply_Surface( 1500, 0, punkte, screen );
    			apply_Surface( 100, 750, text[0], screen );
    			apply_Surface( 0, 0, text[1], screen );
    			apply_Surface( 1325, 50, text[2], screen );
    
    			SDL_Flip( screen );
    			}
    
    		}
    

    Ich hab nämlich in den if else Verzweigungen noch gemacht das der Rückgabewert "1" ist und als normaler Rückgabewert "0".
    Das Problem ist halt, ich will dass solange der normale Kartenwert, also 0 ausgegeben wird, bis die Funktion myButton1..., welche auch für dafür sorgt das die Karten sich umdrehen und generiert werden, aktiviert ist, also == 1, da ja dann eine der if-else Verzweigungen der Funktion aktiv ist. Dann wird erstmal die alte Surface geleert und die neue wird ausgegeben! So der Plan, nur kennt der so die 2. if-else Verzweigung nicht.

    PS: Danke für die Ratschläge 👍



  • ElGreco schrieb:

    die Funktion "blablabla" ist "Mybutton"

    Mybutton ist keine Funktion, sondern ein Objekt.

    ElGreco schrieb:

    hatte nur keine Lust alles zu schreiben.

    Das würde ich dir aber empfehlen, wenn du willst dass wir dir helfen.

    ElGreco schrieb:

    Aber die if else sachen sind so wie beschrieben.

    Deine Beschreibung war sehr unklar, ich denke das geht nicht nur mir so. Wie wärs wenn du uns jetzt endlich mal die Funktion postest?

    ElGreco schrieb:

    Als Rückgabewert ist "int *Zeiger1"

    Die einzige Funktion, die du hier aufgeführt hast, hat den Rückgabetyp int und nicht int*.

    ElGreco schrieb:

    Aber wie gesagt ich bin mir 99% sicher, wo das Problem ist.

    Dann sag uns doch deine Vermutung! Mitsamt dem ganzen Code der Funktion, in der der Fehler vermutlich ist und allem, was zum Verständnis notwendig ist.

    ElGreco schrieb:

    Die neue loop ist jetzt ( vielleicht unnötige Code verschwendung ) so:

    Das ist kein Loop, das ist eine Verzweigung.

    ElGreco schrieb:

    Das Problem ist halt, ich will dass solange der normale Kartenwert, also 0 ausgegeben wird, bis die Funktion myButton1..., welche auch für dafür sorgt das die Karten sich umdrehen und generiert werden, aktiviert ist, also == 1, da ja dann eine der if-else Verzweigungen der Funktion aktiv ist.

    Das ist kein Problem. Was ist das Problem? Immer noch, das der neue Kartenwert über den alten drübergerendert wird? Ist die SDL_FillRect() Funktion so überhaupt richtig verwendet; müsste da nicht eher screen gefüllt werden?

    ElGreco schrieb:

    Dann wird erstmal die alte Surface geleert und die neue wird ausgegeben! So der Plan, nur kennt der so die 2. if-else Verzweigung nicht.

    Was soll das denn heißen, "er kennt sie nicht"???! Das er nie in den Teil mit == 1 reingeht? Test das mal, indem du da ein std::cout << "handleEvents() == 1" << std::endl; o.Ä. reinschreibst.

    ElGreco schrieb:

    Ok ich hab wohl bisschen für unklarheiten gesorgt, das wollt ich nicht sorry^^

    Sorry, aber jetzt ist es immer noch nicht klarer. Halte dir mal vor Augen, dass wir überhaupt keine Ahnung von deinem Programm haben und wie es funktioniert. Dafür, dass wir Außenstehende sind, drückst du dich immer noch extrem unklar aus.



  • Aber das Problem liegt doch nicht in der Funktion, das Problem liegt am Ablauf der Schleife in der main, das wett ich drauf und ich weis nicht was das soll jetzt hier eine ellenlange funktion zu posten aber bitte:

    int Button::handle_events( int *iZeiger )
    {
        //Die Maus-Koordinaten
        int x = 0, y = 0;
    
    	*iZeiger = 0;
    
    	//Herz_Sheet...das wird kein Spaß:
    
    	clipOpen[0].x = 0;
    	clipOpen[0].y = 0;
    	clipOpen[0].w = 300;
    	clipOpen[0].h = 500;
    
    	clipOpen[1].x = 300;
    	clipOpen[1].y = 0;
    	clipOpen[1].w = 300;
    	clipOpen[1].h = 500;
    
    	clipOpen[2].x = 600;
    	clipOpen[2].y = 0;
    	clipOpen[2].w = 300;
    	clipOpen[2].h = 500;
    
    	clipOpen[3].x = 900;
    	clipOpen[3].y = 0;
    	clipOpen[3].w = 300;
    	clipOpen[3].h = 500;
    
    	clipOpen[4].x = 1200;
    	clipOpen[4].y = 0;
    	clipOpen[4].w = 300;
    	clipOpen[4].h = 500;
    
    	clipOpen[5].x = 1500;
    	clipOpen[5].y = 0;
    	clipOpen[5].w = 300;
    	clipOpen[5].h = 500;
    
    	clipOpen[6].x = 0;
    	clipOpen[6].y = 500;
    	clipOpen[6].w = 300;
    	clipOpen[6].h = 500;
    
    	clipOpen[7].x = 300;
    	clipOpen[7].y = 500;
    	clipOpen[7].w = 300;
    	clipOpen[7].h = 500;
    
    	clipOpen[8].x = 600;
    	clipOpen[8].y = 500;
    	clipOpen[8].w = 300;
    	clipOpen[8].h = 500;
    
    	clipOpen[9].x = 900;
    	clipOpen[9].y = 500;
    	clipOpen[9].w = 300;
    	clipOpen[9].h = 500;
    
    	clipOpen[10].x = 1200;
    	clipOpen[10].y = 500;
    	clipOpen[10].w = 300;
    	clipOpen[10].h = 500;
    
    	clipOpen[11].x = 1500;
    	clipOpen[11].y = 500;
    	clipOpen[11].w = 300;
    	clipOpen[11].h = 500;
    
    	clipOpen[12].x = 1800;
    	clipOpen[12].y = 500;
    	clipOpen[12].w = 300;
    	clipOpen[12].h = 500;
    
    	//Herz Ende//
    
    	if( event.type == SDL_MOUSEBUTTONDOWN )																									
        {
            //If the left mouse button was pressed
            if( event.button.button == SDL_BUTTON_LEFT )
            {
                //Get the mouse offsets
                x = event.button.x;
                y = event.button.y;
    
                //If the mouse is over the button
                if( ( x > box.x ) && ( x < box.x + box.w ) && ( y > box.y ) && ( y < box.y + box.h ) )
                {
    
                    //Set the button sprite
                    if( rand() %52 == 1 && bGeklickt == false )
    				{
    					Button myButton1( 610, 512, 300, 500 );
    					apply_Surface( 610,  512, card_Heart, screen, &clipOpen[ 0 ] );
    					bGeklickt = true;
    				    *iZeiger  = 2;
    					return 1;
    				}
    				else if( rand() %52 == 2 && bGeklickt == false )
    				{
    					Button myButton1( 610, 512, 300, 500 );
    					apply_Surface( 610, 512, card_Heart, screen, &clipOpen[ 1 ] );
    					bGeklickt = true;
    					*iZeiger  = 3;
    					return 1;
    				}
    				else if( rand() %52 == 3 && bGeklickt == false )
    				{
    					Button myButton1( 610, 512, 300, 500 );
    					apply_Surface( 610,  512, card_Heart, screen, &clipOpen[ 2 ] );
    					bGeklickt = true;
    					*iZeiger = 4;
    					return 1;
    				}
    				else if( rand() %52 == 4 && bGeklickt == false )
    				{
    					Button myButton1( 610, 512, 300, 500 );
    					apply_Surface( 610, 512, card_Heart, screen, &clipOpen[ 3 ] );
    					bGeklickt = true;
    					*iZeiger = 5;
    					return 1;
    				}
    				else if( rand() %52 == 5 && bGeklickt == false )
    				{
    					Button myButton1( 610, 512, 300, 500 );
    					apply_Surface( 610, 512, card_Heart, screen, &clipOpen[ 4 ] );
    					bGeklickt = true;
    					*iZeiger = 6;
    					return 1;
    				}
    				else if( rand() %52 == 6 && bGeklickt == false )
    				{
    					Button myButton1( 610, 512, 300, 500 );
    					apply_Surface( 610, 512, card_Heart, screen, &clipOpen[ 5 ] );
    					bGeklickt = true;
    					*iZeiger = 7;
    					return 1;
    				}
    				else if( rand() %52 == 7 && bGeklickt == false )
    				{
    					Button myButton1( 610, 512, 300, 500 );
    					apply_Surface( 610, 512, card_Heart, screen, &clipOpen[ 6 ] );
    					bGeklickt = true;
    					*iZeiger = 8;
    					return 1;
    				}
    				else if( rand() %52 == 8 && bGeklickt == false )
    				{
    					Button myButton1( 610, 512, 300, 500 );
    					apply_Surface( 610, 512, card_Heart, screen, &clipOpen[ 7 ] );
    					bGeklickt = true;
    					*iZeiger = 9;
    					return 1;
    				}
    				else if( rand() %52 == 9 && bGeklickt == false)
    				{
    					Button myButton1( 610, 512, 300, 500 );
    					apply_Surface( 610, 512, card_Heart, screen, &clipOpen[ 8 ] );
    					bGeklickt = true;
    					*iZeiger = 10;
    					return 1;
    				}
    				else if( rand() %52 == 10 && bGeklickt == false )
    				{
    					Button myButton1( 610, 512, 300, 500 );
    					apply_Surface( 610, 512, card_Heart, screen, &clipOpen[ 9 ] );
    					bGeklickt = true;
    					*iZeiger = 10;
    					return 1;
    				}
    				else if( rand() %52 == 11 && bGeklickt == false )
    				{
    					Button myButton1( 610, 512, 300, 500 );
    					apply_Surface( 610, 512, card_Heart, screen, &clipOpen[ 10 ] );
    					bGeklickt = true;
    					*iZeiger = 10;
    					return 1;
    				}
    				else if( rand() %52 == 12 && bGeklickt == false )
    				{
    					Button myButton1( 610, 512, 300, 500 );
    					apply_Surface( 610, 512, card_Heart, screen, &clipOpen[ 11 ] );
    					bGeklickt = true;
    					*iZeiger = 10;
    					return 1;
    				}
    				else if( rand() %52 == 13 && bGeklickt == false )
    				{
    					Button myButton1( 610, 512, 300, 500 );
    					apply_Surface( 610, 512, card_Heart, screen, &clipOpen[ 12 ] );
    					bGeklickt = true;
    					*iZeiger = 11;
    					return 1;
    				}
    
    				else if( rand() %52 == 14 && bGeklickt == false )
    				{
    					Button myButton1( 610, 512, 300, 500 );
    					apply_Surface( 610,  512, card_Caro, screen, &clipOpen[ 0 ] );
    					bGeklickt = true;
    					*iZeiger = 2;
    					return 1;
    				}
    				else if( rand() %52 == 15 && bGeklickt == false )
    				{
    					Button myButton1( 610, 512, 300, 500 );
    					apply_Surface( 610, 512, card_Caro, screen, &clipOpen[ 1 ] );
    					bGeklickt = true;
    					*iZeiger = 3;
    					return 1;
    				}
    				else if( rand() %52 == 16 && bGeklickt == false )
    				{
    					Button myButton1( 610, 512, 300, 500 );
    					apply_Surface( 610, 512, card_Caro, screen, &clipOpen[ 2 ] );
    					bGeklickt = true;
    					*iZeiger = 4;
    					return 1;
    				}
    				else if( rand() %52 == 17 && bGeklickt == false )
    				{
    					Button myButton1( 610, 512, 300, 500 );
    					apply_Surface( 610, 512, card_Caro, screen, &clipOpen[ 3 ] );
    					bGeklickt = true;
    					*iZeiger = 5;
    					return 1;
    				}
    				else if( rand() %52 == 18 && bGeklickt == false )
    				{
    					Button myButton1( 610, 512, 300, 500 );
    					apply_Surface( 610, 512, card_Caro, screen, &clipOpen[ 4 ] );
    					bGeklickt = true;
    					*iZeiger = 6;
    					return 1;
    				}
    				else if( rand() %52 == 19 && bGeklickt == false )
    				{
    					Button myButton1( 610, 512, 300, 500 );
    					apply_Surface( 610, 512, card_Caro, screen, &clipOpen[ 5 ] );
    					bGeklickt = true;
    					*iZeiger = 7;
    					return 1;
    				}
    				else if( rand() %52 == 20 && bGeklickt == false )
    				{
    					Button myButton1( 610, 512, 300, 500 );
    					apply_Surface( 610, 512, card_Caro, screen, &clipOpen[ 6 ] );
    					bGeklickt = true;
    					*iZeiger = 8;
    					return 1;
    				}
    				else if( rand() %52 == 21 && bGeklickt == false )
    				{
    					Button myButton1( 610, 512, 300, 500 );
    					apply_Surface( 610, 512, card_Caro, screen, &clipOpen[ 7 ] );
    					bGeklickt = true;
    					*iZeiger = 9;
    					return 1;
    				}
    				else if( rand() %52 == 22 && bGeklickt == false )
    				{
    					Button myButton1( 610, 512, 300, 500 );
    					apply_Surface( 610, 512, card_Caro, screen, &clipOpen[ 8 ] );
    					bGeklickt = true;
    					*iZeiger = 10;
    					return 1;
    				}
    				else if( rand() %52 == 23 && bGeklickt == false )
    				{
    					Button myButton1( 610, 512, 300, 500 );
    					apply_Surface( 610, 512, card_Caro, screen, &clipOpen[ 9 ] );
    					bGeklickt = true;
    					*iZeiger = 10;
    					return 1;
    				}
    				else if( rand() %52 == 24 && bGeklickt == false )
    				{
    					Button myButton1( 610, 512, 300, 500 );
    					apply_Surface( 610, 512, card_Caro, screen, &clipOpen[ 10 ] );
    					bGeklickt = true;
    					*iZeiger = 10;
    					return 1;
    				}
    				else if( rand() %52 == 25 && bGeklickt == false )
    				{
    					Button myButton1( 610, 512, 300, 500 );
    					apply_Surface( 610, 512, card_Caro, screen, &clipOpen[ 11 ] );
    					bGeklickt = true;
    					*iZeiger = 10;
    					return 1;
    				}
    				else if( rand() %52 == 26 && bGeklickt == false )
    				{
    					Button myButton1( 610, 512, 300, 500 );
    					apply_Surface( 610, 512, card_Caro, screen, &clipOpen[ 12 ] );
    					bGeklickt = true;
    					*iZeiger = 11;
    					return 1;
    				}
    
    				// KARO_ENDE //
    
    				else if( rand() %52 == 27 && bGeklickt == false )
    				{
    					Button myButton1( 610, 512, 300, 500 );
    					apply_Surface( 610, 512, card_Pik, screen, &clipOpen[ 0 ] );
    					bGeklickt = true;
    					*iZeiger = 2;
    					return 1;
    				}
    				else if( rand() %52 == 28 && bGeklickt == false )
    				{
    					Button myButton1( 610, 512, 300, 500 );
    					apply_Surface( 610, 512, card_Pik, screen, &clipOpen[ 1 ] );
    					bGeklickt = true;
    					*iZeiger = 3;
    					return 1;
    				}
    				else if( rand() %52 == 29 && bGeklickt == false )
    				{
    					Button myButton1( 610, 512, 300, 500 );
    					apply_Surface( 610, 512, card_Pik, screen, &clipOpen[ 2 ] );
    					bGeklickt = true;
    					*iZeiger = 4;
    					return 1;
    				}
    				else if( rand() %52 == 30 && bGeklickt == false )
    				{
    					Button myButton1( 610, 512, 300, 500 );
    					apply_Surface( 610, 512, card_Pik, screen, &clipOpen[ 3 ] );
    					bGeklickt = true;
    					*iZeiger = 5;
    					return 1;
    				}
    				else if( rand() %52 == 31 && bGeklickt == false )
    				{
    					Button myButton1( 610, 512, 300, 500 );
    					apply_Surface( 610, 512, card_Pik, screen, &clipOpen[ 4 ] );
    					bGeklickt = true;
    					*iZeiger = 6;
    					return 1;
    				}
    				else if( rand() %52 == 32 && bGeklickt == false )
    				{
    					Button myButton1( 610, 512, 300, 500 );
    					apply_Surface( 610, 512, card_Pik, screen, &clipOpen[ 5 ] );
    					bGeklickt = true;
    					*iZeiger = 7;
    					return 1;
    
    				}
    				else if( rand() %52 == 33 && bGeklickt == false )
    				{
    					Button myButton1( 610, 512, 300, 500 );
    					apply_Surface( 610, 512, card_Pik, screen, &clipOpen[ 6 ] );
    					bGeklickt = true;
    					*iZeiger = 8;
    					return 1;
    				}
    				else if( rand() %52 == 34 && bGeklickt == false )
    				{
    					Button myButton1( 610, 512, 300, 500 );
    					apply_Surface( 610, 512, card_Pik, screen, &clipOpen[ 7 ] );
    					bGeklickt = true;
    					*iZeiger = 9;
    					return 1;
    				}
    				else if( rand() %52 == 35 && bGeklickt == false )
    				{
    					Button myButton1( 610, 512, 300, 500 );
    					apply_Surface( 610, 512, card_Pik, screen, &clipOpen[ 8 ] );
    					bGeklickt = true;
    					*iZeiger = 10;
    					return 1;
    				}
    				else if( rand() %52 == 36 && bGeklickt == false )
    				{
    					Button myButton1( 610, 512, 300, 500 );
    					apply_Surface( 610, 512, card_Pik, screen, &clipOpen[ 9 ] );
    					bGeklickt = true;
    					*iZeiger = 10;
    					return 1;
    				}
    				else if( rand() %52 == 37 && bGeklickt == false )
    				{
    					Button myButton1( 610, 512, 300, 500 );
    					apply_Surface( 610, 512, card_Pik, screen, &clipOpen[ 10 ] );
    					bGeklickt = true;
    					*iZeiger = 10;
    					return 1;
    				}
    				else if( rand() %52 == 38 && bGeklickt == false )
    				{
    					Button myButton1( 610, 512, 300, 500 );
    					apply_Surface( 610, 512, card_Pik, screen, &clipOpen[ 11 ] );
    					bGeklickt = true;
    					*iZeiger = 10;
    					return 1;
    				}
    				else if( rand() %52 == 39 && bGeklickt == false )
    				{
    					Button myButton1( 610, 512, 300, 500 );
    					apply_Surface( 610, 512, card_Pik, screen, &clipOpen[ 12 ] );
    					bGeklickt = true;
    					*iZeiger = 11;
    					return 1;
    				}
    
    				//Kreuz:
    
    				else if( rand() %52 == 40 && bGeklickt == false )
    				{
    					Button myButton1( 610, 512, 300, 500 );
    					apply_Surface( 610, 512, card_Kreuz, screen, &clipOpen[ 0 ] );
    					bGeklickt = true;
    					*iZeiger = 2;
    					return 1;
    				}
    				else if( rand() %52 == 41 && bGeklickt == false )
    				{
    					Button myButton1( 610, 512, 300, 500 );
    					apply_Surface( 610, 512, card_Kreuz, screen, &clipOpen[ 1 ] );
    					bGeklickt = true;
    					*iZeiger = 3;
    					return 1;
    				}
    				else if( rand() %52 == 42 && bGeklickt == false )
    				{
    					Button myButton1( 610, 512, 300, 500 );
    					apply_Surface( 610, 512, card_Kreuz, screen, &clipOpen[ 2 ] );
    					bGeklickt = true;
    					*iZeiger = 4;
    					return 1;
    				}
    				else if( rand() %52 == 43 && bGeklickt == false )
    				{
    					Button myButton1( 610, 512, 300, 500 );
    					apply_Surface( 610, 512, card_Kreuz, screen, &clipOpen[ 3 ] );
    					bGeklickt = true;
    					*iZeiger = 5;
    					return 1;
    				}
    				else if( rand() %52 == 44 && bGeklickt == false )
    				{
    					Button myButton1( 610, 512, 300, 500 );
    					apply_Surface( 610, 512, card_Kreuz, screen, &clipOpen[ 4 ] );
    					bGeklickt = true;
    					*iZeiger = 6;
    					return 1;
    				}
    				else if( rand() %52 == 45 && bGeklickt == false )
    				{
    					Button myButton1( 610, 512, 300, 500 );
    					apply_Surface( 610, 512, card_Kreuz, screen, &clipOpen[ 5 ] );
    					bGeklickt = true;
    					*iZeiger = 7;
    					return 1;
    				}
    				else if( rand() %52 == 46 && bGeklickt == false )
    				{
    					Button myButton1( 610, 512, 300, 500 );
    					apply_Surface( 610, 512, card_Pik, screen, &clipOpen[ 6 ] );
    					bGeklickt = true;
    					*iZeiger = 8;
    					return 1;
    				}
    				else if( rand() %52 == 47 && bGeklickt == false )
    				{
    					Button myButton1( 610, 512, 300, 500 );
    					apply_Surface( 610, 512, card_Kreuz, screen, &clipOpen[ 7 ] );
    					bGeklickt = true;
    					*iZeiger = 9;
    					return 1;
    				}
    				else if( rand() %52 == 48 && bGeklickt == false )
    				{
    					Button myButton1( 610, 512, 300, 500 );
    					apply_Surface( 610, 512, card_Kreuz, screen, &clipOpen[ 8 ] );
    					bGeklickt = true;
    					*iZeiger = 10;
    					return 1;
    				}
    				else if( rand() %52 == 49 && bGeklickt == false )
    				{
    					Button myButton1( 610, 512, 300, 500 );
    					apply_Surface( 610, 512, card_Kreuz, screen, &clipOpen[ 9 ] );
    					bGeklickt = true;
    					*iZeiger = 10;
    					return 1;
    				}
    				else if( rand() %52 == 50 && bGeklickt == false )
    				{
    					Button myButton1( 610, 512, 300, 500 );
    					apply_Surface( 610, 512, card_Kreuz, screen, &clipOpen[ 10 ] );
    					bGeklickt = true;
    					*iZeiger = 10;
    					return 1;
    				}
    				else if( rand() %52 == 51 && bGeklickt == false )
    				{
    					Button myButton1( 610, 512, 300, 500 );
    					apply_Surface( 610, 512, card_Kreuz, screen, &clipOpen[ 11 ] );
    					bGeklickt = true;
    					*iZeiger = 10;
    					return 1;
    				}
    				else if( rand() %52 == 52 && bGeklickt == false )
    				{
    					Button myButton1( 610, 512, 300, 500 );
    					apply_Surface( 610, 512, card_Kreuz, screen, &clipOpen[ 12 ] );
    					bGeklickt = true;
    					*iZeiger = 11;
    					return 1;
    				}
    
    				//Kreuz_Ende
    
    				if( Mix_PlayChannel( -1, cardFlip, 0 ) == -1 )
    				{
    					return 1;
    				}
             }
          }
       }
       return *iZeiger, 0;
    }
    


  • ElGreco schrieb:

    ich weis nicht was das soll jetzt hier eine ellenlange funktion zu posten aber bitte:

    Zum Beispiel, damit ich dir sagen kann, dass da 1. doch ein Fehler drin ist und 2. du die Funktion viel kürzer und fehlerunanfälliger schreiben kannst.

    Zu 1.: rand() gibt Zahlen zwischen 0 und RAND_MAX (typischerweise sehr groß) zurück. Wenn du das modulo 52 nimmst (mit dem 😵 kommen Zahlen zwischen 0 und 51 raus, nicht zwischen 1 und 52. Modulo ist der Teilerrest beim ganzzahligen Teilen, in dem Fall durch 52, der kann nie 52 werden.

    Zu 2.: Codewiederholungen sind schlechter Stil, da schlecht lesbar und fehleranfällig, das sollte man immer vermeiden! Ich würde den Körper des if-Blocks mit //If the mouse is over the button , also alles zwischen Z. 89 und Z. 524 einschl. folgendermaßen umschreiben (Bereich der Zufallszahlen sind schon angepasst (siehe 1.)):

    if ( ! bGeklickt ) {
        int rand = rand() % 52;
        <Typ für Karten> card;
        if ( rand >= 39 ) card = card_Kreuz;
        else if (rand >= 26) card = card_Pik;
        else if (rand >= 13) card = card_Caro;
        else card = card_Heart;
        if ( (rand + 1) % 13 == 0 ) *iZeiger = 11;
        else if ( (rand + 1) % 13 >= 9 && (rand + 1) % 13 <= 12 ) *iZeiger = 10;
        else *iZeiger = rand % 13 + 2;
    
        Button myButton1(610, 512, 300, 500);
        apply_Surface(610, 512, card, screen, &clipOpen[rand % 13]);
        bGeklickt = true;
        return 1;
    }
    
    if(Mix_PlayChannel(-1, cardFlip, 0) == -1) {
        return 1;
    }
    

    416 Zeilen Code gespart - nicht schlecht oder? Und der Code ist vermutlich auch schneller, weil er sich bei hohen Zufallszahlen nicht durch die ganzen if-else-Zweife hangeln muss.

    Auf das andere, was ich geschrieben habe, gehst du gar nicht ein. Und den Code von der ganzen Funktion, wo du den Fehler vermutest (der main()-Funktion, wenn ich das richtig verstanden habe), hast du auch nicht gepostet.

    edit: Und was sollt eigentlich das Button myButton1(610, 512, 300, 500); ?
    Das ist eine lokale Variable, die ist nur innerhalb dieses if-Blocks gültig, und da wird sie nicht benutzt.. Ist das so beabsichtigt?



  • Mir fällt gerade noch ein, dass das Vergleichen der Zufallszahl bei dir auch nicht richtig ist. Denn anstatt einmal eine Zufallszahl zu generieren und diese dann zu verwenden (siehe mein Code, Z. 2), rufst du in jeder if- bzw. else-if-Abfrage rand() neu auf. Somit wird in jeder Abfrage eine neue Zufallszahl mit dem entsprechenden Wert verglichen. Evtl. liegt da sogar der Fehler, denn wenn bei keiner der Abfragen zufällig der passende Wert von rand() zurückgegeben wird, sodass die Bedingung erfüllt ist, wird dein ganzes Konstrukt erfolglos durchlaufen und am Schluss 0 zurückgegeben.

    Wenn du dann noch den Zufallsgenerator nicht geseedet hast (am Anfang musst du einmalig srand(time(NULL)) aufrufen, sonst kommen immer die gleichen Zufallszahlen) tritt das Problem bei jedem Programmdurchlauf in gleicher Weise auf.



  • Ok, vielen vielen Dank schonmal für die Sache mit der code Gestaltung und der Sache mit dem Modulo Operator...man merkt ich bin Anfänger.

    Also das mit dem Zufallsgenerator kann gut möglich sein, wenn der jetzt fehlerhaft ist und desshalb 0 zurück gibt, kein Wunder, dass dann nicht die if Anweisung für " == 1 " durchlaufen wird. Ich überarbeite den Code mal und melde mich nochmal.

    Mfg ElGreco


Anmelden zum Antworten