<?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[Probleme mit Snake (Zeitbegrenzung für Einagben)]]></title><description><![CDATA[<p>Hallo,<br />
ich versuche zur Zeit ein Spiel(Snake) in der Konsole zu programmiere, was bisher auch ganz gut vorran ging, allerdings habe ich zur Zeit einige Probleme auf die mir die Suchfunktion des Forums keine Antwort geben konnte.</p>
<p>Mein momentanes Problem besteht darin, dass ich nicht weiß wie ich dem User nur eine bestimme Zeit gebe, um seine Eingabe zu tätigen, damit die Schlange auch von allein weiter in die bisherige Richtung bewegt wird. Bisher bleibt meine Schleife immer bei _getch() stehen. Ich würde es nun gerne so lösen, dass der Nutzer beispielsweise 1 Sekunde Zeit hat um eine Eingabe zu tätigen, ansonsten soll die Schleife diese Stelle überspringen und die Schlange soll sich weiter in die vorherige Richtung bewegen.</p>
<p>So viel erstmal dazu. Desweiteren wollte ich fragen ob mein bisheriges Vorgehen so richtig war, denn das Spielfeld habe ich bisher mit einer simpelen if begrenzt, mit der ich abfrage ob die Schlange bestimmte Koordinaten überschreitet, wäre es vielleicht Sinnvoller das Ganze in einem 2d-Array zu realisieren?<br />
Ich bin für jede Antwort dankbar <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/topic/326708/probleme-mit-snake-zeitbegrenzung-für-einagben</link><generator>RSS for Node</generator><lastBuildDate>Mon, 25 May 2026 05:55:27 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/326708.rss" rel="self" type="application/rss+xml"/><pubDate>Thu, 03 Jul 2014 07:53:01 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to Probleme mit Snake (Zeitbegrenzung für Einagben) on Thu, 03 Jul 2014 07:53:01 GMT]]></title><description><![CDATA[<p>Hallo,<br />
ich versuche zur Zeit ein Spiel(Snake) in der Konsole zu programmiere, was bisher auch ganz gut vorran ging, allerdings habe ich zur Zeit einige Probleme auf die mir die Suchfunktion des Forums keine Antwort geben konnte.</p>
<p>Mein momentanes Problem besteht darin, dass ich nicht weiß wie ich dem User nur eine bestimme Zeit gebe, um seine Eingabe zu tätigen, damit die Schlange auch von allein weiter in die bisherige Richtung bewegt wird. Bisher bleibt meine Schleife immer bei _getch() stehen. Ich würde es nun gerne so lösen, dass der Nutzer beispielsweise 1 Sekunde Zeit hat um eine Eingabe zu tätigen, ansonsten soll die Schleife diese Stelle überspringen und die Schlange soll sich weiter in die vorherige Richtung bewegen.</p>
<p>So viel erstmal dazu. Desweiteren wollte ich fragen ob mein bisheriges Vorgehen so richtig war, denn das Spielfeld habe ich bisher mit einer simpelen if begrenzt, mit der ich abfrage ob die Schlange bestimmte Koordinaten überschreitet, wäre es vielleicht Sinnvoller das Ganze in einem 2d-Array zu realisieren?<br />
Ich bin für jede Antwort dankbar <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/2406763</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2406763</guid><dc:creator><![CDATA[Avorox]]></dc:creator><pubDate>Thu, 03 Jul 2014 07:53:01 GMT</pubDate></item><item><title><![CDATA[Reply to Probleme mit Snake (Zeitbegrenzung für Einagben) on Thu, 03 Jul 2014 08:26:24 GMT]]></title><description><![CDATA[<blockquote>
<p>Mein momentanes Problem besteht darin, dass ich nicht weiß wie ich dem User nur eine bestimme Zeit gebe, um seine Eingabe zu tätigen, damit die Schlange auch von allein weiter in die bisherige Richtung bewegt wird. Bisher bleibt meine Schleife immer bei _getch() stehen. Ich würde es nun gerne so lösen, dass der Nutzer beispielsweise 1 Sekunde Zeit hat um eine Eingabe zu tätigen, ansonsten soll die Schleife diese Stelle überspringen und die Schlange soll sich weiter in die vorherige Richtung bewegen.</p>
</blockquote>
<p>Also, ganz direkt würde ich es so machen:</p>
<pre><code>for( auto first = std::clock() + CLOCKS_PER_SEC; std::clock() &lt; first; )
    if( kbhit() )
    {
        int i = getch();
        // [...]
        break;
    }
</code></pre>
<blockquote>
<p>wäre es vielleicht Sinnvoller das Ganze in einem 2d-Array zu realisieren?</p>
</blockquote>
<p>Eigentilch solltest du ein eindimesionales Array verwenden dass du mittels einer <code>Brett</code> -Klasse als zweidimensionales Array ansprechbar machst (also mit x- und y-Koordinate).</p>
<p>Die Spiellogik selbst sollte aber in zwei Dimensionen stattfinden. Schreib dir eine <code>auf_brett</code> -Funktion, die prüft ob eine Funktion auf dem Brett ist, und schau ob der Kopf der Schlange noch auf dem Brett ist - natürlich per <code>if</code> -Statement. Die Frage verstehe ich also nicht ganz - <code>if</code> und 2D-Arrays schließen sich nicht aus.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2406766</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2406766</guid><dc:creator><![CDATA[Columbo]]></dc:creator><pubDate>Thu, 03 Jul 2014 08:26:24 GMT</pubDate></item><item><title><![CDATA[Reply to Probleme mit Snake (Zeitbegrenzung für Einagben) on Thu, 03 Jul 2014 08:17:48 GMT]]></title><description><![CDATA[<p>Erstmal vielen Dank für die schnelle Antwort.</p>
<p>Da ich noch recht unerfahren bin (lerne seit knapp einem Jahr in der Schule c++) kann ich deinen ersten Lösungsvorschlag noch nicht ganz nachvollziehen, könntest du mir diese eventuell etwas besser erklären? Denn clock() und CLOCKS_PER_SEC etc. sagen mir nicht wirklich etwas, da ich diese nicht kenne.</p>
<p>Zum zweiten Punkt, ich habe bisher ein Spielfeld mit einer for erstellet(also die optische Ausgabe des Feldes) und dann per if gesagt:</p>
<pre><code>if(x &lt;= 0 || x &gt;= 24 || y &lt;= 0 || y &gt;= 24)//Spielfeldgröße 25x25
{
//beenden des Spiels
}
</code></pre>
<p>somit benutze ich bisher gar keinen Array. Daher war meine Frage ob es vielleicht Sinnvoller wäre einen Array mit einzubinden (hab ich im Anfangspost wohl schlecht formuliert, tut mir leid).</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2406769</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2406769</guid><dc:creator><![CDATA[Avorox]]></dc:creator><pubDate>Thu, 03 Jul 2014 08:17:48 GMT</pubDate></item><item><title><![CDATA[Reply to Probleme mit Snake (Zeitbegrenzung für Einagben) on Thu, 03 Jul 2014 08:28:14 GMT]]></title><description><![CDATA[<blockquote>
<p>Da ich noch recht unerfahren bin (lerne seit knapp einem Jahr in der Schule c++) kann ich deinen ersten Lösungsvorschlag noch nicht ganz nachvollziehen, könntest du mir diese eventuell etwas besser erklären? Denn clock() und CLOCKS_PER_SEC etc. sagen mir nicht wirklich etwas, da ich diese nicht kenne.</p>
</blockquote>
<p><a href="http://en.cppreference.com/w/cpp/chrono/c/clock" rel="nofollow"> <code>std::clock()</code> </a>gibt die Anzahl der 'Ticks' seit dem Prozessstart zurück. Es gibt<a href="http://en.cppreference.com/w/cpp/chrono/c/CLOCKS_PER_SEC" rel="nofollow"> <code>CLOCKS_PER_SEC</code> </a>Ticks pro Sekunde.</p>
<p>Du addierst also die Anzahl der Ticks für eine Sekunde auf die aktuelle Tickzahl drauf. Das wird die Tickzahl sein bei der du abbrichst, falls der Benutzer noch keine Eingabe gemacht hat - zum Zeitpunkt der Addition eine Sekunde in der Zukunft.<br />
Und dann prüfst du in einer Schleifen-Abbruchbedingung ob die aktuelle Tickzahl schon bei der Abbruch-Tickzahl ist.<br />
Falls dem nicht so ist, prüfst du ob eine Taste gedrückt wird - und wenn das der Fall ist, fragst du ab welche, mittels <code>getch</code> . Dann verarbeitest du die Eingabe und brichst die Schleife ab.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2406773</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2406773</guid><dc:creator><![CDATA[Columbo]]></dc:creator><pubDate>Thu, 03 Jul 2014 08:28:14 GMT</pubDate></item><item><title><![CDATA[Reply to Probleme mit Snake (Zeitbegrenzung für Einagben) on Thu, 03 Jul 2014 09:12:45 GMT]]></title><description><![CDATA[<p>Danke für die Erklärung, leider habe ich es dadurch immernoch nicht ganz verstanden. Allerdings habe ich, während ich versucht habe mich über die von dir genannte Möglichkeit zu informieren, die Sleep funktionen entdeckt, mit der es jetzt schon recht gut funktioniert.</p>
<p>Ich muss nun nur noch dafür sorgen, dass die Schlange länger wird, sie mit sich selbst zusammenstoßen kann und Punkte spawnen.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2406787</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2406787</guid><dc:creator><![CDATA[Avorox]]></dc:creator><pubDate>Thu, 03 Jul 2014 09:12:45 GMT</pubDate></item><item><title><![CDATA[Reply to Probleme mit Snake (Zeitbegrenzung für Einagben) on Thu, 03 Jul 2014 09:48:53 GMT]]></title><description><![CDATA[<p>Arcoth schrieb:</p>
<blockquote>
<pre><code>for( auto first = std::clock() + CLOCKS_PER_SEC; std::clock() &lt; first; )
</code></pre>
</blockquote>
<p><code>first</code> ? Echt jetzt?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2406802</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2406802</guid><dc:creator><![CDATA[hustbaer]]></dc:creator><pubDate>Thu, 03 Jul 2014 09:48:53 GMT</pubDate></item><item><title><![CDATA[Reply to Probleme mit Snake (Zeitbegrenzung für Einagben) on Fri, 04 Jul 2014 07:24:42 GMT]]></title><description><![CDATA[<p>Nachdem jetzt von der Bewegung her alles reibungslos funktioniert, musste ich feststellen das ich nicht weiß wie ich weiter vorgehen soll. Bis kann mein Programm:</p>
<p>1.Schlange(Länge bisher 1) automatisch in die vorher gewählte Richtung bewegen<br />
2.Kollision mit Wand ist möglich<br />
3.Score zählen(nur leider steigt der nicht da es noch keine Punkte zum einsammeln gibt</p>
<p>Was noch fehlt:</p>
<p>1.Punkte die spawnen(damit die Schlange diese einsammeln kann)<br />
2.Schlange muss wachsen können<br />
3.Kollision mit Schlangenkopf und Körper muss möglich sein.</p>
<p>Da es sich hier um mein erstes Programm dieser Art handelt (bisher habe ich mein meist nur Konsolenprogramme, die irgendwas berechnet und dann ausgegeben haben, geschrieben) habe ich nun keine Ideen wie ich diese Punkte ins Spiel integriere.</p>
<p>Ich bräuchte nun den ein oder anderen Tipp, wie ich das realisieren kann.</p>
<p>Edit,<br />
Hier mal der bisherige Code:</p>
<pre><code>#include &lt;conio.h&gt;
#include &lt;Windows.h&gt;
#include &lt;iostream&gt;

using namespace std;

const int rechts = 'd';
const int links = 'a';
const int hoch = 'w';
const int runter = 's';
const int prechts = 0x4d;         //Hexadezimale codes der Pfeiltasten
const int plinks = 0x4b;
const int phoch = 0x48;
const int prunter = 0x50;

void Bewegung(int, int);

int main()
{
	bool ende = false;
	int x = 12;                      //x Koordniate (erste Definition = Startpunkt)
	int y = 10;                      //y Koordniate (erste Definition = Startpunkt)
	int richtung = 1;
	int punkte = 0;

	cout &lt;&lt; &quot;Punkte &quot; &lt;&lt; punkte &lt;&lt; endl;
	cout &lt;&lt;&quot;XXXXXXXXXXXXXXXXXXXXXXXXX&quot;&lt;&lt;endl;
	for(int i = 1; i &lt; 24; i++)
	{
	cout &lt;&lt; &quot;X                      X&quot;&lt;&lt;endl;
	}
	cout &lt;&lt;&quot;XXXXXXXXXXXXXXXXXXXXXXXXX&quot;&lt;&lt;endl;

	do
	{
		Bewegung(x, y);
		cout &lt;&lt; &quot;o&quot;;

		if(kbhit())
		{
			int taste = getch();
			if(!taste || taste == 0xe0))
				taste = getch();

			if(taste == hoch &amp;&amp; richtung != 2 || taste == phoch &amp;&amp; richtung != 2)
			{
				richtung = 1;
				--y;
			}

			else if(taste == runter &amp;&amp; richtung != 1 || taste == prunter &amp;&amp; richtung != 1)
			{
				richtung = 2;
				++y;
			}

			else if(taste == rechts &amp;&amp; richtung != 4 || taste == prechts &amp;&amp; richtung != 4)
			{
				richtung = 3;
				++x;
			}

			else if(taste == links &amp;&amp; richtung != 3 || taste == plinks &amp;&amp; richtung != 3)

			else
				continue;

			Sleep(150);
		}

		else if(!kbhit())
		{
			if(richtung == 1)
			{
				--y;
			}
			if(richtung == 2)
			{
				++y;
			}
			if(richtung == 3)
			{
				++x;
			}
			if(richtung == 4)
			{
				--x;
			}
			Sleep(150);
		}

		system(&quot;cls&quot;);

		if( x &lt;= 0 || x &gt;= 24 || x &lt;= 1 || y &gt;= 25)
		{
			cout &lt;&lt; &quot;Game Over!&quot; &lt;&lt; endl &lt;&lt; endl;
			cout &lt;&lt; &quot;Du hast &quot; &lt;&lt; punkte &lt;&lt; &quot; Punkte erreicht&quot; &lt;&lt; endl &lt;&lt; endl;
			system(&quot;pause&quot;);
			return 0;
		}

		cout &lt;&lt; &quot;Punkte &quot; &lt;&lt; punkte &lt;&lt; endl;
		cout &lt;&lt;&quot;XXXXXXXXXXXXXXXXXXXXXXXXX&quot;&lt;&lt;endl;
		for(int i = 1; i &lt; 24; i++)
		{
			cout &lt;&lt; &quot;X                      X&quot;&lt;&lt;endl;
		}
		cout &lt;&lt;&quot;XXXXXXXXXXXXXXXXXXXXXXXXX&quot;&lt;&lt;endl;

	}
	while(true);

	return 0;
}

void Bewegung(int b, int h)
{
	COORD punkt;
	punkt.X = b;
	punkt.Y = h;
	SetConsoleCursorPosition(GetStdHandle(STD_OUTPUT_HANDLE), punkt);
}
</code></pre>
<p>Edit durch Arcoth: Code formatiert.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2406818</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2406818</guid><dc:creator><![CDATA[Avorox]]></dc:creator><pubDate>Fri, 04 Jul 2014 07:24:42 GMT</pubDate></item><item><title><![CDATA[Reply to Probleme mit Snake (Zeitbegrenzung für Einagben) on Thu, 03 Jul 2014 17:11:41 GMT]]></title><description><![CDATA[<p>Hab mir mal die Freiheit genommen deinen Code zu formatieren.<br />
Kommentare zum Code:</p>
<ul>
<li><code>&quot;XXXXXXXXXXXXXXXXXXXXXXXXX&quot;</code> ggf. durch <code>std::string(30, 'X')</code> ersetzen.</li>
<li>
<pre><code></code></pre>
</li>
</ul>
<p>if(kbhit()) {/* [..] */}<br />
else if(!kbhit())</p>
<pre><code>
Was soll das denn?
*  In Zeile 64 fehlt was, das war wohl ein Flüchtigkeitsfehler von dir.
*  COORD ist ein Aggregat. Unterstützt dein Compiler C++11 kannst du also Zeile 119-122 durch  

</code></pre>
<p>SetConsoleCursorPosition(GetStdHandle(STD_OUTPUT_HANDLE), {b, h});</p>
<pre><code>
ersetzen.
*  73-88 solltest du durch ein switch-Statement ersetzen.  

</code></pre>
<p>switch (richtung)<br />
{<br />
case 1: --y; break;<br />
case 2: ++y; break;<br />
case 3: ++x; break;<br />
case 4: --x; break;<br />
}</p>
<pre><code>*  Warum die Endlosschleife als `do ... while(true)` schreiben? Da kriege ich immer das Gefühl, die Schleifenform hat er aus guten Grund gewählt, weil die Abbruchbedingung erst nach dem ersten Schleifendurchlauf geprüft werden soll. `for(;;)` ist da geläufiger. Abgesehen davon solltest du immer versuchen, Schleifen eine Abbruchbedingung zu geben.
*  In `x &lt;= 0 || x &gt;= 24 || x &lt;= 1 || y &gt;= 25` steckt wohl auch ein Flüchtigkeitsfehler.
*  `return 0;` am Ende der `main` -Funktion ist überflüssig.</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/2406892</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2406892</guid><dc:creator><![CDATA[Columbo]]></dc:creator><pubDate>Thu, 03 Jul 2014 17:11:41 GMT</pubDate></item><item><title><![CDATA[Reply to Probleme mit Snake (Zeitbegrenzung für Einagben) on Fri, 04 Jul 2014 09:32:38 GMT]]></title><description><![CDATA[<p>Ja die Flüchtigkeitsfehler tun mir leid, ich musste das Programm nochmal von einem anderen Rechner übertragen, da mein privates Notebook bei meinem Praktikum keinen Internetzugang hat. Somit musste ich den Code nochmal komplett abschreiben und hatte keinen Compiler zur verfügung, um es nochmals zu prüfen.</p>
<p>Jedenfalls:</p>
<p>Arcoth schrieb:</p>
<blockquote>
<p>Hab mir mal die Freiheit genommen deinen Code zu formatieren.<br />
Kommentare zum Code:</p>
<ul>
<li><code>&quot;XXXXXXXXXXXXXXXXXXXXXXXXX&quot;</code> ggf. durch <code>std::string(30, 'X')</code> ersetzen.</li>
<li>
<pre><code></code></pre>
</li>
</ul>
<p>if(kbhit()) {/* [..] */}<br />
else if(!kbhit())</p>
<pre><code>
  
Was soll das denn?
*  In Zeile 64 fehlt was, das war wohl ein Flüchtigkeitsfehler von dir.
*  COORD ist ein Aggregat. Unterstützt dein Compiler C++11 kannst du also Zeile 119-122 durch  

</code></pre>
<p>SetConsoleCursorPosition(GetStdHandle(STD_OUTPUT_HANDLE), {b, h});</p>
<pre><code>
  
ersetzen.
*  73-88 solltest du durch ein switch-Statement ersetzen.  

</code></pre>
<p>switch (richtung)<br />
{<br />
case 1: --y; break;<br />
case 2: ++y; break;<br />
case 3: ++x; break;<br />
case 4: --x; break;<br />
}</p>
<pre><code>*  Warum die Endlosschleife als `do ... while(true)` schreiben? Da kriege ich immer das Gefühl, die Schleifenform hat er aus guten Grund gewählt, weil die Abbruchbedingung erst nach dem ersten Schleifendurchlauf geprüft werden soll. `for(;;)` ist da geläufiger. Abgesehen davon solltest du immer versuchen, Schleifen eine Abbruchbedingung zu geben.
*  In `x &lt;= 0 || x &gt;= 24 || x &lt;= 1 || y &gt;= 25` steckt wohl auch ein Flüchtigkeitsfehler.
*  `return 0;` am Ende der `main` -Funktion ist überflüssig.
</code></pre>
</blockquote>
<p>Erstmal danke fürs formatieren <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>Zum string, leider habe ich strings noch nicht wirklich gelernt, daher habe ich versucht das meiste über eine for zu erstellen nur dieses Stück habe ich dann seperat geschrieben.</p>
<p>Ist das mit dem !kbhit() so nicht richtig? Ich hatte das so geplant, dass das Programm fals keine Eingabe erfolgt dort hin springen soll und dann die Bewegung in die vorherige Richtung fortgesetzt wird.<br />
Naja aber du hast recht, ich habe es mal durch ein normales else ersetzt.</p>
<p>Danke für den Tipp, ich werde das mal ausprobieren.</p>
<p>Das mit dem switch werde ich definitiv tun, wird den Code etwas übersichtlicher machen.</p>
<p>Die do while kommt daher, dass ich noch ein manuelles Beenden der Schleife ermöglichen möchte, sobald der Rest funktioniert. Ich werde also am Ende noch eine Bedingung wie &quot;!= beenden&quot; oder ähnliches einsetzen.</p>
<p>Dabei handelt es sich tatsächlich um keinen Fehler, In der obersten Zeile wird der Punktestand ausgegeben, somit ist die Y-Achse um eins nach unten verschoben.</p>
<p>Unser Lehrer zieht uns immer nen Punkt in Tests etc. ab wenn wir das return 0; nicht schreiben, daher hab ich es mir angewöhnt dieses auch bei privaten Projekten zu setzen, dann vergesse ich es auch nicht bei Schulaufgaben.</p>
<p>Ich werde mich jetzt nochmal dran setzen, vielen Dank für die Hilfe <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/2406941</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2406941</guid><dc:creator><![CDATA[Avorox]]></dc:creator><pubDate>Fri, 04 Jul 2014 09:32:38 GMT</pubDate></item></channel></rss>