8 Damenproblem



  • SeppJ schrieb:

    Ist das nicht der ganze Sinn der Nutzereingabe? Wozu ist sie sonst da? Vielleicht verstehe ich auch gerade nicht, womit genau du da die Schwierigkeit hast.

    Vielleicht kann ich es an dem was ich bisher habe besser erklären.

    #include <iostream>
    using namespace std;
    int main(){
    	bool brett[8][8];
    	bool gedeckt=true;
    
    	for(int i=0; i<8; i++){
    		for(int j=0; j<8;j++){
    		brett[i][j]=true;
    		}
    	}
    
    char buchstabe; //buchstabe in der Kombination mit der Zahl ergibt Feldkennzeichen (z.B. A1, B4)
    int zahl;
    int dame=0, damenposition1, damenposition2;
    
    while(dame<8){
    
    cout << "Geben Sie die Position ein, auf die sie die Dame setzen möchten! (in dieser Form z.B. A1" << endl;
    cin >> buchstabe >> zahl;
    
    damenposition1=buchstabe-65;
    damenposition2=zahl-1;
    
    cout << "damenp1 " << damenposition1;
    cout << "damenp2 " << damenposition2;
    
    for(int i=0;i<8;i++){ //hier liegt der Hund
    	for(int j=0;j<8;j++){
    		brett[i][damenposition2]=false;
    		brett[damenposition1][j]=false;
    		gedeckt = false;
    		if(brett[i][j]==false&&gedeckt==true)
    			gedeckt=true;
    
    		cout << "Brett: " << brett[i][j] << endl; //diese Ausgaben sollen mir helfen, zu sehen was ich tue.
    		cout << "gedeckt " << gedeckt << endl;	
    	}
    }
    
    for(int i=0;i<8;i++){
    	for(int j=damenposition2-1;i=>0;
    
    dame++;
    }
    system( "PAUSE" );
    return 0;
    }
    

    Also da passt jetzt auch wieder eine Klammer nicht und es ist ein unfertiger Ausdruck drinnen.

    Aber was mein Problem ist:
    Ich verstehe nicht, wie ich die Stellen wo die Dame steht, fixieren kann, um dann eine Ausgabe zu machen, die dem Benutzer sagt "JA da darfst du sie hinstellen" oder " Nein ist gedeckt!".

    Das ist mein größtes Problem.
    Ich denke ich weiß nicht was mein Ziel ist.


  • Mod

    while(anzahl_damen < 8)
    {
      do
      {
        position_für_neue_dame = nutzereingabe();
      }
      while (spielfeld.an(position_für_neue_dame) == gedeckt);  // So lange fragen, bis gültige Eingabe
    
      markiere_gedeckte_felder(spielfeld, position_für_neue_dame);
      ++anzahl_damen;
    }
    


  • SeppJ schrieb:

    while(anzahl_damen < 8)
    {
      do
      {
        position_für_neue_dame = nutzereingabe();
      }
      while (spielfeld.an(position_für_neue_dame) == gedeckt);  // So lange fragen, bis gültige Eingabe
    
      markiere_gedeckte_felder(spielfeld, position_für_neue_dame);
      ++anzahl_damen;
    }
    

    Das Pseudo code, oder?
    Ich komm einfach nicht klar mit dem Beispiel.
    Einfacher geht es wohl nicht.

    Achso, ok den Teil hab ich jetzt verstanden. (glaube ich)
    Aber wie fixiere ich die erste Dame, ohne dass ich das Feld auf "false" setze.


  • Mod

    Karmon schrieb:

    Das Pseudo code, oder?

    Jain. Man könnte ein Programm schreiben, dass so aussieht. Aber es war schon eher nur als Anregung gedacht, wie deine Programmlogik aussehen soll.

    Einfacher geht es wohl nicht.

    Ich fürchte, das ist leider wahr.

    Aber wie fixiere ich die erste Dame, ohne dass ich das Feld auf "false" setze.

    Ich verstehe immer noch nicht:
    1. Was du genau meinst.
    2. Wieso du das überhaupt willst.
    3. Was dabei das Problem ist.



  • SeppJ schrieb:

    Karmon schrieb:

    Das Pseudo code, oder?

    Jain. Man könnte ein Programm schreiben, dass so aussieht. Aber es war schon eher nur als Anregung gedacht, wie deine Programmlogik aussehen soll.

    Einfacher geht es wohl nicht.

    Ich fürchte, das ist leider wahr.

    Aber wie fixiere ich die erste Dame, ohne dass ich das Feld auf "false" setze.

    Ich verstehe immer noch nicht:
    1. Was du genau meinst.
    2. Wieso du das überhaupt willst.
    3. Was dabei das Problem ist.

    Ich denke ich habe gerade eine ziemliche Denkblockade.
    Also was will ich.

    Ich will, ein Programm schreiben, dass mir sagt, wo ich eine Dame hinstellen darf, ohne dass Sie von einer anderen Dame gedeckt wird.
    Wie mache ich das?
    Ich habe ein array vom typ bool (alle Elemente auf true) und lasse den Benutzer eine Schachfeldposition eingeben.
    Und hier weiß ich schon nichtmehr weiter.

    Ich habe eine Position. z.B. A1. Soll diese jetzt "true" oder "false" sein?
    Ich denke true, also muss ich alle Felder, die diese Dame deckt auf false setzen.

    Mein Code:

    brett[Damenposition1]Damenposition2]=true;
    for(int i=0;i<8;i++){
        for(int j=0;j<8;j++){
          brett[i][j]=false;
    

    da ist ja dann mein ausdruck oben schon wieder für den geier, weil jetzt auch das feld wo vorher "true" war, "false" ist oder?

    Auf alle Felder die "false" sind, darf jetzt keine weitere Dame mehr gesetzt werden.

    Nächster Puknkt wo ich nicht weiter weiß...
    Der Benutzer gibt wieder etwas ein. z.B. A2. Das ist nun ein Feld wo keine Dame stehen darf. Also muss mein Programm ausgeben: "Geht nicht!".

    Dann geht es weiter bis er ein Feld erwischt, dass True ist.
    Leiwand wärs, wenn ich dann ein kurzes "Richtiges Feld" ausgeben könnte.

    Das soll sich nun solange wiederholen, bis 8 Damen auf dem Feld stehen.

    Richtig?



  • Ich habe das Gefühl, du hast das gerade völlig richtig beschrieben. Was genau ist die Denkblockade oder Nicht-mehr-weiter-wissen?



  • Bashar schrieb:

    Ich habe das Gefühl, du hast das gerade völlig richtig beschrieben. Was genau ist die Denkblockade oder Nicht-mehr-weiter-wissen?

    Hast du meinen Edit auch gesehen?
    Ahja genau, ich hab bei meinem Edit noch was vergessen.
    nämlich die Diagonale im Code.
    Wenn ich jetzt die Diagonale von einem Feld mittendrin z.B. C4 haben möchte:

    for(int i=0;i<8;i++){
       for(int j=damenposition2-1;j>=0;j--)
    

    dann komme ich doch nur in eine richtung der Diagonale, aber ich will ja in die 2te richtung auch, also dasselbe nur nochmal mit j++ oder?



  • Irgendwie ist die Aufgabe doch blöd ... was ist denn, wenn ich 7 Damen auf das Brett so gestellt habe, dass eine achte nicht mehr geht?
    Dann musss eine Möglichkeit her, von den bereits platzierten Damen wieder welche zu entfernen?!



  • Belli schrieb:

    Irgendwie ist die Aufgabe doch blöd ... was ist denn, wenn ich 7 Damen auf das Brett so gestellt habe, dass eine achte nicht mehr geht?
    Dann musss eine Möglichkeit her, von den bereits platzierten Damen wieder welche zu entfernen?!

    Das auch noch???


  • Mod

    Karmon schrieb:

    Ich habe eine Position. z.B. A1. Soll diese jetzt "true" oder "false" sein?
    Ich denke true, also muss ich alle Felder, die diese Dame deckt auf false setzen.

    Mein Code:

    brett[Damenposition1]Damenposition2]=true;
    for(int i=0;i<8;i++){
        for(int j=0;j<8;j++){
          brett[i][j]=false;
    

    da ist ja dann mein ausdruck oben schon wieder für den geier, weil jetzt auch das feld wo vorher "true" war, "false" ist oder?

    Was sollen die Werte denn bedeuten? false = Es darf dort keine weitere Dame hin gesetzt werden, true = es darf noch eine weitere Dame hingesetzt werden? Wenn dem so ist: Darf eine Dame dort hin gesetzt werden, wo schon eine andere Dame steht? Was bedeutet das für den Wert eines Feldes, auf dem eine Dame steht?

    Der Benutzer gibt wieder etwas ein. z.B. A2. Das ist nun ein Feld wo keine Dame stehen darf. Also muss mein Programm ausgeben: "Geht nicht!".

    if-Abfrage.

    Dann geht es weiter bis er ein Feld erwischt, dass True ist.

    do...while. Du musst es bloß ein wenig umformulieren, da do...while = "tue ... so lange wie". Also das Gegenteil 😉 von "so lange bis".

    Leiwand wärs, wenn ich dann ein kurzes "Richtiges Feld" ausgeben könnte.

    Dann tu das doch einfach.

    Das soll sich nun solange wiederholen, bis 8 Damen auf dem Feld stehen.

    Wieder eine Schleife. Wieder sind Schleifenbedingungen in C++ normalerweise von der Form "so lange wie", wieder ist das nicht schwer umzuformen.

    Du hast quasi gerade ein komplettes Programm beschrieben. Bloß eben auf Deutsch. Die meisten deiner Sätze könnte man 1:1 nach C++ übersetzen.


  • Mod

    Karmon schrieb:

    Wenn ich jetzt die Diagonale von einem Feld mittendrin z.B. C4 haben möchte:

    for(int i=0;i<8;i++){
       for(int j=damenposition2-1;j>=0;j--)
    

    dann komme ich doch nur in eine richtung der Diagonale, aber ich will ja in die 2te richtung auch, also dasselbe nur nochmal mit j++ oder?

    Das ist wieder, wieso ich dir Funktionen empfohlen habe. Schreib eine Funktion, die als Parameter dein Spielfeld und eine Position nimmt und dann alle Felder in dem Spielfeld markiert, die von der Position aus gedeckt sind.
    Dann kannst du
    1. Dir in Ruhe überlegen, wie so eine Funktion aussehen muss.
    2. Du musst es nicht sofort machen. Du kannst den Rest deines Programms schreiben und dort nur diese Funktion aufrufen. Sobald du einen Plan hast, wie diese Funktion aussehen muss, kannst du sie dann schreiben.

    Noch ein paar Tipps:
    -Versteif dich nicht zu sehr da drauf, alle Felder in nur einem Durchgang markieren zu wollen. Dein Programm auf der ersten Seite hat das doch auch nicht versucht.
    -Vielleicht wäre es wieder eine gute Idee, das ganze in Unterfunktionen aufzuteilen. Das Markieren der Felder besteht doch aus:

    markiere_von_position_nach_oben(position, spielfeld);
    markiere_von_position_nach_unten(position, spielfeld);
    markiere_von_position_nach_links(position, spielfeld);
    markiere_von_position_nach_rechts(position, spielfeld);
    markiere_von_position_nach_oben_links(position, spielfeld);
    markiere_von_position_nach_oben_rechts(position, spielfeld);
    markiere_von_position_nach_unten_links(position, spielfeld);
    markiere_von_position_nach_unten_rechts(position, spielfeld);
    

    Oder, wenn man kurz darüber nachdenkt, dann ist das doch alles das gleiche wie:

    markiere_von_position_aus_mit_schrittweite(spielfeld, position, 0, 1);
    markiere_von_position_aus_mit_schrittweite(spielfeld, position, 1, 0);
    markiere_von_position_aus_mit_schrittweite(spielfeld, position, 0, -1);
    markiere_von_position_aus_mit_schrittweite(spielfeld, position, -1, 0);
    markiere_von_position_aus_mit_schrittweite(spielfeld, position, 1, 1);
    markiere_von_position_aus_mit_schrittweite(spielfeld, position, 1, -1);
    markiere_von_position_aus_mit_schrittweite(spielfeld, position, -1, 1);
    markiere_von_position_aus_mit_schrittweite(spielfeld, position, -1, -1);
    

    Kann man ja vielleicht auch durch ein paar Schleifen noch weiter vereinfachen 😉



  • Ist eine Funtkion so etwas wie main()?
    Ich hab das mal gegoogelt. http://www.cplusplus.com/doc/tutorial/functions/

    Werd mir das mal genauer ansehen.

    Vielen Dank für die Geduld, ich denke jetzt sollte ich es doch schon irgendwie hinbekommen.

    Jetzt bin ich draufgekommen, dass meine Schleife, deren Code ich oben gepostet habe, alle felder auf false setzt.



  • #include <iostream> 
    using namespace std; 
    int main(){
    	bool brett[8][8];
    	bool gedeckt=true;
    
    	for(int i=0; i<8; i++){
    		for(int j=0; j<8;j++){
    		brett[i][j]=true;
    		}
    	}
    
    char buchstabe; 
    int zahl;
    int dame=0, damenposition1, damenposition2;
    
    while(dame<8){//anfang der while schleife solange bis 8 damen stehen
    	do{//anfang der do schleife
    
    cout << "Geben Sie die Position ein, auf die sie die Dame setzen möchten! (in dieser Form z.B. A1)" << endl;
    cin >> buchstabe >> zahl;
    
    damenposition1=buchstabe-65;
    damenposition2=zahl-1;
    
    if(dame==0)
    	brett[damenposition1][damenposition2]=true;
    
    for(int i=0;i<8;i++){
    	brett[i][damenposition2];
    }
    for (int i=0;i<8;i++){
    	brett[damenposition1][i];
    }
    
    for(int i=damenposition1-1;i<=0;i--){
    	for(int j=damenposition2+1;i<8;i++){
    		brett[i][j]=false;
    		damenposition1--;
    	}
    }
    for(int i=damenposition1-1;i=0;i--){
    	for(int j=damenposition2-1;i=0;i--){
    			brett[i][j]=false;
    			damenposition1--;
    	}
    }
    for(int i=damenposition2-1;i=0;i--){
    	for(int j=damenposition1+1;i<8;i++){
    		brett[i][j]=false;
    		damenposition2--;
    	}
    }
    for(int i=damenposition2+1;i<8;i++){
    	for(int j=damenposition1+1;i<8;j++){
    		damenposition2++;
    	}
    }
    
    if(brett[damenposition1][damenposition2]==false)
    	cout << "Dieses Spielfeld wird bereits von einer Dame gedeckt" << endl;
    else cout << "Freies Feld erwischt!" << endl;
    
    	} while(brett[damenposition1][damenposition2]=false);
    dame++;
    }
    
    return 0;
    }
    

    Soweit bin ich gekommen, bekomme leider immer einen Buffer Overflow oder wie man das nennt.
    Ich hoffe ich konnte das meiste von den Tipps übernehmen, Sepp.
    Danke für die große Hilfe.

    Die for Schleifen für die Diagonale haben mir den Rest gegeben. (denke ich)
    Ich schau auf jedenfall vor 7 nochmal rein, falls jemand noch Feedback für mich hat, vielen Dank im voraus.

    Gute Nacht
    D



  • Der Spass wäre leichter zu Lesen (und zu Schreiben) wenn du die Variablen für X und Y ... naja "x" und "y" nennen würdest 😉

    Ps:

    Buffer Overflow oder wie man das nennt

    "oder wie man das nennt" ist schlecht, gerade als Anfänger.
    Wir wissen was ein Buffer Overflow ist. Aber woher sollen wir wissen ob du wirklich einen Buffer Overflow meinst?


  • Mod

    Leider ziemlich viel falsch 😞 . Fangen wir mal an:

    • Wieso prüfst du nicht zuerst, ob das Feld legal ist? Das würde sehr viele deiner Probleme lösen, unter anderem dein Vorhaben mit dem

    Aber wie fixiere ich die erste Dame, ohne dass ich das Feld auf "false" setze.

    Es würde auch so einiges an Problemen lösen, die du noch gar nicht erkannt hast. Darunter unter anderem:
    -Was, wenn die Platzierung nicht legal ist? Wie die Markierung rückgängig machen?
    -Was, wenn bei der nächsten Eingabe eine Dame an die gleiche Position gesetzt wird? Momentan bei dir legal.

    • Wie schon erwähnt, sind alle Schleifen Bedingungen von der Art, dass die Schleife läuft, solange die Bedingung erfüllt ist. Das gilt auch für for-Schleifen.
    • = ist eine Zuweisung, kein Vergleich
    • Wenn du sich ähnelnde Schleifen per Copy&Paste&Ändern programmierst, dann stell auch sicher, dass du alle relevanten Teile änderst. Besonders bei Buchstaben, die sich ähnlich sehen, wie 'i' und 'j', passieren da schnell Fehler...
    • Wenn du sich ähnelnde Schleifen nicht per Copy&Paste&Ändern programmierst, sondern per Abschreiben, dann stell auch sicher, dass du alle relevanten Teile mit abschreibst. Und beispielsweise nicht vergisst, was die Schleife überhaupt machen soll...
    • Sei dir sicher, welche Variable in deinem Code welche Bedeutung hat. Du änderst ziemlich willkürlich ein paar Werte, die du besser nicht ändern solltest. Und benutzt an anderen Stellen die falschen Werte.
    • Es kann hilfreich sein, den Programmfluss auf einem Stück Papier durchzugehen, indem man sich selber in die Lage des Computers versetzt und ganz genau den Code abarbeitet, wie er das steht. Dabei aufschreiben, welche Variable wo welchen Wert hat. Doppelt hilfreich, wenn man nebenher noch mit einem Debugger im Einzelschritt durch das Programm geht und vergleicht, ob man wirklich richtig liegt.

    Ehrlich gesagt ist das ziemlicher schlecht. Klingt hart, ist aber so. Der Code sieht aus wie mal eben schnell hingekotzt, damit da überhaupt irgendwas steht. Ohne auch nur einen einzigen Moment lang mal zu gucken, ob das irgendwie Sinn macht oder so richtig ist. Wenn du mit derart wenig Sorgfalt programmierst oder wenn dies die größte Sorgfalt ist, zu der du fähig bist, dann wird das nichts. Programmieren ist das Übersetzen deiner Gedanken in eine streng mathematische Form. Code ist Logik pur, kein hingeschluderter Haufen Zeichen. Du musst von jedem Zeichen in deinem Programm genau wissen, wo du es warum setzt. Wenn du dazu nicht fähig bist, dann ist Programmieren vielleicht nichts für dich. Zumal der Anfangspunkt dieses Übersetzungsprozesses, also deine Gedanken, bereits falsch zu sein scheinen. Du hast keinen Plan, wie das Programm überhaupt ablaufen soll, siehe den ersten Punkt ganz oben. Niemand wäre hier auf den Gedanken gekommen, dass du die Prüfung, ob die Eingabe legal war, nach dem Markieren der Felder durchführen wolltest. Das macht einfach keinen Sinn und daher hat niemand so richtig verstanden, was du mit dem

    Aber wie fixiere ich die erste Dame, ohne dass ich das Feld auf "false" setze.

    überhaupt erreichen wolltest. Auch an einfachen Problemen scheitert es bereits, du scheinst keinen Algorithmus formulieren zu können, wie man diagonal durch das Spielfeld gehen kann. Ansätze sind da, aber du scheinst komische Zusatzvorstellungen zu haben, die ein sehr einfaches Problem so weit verkomplizieren, bis die Lösung falsch ist.



  • Danke für die ausführliche Rückmeldung.

    Ich habe auf keinen Fall vor, das Programmieren sein zu lassen, da es mir Spaß macht.
    Allerdings ist es wirklich schwer für mich, das was ich umsetzen muss, zu verstehen.

    Ich hatte bis jetzt keinerlei zweifel daran, dass Logisch zu denken ein Problem für mich darstellt.
    Ich hoffe, dass es einfach daran liegt, dass ich die Basics nicht beherrsche.

    Ich werde einfach üben, bis ich es kann. 😉

    lG D.

    EDIT: Ich komme nicht drauf wie man die Diagonalfelder "abdeckt" also auf false setzt, ohne die anderen Felder, die die Dame nicht abdeckt, auf false zu setzen.



  • Karmon schrieb:

    Danke für die ausführliche Rückmeldung.

    Ich habe auf keinen Fall vor, das Programmieren sein zu lassen, da es mir Spaß macht.
    Allerdings ist es wirklich schwer für mich, das was ich umsetzen muss, zu verstehen.

    Ich hatte bis jetzt keinerlei zweifel daran, dass Logisch zu denken ein Problem für mich darstellt.
    Ich hoffe, dass es einfach daran liegt, dass ich die Basics nicht beherrsche.

    Ich werde einfach üben, bis ich es kann. 😉

    lG D.

    EDIT: Ich komme nicht drauf wie man die Diagonalfelder "abdeckt" also auf false setzt, ohne die anderen Felder, die die Dame nicht abdeckt, auf false zu setzen.

    niemand hat die weisheit mit löffeln gegessen und es ist noch nie ein meister vom himmel gefallen...

    üben üben und theorie und grundlagen wiederholen, das hilft meistens viel...

    auch um methoden und herangehensweisen besser zu durchdringen oder überhaupt einmal richtig zu verstehen!

    lass dich aber nicht demotivieren! und verlier den spaß daran...! 😃



  • Karmon schrieb:

    EDIT: Ich komme nicht drauf wie man die Diagonalfelder "abdeckt" also auf false setzt, ohne die anderen Felder, die die Dame nicht abdeckt, auf false zu setzen.

    Hier mal eine exemplarische Schleife von dir. Ich weiß nicht genau, was die machen soll, aber sie enthält einige grobe Schnitzer sowohl in der Logik als auch was dein Wissen über C++ angeht.

    for(int i=damenposition2-1;i=0;i--){
        for(int j=damenposition1+1;i<8;i++){
            brett[i][j]=false;
            damenposition2--;
        }
    }
    

    Auf den ersten Blick sind das zwei verschachtelte Schleifen, d.h. es wird ein zweidimensionaler Bereich abgelaufen, vielleicht ein Rechteck. Eine Diagonale ist aber ein eindimensionales Objekt, nur eine Linie. Der einzige naheliegende Ansatz ist daher, das mit nur einer for-Schleife zu machen.

    Auf den zweiten Blick fällt auf, dass die Bedingung in der ersten Schleife, i = 0 , eine Zuweisung ist. Mit an Sicherheit grenzender Wahrscheinlichkeit ist der Vergleich i == 0 gemeint, so dass die Schleife i runterzählt und bei 0 abbricht. Jetzt musst du aber wissen, dass das eine "Solange"-Bedingung ist, d.h. wenn du bei 0 abbrechen willst, muss da i != 0 stehen.

    In der zweiten Schleife initialisierst du j, benutzt aber in der Bedingung und im Update-Ausdruck i. Was da dann genau passiert ist relativ undurchdringlich, höchstwahrscheinlich ist das auch nicht so gemeint.

    Um den richtigen Algorithmus zu finden, solltest du die Aufgabe aufteilen:

    1. Schreibe eine Schleife, die die Koordinaten der Felder entlang einer Diagonale ausgibt.
    2. Überlege dir geometrisch, von wo bis wo diese Schleife laufen muss, damit die richtigen Felder auf dem Schachbrett getroffen werden.
    3. Erst wenn das funktioniert baue es in dein 8-Damen-Programm ein.


  • MfG schrieb:

    niemand hat die weisheit mit löffeln gegessen und es ist noch nie ein meister vom himmel gefallen...

    üben üben und theorie und grundlagen wiederholen, das hilft meistens viel...

    auch um methoden und herangehensweisen besser zu durchdringen oder überhaupt einmal richtig zu verstehen!

    lass dich aber nicht demotivieren! und verlier den spaß daran...! 😃

    Danke für die Aufmunterung :p.

    Bashar schrieb:

    Karmon schrieb:

    EDIT: Ich komme nicht drauf wie man die Diagonalfelder "abdeckt" also auf false setzt, ohne die anderen Felder, die die Dame nicht abdeckt, auf false zu setzen.

    Hier mal eine exemplarische Schleife von dir. Ich weiß nicht genau, was die machen soll, aber sie enthält einige grobe Schnitzer sowohl in der Logik als auch was dein Wissen über C++ angeht.

    for(int i=damenposition2-1;i=0;i--){
        for(int j=damenposition1+1;i<8;i++){
            brett[i][j]=false;
            damenposition2--;
        }
    }
    

    Auf den ersten Blick sind das zwei verschachtelte Schleifen, d.h. es wird ein zweidimensionaler Bereich abgelaufen, vielleicht ein Rechteck. Eine Diagonale ist aber ein eindimensionales Objekt, nur eine Linie. Der einzige naheliegende Ansatz ist daher, das mit nur einer for-Schleife zu machen.

    Auf den zweiten Blick fällt auf, dass die Bedingung in der ersten Schleife, i = 0 , eine Zuweisung ist. Mit an Sicherheit grenzender Wahrscheinlichkeit ist der Vergleich i == 0 gemeint, so dass die Schleife i runterzählt und bei 0 abbricht. Jetzt musst du aber wissen, dass das eine "Solange"-Bedingung ist, d.h. wenn du bei 0 abbrechen willst, muss da i != 0 stehen.

    In der zweiten Schleife initialisierst du j, benutzt aber in der Bedingung und im Update-Ausdruck i. Was da dann genau passiert ist relativ undurchdringlich, höchstwahrscheinlich ist das auch nicht so gemeint.

    Um den richtigen Algorithmus zu finden, solltest du die Aufgabe aufteilen:

    1. Schreibe eine Schleife, die die Koordinaten der Felder entlang einer Diagonale ausgibt.
    2. Überlege dir geometrisch, von wo bis wo diese Schleife laufen muss, damit die richtigen Felder auf dem Schachbrett getroffen werden.
    3. Erst wenn das funktioniert baue es in dein 8-Damen-Programm ein.

    Ich denke ich hab es verstanden.

    Hier ist mal ein Code für eine Diagonale die von 0/0 ausgeht und die diagonale nach rechts unten entlang wandern sollte.

    Falls diese richtig ist, sollte es nicht zu schwer sein, davon ausgehend, die anderen Richtungen zu bestimmen.

    for(int i=damenposition1; i<8;i++){
       int j=damenposition2;
          brett[i][j]=false;
             j++;
    }
    

    ist das jetzt so die richtige Denkweise?

    Mein Gedankengang ist folgender:
    i wird immer um 1 erhöht und j auch.
    das heißt es geht vom Feld 0/0 auf das Feld 1/1.

    Wenn die Benutzereingabe dann 5/5 ist, ist i gleich 5 also hört es wieder bei 7 auf.

    Anschließend noch eine Frage. (falls der vorherige Code richtig ist.)
    Ausgehend von z.B. 4/2 (also C5)

    for(int i=damenposition1;i>=0;i--){ //i>=0 damit es bis 0 geht, und dann abbricht, richtig?
        int j=damenposition2;
        brett[i][j]=false;
        j--;
    }
    

    Dann geht i bis 0 und j geht mit i jeweils um -1 mit. also wird aus 4/2 -> 3/1 und dann 2/0, wo die schleife dann aufhört, da der "Rand" des Spielbretts erreich wurde.



  • Karmon schrieb:

    Hier ist mal ein Code für eine Diagonale die von 0/0 ausgeht und die diagonale nach rechts unten entlang wandern sollte.

    Falls diese richtig ist, sollte es nicht zu schwer sein, davon ausgehend, die anderen Richtungen zu bestimmen.

    for(int i=damenposition1; i<8;i++){
       int j=damenposition2;
          brett[i][j]=false;
             j++;
    }
    

    ist das jetzt so die richtige Denkweise?

    Schon besser, aber immer noch falsch. Das j wird in jedem Durchlauf wieder auf damenposition2 gesetzt. Das sollte nur am Anfang passieren:

    for (int i = damenposition1, j = damenposition2; ......)
    

    Du solltest die Koordinaten übrigens ausgeben und nicht in dein brett-Array eintragen, damit du sofort siehst, wenn es falsch ist. Ja, in einem eigenen Programm. Wenn es funktioniert, überträgst du den Algorithmus in das Damenprogramm.

    Mein Gedankengang ist folgender:
    i wird immer um 1 erhöht und j auch.
    das heißt es geht vom Feld 0/0 auf das Feld 1/1.

    Richtig.

    Anschließend noch eine Frage. (falls der vorherige Code richtig ist.)
    Ausgehend von z.B. 4/2 (also C5)

    for(int i=damenposition1;i>=0;i--){ //i>=0 damit es bis 0 geht, und dann abbricht, richtig?
        int j=damenposition2;
        brett[i][j]=false;
        j--;
    }
    

    Dann geht i bis 0 und j geht mit i jeweils um -1 mit. also wird aus 4/2 -> 3/1 und dann 2/0, wo die schleife dann aufhört, da der "Rand" des Spielbretts erreich wurde.

    Hier wird ja j negativ, aber deine Bedingung prüft i, dh die Schleife geht weiter: 1/-1, 0/-2.


Anmelden zum Antworten