8 Damenproblem



  • Hallo Leute!
    Ich habe in diesem Forum bezüglich des 8 Damenproblems schon einen Thread gefunden und habe versucht mich an diesem zu orientieren.

    Allerdings scheitere ich komplett daran.

    Ich habe zwar die ganzen Möglichkeiten des Schachbretts abgedeckt, also ich setze alle Felder auf false wo der Benutzer die Dame hinplatziert.

    Mein Problem: Ich versage kläglich an etlichen Stellen; ich habe keine Übersicht mehr über meine {} Klammern, ich habe keine Ahnung, wo ich meine Ausgabe machen soll, oder wie ich es hinbekomme, dass mir die Felder übrigbleiben, die noch auf true sind.

    Ich habe soviel an diesem Code herumgebastelt, dass ich mich selber nichtmehr zurechtfinde.

    Ich hoffe ihr könnt mir vielleicht ein paar Denkanstöße geben:
    Wo liege ich komplett falsch, was macht gar keinen Sinn und welche Zeilen sollte ich mir nochmal genauer anschauen.

    #include <iostream>
    using namespace std;
    int main(){
    	char feldbuch;
    	int feldzahl, z;
    	int bitches = 0;
    	int posd1, posd1s, posd2, posd2s;
    	bool brett[8][8];
    	bool bes = true;
    
    for(int i = 0; i < 8; i++){
    	for(int j = 0; j < 8; j++){
    		brett[i][j]=true;
    	cout << "brett" << brett[i][j] << endl;
    	cout << "bes" << bes;
    	}
    }
    
    while (bitches < 8){
    
    		cout << "Geben Sie die Feldkoordinaten der Stelle ein, an der Sie die Dame gerne platzieren würden! (In dieser Form z.B. A1) "<< endl;
    		cin >> feldbuch >> feldzahl;
    
    		posd1=feldbuch-65; //z.B. arr[posd1] --> 'A'=65 --> [0] = 0
    		posd2=feldzahl-1;
    
    		for(int i = 0; i << 8; i++){
    			for(int j = 0; j << 8; j++){
    		bes=false;
    			if(brett[i][j]==false)
    				bes=true;
    			cout << "bes: " << bes << endl;
    			}
    
    		}
    
    	while(bes==true);{
    
    		for(int i = 0; i < 8; i++){
    			brett[i][posd2s]=false;
    		}break;
    		for(int j = 0; j < 8; j++){
    			brett[posd1s][j]=false;
    		}break;
    
    		for(int i = posd1s-1; i = 0; i--){
    			for(int j=posd2s+1;j<8;j++){
    				brett[i][j]=false;
    
    			}
    		}	break;
    		for(int i = posd1s+1; i < 8; i++){
    			for(int j = posd2s-1; i = 0; i--){
    				brett[i][j]=false;
    
    			}
    		}break;
    		for(int i = posd1s-1; i = 0; i--){
    			for(int j=posd2s+1;j = 0;j--){
    				brett[i][j]=false;
    
    			}
    		}	break;
    		for(int i = posd1s+1; i < 8; i++){
    			for(int j = posd2s+1; i < 8; i++){
    				brett[i][j]=false;
    
    			}
    		}
    
    	for(int i = 0; i < 8; i++){
    		for(int j = 0; j < 8; j++){
    		cout << "have fun!" << brett[i][j];	
    
    		}
    	}
    
    	}
    }	bitches++;
    
    system( "PAUSE" );
    return 0;
    }
    

    Ich hoffe Ihr habt die Geduld mir zu helfen, ich bin über jedes Feedback dankbar.

    Lg D

    EDIT: Hier die Angabe falls das hilft.
    Beim 8-Damen-Problem müssen auf einem Schachbrett 8 Damen so positioniert werden, dass sie sich gegenseitig nicht bedrohen.
    Schreiben Sie ein Programm zur Unterstützung bei der Suche nach einer Lösung. Es soll möglich sein, durch Eingabe der Feldkoordinaten in der üblichen Schachnotation Damen auf dem Feld zu positionieren. Falls die gewählte Position bedroht ist, soll das Programm eine Meldung ausgeben. Andernfalls wird eine Dame an diese Position gesetzt. Die Eingabe kann so lange wiederholt werden, bis 8 Damen positioniert wurden.


  • Mod

    Karmon schrieb:

    Mein Problem: Ich versage kläglich an etlichen Stellen; ich habe keine Übersicht mehr über meine {} Klammern,

    Ja, sieht man. Es macht wohl gar keinen Sinn, auf den Inhalt einzugehen, wenn die Form schon derart fehlerhaft ist. Womit programmierst du denn? Viele Editoren bieten automatische Einrueckung und Klammerpaarmarkierung.

    Ich denke, den Code, so wie er jetzt ist, kannst du komplett wegwerfen. Damit weiter zu arbeiten, waere wie aus einem Stueck Filz wieder einen sauberen Faden zu ziehen und einen Pullover zu stricken. Dann lieber noch einmal neu anfangen.

    Also ein paar Punkte, wie du vorgehen koenntest:

    • Besseres Werkzeug besorgen. Egal wie viel Selbstdisziplin man sich selber zu schreibt, man macht schnell mal irgendwas falsch bei der Klammersetzung. Wenn ein Computer das kontrolliert, dann sieht man auch subtile Fehler wie in Zeile 38, weil die automatische Einrueckung auf einmal nicht zu dem passt, was man sich von der Logik her vorgestellt hat. So merkt man, dass da ein Fehler ist. Es ist natuerlich immer noch sauberes Arbeiten noetig (z.B. dass man solchen Anomalien dann nachspuert, also warum der while-Block dort nicht eingerueckt wird). Und man muss immer noch einen sauberen Stil pflegen, also die Klammern immer mnach einheitlichem Stil auf- und zugehen lassen. Zumindest letzteres ist bei dir konsistent.

    • Kopier keinen Code zusammen, ohne ihn zu verstehen! Copy&Paste ist nicht Programmieren. Woanders Ideen zu holen ist gut, aber setz sie dann selber in Code um!

    • Ein paar Punkte, die deinen Code uebersichtlicher machen:

    • Definier Variablen so lokal wie moeglich. Wir sind hier nicht in C, wo man alles am Blockanfang definieren muss. Selbst in C ist es der Blockanfang, nicht der Funktionsanfang.

    • Aussagekraeftige, einheitliche Namen. Keine Scherznamen. Vermeide komische Abkuerzungen. bitches? feldbuch? bes? Bei einigen muss man 3x nachdenken, bis man sich den Sinn erschlossen hat. Bei einigen bin ich mir immer noch nicht sicher, was sie bedeuten sollen.

    • Funktionen! Im Idealbild sollten sich keine 2 Zeilen in deinem Programm jemals wiederholen. So hast du wichtige, oft vorkommende Codeteil nur noch einmal im Programm und entsprechend auch nur noch eine Stelle, an der diese falsch sein koennen. So merkt man schnell, welche Stellen womoeglich falsch sind und die Suche nach Fehlern in diesen Abschnitten ist auch einfacher, weil diese kuerzer sind.



  • Du bist mein Held!

    Vielen Dank für die Tipps.
    Also, ich schreib das jetzt mal alles neu.

    Arbeite auf Visual Express 2013.
    Da gibts die Klammermarkierung, die ist wirklich praktisch.

    Den letzten Ratschlag mit den Funktionen hab ich nur nicht so ganz verstanden.
    Was wiederholt sich denn? Ich weiß es sieht alles gleich aus, aber es macht doch einen Sinn oder?

    Ich bin immer von der Eingabe C4 ausgegangen und hab mir das dann mit Kugelschreiber aufgezeichnet.
    Vielleicht ein Denkfehler, aber ich komm nicht drauf.

    Sorry für die ganzen komischen Ausdrücke, die hätte ich noch umbenennen sollen.
    In Version 2 wird das alles übersichtlich.

    Danke fürs das Feedback.

    EDIT: Die größte Schwierigkeit besteht darin für mich, herauszufinden, wie ich alle Felder auf "false" setze, bis auf das Feld wo die Dame steht. Ich muss ja zuerst einmal die Dame irgendwohin stellen, damit ich danach schauen kann, wo sie jetzt nichtmehr stehen darf, stimmt das so in etwa?
    Soll ich von der ersten Eingabe des Benutzers ausgehen?



  • SeppJ schrieb:

    Karmon schrieb:

    Mein Problem: Ich versage kläglich an etlichen Stellen; ich habe keine Übersicht mehr über meine {} Klammern,

    Ja, sieht man. Es macht wohl gar keinen Sinn, auf den Inhalt einzugehen, wenn die Form schon derart fehlerhaft ist. Womit programmierst du denn? Viele Editoren bieten automatische Einrueckung und Klammerpaarmarkierung.

    Ich denke, den Code, so wie er jetzt ist, kannst du komplett wegwerfen. Damit weiter zu arbeiten, waere wie aus einem Stueck Filz wieder einen sauberen Faden zu ziehen und einen Pullover zu stricken. Dann lieber noch einmal neu anfangen.

    Willst du mich eigentlich entmutigen?! Weißt du eigentlich was für Code ich warten muss?! - Fremden Rotz-Code?!!! Das da oben sind keine 100 Zeilen und du vergleichst das mit einem Filz aus dem man einen sauberen Faden zieht. Muss ich jetzt um meinen Job bangen? Ich hab nämlich keine Ahnung, ob ich das hinkrieg! :p


  • Mod

    IBV schrieb:

    SeppJ schrieb:

    Karmon schrieb:

    Mein Problem: Ich versage kläglich an etlichen Stellen; ich habe keine Übersicht mehr über meine {} Klammern,

    Ja, sieht man. Es macht wohl gar keinen Sinn, auf den Inhalt einzugehen, wenn die Form schon derart fehlerhaft ist. Womit programmierst du denn? Viele Editoren bieten automatische Einrueckung und Klammerpaarmarkierung.

    Ich denke, den Code, so wie er jetzt ist, kannst du komplett wegwerfen. Damit weiter zu arbeiten, waere wie aus einem Stueck Filz wieder einen sauberen Faden zu ziehen und einen Pullover zu stricken. Dann lieber noch einmal neu anfangen.

    Willst du mich eigentlich entmutigen?! Weißt du eigentlich was für Code ich warten muss?! - Fremden Rotz-Code?!!! Das da oben sind keine 100 Zeilen und du vergleichst das mit einem Filz aus dem man einen sauberen Faden zieht. Muss ich jetzt um meinen Job bangen? Ich hab nämlich keine Ahnung, ob ich das hinkrieg! :p

    Ich will nicht bestreiten, dass es möglich wäre, da drin aufzuräumen. Aber zwei Punkte:
    -Ich vermute mal, dein Rotz-Code funktioniert wenigstens? Zumindest halbwegs? Es ist doch deutlich leichter, mit einem Stück Filz zu arbeiten, dass wenigsten funktioniert, als die Fehler im Gewebe eines Filzlappens zu finden. Es ist ja nicht einmal gesagt, ob das Programm überhaupt stimmt, selbst nachdem man es entwirrt hat.
    -Ist das eine sinnvolle Art, Programmieren zu lernen? Du wirst schließlich dafür bezahlt, dass du als Programmierprofi dir das antust. Für den Threadersteller wäre es IMHO besser, wenn er lernt, wie man von Vornherein vermeidet, solchen Code zu produzieren. Um die 100 weggeworfenen Zeilen ist es auch nicht zu schade.

    Karmon schrieb:

    Den letzten Ratschlag mit den Funktionen hab ich nur nicht so ganz verstanden.
    Was wiederholt sich denn? Ich weiß es sieht alles gleich aus, aber es macht doch einen Sinn oder?

    Selbst wenn sich nichts wiederholt, kann eine Funktion für Übersicht sorgen. Du könntest zum Beispiel eine Funktion schreiben, die alle Felder als unbesetzbar markiert, ausgehend von einer Position. Diese besteht aus Unterfunktionen, die die Geraden und Diagonalen markieren. Dadurch vereinfacht sich die Logik auf jeder Ebene erheblich, weil nur noch die Teile da stehen, die dort auch relevant sind. Bei dem Teil, der mit dem Benutzer interagiert ist es beispielsweise nicht relevant zu wissen, wie die Felder als unbesetzbar markiert werden. Wichtig ist nur, dass es geschieht. Derzeit wird der Lesefluss in diesem Teil aber durch 50 Zeilen Code unterbrochen, der die Felder im Details markiert. Ebenso beim Markieren der Felder selber. Es ist doch nicht wichtig zu wissen, wie genau eine Diagonale markiert wird, es ist wichtig zu wissen, dass alle 2 (oder 4, je nachdem wie man es sieht) Diagonalen markiert werden. Dann fallen auch viel leichter gewisse Logikfehler im Programm auf.

    Karmon schrieb:

    Soll ich von der ersten Eingabe des Benutzers ausgehen?

    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.



  • bitches sind immer eine gute idee, der soll den code so lassen. 🕶 😋 👍



  • SeppJ schrieb:

    Ich will nicht bestreiten, dass es möglich wäre, da drin aufzuräumen. Aber zwei Punkte:
    -Ich vermute mal, dein Rotz-Code funktioniert wenigstens? Zumindest halbwegs? Es ist doch deutlich leichter, mit einem Stück Filz zu arbeiten, dass wenigsten funktioniert, als die Fehler im Gewebe eines Filzlappens zu finden. Es ist ja nicht einmal gesagt, ob das Programm überhaupt stimmt, selbst nachdem man es entwirrt hat.

    Das Programm hat Bugs und darüber hinaus Memleaks.
    Ehrlich gesagt, habe ich noch nie solchen Code gesehen. Um eine Vorstellung zu bekommen: Es wurde von einem Praktikanten programmiert, der noch weniger von C++ versteht als ich. Und ich versteh schon nicht viel davon. Referenzen? Fehlanzeige. Delete nach einem new? Nö. :p
    Zu allem Überfluss ist die Thematik ebenfalls recht komplex. Es geht um das Parsen und Mergen von svn dumps und das soll hinterher konsistent sein. Es gibt kein Programm da draußen, das es schafft, zwei svn Repositories samt Historie im selben Trunk-Verzeichnis zu mergen. Das Programm kann das ansatzweise, aber es gibt ein paar Spezialfälle, wo das nicht klappt.

    -Ist das eine sinnvolle Art, Programmieren zu lernen? Du wirst schließlich dafür bezahlt, dass du als Programmierprofi dir das antust. Für den Threadersteller wäre es IMHO besser, wenn er lernt, wie man von Vornherein vermeidet, solchen Code zu produzieren. Um die 100 weggeworfenen Zeilen ist es auch nicht zu schade.

    Das stimmt natürlich, außer dass ich ein Programmierprofi bin. :p

    L. G.,
    IBV



  • 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


Anmelden zum Antworten