Bessere Möglichkeit?



  • Hallo ich bin neu hier und hoffe das ist das richte unterforum 😉
    also ich hab die frage ob man diesen Code vielleicht einfacher schreiben kann. Er ist jezt schon funktionstüchtig und ist von einem TicTacToe spiel die Prüffunktion:

    void pruefwaagrecht (int x1, int y1){
    	 int d=0;
    	 int f=0;
    	 for(x1=0; x1<3; x1++){
    			y1=0;
    		 if(feld[x1][y1]==1){
    			 d++;
    			 if(d==3){
    				 MessageBox::Show("Spieler1 won","Spieler1 won");
    			 }
    		 }
    		 if (feld[x1][y1]==2){
    			f++;
    			if(f==3){
    				MessageBox::Show("Spieler2 won","Spieler2 won");
    		 }
    		 }
    			 }
    	int g=0;
    	int h=0;
    	 for(x1=0; x1<3; x1++){
    		 y1=1;
    		if(feld[x1][y1]==1){
    			g++;
    			if(g==3){
    				MessageBox::Show("Spieler1 won","Spieler1 won");
    			}
    		}
    		if(feld[x1][y1]==2){
    			h++;
    			if(h==3){
    				MessageBox::Show("Spieler2 won","Spieler2 won");
    			}
    		}
     }
    		int i=0;
    		int j=0;
    	 	 for(x1=0; x1<3; x1++){
    		 y1=2;
    		if(feld[x1][y1]==1){
    
    			i++;
    			if(i==3){
    				MessageBox::Show("Spieler1 won","Spieler1 won");
    			}
    		}
    		if(feld[x1][y1]==2){
    
    			j++;
    			if(j==3){
    				MessageBox::Show("Spieler2 won","Spieler2 won");
    			}
    		}
     }	
    
     }
     void pruefsenkrecht (int x1, int y1){
    	 int d=0;
    	 int f=0;
    	 for(y1=0; y1<3; y1++){
    			x1=0;
    		 if(feld[x1][y1]==1){
    			 d++;
    			 if(d==3){
    				 MessageBox::Show("Spieler1 won","Spieler1 won");
    			 }
    		 }
    		 if (feld[x1][y1]==2){
    			f++;
    			if(f==3){
    				MessageBox::Show("Spieler2 won","Spieler2 won");
    		 }
    		 }
    			 }
    	int g=0;
    	int h=0;
    	 for(y1=0; y1<3; y1++){
    		 x1=1;
    		if(feld[x1][y1]==1){
    			g++;
    			if(g==3){
    				MessageBox::Show("Spieler1 won","Spieler1 won");
    			}
    		}
    		if(feld[x1][y1]==2){
    			h++;
    			if(h==3){
    				MessageBox::Show("Spieler2 won","Spieler2 won");
    			}
    		}
     }
    		int i=0;
    		int j=0;
    	 	 for(y1=0; y1<3; y1++){
    		 x1=2;
    		if(feld[x1][y1]==1){
    
    			i++;
    			if(i==3){
    				MessageBox::Show("Spieler1 won","Spieler1 won");
    			}
    		}
    		if(feld[x1][y1]==2){
    
    			j++;
    			if(j==3){
    				MessageBox::Show("Spieler2 won","Spieler2 won");
    			}
    		}
     }	
    
     }
    
     void pruefdiagonal(int x1, int y1){
    	 if(feld[0][0]==1 && feld[1][1]==1 && feld[2][2]==1){
    	 MessageBox::Show("Spieler1 won","Spieler1 won");
    	 }
    	 if(feld[0][2]==1 && feld[1][1]==1 && feld[2][0]==1){
    	 MessageBox::Show("Spieler1 won","Spieler1 won");
    	 }
    	 if(feld[0][2]==2 && feld[1][1]==2 && feld[2][0]==2){
    	 MessageBox::Show("Spieler2 won","Spieler2 won");
    	 }
    	 if(feld[0][0]==2 && feld[1][1]==2 && feld[2][2]==2){
    	 MessageBox::Show("Spieler2 won","Spieler2 won");
    	 }
    
     }
    

    also ihr braucht mir nur zu sagen ob es mit anderen schleifen geht und nicht den Code umschreiben... Ich muss/will es selbst umschreiben um zu verstehen was ich mache!
    grüßle Broken 😉



  • Du kannst auf jeden Fall den immer selben Code zur Gewinnprüfung in eine eigene Funktion auslagern.



  • Danke für die schnelle Hilfe... Hast du es so gemeint?:

    void gewinn(int x1, int y1){
    	 if(feld[x1][y1]==1){
    		d++;
    		if(d==3){
    		MessageBox::Show("Spieler1 won","Spieler1 won");
    	}
    			 }
    
    		 if (feld[x1][y1]==2){
    			f++;
    			if(f==3){
    			MessageBox::Show("Spieler2 won","Spieler2 won");
    		 }
    		 }	
     }
     void pruefwaagrecht (int x1, int y1){
    	 for(x1=0; x1<3; x1++){
    			y1=0;
    		gewinn(x1,y1);
    			 }
     }
    

    weil so funktioniert es nicht...:(


  • Mod

    BrokenWingz schrieb:

    Danke für die schnelle Hilfe... Hast du es so gemeint?:

    void gewinn(int x1, int y1){
    	 if(feld[x1][y1]==1){
    		d++;
    		if(d==3){
    		MessageBox::Show("Spieler1 won","Spieler1 won");
    	}
    			 }
    		 
    		 if (feld[x1][y1]==2){
    			f++;
    			if(f==3){
    			MessageBox::Show("Spieler2 won","Spieler2 won");
    		 }
    		 }	
     }
     void pruefwaagrecht (int x1, int y1){
    	 for(x1=0; x1<3; x1++){
    			y1=0;
    		gewinn(x1,y1);
    			 }
     }
    

    weil so funktioniert es nicht...:(

    Ja, das hat pumuckl gemeint, bloß in richtig. Das bei dir richtig zu machen ist jedoch hochkompliziert, weil bei dir alles global ist. Tja, das kommt eben davon. Ich kann mir nicht vorstellen, dass du davor nicht gewarnt wurdest.

    Ein Problem, das hier auf dem ersten Blick auffällt (es gibt sicher noch mehr, siehe oben), ist, dass nun immer die gleichen globalen Variablen hochgezählt werden, während du vorher d,f,g,h,i,j hattest (BTW: Nichtssagendere Namen gibt's ja wohl nicht. Was soll eine globale Variable mit einem einzigen nichtssagenden Buchstaben? Das ist ja schon Autosadismus.). Du müsstest der Funktion also mitteilen, welche Variable jeweils hochgezählt werden soll.

    Tipp für bessere Möglichkeit: Alles wegschmeißen, mehr Übung in sauberem Design bekommen (d.h. ein paar Wochen lernen!), dann alles nochmal machen. Und dann alles schön abstrakt und ohne globale Zustände.



  • SeppJ schrieb:

    Ja, das hat pumuckl gemeint, bloß in richtig. Das bei dir richtig zu machen ist jedoch hochkompliziert, weil bei dir alles global ist. Tja, das kommt eben davon. Ich kann mir nicht vorstellen, dass du davor nicht gewarnt wurdest.

    Ein Problem, das hier auf dem ersten Blick auffällt (es gibt sicher noch mehr, siehe oben), ist, dass nun immer die gleichen globalen Variablen hochgezählt werden, während du vorher d,f,g,h,i,j hattest (BTW: Nichtssagendere Namen gibt's ja wohl nicht. Was soll eine globale Variable mit einem einzigen nichtssagenden Buchstaben? Das ist ja schon Autosadismus.). Du müsstest der Funktion also mitteilen, welche Variable jeweils hochgezählt werden soll.

    Tipp für bessere Möglichkeit: Alles wegschmeißen, mehr Übung in sauberem Design bekommen (d.h. ein paar Wochen lernen!), dann alles nochmal machen. Und dann alles schön abstrakt und ohne globale Zustände.

    Danke für die hilfe... war echt hilfreich ich schreib 1. noch nich so lange wie du 2. ich muss es für die schule machen und hab deswegen 3. nicht so viel zeit... und alles wegschmeißen --> FICK DICH AUF SO NE HILFE KANN ICH VERZICHTEN!!!!!



  • BrokenWingz schrieb:

    FICK DICH AUF SO NE HILFE KANN ICH VERZICHTEN!!!!!

    nun werden dir definitiv noch vieeeel mehr leute viel bessere ratschläge geben, als bisher.
    davon abgesehen war das ein wesentlich besserer vorschlag, als du offenbar annimmst...


Anmelden zum Antworten