<?xml version="1.0" encoding="UTF-8"?><rss xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:atom="http://www.w3.org/2005/Atom" version="2.0"><channel><title><![CDATA[4-gewinnt]]></title><description><![CDATA[<p>Hallo!<br />
Ich übe mich gerade im C++-programmieren und habe mir als Übung selbst die Aufgabe gestellt das Spiel 4-gewinnt als Konsolenspiel zu programmieren.<br />
Ich kann den Sourcecode (den ich hier nicht komplett reinstelle) ohne Probleme kompilieren. Sobald ich allerdings zu Spielen beginne, stürzt die .exe-Datei ab.<br />
Vermutlich irgend ein Pointer-Fehler oder eine Indexmenge überschritten. Leider konnte ich es bisher nicht herausfinden.</p>
<p>als 4-Gewinnt-Gitter nehme ich ein 6x7-Array bzw. eigentlich einen Pointer, der auf ein Array zeigt, dessen Elemente wieder Pointer sind (man sieht das gut bei der Funktionsdefinition).</p>
<p>Ich vermute der Fehler liegt bei meiner Funktion, die checkt ob ein Spieler gewonnen hat oder nicht.</p>
<pre><code class="language-cpp">int check_diagonal_1(int **array, int *turn) {
                         for(int i=3;i&lt;6;i++)
                                 for(int j=0;j&lt;4;j++)
                                         if((array[i][j]== *turn) &amp;&amp; (array[i-1][j+1]== *turn) &amp;&amp; (array[i-2][j+2]== *turn) &amp;&amp; (array[i-3][j+3]== *turn))return 1;
return 0;
}

int check_diagonal_2(int **array, int *turn) {
                     for(int i=0;i&lt;3;i++)
                             for(int j=0;j&lt;4;j++)
                                     if((array[i][j]== *turn) &amp;&amp; (array[i+1][j+1]== *turn) &amp;&amp; (array[i+2][j+2]== *turn) &amp;&amp; (array[i+3][j+3]== *turn)) return 1;

return 0;
}

int check_horizontal(int **array, int *turn) {

    for(int i=0;i&lt;6;i++)
         for(int j=0;j&lt;4;i++)
                 if((array[i][j]== *turn) &amp;&amp; (array[i][j+1] == *turn) &amp;&amp; (array[i][j+2] == *turn) &amp;&amp; (array[i][j+3]== *turn)) return 1;

return 0;

}

int check_vertical(int **array, int *turn) {

    for(int j=0;j&lt;7;j++)
         for(int i=0;i&lt;3;i++)
                 if((array[i][j]== *turn) &amp;&amp; (array[i+1][j]== *turn) &amp;&amp; (array[i+2][j] == *turn) &amp;&amp; (array[i+3][j]== *turn)) return 1;

return 0;
}

int check_diagonal(int **array, int *turn) {
    if((check_diagonal_1(array,turn) || check_diagonal_2(array,turn))== 1) return 1;
    else return 0;
}

int check(int **array, int *turn) {
    if((check_diagonal(array,turn) || check_horizontal(array,turn) || check_vertical(array,turn))==1) return 1;
    else return 0;
}
</code></pre>
<p>Zugegeben, nicht sehr elegant. Eigentlich sollte es aber zumindest funktionieren. Habt ihr eine Idee?</p>
<p>MfG<br />
Antro</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/283201/4-gewinnt</link><generator>RSS for Node</generator><lastBuildDate>Sat, 22 Aug 2026 15:59:27 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/283201.rss" rel="self" type="application/rss+xml"/><pubDate>Mon, 07 Mar 2011 14:31:17 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to 4-gewinnt on Mon, 07 Mar 2011 14:32:40 GMT]]></title><description><![CDATA[<p>Hallo!<br />
Ich übe mich gerade im C++-programmieren und habe mir als Übung selbst die Aufgabe gestellt das Spiel 4-gewinnt als Konsolenspiel zu programmieren.<br />
Ich kann den Sourcecode (den ich hier nicht komplett reinstelle) ohne Probleme kompilieren. Sobald ich allerdings zu Spielen beginne, stürzt die .exe-Datei ab.<br />
Vermutlich irgend ein Pointer-Fehler oder eine Indexmenge überschritten. Leider konnte ich es bisher nicht herausfinden.</p>
<p>als 4-Gewinnt-Gitter nehme ich ein 6x7-Array bzw. eigentlich einen Pointer, der auf ein Array zeigt, dessen Elemente wieder Pointer sind (man sieht das gut bei der Funktionsdefinition).</p>
<p>Ich vermute der Fehler liegt bei meiner Funktion, die checkt ob ein Spieler gewonnen hat oder nicht.</p>
<pre><code class="language-cpp">int check_diagonal_1(int **array, int *turn) {
                         for(int i=3;i&lt;6;i++)
                                 for(int j=0;j&lt;4;j++)
                                         if((array[i][j]== *turn) &amp;&amp; (array[i-1][j+1]== *turn) &amp;&amp; (array[i-2][j+2]== *turn) &amp;&amp; (array[i-3][j+3]== *turn))return 1;
return 0;
}

int check_diagonal_2(int **array, int *turn) {
                     for(int i=0;i&lt;3;i++)
                             for(int j=0;j&lt;4;j++)
                                     if((array[i][j]== *turn) &amp;&amp; (array[i+1][j+1]== *turn) &amp;&amp; (array[i+2][j+2]== *turn) &amp;&amp; (array[i+3][j+3]== *turn)) return 1;

return 0;
}

int check_horizontal(int **array, int *turn) {

    for(int i=0;i&lt;6;i++)
         for(int j=0;j&lt;4;i++)
                 if((array[i][j]== *turn) &amp;&amp; (array[i][j+1] == *turn) &amp;&amp; (array[i][j+2] == *turn) &amp;&amp; (array[i][j+3]== *turn)) return 1;

return 0;

}

int check_vertical(int **array, int *turn) {

    for(int j=0;j&lt;7;j++)
         for(int i=0;i&lt;3;i++)
                 if((array[i][j]== *turn) &amp;&amp; (array[i+1][j]== *turn) &amp;&amp; (array[i+2][j] == *turn) &amp;&amp; (array[i+3][j]== *turn)) return 1;

return 0;
}

int check_diagonal(int **array, int *turn) {
    if((check_diagonal_1(array,turn) || check_diagonal_2(array,turn))== 1) return 1;
    else return 0;
}

int check(int **array, int *turn) {
    if((check_diagonal(array,turn) || check_horizontal(array,turn) || check_vertical(array,turn))==1) return 1;
    else return 0;
}
</code></pre>
<p>Zugegeben, nicht sehr elegant. Eigentlich sollte es aber zumindest funktionieren. Habt ihr eine Idee?</p>
<p>MfG<br />
Antro</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2030819</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2030819</guid><dc:creator><![CDATA[Antro]]></dc:creator><pubDate>Mon, 07 Mar 2011 14:32:40 GMT</pubDate></item><item><title><![CDATA[Reply to 4-gewinnt on Mon, 07 Mar 2011 14:48:53 GMT]]></title><description><![CDATA[<p>Hallo Antro,</p>
<p>willkommen im C++-Forum.</p>
<p>Versuche mal in Zeile 20: for(int j=0;j&lt;4;++j) nicht ++i</p>
<p>Gruß<br />
Werner</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2030826</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2030826</guid><dc:creator><![CDATA[Werner Salomon]]></dc:creator><pubDate>Mon, 07 Mar 2011 14:48:53 GMT</pubDate></item><item><title><![CDATA[Reply to 4-gewinnt on Mon, 07 Mar 2011 15:43:07 GMT]]></title><description><![CDATA[<p>Hallo Antro,</p>
<p>und du solltest deine Variable 'turn' einfach als 'int' übergeben (nicht als Zeiger), denn es ist ja nur eine Wertevergleich, den du durchführst!<br />
Je weniger Zeiger du verwendest, umso weniger Fehler können passieren <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f609.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--winking_face"
      title=";-)"
      alt="😉"
    /></p>
<p>Verwendest du denn keine IDE (z.B. das Visual Studio)? Denn der eingebaute Debugger müßte dir dann die Absturzstelle exakt anzeigen...</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2030844</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2030844</guid><dc:creator><![CDATA[Th69]]></dc:creator><pubDate>Mon, 07 Mar 2011 15:43:07 GMT</pubDate></item><item><title><![CDATA[Reply to 4-gewinnt on Mon, 07 Mar 2011 16:01:49 GMT]]></title><description><![CDATA[<p>Ein paar Verbesserungsvorschläge:</p>
<ul>
<li>Vermeide magische Konstanten (6 und 7 tauchen überall auf). Man kann solchen Konstanten einen Namen geben und den Wert an genau einer Stelle festlegen. Das erhöht die Lesbarkeit und erleichtert in Deinem Fall das nachträgliche Vergrößern/Verkleinern des Feldes.</li>
<li>Vermeide ** und besonders *** -- siehe auch <a href="http://www.c2.com/cgi/wiki?ThreeStarProgrammer" rel="nofollow">3-Sterne-Programmierer</a>. Du kannst Dir Für Dein Feld zB einen eigenen Typ definieren.</li>
<li>In vielen Deiner Funktionen ist es nicht notwendig, turn als Zeiger zu definieren; denn Dir geht es nicht um die Adresse irgendeiner turn-Variablen sondern um den aktuell gespeicherten Wert.</li>
</ul>
<pre><code class="language-cpp">const int zeilen  = 6;
const int spalten = 7;

struct meinfeld
{
  int elemente[zeilen][spalten];
};

void feld_darstellen(meinfeld f); // oder besser: meinfeld const &amp; f
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/2030854</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2030854</guid><dc:creator><![CDATA[krümelkacker]]></dc:creator><pubDate>Mon, 07 Mar 2011 16:01:49 GMT</pubDate></item><item><title><![CDATA[Reply to 4-gewinnt on Tue, 08 Mar 2011 15:29:38 GMT]]></title><description><![CDATA[<p>Hallo!<br />
Danke für die Tipps. Das Programm funktioniert jetzt.</p>
<p><a class="plugin-mentions-user plugin-mentions-a" href="https://www.c-plusplus.net/forum/uid/18594">@Th69</a>: Nein, ich verwende keine IDE und habe bisher auch keine Ahnung wie das geht. <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f642.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--slightly_smiling_face"
      title=":-)"
      alt="🙂"
    /></p>
<p>Das mit den Pointern werde ich mir zu Herzen nehmen. Ich habe halt irgendwie gedacht, dass ich mit Pointer weniger Speicherplatz brauche oder das Programm schneller ist (was bei 4-gewinnt eigentlich eh nicht relevant ist).<br />
Das mit den globalen Variablen ist auch eine super Idee, danke.</p>
<p>Könnte ich bei so einer Funktion eigentlich auch ein normales array übergeben?</p>
<p>Noch was:<br />
Was wäre eurer Meinung nach als nächstes der beste Schritt für mich?</p>
<p>- alles nochmal mit IDE<br />
- eine kleine KI einbauen (ist halt schwierig die so zu gestalten, dass sie nicht zu schnell zu durchschauen ist. Vielleicht irgendwie mit Bäumen oder so?)<br />
- etwas anderes (dann bitte mit Vorschlag)</p>
<p>MfG<br />
Antro</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2031365</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2031365</guid><dc:creator><![CDATA[Antro]]></dc:creator><pubDate>Tue, 08 Mar 2011 15:29:38 GMT</pubDate></item><item><title><![CDATA[Reply to 4-gewinnt on Wed, 09 Mar 2011 08:04:35 GMT]]></title><description><![CDATA[<p>Antro schrieb:</p>
<blockquote>
<p>ich verwende keine IDE und habe bisher auch keine Ahnung wie das geht. <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f642.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--slightly_smiling_face"
      title=":-)"
      alt="🙂"
    /> [...]<br />
- alles nochmal mit IDE</p>
</blockquote>
<p>Das lässt vermuten, dass du nichtmal so ganz weißt was eine IDE ist. (Sonst wüsstest du dass du da nicht &quot;alles nochmal&quot; schreiben müsstest) Welchen Compiler benutzt du denn, und worin schreibst du deine Quellcodes?</p>
<blockquote>
<p>Das mit den Pointern werde ich mir zu Herzen nehmen. Ich habe halt irgendwie gedacht, dass ich mit Pointer weniger Speicherplatz brauche oder das Programm schneller ist (was bei 4-gewinnt eigentlich eh nicht relevant ist).</p>
</blockquote>
<p>Weder noch. Mit Poitnern brauchst du den gleichen Speicherplatz für die Objekte (nur auf dem Heap und nicht auf dem Stack), PLUS den Platz für die Poitner auf dem Stack. Schneller wirds auch nicht, eher langsamer durch die Speicherallokationen, die teuer sind.<br />
Was lernt man daraus? Beim Programmieren kommts nicht auf denken/schätzen/vermuten an, sondern auf Wissen.</p>
<blockquote>
<p>Könnte ich bei so einer Funktion eigentlich auch ein normales array übergeben?</p>
</blockquote>
<p>Normale Arrays kann man nicht richtig an Funktionen übergeben. Die &quot;zerfallen&quot; zu Pointern (auf das erste Element) und die Längeninformation geht dabei verloren bzw. muss extra mit dazugegeben werden. Container und Referenzen sind da eleganter.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2031610</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2031610</guid><dc:creator><![CDATA[pumuckl]]></dc:creator><pubDate>Wed, 09 Mar 2011 08:04:35 GMT</pubDate></item><item><title><![CDATA[Reply to 4-gewinnt on Wed, 09 Mar 2011 08:13:49 GMT]]></title><description><![CDATA[<p>Natürlich kann man Arrays übergeben: <a href="http://ideone.com/5Vain" rel="nofollow">http://ideone.com/5Vain</a></p>
]]></description><link>https://www.c-plusplus.net/forum/post/2031615</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2031615</guid><dc:creator><![CDATA[314159265358979]]></dc:creator><pubDate>Wed, 09 Mar 2011 08:13:49 GMT</pubDate></item><item><title><![CDATA[Reply to 4-gewinnt on Wed, 09 Mar 2011 09:21:42 GMT]]></title><description><![CDATA[<p>Antro schrieb:</p>
<blockquote>
<p>Hallo!<br />
Danke für die Tipps. Das Programm funktioniert jetzt.</p>
<p><a class="plugin-mentions-user plugin-mentions-a" href="https://www.c-plusplus.net/forum/uid/18594">@Th69</a>: Nein, ich verwende keine IDE und habe bisher auch keine Ahnung wie das geht. <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f642.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--slightly_smiling_face"
      title=":-)"
      alt="🙂"
    /></p>
<p>Das mit den Pointern werde ich mir zu Herzen nehmen. Ich habe halt irgendwie gedacht, dass ich mit Pointer weniger Speicherplatz brauche oder das Programm schneller ist (was bei 4-gewinnt eigentlich eh nicht relevant ist).<br />
Das mit den globalen Variablen ist auch eine super Idee, danke.</p>
<p>Könnte ich bei so einer Funktion eigentlich auch ein normales array übergeben?</p>
<p>Noch was:<br />
Was wäre eurer Meinung nach als nächstes der beste Schritt für mich?</p>
<p>- alles nochmal mit IDE<br />
- eine kleine KI einbauen (ist halt schwierig die so zu gestalten, dass sie nicht zu schnell zu durchschauen ist. Vielleicht irgendwie mit Bäumen oder so?)<br />
- etwas anderes (dann bitte mit Vorschlag)</p>
<p>MfG<br />
Antro</p>
</blockquote>
<p>IDE heisst nichts anderes als &quot;Integrated Developement environment&quot;. Es ist nichts anderes als eine Entwicklungsumgebung.<br />
Hier gibts einige. Ich empfehle jedoch Visual C++ Express 2008 oder 2010, da der Debugger einfach ungeschlagen ist. Und ein Debugger gehört zum Handwerkszeug ganz dringend dazu^^.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2031638</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2031638</guid><dc:creator><![CDATA[[[global:former_user]]]]></dc:creator><pubDate>Wed, 09 Mar 2011 09:21:42 GMT</pubDate></item><item><title><![CDATA[Reply to 4-gewinnt on Wed, 09 Mar 2011 18:29:57 GMT]]></title><description><![CDATA[<p>314159265358979 schrieb:</p>
<blockquote>
<p>Natürlich kann man Arrays übergeben</p>
</blockquote>
<p>Naja, das kommt drauf an, was genau Du unter &quot;Übergeben eines X&quot; verstehst. In Deinem Beispiel findet eine Kopierinitialisierung einer Referenz auf ein Array statt. Ist das ein &quot;Übergeben eines Arrays&quot;? IMHO Grauzone und Ansichtssache.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2031933</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2031933</guid><dc:creator><![CDATA[krümelkacker]]></dc:creator><pubDate>Wed, 09 Mar 2011 18:29:57 GMT</pubDate></item><item><title><![CDATA[Reply to 4-gewinnt on Fri, 11 Mar 2011 08:29:02 GMT]]></title><description><![CDATA[<p>Danke für die Antworten. Es ist irgendwie schwer bestimmte Dinge in Erfahrung zu bringen. Z.B. wo jetzt was gespeichert wird und wieso dies und das schneller ist. In den meisten Tutorien werden diese Informationen nicht angegeben. Ich hab mich übrigens verschrieben. Ich wollte fragen ob ich jetzt alles mit GUI machen soll. Als IDE habe ich derzeit mal Visual C Express 2010 und DEV-C heruntergeladen. Mit letzterem komme ich bisher gut zurecht. Bei Visual C hingegen weiß ich nicht einmal wie man richtig kompiliert.</p>
<p>Was meint ihr also?<br />
Lieber zuerst eine GUI für das Spiel programmieren, oder eine KI oder überhaupt etwas anderes?</p>
<p>MfG<br />
Antro</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2032593</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2032593</guid><dc:creator><![CDATA[Antro]]></dc:creator><pubDate>Fri, 11 Mar 2011 08:29:02 GMT</pubDate></item><item><title><![CDATA[Reply to 4-gewinnt on Fri, 11 Mar 2011 08:34:08 GMT]]></title><description><![CDATA[<p>Antro schrieb:</p>
<blockquote>
<p>Danke für die Antworten. Es ist irgendwie schwer bestimmte Dinge in Erfahrung zu bringen. Z.B. wo jetzt was gespeichert wird und wieso dies und das schneller ist. In den meisten Tutorien werden diese Informationen nicht angegeben. Ich hab mich übrigens verschrieben. Ich wollte fragen ob ich jetzt alles mit GUI machen soll. Als IDE habe ich derzeit mal Visual C Express 2010 und DEV-C heruntergeladen. Mit letzterem komme ich bisher gut zurecht. Bei Visual C hingegen weiß ich nicht einmal wie man richtig kompiliert.</p>
<p>Was meint ihr also?<br />
Lieber zuerst eine GUI für das Spiel programmieren, oder eine KI oder überhaupt etwas anderes?</p>
<p>MfG<br />
Antro</p>
</blockquote>
<p>Hier deine Aufgabenliste:<br />
* Dev-C++ wegwerfen<br />
* Lernen mit Visual C++ Express umzugehen oder Code::Blocks verwenden. Oder, mein favorit für Anfänger: CodeLite (<a href="http://www.codelite.org/" rel="nofollow">http://www.codelite.org/</a>).<br />
* C++ Buch fertig lesen<br />
* Lernen mit wxWidgets (GUI Toolkit) oder QT umzugehen</p>
<p>Mein Vorschlag <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f642.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--slightly_smiling_face"
      title=":)"
      alt="🙂"
    /></p>
]]></description><link>https://www.c-plusplus.net/forum/post/2032596</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2032596</guid><dc:creator><![CDATA[[[global:former_user]]]]></dc:creator><pubDate>Fri, 11 Mar 2011 08:34:08 GMT</pubDate></item><item><title><![CDATA[Reply to 4-gewinnt on Fri, 11 Mar 2011 08:40:59 GMT]]></title><description><![CDATA[<p>Beides (besonders GUI-Programmierung) sind recht komplexe Themengebiete. Ich würde dir empfehlen eben die Grundlagen zu erlernen. Da gibt es wohl noch einiges zu machen. Wenn die Grundlagen dann sitzen, kannst du mit dem Programmieren z. B. der Winapi weiter machen. Da du aber Lust auf Spiele hast, empfehle ich dir dich dann mit der SDL oder der SFML zu befassen. Diese sind einfach zu verewnden mit großem Umfang. Das mit der KI ergibt sich mehr oder weniger von Alleine. Ganz wichtig sind immer Bücher.</p>
<p>Dev-C++ wurde schon seit Jahren nicht mehr weiterentwickelt und es wird nicht empfohlen ihn zu verwenden. Suche dir am Besten für Visual Studio ein gutes Tutorial oder lies die Hilfe dazu. Imo ist dieser die erste Wahl wenn man unter Windows programmiert. Sehr gute Alternative ist G++ und erste Wahl unter Linux.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2032599</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2032599</guid><dc:creator><![CDATA[HighLigerBiMBam]]></dc:creator><pubDate>Fri, 11 Mar 2011 08:40:59 GMT</pubDate></item></channel></rss>