Code-Verkürzung
-
Also ich bin immernoch für ne Schleife. :p
Vor allem das, wo du a,b,c dann d,e,f und g,h,i verlgleichst geht ganz gut in eine Schleife rein. bei den anderen kommt es drauf an, ob es ein bestimmtes Muster gibt. Das musst du aber selbst wissen.

-
martin.bens schrieb:
Und das andere Codesegment krig ich nicht in ne Funktion gepackt.
Welches Codesegment? Und wo liegt das Problem genau?
drakon schrieb:
Also ich bin immernoch für ne Schleife. :p
Ja, kommt halt drauf an. Nur wenn man dann in der Schleife mehr Code hat als wenn man die Funktionen direkt hinschreiben würde, muss man sich fragen, ob sich der Aufwand lohnt. Grundsätzlich ist es aber nie schlecht, Schleifen zu berücksichtigen.

-
if (x==1 && y==1){ a=feldveraenderung(a, spieler); anzahl=anzahlveraenderung(a, anzahl); spieler=spielerveraenderung(a, spieler);} else if(x==2 && y==1){ b=feldveraenderung(b, spieler); anzahl=anzahlveraenderung(b, anzahl); spieler=spielerveraenderung(b, spieler);} else if(x==3 && y==1){ c=feldveraenderung(c, spieler); anzahl=anzahlveraenderung(c, anzahl); spieler=spielerveraenderung(c, spieler);} else if(x==1 && y==2){ d=feldveraenderung(d, spieler); anzahl=anzahlveraenderung(d, anzahl); spieler=spielerveraenderung(d, spieler);} else if(x==2 && y==2){ e=feldveraenderung(e, spieler); anzahl=anzahlveraenderung(e, anzahl); spieler=spielerveraenderung(e, spieler);} else if(x==3 && y==2){ f=feldveraenderung(f, spieler); anzahl=anzahlveraenderung(f, anzahl); spieler=spielerveraenderung(f, spieler);} else if(x==1 && y==3){ g=feldveraenderung(g, spieler); anzahl=anzahlveraenderung(g, anzahl); spieler=spielerveraenderung(g, spieler);} else if(x==2 && y==3){ h=feldveraenderung(h, spieler); anzahl=anzahlveraenderung(h, anzahl); spieler=spielerveraenderung(h, spieler);} else if(x==3 && y==3){ i=feldveraenderung(i, spieler); anzahl=anzahlveraenderung(i, anzahl); spieler=spielerveraenderung(i, spieler);}int feldveraenderung(int a, int spieler){ if (a==0){ return spieler;} else{ cout<<"Feld bereits besetzt.\n"; return 0; }} int anzahlveraenderung(int a, int anzahl){ if (a!=0){ return anzahl++;}} int spielerveraenderung(int a, int spieler){ if (a!=0){ return spieler--;}}könnte man das noch kürzen?
-
Klar geht das. Probier einfach das ganze zu abstrahieren, wo du jetzt eine Zahl einsetzt. Gibt es da ein Muster? - Wenn ja dann setz es in Programmcode um und dann kannst du das ganze wieder in eine Schleife packen..
-
Das erste sehr wohl. Du machst zwei verschachtelte Schleifen, eine für das
xund eine für dasy.Beim zweiten könntest du eventuell den ternären
operator?:einsetzen, aber wichtiger ist, dass du die Klammern sauber setzt. Glaub mir, du wirst später froh sein, wenn du dir jetzt schon einen guten Stil aneignest.
-
Hier mal der ganze Code. Das sollte für mich zur Übung ein Tic-Tac-ToE Spiel werden:
# include <iostream> using namespace std; int y_koordinate(){ int y; cout<<"y-Koordinate: "; cin>>y; cout<<"\n"; return y; } int x_koordinate(){ int x; cout<<"x-Koordinate: "; cin>>x; cout<<"\n"; return x; } bool DreiInReihe1(int a, int b, int c){ return a%2==1 && b%2==1 && c%2==1;} bool DreiInReihe2(int a, int b, int c){ return a!=0 && b!=0 && c!=0 && a%2==0 && b%2==0 && c%2==0;} int feldveraenderung(int a, int spieler){ if (a==0){ return spieler;} else{ cout<<"Feld bereits besetzt.\n"; return 0; }} int anzahlveraenderung(int a, int anzahl){ if (a!=0){ return anzahl++;}} int spielerveraenderung(int a, int spieler){ if (a!=0){ spieler--; return spieler;}} int feld(string spielername1, string spielername2){ int a=0,b=0,c=0,d=0,e=0,f=0,g=0,h=0,i=0, spieler=1, anzahl=8; while (anzahl<=8){ if (spieler%2==1){ cout<<spielername1<<" : \n";} else if (spieler%2==0){ cout<<spielername2<<" : \n";} int x=x_koordinate(); int y=y_koordinate(); if (x==1 && y==1){ a=feldveraenderung(a, spieler); anzahl=anzahlveraenderung(a, anzahl); spieler=spielerveraenderung(a, spieler);} else if(x==2 && y==1){ b=feldveraenderung(b, spieler); anzahl=anzahlveraenderung(b, anzahl); spieler=spielerveraenderung(b, spieler);} else if(x==3 && y==1){ c=feldveraenderung(c, spieler); anzahl=anzahlveraenderung(c, anzahl); spieler=spielerveraenderung(c, spieler);} else if(x==1 && y==2){ d=feldveraenderung(d, spieler); anzahl=anzahlveraenderung(d, anzahl); spieler=spielerveraenderung(d, spieler);} else if(x==2 && y==2){ e=feldveraenderung(e, spieler); anzahl=anzahlveraenderung(e, anzahl); spieler=spielerveraenderung(e, spieler);} else if(x==3 && y==2){ f=feldveraenderung(f, spieler); anzahl=anzahlveraenderung(f, anzahl); spieler=spielerveraenderung(f, spieler);} else if(x==1 && y==3){ g=feldveraenderung(g, spieler); anzahl=anzahlveraenderung(g, anzahl); spieler=spielerveraenderung(g, spieler);} else if(x==2 && y==3){ h=feldveraenderung(h, spieler); anzahl=anzahlveraenderung(h, anzahl); spieler=spielerveraenderung(h, spieler);} else if(x==3 && y==3){ i=feldveraenderung(i, spieler); anzahl=anzahlveraenderung(i, anzahl); spieler=spielerveraenderung(i, spieler);} else{ cout<<"Falsche Eingabe\n"; anzahl++; spieler--;} if (DreiInReihe1(a,b,c) || DreiInReihe1(d,e,f) || DreiInReihe1(g,h,i) || DreiInReihe1(a,d,g) || DreiInReihe1(b,e,h) || DreiInReihe1(c,f,i) || DreiInReihe1(a,e,i) || DreiInReihe1(c,e,g)){ return 1;} else if (DreiInReihe2(a,b,c) || DreiInReihe2(d,e,f) || DreiInReihe2(g,h,i) || DreiInReihe2(a,d,g) || DreiInReihe2(b,e,h) || DreiInReihe2(c,f,i) || DreiInReihe2(a,e,i) || DreiInReihe2(c,e,g)){ return 2;} anzahl--; spieler++; } } int main(){ cout<<"Tic - Tac - To\n"; cout<<"Welches Zeichen moechten sie?\n"; cout<<"Kreuz --> 1 und Kreis -->2 "; int spieler1=0, spieler2=0; cin>>spieler1; cout<<"\n"; cout<<"Spieler 1 geben sie ihren Namen ein! "; string spielername1; cin>>spielername1; cout<<"Spieler 2 geben sie ihren Namen ein! "; string spielername2; cin>>spielername2; if (spieler1==1){ cout<<spielername1<<" hat Kreuz und "<<spielername2<<" hat Kreis\n";} else if (spieler1==2){ cout<<spielername2<<" hat Kreuz und "<<spielername1<<" hat Kreis\n";} if (spieler1==1){ spieler2=2;} else if(spieler1==2){ spieler2=1;} int gewonnen; gewonnen=feld(spielername1, spielername2); if (gewonnen==spieler1){ cout<<spielername1<<" hat gewonnen\n";} else if(gewonnen==spieler2){ cout<<spielername2<<" hat gewonnen\n";} system("Pause"); return 0; }könntet ihr mir noch mögliche Verkürzungen sagen. Das war eben so einfache programmierung und dann wollt ich mir Rat einholen wie ichs besser machen kann.
-
Wir haben dir ja bereits Ratschläge gebracht...?
-
die meisten versteh ich leider nicht.
einmal das mit den Schleifen und das mit dem ternären operator?
-
Wie wärs, wenn du dich zusätzlich zu unseren Vorschlägen noch ein wenig selbst erkunden würdest?
Zu den Schleifen haben wir glaube ich genügend Hinweise gegeben. Schau doch, wo du wiederkommende Strukturen erkennst, und versuche, eine Regelmässigkeit darin zu finden.
-
Kleine Merkregel, wenn du weisst, was du noch verkürzen kannst:
Sobald du Code per Copy/Paste kopierst und einfügst, dann ist das ein Fall von unnötiger Redundanz. (Klar gibt es Ausnahmen, aber bei einem Anfänger greift die Regel sicher recht gut.)
Ich sehe bei dir so ein Schema:
for (int y = 0; y < 3; y++) for (int x = 0; x < 3; x++) { bar (array[y*3 + x]); foobar (array[y*3 + x]); foo (x,y); }Wo das ist und wie du das bei dir umsetzen kannst solltest du selbst hinkriegen..