<?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[Snake:D]]></title><description><![CDATA[<p>Hey Leutz, habe heute zum ersten Mal Snake programmiert. Mich interessiert da ich relativ neu dabei bin mit C++, inwieweit das sinvoll gewesen ist, es so zu machen wie ich. Habe ich OOP-Like programmiert oder gar nicht ich? Damit ich bei anderen Projekten es besser machen kann. Sind knapp 300 Zeilen und wer sich das nicht antun möchte; kann ich verstehen <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f60b.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--face_savoring_food"
      title=":yum:"
      alt="😋"
    /><br />
Nochwas: Wenn es einer bei sich aufm PC ausprobieren kann, wäre das toll(kann auch die exe versenden), da bei mir das Spiel sehr langsam läuft, obwohl Sleep() nur auf 50 gesetzt ist. Vllcht hat jmd. eine Antwort drauf.<br />
Für jeden Tipp bin ich sehr dankbar. Aber bitte immer mit Begruendung.<br />
Viele Dank!</p>
<p>EDIT: Es fehlt die Überprüfung wenn der Kopf in Richtung des hinteren Teils lenkt.</p>
<pre><code>//main.cpp
#include&lt;iostream&gt;
#include&lt;conio.h&gt;
#include&lt;Windows.h&gt;

#include&quot;CField.h&quot;
#include&quot;CSnake.h&quot;
#include&quot;CMove.h&quot;

using namespace std;

int main()
{
  CMove game;//Instanz für das ganze Spiel
  int zaehler;//zaehler damit nach einer eingabe, der default-move nicht ausgefuehrt wird, also schlange geradeaus
  //(gibt zwei verschieden move funktionen) 
  bool exit = false; //für die schleife
  while(!exit) 
  { 
    zaehler=0;//zaehler immer am anfang =0, damit wenn keine taste gedrueckt wird der normal move in der if ausgefuehrt wird. siehe unten 
    system(&quot;cls&quot;);//zum löschen des Ausgabefensters nach jeder Bewegung
    if(kbhit())
    {      
        char c = getch(); // Muss auf keine Eingabe warten, Taste ist bereits gedrückt 
        switch(c) //nur wenn eine Taste gedrueckt wird, ansonsten bewegt sich die Schlange von selbst 
        { 
          case 'w':
            game.move('w');//die zweite move funktion, hier wird 'w' mitgegeben, damit die funktion richtig reagieren kann
            zaehler++;//damit nur einer bewegung gemacht wird und nicht in die if gegngen wird und die schlange sich nochmal bewegt bevor
            //ein neues Bild erstellt wird
            break;
          case 'a':
            game.move('a');
            zaehler++;
            break;
          case 'd':
            game.move('d');
            zaehler++;
            break;
          case 's':
            game.move('s');
            zaehler++;
            break;
          default:
            ;
        }
    }
    if(zaehler == 0)//hier der andere move der nur gerade ausgeht; zwei moves wegen des Problems, wenn keine Taste gedrueckzt wird
    {  // und die schlange ja trotzdem selbstsändig geradeaus gehne soll
      game.default_move();}
    game.draw();//brett wird gezeichnet
    // Bewege andere Spielfiguren (z.B. die Snake-Schlange) 
     // Geschwindigkeitsregler 
     Sleep(50); 
  }

}

//CFiel.h
//Selbsterklärend das Feld in dem Die schlange sich bewegt

#ifndef _CField
#define _CField

class CField
{
protected:
  char field[20][20];// das feld 
public:
  CField();//hier wird das Feld erstellt mit den anfangsdaten für die schlange und des randes
  virtual ~CField(){};//keine fkt.
  void draw();//zeichnen
  void setCharToField(const unsigned int x_cord,const unsigned int y_cord);//für die schlange wenn sie sich bewegt 
  void deleteOldChar(const unsigned int x_cord, const unsigned int y_cord);//auch selbsterklärend; schlangen ende löschen und nicht groeßer werden lassen
};

#endif _CField

//CField.cpp  ############ fkt selbsterklärend deshalb nicht erklärt
#include&quot;CField.h&quot;
#include &lt;iostream&gt;

using namespace std;

void CField::setCharToField(const unsigned int x_cord,const unsigned int y_cord)
{
  if( (x_cord&gt;=0 || x_cord&lt;20) &amp;&amp; (y_cord&gt;=0 || y_cord&lt;20) )
    field[x_cord][y_cord] = '*';
}

void CField::deleteOldChar(const unsigned x_cord, const unsigned y_cord)
{
  field[x_cord][y_cord] = ' ';
}

CField::CField()
{
  for(int i=0; i&lt;20; i++)
  {
    field[0][i] ='#';
    field[19][i] = '#';
    field[i][0] = '#';
    field[i][19] = '#';
  }
  for(int i=1; i&lt;19; i++)
  {
    for(int j=1; j&lt;19; j++)
    {
      field[i][j] = ' ';
    }
    cout &lt;&lt; &quot;\n&quot;;
  }
}

void CField::draw()
{
  for(int i=0; i&lt;20; i++)
  {
    for(int j=0; j&lt;20; j++)
    {
      cout &lt;&lt; field[i][j];
    }
    cout &lt;&lt; &quot;\n&quot;;
  }
}
//CSnake.h
#include &lt;vector&gt;

#include&quot;CField.h&quot;

#ifndef _CSnake
#define _CSnake

class CSnake : public CField//Vererbung, damit direkt auf das feld array zugegriffen werden kann und auf die wichtige fkt.
{
protected:
  unsigned int x_food, y_food;//coords vom essen für die schlange
  std::vector&lt;unsigned int&gt; snake_x;//schlange besteht aus 2 vektoren einmal für die x coords und einmal die y coords
  std::vector&lt;unsigned int&gt; snake_y;//
public:
  void new_food();//für das neue essen, wenn das alte weg ist
  int snake_food_check();//checken ob schlange schon gegessen hat
  CSnake();//schlange in vektor gespeichert und ins feld getan und das erste essen gespeichert
  void putInField();//vektoren (schlange) in das feld ausgegebn 
};

#endif _CSnake

//CSnake.cpp
#include&lt;iostream&gt;
#include&lt;stdlib.h&gt;
#include&lt;time.h&gt;

#include &quot;CSnake.h&quot;

CSnake::CSnake()//schlange startet imnmer von der selben position und das essen auch
{
  snake_x.push_back(10);
  snake_y.push_back(10);
  snake_x.push_back(10);
  snake_y.push_back(9);
  snake_x.push_back(10);
  snake_y.push_back(8);
  snake_x.push_back(10);
  snake_y.push_back(7);
  setCharToField(snake_x[0],snake_y[0]);
  setCharToField(snake_x[1],snake_y[1]);
  setCharToField(snake_x[2],snake_y[2]);
  setCharToField(snake_x[3], snake_y[3]);
  x_food = 2; y_food = 16;
  field[x_food][y_food] = 'O';
}

void CSnake::putInField()// fkt um den vektor immer ins feld auszugebene
{
  for(unsigned int i=0; i&lt;snake_x.size(); i++)
    {
      setCharToField(snake_x[i],snake_y[i]);
    }
}

int CSnake::snake_food_check()
{
  if(snake_x[0] == x_food &amp;&amp; snake_y[0] == y_food)//da der kopf nur isst wird nach jeder bewegung überprüft oder der kopf(mund) schon gegessen hat 
    return 1;//1 für die abfrage später in move.cpp
  return 0;
}

void CSnake::new_food()//hier neues essen gesetzt werden
{
   int x=x_food; int y=y_food;//abspeichern der alten food daten, da gleich in while solange geändert wird bis was anderes rauskommt 
   srand(time(NULL));//um das essen rnd zu verteilen
   while(field[x_food][y_food] != ' ')//hier nur reinkomemn wenn auf dem feld schon was anderes steht 
   {
     x_food=x; y_food=y;//da ja x und y neue daten hattem im 2-ten bzw n-ten durchgang 
     while(x==x_food)//solange bis die x coord neu ist und nicht alt 
     {
       x_food = rand()% 18+1;//hier wird x_food neu gesetzt
     }
     while(y==y_food)//hier wird y neugesetzt
     {
       y_food = rand()% 18+1;
     }
   }
   field[x_food][y_food] = 'O';//und wenn ein neuer geigneter ort gefunden dann das essen setzen
}

//CMove.h
#include &quot;CSnake.h&quot;
#ifndef _CMove
#define _CMove

class CMove:public CSnake 
{
private:
  char direction;//um die letzte Taste Taste zu speicher(w,a,s,d) um die schlange automatisch in diese rihctug laufen zu lassen, wenn nichts gedrueckt wird
  int metFood;
public:
  CMove();//nur membervariablen gesetzt
  virtual ~CMove(){};
  void move(const char input);//wenn eine taste gedrueckt
  void default_move();//schlange von alleine
};

#endif _CMove

//CMove.cpp
#include &quot;CMove.h&quot;
#include&lt;iostream&gt;
#include&lt;conio.h&gt;
#include&lt;Windows.h&gt;

using namespace std;

CMove::CMove()
{
  direction = ' ';
  metFood=0;
}

void CMove::move(const char input)
{
  direction = input;//damit wenn wir in die auto move kommen, wissen in welche richtung
  metFood = snake_food_check();//checken ob gegessen
  deleteOldChar(snake_x[snake_x.size()-1], snake_y[snake_y.size()-1]);//altes zeichen immer löschen
  if(metFood == 1)//wenn gegessen
    {
      snake_x.push_back(snake_x[snake_x.size()-1]);//dann wird die Schlange verlaengert
      snake_y.push_back(snake_y[snake_y.size()-1]);
      new_food();//und neues essen gesetzt
    }
  for(unsigned int i=1; i&lt;snake_x.size(); i++)
  {    
    snake_x[snake_x.size()-i] = snake_x[snake_x.size()-i-1];
    snake_y[snake_y.size()-i] = snake_y[snake_y.size()-i-1];   
  }//hier wird der hintere teil ohne kopf auf den nächsten teil gesetzt(schlange fortbewegung)

  if(direction == 'w')
  {
    if(field[snake_x[0]-1][snake_y[0&rsqb;&rsqb; == '*' || field[snake_x[0]-1][snake_y[0&rsqb;&rsqb; == '#')//kollision überprüfen
    {
      std::cout &lt;&lt; &quot;Leider Verloren&quot; &lt;&lt; endl;
      Sleep(20000);
      exit(0);
    }
    snake_x[0] = snake_x[0]-1;//ansonsten den kopf in die richtige richtung lenken; die nächsten teile genauso
  }
  else if(direction == 's')
  {
    if(field[snake_x[0]+1][snake_y[0&rsqb;&rsqb; == '*' || field[snake_x[0]+1][snake_y[0&rsqb;&rsqb; == '#')
    {
      std::cout &lt;&lt; &quot;Leider Verloren&quot; &lt;&lt; endl;
      Sleep(20000);
      exit(0);
    }
    snake_x[0] = snake_x[0]+1;
  }
  else if (direction == 'a')
  {
    if(field[snake_x[0&rsqb;&rsqb;[snake_y[0]-1] == '*' || field[snake_x[0&rsqb;&rsqb;[snake_y[0]-1] == '#')
    {
      std::cout &lt;&lt; &quot;Leider Verloren&quot; &lt;&lt; endl;
      Sleep(200);
      exit(0);
    }
    snake_y[0] = snake_y[0]-1;
  }
  else if(direction == 'd')
  {
    if(field[snake_x[0&rsqb;&rsqb;[snake_y[0]+1] == '*' || field[snake_x[0&rsqb;&rsqb;[snake_y[0]+1] == '#')
    {
      std::cout &lt;&lt; &quot;Leider Verloren&quot; &lt;&lt; endl;
      Sleep(20000);
      exit(0);
    }
    snake_y[0] = snake_y[0]+1;
  }
  putInField();//neue schlange in das feld setzen
}

void CMove::default_move()//hier damit die schlange auto läuft
{
  metFood = snake_food_check();//gegessen?
  deleteOldChar(snake_x[snake_x.size()-1], snake_y[snake_y.size()-1]);//schlange darf nichts liegen lassen;)
  if(metFood == 1)
    {
      snake_x.push_back(snake_x[snake_x.size()-1]);
      snake_y.push_back(snake_y[snake_y.size()-1]);
      new_food();//gleiche wie oben ob
    }
  for(unsigned int i=1; i&lt;snake_x.size(); i++)
  {
    snake_x[snake_x.size()-i] = snake_x[snake_x.size()-i-1];
    snake_y[snake_y.size()-i] = snake_y[snake_y.size()-i-1];
  }//hinterer teil bewegt

  if(direction == ' ')
  {//am anfang ist direction mit ' ' definiert(konstruktur), und wenn nichts gedrueckt wird dann hierrein 
    if(field[snake_x[0&rsqb;&rsqb;[snake_y[0]+1] == '*' || field[snake_x[0&rsqb;&rsqb;[snake_y[0]+1] == '#')//kollision
    {
      std::cout &lt;&lt; &quot;Leider Verloren&quot; &lt;&lt; endl;
      Sleep(20000);
      exit(0);
    }
    snake_y[0] = snake_y[0]+1;
  }
  else if(direction == 'w')
  {
    if(field[snake_x[0]-1][snake_y[0&rsqb;&rsqb; == '*' || field[snake_x[0]-1][snake_y[0&rsqb;&rsqb; == '#')
    {
      std::cout &lt;&lt; &quot;Leider Verloren&quot; &lt;&lt; endl;
      Sleep(20000);
      exit(0);
    }
    snake_x[0] = snake_x[0]-1;
  }
  else if(direction == 's')
  {
    if(field[snake_x[0]+1][snake_y[0&rsqb;&rsqb; == '*' || field[snake_x[0]+1][snake_y[0]-1] == '#' )
    {
      std::cout &lt;&lt; &quot;Leider Verloren&quot; &lt;&lt; endl;
      Sleep(20000);
      exit(0);
    }
    snake_x[0] = snake_x[0]+1;
  }
  else if (direction == 'a')
  {
    if(field[snake_x[0&rsqb;&rsqb;[snake_y[0]-1] == '*' || field[snake_x[0&rsqb;&rsqb;[snake_y[0]-1] == '#')
    {
      std::cout &lt;&lt; &quot;Leider Verloren&quot; &lt;&lt; endl;
      Sleep(20000);
      exit(0);
    }
    snake_y[0] = snake_y[0]-1;
  }
  else if(direction == 'd')
  {
    if(field[snake_x[0&rsqb;&rsqb;[snake_y[0]+1] == '*' || field[snake_x[0&rsqb;&rsqb;[snake_y[0]+1] == '#')
    {
      std::cout &lt;&lt; &quot;Leider Verloren&quot; &lt;&lt; endl;
      Sleep(20000);
      exit(0);
    }
    snake_y[0] = snake_y[0]+1;
  }
  putInField();
}
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/topic/317916/snake-d</link><generator>RSS for Node</generator><lastBuildDate>Mon, 27 Jul 2026 21:39:31 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/317916.rss" rel="self" type="application/rss+xml"/><pubDate>Mon, 24 Jun 2013 17:59:49 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to Snake:D on Mon, 24 Jun 2013 18:01:12 GMT]]></title><description><![CDATA[<p>Hey Leutz, habe heute zum ersten Mal Snake programmiert. Mich interessiert da ich relativ neu dabei bin mit C++, inwieweit das sinvoll gewesen ist, es so zu machen wie ich. Habe ich OOP-Like programmiert oder gar nicht ich? Damit ich bei anderen Projekten es besser machen kann. Sind knapp 300 Zeilen und wer sich das nicht antun möchte; kann ich verstehen <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f60b.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--face_savoring_food"
      title=":yum:"
      alt="😋"
    /><br />
Nochwas: Wenn es einer bei sich aufm PC ausprobieren kann, wäre das toll(kann auch die exe versenden), da bei mir das Spiel sehr langsam läuft, obwohl Sleep() nur auf 50 gesetzt ist. Vllcht hat jmd. eine Antwort drauf.<br />
Für jeden Tipp bin ich sehr dankbar. Aber bitte immer mit Begruendung.<br />
Viele Dank!</p>
<p>EDIT: Es fehlt die Überprüfung wenn der Kopf in Richtung des hinteren Teils lenkt.</p>
<pre><code>//main.cpp
#include&lt;iostream&gt;
#include&lt;conio.h&gt;
#include&lt;Windows.h&gt;

#include&quot;CField.h&quot;
#include&quot;CSnake.h&quot;
#include&quot;CMove.h&quot;

using namespace std;

int main()
{
  CMove game;//Instanz für das ganze Spiel
  int zaehler;//zaehler damit nach einer eingabe, der default-move nicht ausgefuehrt wird, also schlange geradeaus
  //(gibt zwei verschieden move funktionen) 
  bool exit = false; //für die schleife
  while(!exit) 
  { 
    zaehler=0;//zaehler immer am anfang =0, damit wenn keine taste gedrueckt wird der normal move in der if ausgefuehrt wird. siehe unten 
    system(&quot;cls&quot;);//zum löschen des Ausgabefensters nach jeder Bewegung
    if(kbhit())
    {      
        char c = getch(); // Muss auf keine Eingabe warten, Taste ist bereits gedrückt 
        switch(c) //nur wenn eine Taste gedrueckt wird, ansonsten bewegt sich die Schlange von selbst 
        { 
          case 'w':
            game.move('w');//die zweite move funktion, hier wird 'w' mitgegeben, damit die funktion richtig reagieren kann
            zaehler++;//damit nur einer bewegung gemacht wird und nicht in die if gegngen wird und die schlange sich nochmal bewegt bevor
            //ein neues Bild erstellt wird
            break;
          case 'a':
            game.move('a');
            zaehler++;
            break;
          case 'd':
            game.move('d');
            zaehler++;
            break;
          case 's':
            game.move('s');
            zaehler++;
            break;
          default:
            ;
        }
    }
    if(zaehler == 0)//hier der andere move der nur gerade ausgeht; zwei moves wegen des Problems, wenn keine Taste gedrueckzt wird
    {  // und die schlange ja trotzdem selbstsändig geradeaus gehne soll
      game.default_move();}
    game.draw();//brett wird gezeichnet
    // Bewege andere Spielfiguren (z.B. die Snake-Schlange) 
     // Geschwindigkeitsregler 
     Sleep(50); 
  }

}

//CFiel.h
//Selbsterklärend das Feld in dem Die schlange sich bewegt

#ifndef _CField
#define _CField

class CField
{
protected:
  char field[20][20];// das feld 
public:
  CField();//hier wird das Feld erstellt mit den anfangsdaten für die schlange und des randes
  virtual ~CField(){};//keine fkt.
  void draw();//zeichnen
  void setCharToField(const unsigned int x_cord,const unsigned int y_cord);//für die schlange wenn sie sich bewegt 
  void deleteOldChar(const unsigned int x_cord, const unsigned int y_cord);//auch selbsterklärend; schlangen ende löschen und nicht groeßer werden lassen
};

#endif _CField

//CField.cpp  ############ fkt selbsterklärend deshalb nicht erklärt
#include&quot;CField.h&quot;
#include &lt;iostream&gt;

using namespace std;

void CField::setCharToField(const unsigned int x_cord,const unsigned int y_cord)
{
  if( (x_cord&gt;=0 || x_cord&lt;20) &amp;&amp; (y_cord&gt;=0 || y_cord&lt;20) )
    field[x_cord][y_cord] = '*';
}

void CField::deleteOldChar(const unsigned x_cord, const unsigned y_cord)
{
  field[x_cord][y_cord] = ' ';
}

CField::CField()
{
  for(int i=0; i&lt;20; i++)
  {
    field[0][i] ='#';
    field[19][i] = '#';
    field[i][0] = '#';
    field[i][19] = '#';
  }
  for(int i=1; i&lt;19; i++)
  {
    for(int j=1; j&lt;19; j++)
    {
      field[i][j] = ' ';
    }
    cout &lt;&lt; &quot;\n&quot;;
  }
}

void CField::draw()
{
  for(int i=0; i&lt;20; i++)
  {
    for(int j=0; j&lt;20; j++)
    {
      cout &lt;&lt; field[i][j];
    }
    cout &lt;&lt; &quot;\n&quot;;
  }
}
//CSnake.h
#include &lt;vector&gt;

#include&quot;CField.h&quot;

#ifndef _CSnake
#define _CSnake

class CSnake : public CField//Vererbung, damit direkt auf das feld array zugegriffen werden kann und auf die wichtige fkt.
{
protected:
  unsigned int x_food, y_food;//coords vom essen für die schlange
  std::vector&lt;unsigned int&gt; snake_x;//schlange besteht aus 2 vektoren einmal für die x coords und einmal die y coords
  std::vector&lt;unsigned int&gt; snake_y;//
public:
  void new_food();//für das neue essen, wenn das alte weg ist
  int snake_food_check();//checken ob schlange schon gegessen hat
  CSnake();//schlange in vektor gespeichert und ins feld getan und das erste essen gespeichert
  void putInField();//vektoren (schlange) in das feld ausgegebn 
};

#endif _CSnake

//CSnake.cpp
#include&lt;iostream&gt;
#include&lt;stdlib.h&gt;
#include&lt;time.h&gt;

#include &quot;CSnake.h&quot;

CSnake::CSnake()//schlange startet imnmer von der selben position und das essen auch
{
  snake_x.push_back(10);
  snake_y.push_back(10);
  snake_x.push_back(10);
  snake_y.push_back(9);
  snake_x.push_back(10);
  snake_y.push_back(8);
  snake_x.push_back(10);
  snake_y.push_back(7);
  setCharToField(snake_x[0],snake_y[0]);
  setCharToField(snake_x[1],snake_y[1]);
  setCharToField(snake_x[2],snake_y[2]);
  setCharToField(snake_x[3], snake_y[3]);
  x_food = 2; y_food = 16;
  field[x_food][y_food] = 'O';
}

void CSnake::putInField()// fkt um den vektor immer ins feld auszugebene
{
  for(unsigned int i=0; i&lt;snake_x.size(); i++)
    {
      setCharToField(snake_x[i],snake_y[i]);
    }
}

int CSnake::snake_food_check()
{
  if(snake_x[0] == x_food &amp;&amp; snake_y[0] == y_food)//da der kopf nur isst wird nach jeder bewegung überprüft oder der kopf(mund) schon gegessen hat 
    return 1;//1 für die abfrage später in move.cpp
  return 0;
}

void CSnake::new_food()//hier neues essen gesetzt werden
{
   int x=x_food; int y=y_food;//abspeichern der alten food daten, da gleich in while solange geändert wird bis was anderes rauskommt 
   srand(time(NULL));//um das essen rnd zu verteilen
   while(field[x_food][y_food] != ' ')//hier nur reinkomemn wenn auf dem feld schon was anderes steht 
   {
     x_food=x; y_food=y;//da ja x und y neue daten hattem im 2-ten bzw n-ten durchgang 
     while(x==x_food)//solange bis die x coord neu ist und nicht alt 
     {
       x_food = rand()% 18+1;//hier wird x_food neu gesetzt
     }
     while(y==y_food)//hier wird y neugesetzt
     {
       y_food = rand()% 18+1;
     }
   }
   field[x_food][y_food] = 'O';//und wenn ein neuer geigneter ort gefunden dann das essen setzen
}

//CMove.h
#include &quot;CSnake.h&quot;
#ifndef _CMove
#define _CMove

class CMove:public CSnake 
{
private:
  char direction;//um die letzte Taste Taste zu speicher(w,a,s,d) um die schlange automatisch in diese rihctug laufen zu lassen, wenn nichts gedrueckt wird
  int metFood;
public:
  CMove();//nur membervariablen gesetzt
  virtual ~CMove(){};
  void move(const char input);//wenn eine taste gedrueckt
  void default_move();//schlange von alleine
};

#endif _CMove

//CMove.cpp
#include &quot;CMove.h&quot;
#include&lt;iostream&gt;
#include&lt;conio.h&gt;
#include&lt;Windows.h&gt;

using namespace std;

CMove::CMove()
{
  direction = ' ';
  metFood=0;
}

void CMove::move(const char input)
{
  direction = input;//damit wenn wir in die auto move kommen, wissen in welche richtung
  metFood = snake_food_check();//checken ob gegessen
  deleteOldChar(snake_x[snake_x.size()-1], snake_y[snake_y.size()-1]);//altes zeichen immer löschen
  if(metFood == 1)//wenn gegessen
    {
      snake_x.push_back(snake_x[snake_x.size()-1]);//dann wird die Schlange verlaengert
      snake_y.push_back(snake_y[snake_y.size()-1]);
      new_food();//und neues essen gesetzt
    }
  for(unsigned int i=1; i&lt;snake_x.size(); i++)
  {    
    snake_x[snake_x.size()-i] = snake_x[snake_x.size()-i-1];
    snake_y[snake_y.size()-i] = snake_y[snake_y.size()-i-1];   
  }//hier wird der hintere teil ohne kopf auf den nächsten teil gesetzt(schlange fortbewegung)

  if(direction == 'w')
  {
    if(field[snake_x[0]-1][snake_y[0&rsqb;&rsqb; == '*' || field[snake_x[0]-1][snake_y[0&rsqb;&rsqb; == '#')//kollision überprüfen
    {
      std::cout &lt;&lt; &quot;Leider Verloren&quot; &lt;&lt; endl;
      Sleep(20000);
      exit(0);
    }
    snake_x[0] = snake_x[0]-1;//ansonsten den kopf in die richtige richtung lenken; die nächsten teile genauso
  }
  else if(direction == 's')
  {
    if(field[snake_x[0]+1][snake_y[0&rsqb;&rsqb; == '*' || field[snake_x[0]+1][snake_y[0&rsqb;&rsqb; == '#')
    {
      std::cout &lt;&lt; &quot;Leider Verloren&quot; &lt;&lt; endl;
      Sleep(20000);
      exit(0);
    }
    snake_x[0] = snake_x[0]+1;
  }
  else if (direction == 'a')
  {
    if(field[snake_x[0&rsqb;&rsqb;[snake_y[0]-1] == '*' || field[snake_x[0&rsqb;&rsqb;[snake_y[0]-1] == '#')
    {
      std::cout &lt;&lt; &quot;Leider Verloren&quot; &lt;&lt; endl;
      Sleep(200);
      exit(0);
    }
    snake_y[0] = snake_y[0]-1;
  }
  else if(direction == 'd')
  {
    if(field[snake_x[0&rsqb;&rsqb;[snake_y[0]+1] == '*' || field[snake_x[0&rsqb;&rsqb;[snake_y[0]+1] == '#')
    {
      std::cout &lt;&lt; &quot;Leider Verloren&quot; &lt;&lt; endl;
      Sleep(20000);
      exit(0);
    }
    snake_y[0] = snake_y[0]+1;
  }
  putInField();//neue schlange in das feld setzen
}

void CMove::default_move()//hier damit die schlange auto läuft
{
  metFood = snake_food_check();//gegessen?
  deleteOldChar(snake_x[snake_x.size()-1], snake_y[snake_y.size()-1]);//schlange darf nichts liegen lassen;)
  if(metFood == 1)
    {
      snake_x.push_back(snake_x[snake_x.size()-1]);
      snake_y.push_back(snake_y[snake_y.size()-1]);
      new_food();//gleiche wie oben ob
    }
  for(unsigned int i=1; i&lt;snake_x.size(); i++)
  {
    snake_x[snake_x.size()-i] = snake_x[snake_x.size()-i-1];
    snake_y[snake_y.size()-i] = snake_y[snake_y.size()-i-1];
  }//hinterer teil bewegt

  if(direction == ' ')
  {//am anfang ist direction mit ' ' definiert(konstruktur), und wenn nichts gedrueckt wird dann hierrein 
    if(field[snake_x[0&rsqb;&rsqb;[snake_y[0]+1] == '*' || field[snake_x[0&rsqb;&rsqb;[snake_y[0]+1] == '#')//kollision
    {
      std::cout &lt;&lt; &quot;Leider Verloren&quot; &lt;&lt; endl;
      Sleep(20000);
      exit(0);
    }
    snake_y[0] = snake_y[0]+1;
  }
  else if(direction == 'w')
  {
    if(field[snake_x[0]-1][snake_y[0&rsqb;&rsqb; == '*' || field[snake_x[0]-1][snake_y[0&rsqb;&rsqb; == '#')
    {
      std::cout &lt;&lt; &quot;Leider Verloren&quot; &lt;&lt; endl;
      Sleep(20000);
      exit(0);
    }
    snake_x[0] = snake_x[0]-1;
  }
  else if(direction == 's')
  {
    if(field[snake_x[0]+1][snake_y[0&rsqb;&rsqb; == '*' || field[snake_x[0]+1][snake_y[0]-1] == '#' )
    {
      std::cout &lt;&lt; &quot;Leider Verloren&quot; &lt;&lt; endl;
      Sleep(20000);
      exit(0);
    }
    snake_x[0] = snake_x[0]+1;
  }
  else if (direction == 'a')
  {
    if(field[snake_x[0&rsqb;&rsqb;[snake_y[0]-1] == '*' || field[snake_x[0&rsqb;&rsqb;[snake_y[0]-1] == '#')
    {
      std::cout &lt;&lt; &quot;Leider Verloren&quot; &lt;&lt; endl;
      Sleep(20000);
      exit(0);
    }
    snake_y[0] = snake_y[0]-1;
  }
  else if(direction == 'd')
  {
    if(field[snake_x[0&rsqb;&rsqb;[snake_y[0]+1] == '*' || field[snake_x[0&rsqb;&rsqb;[snake_y[0]+1] == '#')
    {
      std::cout &lt;&lt; &quot;Leider Verloren&quot; &lt;&lt; endl;
      Sleep(20000);
      exit(0);
    }
    snake_y[0] = snake_y[0]+1;
  }
  putInField();
}
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/2334025</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2334025</guid><dc:creator><![CDATA[Aknayirp]]></dc:creator><pubDate>Mon, 24 Jun 2013 18:01:12 GMT</pubDate></item><item><title><![CDATA[Reply to Snake:D on Mon, 24 Jun 2013 18:02:07 GMT]]></title><description><![CDATA[<p>Du hast die &quot;ein Wurstbrot ist ein Supermarkt&quot;-Krankheit. Hast du Bücher von Jürgen Wolf gelesen?</p>
<p>Falls dir der Begriff nichts sagt: Total vermurkstes Design durch Missbrauch von Vererbung.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2334027</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2334027</guid><dc:creator><![CDATA[SeppJ]]></dc:creator><pubDate>Mon, 24 Jun 2013 18:02:07 GMT</pubDate></item><item><title><![CDATA[Reply to Snake:D on Mon, 24 Jun 2013 18:17:11 GMT]]></title><description><![CDATA[<p>Wie dus besser machen kannst:<br />
Eine Klasse map, die verwaltet die Map.<br />
Darauf agiert eine Klasse snake.<br />
Und gewöhn dir bitte dieses C davor ab, das ist einfach nur... blöd.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2334031</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2334031</guid><dc:creator><![CDATA[Nathan]]></dc:creator><pubDate>Mon, 24 Jun 2013 18:17:11 GMT</pubDate></item><item><title><![CDATA[Reply to Snake:D on Mon, 24 Jun 2013 18:41:53 GMT]]></title><description><![CDATA[<p>SeppJ schrieb:</p>
<blockquote>
<p>Du hast die &quot;ein Wurstbrot ist ein Supermarkt&quot;-Krankheit. Hast du Bücher von Jürgen Wolf gelesen?</p>
<p>Falls dir der Begriff nichts sagt: Total vermurkstes Design durch Missbrauch von Vererbung.</p>
</blockquote>
<p>Ja, das dachte ich mir. Jürgen Wolf sagt mir nichts...(jetzt nachm google, ja ich habe mal mit galileo computing mir c etwas näher gebracht, für die Uni)<br />
Was hätte ich denn anders machen sollen. Also ich weiß da gibt es bestimmt viel. Aber durch die Vererbung schien mir das alles relativ einfach zu sein.<br />
Hätte ich das mit der Vererbung lieber sein lassen und einfach Schnittstellen erstellt?<br />
Ich will es halt besser machen, deshalb bitte etwas konkreter, wenns geht <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f603.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--grinning_face_with_big_eyes"
      title=":D"
      alt="😃"
    /><br />
Dankeschön!</p>
<blockquote>
<p>Wie dus besser machen kannst:<br />
Eine Klasse map, die verwaltet die Map.<br />
Darauf agiert eine Klasse snake.<br />
Und gewöhn dir bitte dieses C davor ab, das ist einfach nur... blöd.</p>
</blockquote>
<p>Also das mit dem C hab ich nur von der Uni, dachte es sei sinvoll...<br />
Wenn du sagst, verwaltet die Map, dann macht sie alles von wegen Crash oder das Essen usw.? Darauf agiert eine Klasse Snake, im Sinne von einer Vererbung?</p>
<p>EDIT: Meint ich sollte es nochmal machen, aber diesmal versuchen es besser zu machen, oder lieber an ein anderes Projekt wagen?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2334038</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2334038</guid><dc:creator><![CDATA[Aknayirp]]></dc:creator><pubDate>Mon, 24 Jun 2013 18:41:53 GMT</pubDate></item><item><title><![CDATA[Reply to Snake:D on Mon, 24 Jun 2013 18:45:20 GMT]]></title><description><![CDATA[<p>Aknayirp schrieb:</p>
<blockquote>
<blockquote>
<p>Wie dus besser machen kannst:<br />
Eine Klasse map, die verwaltet die Map.<br />
Darauf agiert eine Klasse snake.<br />
Und gewöhn dir bitte dieses C davor ab, das ist einfach nur... blöd.</p>
</blockquote>
<p>Also das mit dem C hab ich nur von der Uni, dachte es sei sinvoll...<br />
Wenn du sagst, verwaltet die Map, dann macht sie alles von wegen Crash oder das Essen usw.? Darauf agiert eine Klasse Snake, im Sinne von einer Vererbung?</p>
</blockquote>
<p>Nein, nicht mit einer Vererbung. Eine Vererbung steht für eine ist-ein Beziehung.<br />
Ist Snake eine Map? Nein.<br />
Ich geb dir mal ein denkbares Interface vor, dann verstehst du vielleicht wie ich das meine:</p>
<pre><code>class map
{
public:
    // Konstruktoren...

    void update(); // updated die Map, indem dort Essen und so hinzugefügt werden
    void draw(); // zeichnet die Map auf dem Bildschirm
};

class snake
{
public:
    // Konstruktoren

    void update(map &amp;m); // nimmt die Map als Referenz, d.h. veränderbar
                         // setzt an den Positionen der Schlange die Tiles entsprechend, checkt Kollision, etc.
};

int main()
{
    map m;
    snake s;

    while (!game_over)
    {
        m.update();
        s.update(m);
        m.draw();
    }
}
</code></pre>
<p>Ist natürlich noch ausbaufähig.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2334041</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2334041</guid><dc:creator><![CDATA[Nathan]]></dc:creator><pubDate>Mon, 24 Jun 2013 18:45:20 GMT</pubDate></item><item><title><![CDATA[Reply to Snake:D on Mon, 24 Jun 2013 18:54:14 GMT]]></title><description><![CDATA[<pre><code>Eine Vererbung steht für eine ist-ein Beziehung. 
Ist Snake eine Map? Nein.
</code></pre>
<p>Jaaa richtig. So hatte ich das auch gelernt, aber hab das heute wohl verdrängt. Aber macht natürlich Sinn.<br />
Du hast es jetzt hier &quot;void update(map &amp;m)&quot; gesetzt, damit beim Snake update auch Zugriff auf die Klasse map hast? Wenn ja, worauf hast du dann alles Zugriff?</p>
<p>Vielen Dank für die Hilfe <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f44d.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--thumbs_up"
      title=":+1:"
      alt="👍"
    /><br />
MfG<br />
Aknayirp</p>
<p>EDIT: Noch ne ganz andere Frage: Wenn ich Snake.exe aufm Laptop starte(hab es auch hier drauf geschrieben), dann ist das Spiel langsam und aufm Rechner viel schneller. Woran kann das liegen?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2334044</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2334044</guid><dc:creator><![CDATA[Aknayirp]]></dc:creator><pubDate>Mon, 24 Jun 2013 18:54:14 GMT</pubDate></item><item><title><![CDATA[Reply to Snake:D on Mon, 24 Jun 2013 18:55:07 GMT]]></title><description><![CDATA[<p>Auf alles public.<br />
Deshalb wären vielleicht noch Funktionen angebracht wie:<br />
get_tile_at() bzw. set_tile_at(), damit die Snake auch sich reinzeichnen, bzw. die Früchte abfragen kann.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2334045</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2334045</guid><dc:creator><![CDATA[Nathan]]></dc:creator><pubDate>Mon, 24 Jun 2013 18:55:07 GMT</pubDate></item><item><title><![CDATA[Reply to Snake:D on Mon, 24 Jun 2013 19:01:39 GMT]]></title><description><![CDATA[<p>Nathan schrieb:</p>
<blockquote>
<p>Auf alles public.<br />
Deshalb wären vielleicht noch Funktionen angebracht wie:<br />
get_tile_at() bzw. set_tile_at(), damit die Snake auch sich reinzeichnen, bzw. die Früchte abfragen kann.</p>
</blockquote>
<p>Alles klar, danke. Ich denke dann versuche ich mich sobald ich kann, an eine bessere Version ran. Aber bin froh es überhaupt geschafft zu haben:D<br />
P.S: Im letzten Post hatte ich im EDIT eine wichtige Frage gestellen, wäre toll wenn da einer was zu sagen könnte.</p>
<p>MfG<br />
Aknayirp</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2334047</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2334047</guid><dc:creator><![CDATA[Aknayirp]]></dc:creator><pubDate>Mon, 24 Jun 2013 19:01:39 GMT</pubDate></item><item><title><![CDATA[Reply to Snake:D on Mon, 24 Jun 2013 19:04:35 GMT]]></title><description><![CDATA[<p>Liegt vermutlich am system(&quot;cls&quot;), ist scheiße lahm.<br />
Siehe: <a href="http://support.microsoft.com/kb/99261/de" rel="nofollow">http://support.microsoft.com/kb/99261/de</a> für Alternativen.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2334050</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2334050</guid><dc:creator><![CDATA[Nathan]]></dc:creator><pubDate>Mon, 24 Jun 2013 19:04:35 GMT</pubDate></item><item><title><![CDATA[Reply to Snake:D on Mon, 24 Jun 2013 19:58:04 GMT]]></title><description><![CDATA[<p>Nathan schrieb:</p>
<blockquote>
<p>Liegt vermutlich am system(&quot;cls&quot;), ist scheiße lahm.<br />
Siehe: <a href="http://support.microsoft.com/kb/99261/de" rel="nofollow">http://support.microsoft.com/kb/99261/de</a> für Alternativen.</p>
</blockquote>
<p>Also auf der Seite gibt es nur eine andere Funktion die man benutzen kann, aber kann ich die einfach so einsetzen? Und was muss ich denn<br />
&quot;void cls( HANDLE hConsole )&quot; für &quot;HANDLE hConsole&quot; einsetzen, wenn ich die Fkt. aufrufe?</p>
<p>EDIT: Hab eine andere Funktion im I-Net gefunden, mit der es gut funktioniert:<br />
<a href="http://www.cplusplus.com/articles/4z18T05o/#Windows" rel="nofollow">http://www.cplusplus.com/articles/4z18T05o/#Windows</a></p>
<p>EDIT2: Lag wirklich am system(&quot;cls&quot;)!</p>
<p>EDIT3: Frage: Habe hier im Programm oft in Memberfkt, andere Memberfkt aufgerufen, ist das so üblich? Oder ist das schlechter Programmierstil?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2334051</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2334051</guid><dc:creator><![CDATA[Aknayirp]]></dc:creator><pubDate>Mon, 24 Jun 2013 19:58:04 GMT</pubDate></item><item><title><![CDATA[Reply to Snake:D on Mon, 24 Jun 2013 20:30:38 GMT]]></title><description><![CDATA[<p>Aknayirp schrieb:</p>
<blockquote>
<p>EDIT3: Frage: Habe hier im Programm oft in Memberfkt, andere Memberfkt aufgerufen, ist das so üblich? Oder ist das schlechter Programmierstil?</p>
</blockquote>
<p>Völlig ok und üblich.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2334072</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2334072</guid><dc:creator><![CDATA[nwp3]]></dc:creator><pubDate>Mon, 24 Jun 2013 20:30:38 GMT</pubDate></item><item><title><![CDATA[Reply to Snake:D on Mon, 24 Jun 2013 20:32:28 GMT]]></title><description><![CDATA[<p>nwp3 schrieb:</p>
<blockquote>
<p>Aknayirp schrieb:</p>
<blockquote>
<p>EDIT3: Frage: Habe hier im Programm oft in Memberfkt, andere Memberfkt aufgerufen, ist das so üblich? Oder ist das schlechter Programmierstil?</p>
</blockquote>
<p>Völlig ok und üblich.</p>
</blockquote>
<p>Cool, thx <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f603.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--grinning_face_with_big_eyes"
      title=":D"
      alt="😃"
    /></p>
]]></description><link>https://www.c-plusplus.net/forum/post/2334075</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2334075</guid><dc:creator><![CDATA[Aknayirp]]></dc:creator><pubDate>Mon, 24 Jun 2013 20:32:28 GMT</pubDate></item></channel></rss>