<?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[Zufalls Funktion?]]></title><description><![CDATA[<p>Hi,</p>
<p>ich hab zwei fragen:<br />
1. Gibt es ne Funktion mit er ich eine zufällige Zahl generieren kann?</p>
<p>2. Ich arbeite an nem Spiel: &quot;UBoot Jagd&quot; und ein Schiff zufällig umherfahren lassen hat einer ne Idee?</p>
<p>Hie die Klassen dafür:</p>
<p>ship.h:</p>
<pre><code class="language-cpp">#ifndef SHIP_H
#define SHIP_H

#include &quot;Koord.h&quot;
#include &quot;Torpedo.h&quot;

class ship                                    // Klasse ship, die Klassen UBoot
{                                             // und Enemy leiten sich von ihr
  public:                                     // ab.
  ship();
  virtual ~ship();

  virtual int GetRichtung() const;
  virtual int GetXKoord() const;
  virtual int GetYKoord() const;
  virtual void SetKoord(int, int);
  virtual void SetRichtung(int);

  virtual void Move(int);
  virtual void Shoot(int, int, int);
  virtual void TorpLaden() = 0;
  virtual int CheckTorpedo() const;
  virtual void SetTorp(int x);

  protected:
  int itsRichtung;
  Koord itsKoord;
  Torpedo* itsTorp[25];
};

#endif
</code></pre>
<p>ship.cpp:</p>
<pre><code class="language-cpp">#include &quot;defs.h&quot;
#include &quot;Koord.h&quot;
#include &quot;ship.h&quot;

ship::ship()
{}

ship::~ship()
{}

int ship::GetRichtung() const
{
  return itsRichtung;
}

int ship::GetXKoord() const
{
  return itsKoord.GetX();
}

int ship::GetYKoord() const
{
  return itsKoord.GetY();
}

void ship::SetKoord(int x, int y)
{
  itsKoord.SetX(x);
  itsKoord.SetY(y);
}

void ship::SetRichtung(int richtung)
{
  itsRichtung = richtung;
}

void ship::Move(int i)
{
  int x = itsKoord.GetX();
  int y = itsKoord.GetY();
  switch(itsRichtung)
  {
    case NORDEN:
    {
      y = y + i;
      itsKoord.SetY(y);
      break;
    }

    case SUEDEN:
    {
      y = y - i;
      itsKoord.SetY(y);
      break;
    }

    case WESTEN:
    {
      x = x - i;
      itsKoord.SetX(x);
      break;
    }

    case OSTEN:
    {
      x = x + i;
      itsKoord.SetX(x);
      break;
    }
  }
}

void ship::Shoot(int richtung, int x, int y)
{
  int i = CheckTorpedo();
  itsTorp[i]-&gt;SetRichtung(richtung);
  itsTorp[i]-&gt;SetZiel(x, y);
}

int ship::CheckTorpedo() const               // Funktion zur überprüfung welcher
{                                            // Torpedo der erste nicht
  int i;                                     // abgefeuerte Torpedo ist.
  for(i = 0; i &lt; 25; i++)
  {
    if (itsTorp[i] != 0)
    {
      break;
    }
  }
  return i;
}

void ship::SetTorp(int x)
{
  delete itsTorp[x];
  itsTorp[x] = 0;
}
</code></pre>
<p>Enemy.h:</p>
<pre><code class="language-cpp">#ifndef ENEMY_H
#define ENEMY_H

#include &quot;ship.h&quot;
#include &quot;State.h&quot;
#include &quot;WasserBombe.h&quot;

class Enemy : public ship
{
  public:
  Enemy();
  Enemy(int, int);
  ~Enemy();

  void BombeLaden();
  int CheckBombe() const;
  void ShootBombe();
  void TorpLaden();

  void Reagiere(UBoot&amp;);
  void ChangeState(State*);
  int GetPlayer(UBoot&amp;) const;
  void SearchPlayer();// &lt;------------------- Da soll das umherfahren rein

  private:
  State * CurrentState;
  WasserBombe * itsBomben[30];
};

#endif
</code></pre>
<p>Enemy.cpp:</p>
<pre><code class="language-cpp">#include &lt;iostream&gt;

#include &quot;defs.h&quot;
#include &quot;State.h&quot;
#include &quot;StatePlayerUnknown.h&quot;
#include &quot;Torpedo.h&quot;
#include &quot;WasserBombe.h&quot;
#include &quot;Enemy.h&quot;
#include &quot;UBoot.h&quot;

Enemy::Enemy()
{
  CurrentState = new State_PlayerUnknown;

  for (int i = 0; i &lt; 25; i++)
  {
    itsTorp[i] = new Torpedo;
  }

  for (int i = 0; i &lt; 30; i++)
  {
    itsBomben[i] = new WasserBombe;
  }
}

Enemy::Enemy(int x, int y)
{
  itsKoord.SetX(x);
  itsKoord.SetY(y);

  CurrentState = new State_PlayerUnknown;

  for (int i = 0; i &lt; 25; i++)
  {
    itsTorp[i] = new Torpedo;
  }

  for (int i = 0; i &lt; 30; i++)
  {
    itsBomben[i] = new WasserBombe;
  }
}

Enemy::~Enemy()
{}

int Enemy::CheckBombe() const
{
  int i;
  for(i = 0; i &lt; 25; i++)
  {
    if (itsBomben[i] != 0)
    {
      break;
    }
  }
  return i;
}

void Enemy::ShootBombe()
{

}

void Enemy::BombeLaden()
{
  for (int i = 0; i &lt; 30; i++)
  {
    itsBomben[i] = new WasserBombe;
  }
}

void Enemy::TorpLaden()
{
  for (int i = 0; i &lt; 25; i++)
  {
    itsTorp[i] = new Torpedo;
  }
}

void Enemy::Reagiere(UBoot&amp; player)
{
  CurrentState-&gt;Execute(this, player);
}

void Enemy::ChangeState(State * newState)
{
  delete CurrentState;
  CurrentState = newState;
}

int Enemy::GetPlayer(UBoot &amp; player) const
{
  int x = player.GetXKoord();
  int y = player.GetYKoord();
  int itsX = itsKoord.GetX();
  int itsY = itsKoord.GetY();

  //***********************************
  if(itsX &gt; x)
  {
    if(itsX - x &gt; 3)
    {
      return UNBEKANNT;
    }
  }
  if(itsX &lt; x)
  {
    if(x - itsX &gt; 3)
    {
      return UNBEKANNT;
    }
  }                             // Auserhalb des Erfassungsbereichs
  if(itsY &gt; y)
  {
    if(itsY - y &gt; 3)
    {
      return UNBEKANNT;
    }
  }
  if(itsY &lt; y)
  {
    if(y - itsY &gt; 3)
    {
      return UNBEKANNT;
    }
  }
  //*************************************

    if(itsX == x &amp;&amp; itsY == y)
    {
      return GEFUNDEN;
    }

    if(itsX == x)
    {
      if(y &gt; itsY)
      {
        return NORDEN;
      }
      if(y &lt; itsY)
      {
        return SUEDEN;
      }
    }

    if(itsY == y)
    {
      if(x &gt; itsX)
      {
        return OSTEN;
      }
      if(x &lt; itsX)
      {
        return WESTEN;
      }
    }

    if(y &gt; itsY)
    {
      return NORDEN;
    }
    if(y &lt; itsY)
    {
      return SUEDEN;
    }

}

void Enemy::SearchPlayer()
{
  //&lt;------------------------------ Hier das umherfahren
}
</code></pre>
<p>defs.h:</p>
<pre><code class="language-cpp">#ifndef DEFS_H
#define DEFS_H

#define NORDEN    0
#define WESTEN    1
#define OSTEN     2
#define SUEDEN    3
#define UNBEKANNT 4
#define GEFUNDEN  5

#endif
</code></pre>
<p>Wie ich das schiff bewege könnt ihr in der Move Funktion von ship sehen.</p>
<p>Mfg Yazoo</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/203619/zufalls-funktion</link><generator>RSS for Node</generator><lastBuildDate>Thu, 08 Oct 2026 01:54:54 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/203619.rss" rel="self" type="application/rss+xml"/><pubDate>Thu, 24 Jan 2008 15:02:44 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to Zufalls Funktion? on Thu, 24 Jan 2008 15:05:39 GMT]]></title><description><![CDATA[<p>Hi,</p>
<p>ich hab zwei fragen:<br />
1. Gibt es ne Funktion mit er ich eine zufällige Zahl generieren kann?</p>
<p>2. Ich arbeite an nem Spiel: &quot;UBoot Jagd&quot; und ein Schiff zufällig umherfahren lassen hat einer ne Idee?</p>
<p>Hie die Klassen dafür:</p>
<p>ship.h:</p>
<pre><code class="language-cpp">#ifndef SHIP_H
#define SHIP_H

#include &quot;Koord.h&quot;
#include &quot;Torpedo.h&quot;

class ship                                    // Klasse ship, die Klassen UBoot
{                                             // und Enemy leiten sich von ihr
  public:                                     // ab.
  ship();
  virtual ~ship();

  virtual int GetRichtung() const;
  virtual int GetXKoord() const;
  virtual int GetYKoord() const;
  virtual void SetKoord(int, int);
  virtual void SetRichtung(int);

  virtual void Move(int);
  virtual void Shoot(int, int, int);
  virtual void TorpLaden() = 0;
  virtual int CheckTorpedo() const;
  virtual void SetTorp(int x);

  protected:
  int itsRichtung;
  Koord itsKoord;
  Torpedo* itsTorp[25];
};

#endif
</code></pre>
<p>ship.cpp:</p>
<pre><code class="language-cpp">#include &quot;defs.h&quot;
#include &quot;Koord.h&quot;
#include &quot;ship.h&quot;

ship::ship()
{}

ship::~ship()
{}

int ship::GetRichtung() const
{
  return itsRichtung;
}

int ship::GetXKoord() const
{
  return itsKoord.GetX();
}

int ship::GetYKoord() const
{
  return itsKoord.GetY();
}

void ship::SetKoord(int x, int y)
{
  itsKoord.SetX(x);
  itsKoord.SetY(y);
}

void ship::SetRichtung(int richtung)
{
  itsRichtung = richtung;
}

void ship::Move(int i)
{
  int x = itsKoord.GetX();
  int y = itsKoord.GetY();
  switch(itsRichtung)
  {
    case NORDEN:
    {
      y = y + i;
      itsKoord.SetY(y);
      break;
    }

    case SUEDEN:
    {
      y = y - i;
      itsKoord.SetY(y);
      break;
    }

    case WESTEN:
    {
      x = x - i;
      itsKoord.SetX(x);
      break;
    }

    case OSTEN:
    {
      x = x + i;
      itsKoord.SetX(x);
      break;
    }
  }
}

void ship::Shoot(int richtung, int x, int y)
{
  int i = CheckTorpedo();
  itsTorp[i]-&gt;SetRichtung(richtung);
  itsTorp[i]-&gt;SetZiel(x, y);
}

int ship::CheckTorpedo() const               // Funktion zur überprüfung welcher
{                                            // Torpedo der erste nicht
  int i;                                     // abgefeuerte Torpedo ist.
  for(i = 0; i &lt; 25; i++)
  {
    if (itsTorp[i] != 0)
    {
      break;
    }
  }
  return i;
}

void ship::SetTorp(int x)
{
  delete itsTorp[x];
  itsTorp[x] = 0;
}
</code></pre>
<p>Enemy.h:</p>
<pre><code class="language-cpp">#ifndef ENEMY_H
#define ENEMY_H

#include &quot;ship.h&quot;
#include &quot;State.h&quot;
#include &quot;WasserBombe.h&quot;

class Enemy : public ship
{
  public:
  Enemy();
  Enemy(int, int);
  ~Enemy();

  void BombeLaden();
  int CheckBombe() const;
  void ShootBombe();
  void TorpLaden();

  void Reagiere(UBoot&amp;);
  void ChangeState(State*);
  int GetPlayer(UBoot&amp;) const;
  void SearchPlayer();// &lt;------------------- Da soll das umherfahren rein

  private:
  State * CurrentState;
  WasserBombe * itsBomben[30];
};

#endif
</code></pre>
<p>Enemy.cpp:</p>
<pre><code class="language-cpp">#include &lt;iostream&gt;

#include &quot;defs.h&quot;
#include &quot;State.h&quot;
#include &quot;StatePlayerUnknown.h&quot;
#include &quot;Torpedo.h&quot;
#include &quot;WasserBombe.h&quot;
#include &quot;Enemy.h&quot;
#include &quot;UBoot.h&quot;

Enemy::Enemy()
{
  CurrentState = new State_PlayerUnknown;

  for (int i = 0; i &lt; 25; i++)
  {
    itsTorp[i] = new Torpedo;
  }

  for (int i = 0; i &lt; 30; i++)
  {
    itsBomben[i] = new WasserBombe;
  }
}

Enemy::Enemy(int x, int y)
{
  itsKoord.SetX(x);
  itsKoord.SetY(y);

  CurrentState = new State_PlayerUnknown;

  for (int i = 0; i &lt; 25; i++)
  {
    itsTorp[i] = new Torpedo;
  }

  for (int i = 0; i &lt; 30; i++)
  {
    itsBomben[i] = new WasserBombe;
  }
}

Enemy::~Enemy()
{}

int Enemy::CheckBombe() const
{
  int i;
  for(i = 0; i &lt; 25; i++)
  {
    if (itsBomben[i] != 0)
    {
      break;
    }
  }
  return i;
}

void Enemy::ShootBombe()
{

}

void Enemy::BombeLaden()
{
  for (int i = 0; i &lt; 30; i++)
  {
    itsBomben[i] = new WasserBombe;
  }
}

void Enemy::TorpLaden()
{
  for (int i = 0; i &lt; 25; i++)
  {
    itsTorp[i] = new Torpedo;
  }
}

void Enemy::Reagiere(UBoot&amp; player)
{
  CurrentState-&gt;Execute(this, player);
}

void Enemy::ChangeState(State * newState)
{
  delete CurrentState;
  CurrentState = newState;
}

int Enemy::GetPlayer(UBoot &amp; player) const
{
  int x = player.GetXKoord();
  int y = player.GetYKoord();
  int itsX = itsKoord.GetX();
  int itsY = itsKoord.GetY();

  //***********************************
  if(itsX &gt; x)
  {
    if(itsX - x &gt; 3)
    {
      return UNBEKANNT;
    }
  }
  if(itsX &lt; x)
  {
    if(x - itsX &gt; 3)
    {
      return UNBEKANNT;
    }
  }                             // Auserhalb des Erfassungsbereichs
  if(itsY &gt; y)
  {
    if(itsY - y &gt; 3)
    {
      return UNBEKANNT;
    }
  }
  if(itsY &lt; y)
  {
    if(y - itsY &gt; 3)
    {
      return UNBEKANNT;
    }
  }
  //*************************************

    if(itsX == x &amp;&amp; itsY == y)
    {
      return GEFUNDEN;
    }

    if(itsX == x)
    {
      if(y &gt; itsY)
      {
        return NORDEN;
      }
      if(y &lt; itsY)
      {
        return SUEDEN;
      }
    }

    if(itsY == y)
    {
      if(x &gt; itsX)
      {
        return OSTEN;
      }
      if(x &lt; itsX)
      {
        return WESTEN;
      }
    }

    if(y &gt; itsY)
    {
      return NORDEN;
    }
    if(y &lt; itsY)
    {
      return SUEDEN;
    }

}

void Enemy::SearchPlayer()
{
  //&lt;------------------------------ Hier das umherfahren
}
</code></pre>
<p>defs.h:</p>
<pre><code class="language-cpp">#ifndef DEFS_H
#define DEFS_H

#define NORDEN    0
#define WESTEN    1
#define OSTEN     2
#define SUEDEN    3
#define UNBEKANNT 4
#define GEFUNDEN  5

#endif
</code></pre>
<p>Wie ich das schiff bewege könnt ihr in der Move Funktion von ship sehen.</p>
<p>Mfg Yazoo</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1442849</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1442849</guid><dc:creator><![CDATA[Yazoo]]></dc:creator><pubDate>Thu, 24 Jan 2008 15:05:39 GMT</pubDate></item><item><title><![CDATA[Reply to Zufalls Funktion? on Thu, 24 Jan 2008 15:08:11 GMT]]></title><description><![CDATA[<ol>
<li>
<p>Ja, gibt es - nennt sich rand() (und Erklärungen/Hinweise zum Umgang damit solltest du im Web mehr als genug finden)</p>
</li>
<li>
<p>Ich glaube kaum, daß sich jemand die Mühe machen wird, diesen Wust durchzuarbeiten. Im wesentlichen mußt du nur zufällige SetRichtung() und Move() Aufrufe aneinanderreihen und angemessen auf &quot;Feindkontakt&quot; reagieren.</p>
</li>
</ol>
]]></description><link>https://www.c-plusplus.net/forum/post/1442853</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1442853</guid><dc:creator><![CDATA[CStoll]]></dc:creator><pubDate>Thu, 24 Jan 2008 15:08:11 GMT</pubDate></item><item><title><![CDATA[Reply to Zufalls Funktion? on Thu, 24 Jan 2008 15:09:01 GMT]]></title><description><![CDATA[<p>Die Funktion std::rand() liefert die einen zufälligen Wert zwischen 0 und RAND_MAX,<br />
sie ist in cstdlib definiert (#incude &lt;cstdlib&gt;). Initalisieren tust du den Zufallsgenerator mit der Funktion std::srand().<br />
Beispiele findest du im entsprechenden Artikel im Magazin.<br />
<a href="http://magazin.c-plusplus.net/artikel/Zuf%E4lle%20gibt%60sFragezeichenAusrufezeichen" rel="nofollow">http://magazin.c-plusplus.net/artikel/Zuf�lle gibt`sFragezeichenAusrufezeichen</a></p>
]]></description><link>https://www.c-plusplus.net/forum/post/1442855</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1442855</guid><dc:creator><![CDATA[Mario Sandler]]></dc:creator><pubDate>Thu, 24 Jan 2008 15:09:01 GMT</pubDate></item><item><title><![CDATA[Reply to Zufalls Funktion? on Thu, 24 Jan 2008 15:10:28 GMT]]></title><description><![CDATA[<p>das mit zufälligem SetRichtung() sollte sich mit rand() machen lassen, da die Richtung als int gespeichert wird, oder?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1442856</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1442856</guid><dc:creator><![CDATA[Yazoo]]></dc:creator><pubDate>Thu, 24 Jan 2008 15:10:28 GMT</pubDate></item><item><title><![CDATA[Reply to Zufalls Funktion? on Thu, 24 Jan 2008 15:36:10 GMT]]></title><description><![CDATA[<p>ich würde dir trotzdem ein enum empfehlen, ist schönerer Stil imho <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>
]]></description><link>https://www.c-plusplus.net/forum/post/1442874</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1442874</guid><dc:creator><![CDATA[hey]]></dc:creator><pubDate>Thu, 24 Jan 2008 15:36:10 GMT</pubDate></item><item><title><![CDATA[Reply to Zufalls Funktion? on Thu, 24 Jan 2008 21:56:44 GMT]]></title><description><![CDATA[<p>Hallo Yazoo,</p>
<p>bevor ich zu dem 'Umherfahren' komme - benutzte bitte die Vektor- bzw. Positionsklasse Koord um die Positionen und Richtungen zu beschreiben. Dann wird alles einfacher übersichtlicher und viiiel kürzer. Ich hoffe, sie kann das, sonst siehe Listing von 'class Vec' weiter unten. Ebenso solltest Du die Richtung als Vektor auffassen. Also</p>
<pre><code class="language-cpp">class ship 
{ 
public:
  // ..
  Koord GetPos() const { return itsKoord; }
protected:
  // ..
  Koord itsRichtung;
  Koord itsKoord;
</code></pre>
<p>Dann vereinfacht sich das Move zu</p>
<pre><code class="language-cpp">void ship::Move( const Koord&amp; dir )
{
    itsKoord += dir;
    itsRichtung = dir;
}
</code></pre>
<p>und das Enemy::GetPlayer</p>
<pre><code class="language-cpp">int Enemy::GetPlayer( const UBoot&amp; player ) const
{
  const Koord to_player = player.GetPos() - itsKoord;
  if( abs( to_player ) &gt; 3 )  // siehe class Vec
  {
    // Auserhalb des Erfassungsbereichs
    return UNBEKANNT;
  }
  if( to_player == Koord() ) // to_player = (0,0)
  {
      return GEFUNDEN;
  }
  // usw. - ggf. gibt es hier auch einen allgemeinen Code, wenn
  // die Schnittstelle geändert wird - z.B. einfach:
  return to_player / abs( to_player ); // mit der Richtung zurück
}
</code></pre>
<p>Jetzt zum zufälligen Verfahren. Ich benutzt dazu eine <a href="http://www.c-plusplus.net/forum/viewtopic-var-t-is-169319-and-postdays-is-0-and-postorder-is-asc-and-highlight-is-perlen-and-start-is-4.html" rel="nofollow">Zufall-Klasse aus einem anderen Thread</a>. Das Schiff soll so fahren, dass es öfter geradeaus fährt, als die Richtung wechselt. Das erreicht man z.B. so:</p>
<pre><code class="language-cpp">void Enemy::SearchPlayer()
{
  //&lt;------------------------------ Hier das umherfahren
  const int N = 3; // grosses N, oft geradeaus, kleines N oft Kurswechsel
  Zufall&lt; int &gt; z( -N, N+1 ); // liefert Werte im Intervall [-N,N+1[ = [-N,N]
  for(;;) // Schleife über alle Schritte
  {
    move( itsRichtung.turn( z() / N ) ); // Z()/N liefert -1,0,1
    // neue Position erreicht
    // .. 
  }
}
</code></pre>
<p>das war's eigentlich schon. Hier noch das Listing von 'class Vec':</p>
<pre><code class="language-cpp">#include &lt;algorithm&gt;
#include &lt;cmath&gt;
#include &lt;iostream&gt;

// --   eine ganz einfache Vektor- bzw. Positionsklasse
class Vec
{
public:
    Vec() : m_x(0), m_y(0) {}
    Vec( int x, int y ) : m_x(x), m_y(y) {}

    Vec&amp; operator+=( const Vec&amp; b )
    {
        m_x += b.m_x; m_y += b.m_y;
        return *this;
    }
    Vec&amp; operator-=( const Vec&amp; b )
    {
        m_x -= b.m_x; m_y -= b.m_y;
        return *this;
    }

    bool operator==( const Vec&amp; b ) const
    {
        return m_x == b.m_x &amp;&amp; m_y == b.m_y;
    }

    // --   Betrag ist hier der maximale Abstand in einer Richtung
    friend int abs( const Vec&amp; v )
    {
        return std::max( std::abs( v.m_x ), std::abs( v.m_y ) );
    }

    // --   gedrehten Vektor bestimmen: 
    //      dir &gt; 0: links, dir = 0: gerade; dir &lt; 0: rechts
    Vec turn( int dir ) const
    {
        if( dir &gt; 0 )   // drehen nach links
            return Vec( -m_y, m_x );
        if( dir &lt; 0 )   // drehen nach rechts
            return Vec( m_y, -m_x );
        return *this;   // geradeaus = nicht drehen
    }

    // --   Ausgabe
    friend std::ostream&amp; operator&lt;&lt;( std::ostream&amp; out, const Vec&amp; v )
    {
        return out &lt;&lt; v.m_x &lt;&lt; &quot; &quot; &lt;&lt; v.m_y;
    }
    // --   Getters (bitte sparsam benutzen!)
    friend int X( const Vec&amp; Vec ) { return Vec.m_x; }
    friend int Y( const Vec&amp; Vec ) { return Vec.m_y; }

private:
    int m_x, m_y;
};

Vec operator+( Vec a, const Vec&amp; b )
{
    return a += b;
}
Vec operator-( Vec a, const Vec&amp; b )
{
    return a -= b;
}
bool operator!=( const Vec&amp; a, const Vec&amp; b )
{
    return !(a == b);
}
// und ggf.:
typedef Vec Koord;
</code></pre>
<p>Gruß<br />
Werner</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1443154</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1443154</guid><dc:creator><![CDATA[Werner Salomon]]></dc:creator><pubDate>Thu, 24 Jan 2008 21:56:44 GMT</pubDate></item><item><title><![CDATA[Reply to Zufalls Funktion? on Fri, 25 Jan 2008 05:58:50 GMT]]></title><description><![CDATA[<p>ehrlichgesagt ich habe nur die hälfte davon verstanden was Werner Salomon sagte, aber trozdem danke euch allen das ihr euch so viel mühe gemacht habt mir zu helfen.</p>
<p>Das Prob ist gelöst, aber es ist schon ein neues aufgetreten, seht euch meinen neuen thread an...</p>
<p>thx und cya</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1443215</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1443215</guid><dc:creator><![CDATA[Yazoo]]></dc:creator><pubDate>Fri, 25 Jan 2008 05:58:50 GMT</pubDate></item><item><title><![CDATA[Reply to Zufalls Funktion? on Fri, 25 Jan 2008 09:32:29 GMT]]></title><description><![CDATA[<p>Yazoo schrieb:</p>
<blockquote>
<p>ehrlichgesagt ich habe nur die hälfte davon verstanden was Werner Salomon sagte, ...</p>
</blockquote>
<p>Tue mir doch mal den Gefallen und sage mir, was Du genau nicht verstanden hast.</p>
<p>das wäre super<br />
Werner</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1443247</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1443247</guid><dc:creator><![CDATA[Werner Salomon]]></dc:creator><pubDate>Fri, 25 Jan 2008 09:32:29 GMT</pubDate></item><item><title><![CDATA[Reply to Zufalls Funktion? on Fri, 25 Jan 2008 14:13:40 GMT]]></title><description><![CDATA[<p>vor allen das mit dem turn() versteh ich nicht, also wie du genau die richtung speicherst und veränderst.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1443477</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1443477</guid><dc:creator><![CDATA[Yazoo]]></dc:creator><pubDate>Fri, 25 Jan 2008 14:13:40 GMT</pubDate></item><item><title><![CDATA[Reply to Zufalls Funktion? on Sat, 26 Jan 2008 11:47:55 GMT]]></title><description><![CDATA[<p>Yazoo schrieb:</p>
<blockquote>
<p>vor allen das mit dem turn() versteh ich nicht, also wie du genau die richtung speicherst und veränderst.</p>
</blockquote>
<p>Ok - da wäre ich gar nicht drauf gekommen, dass das ein Problem ist.</p>
<p>Zu Richtung speichern: die Richtung ist im Prinzip auch eine Koordinate - genaugenommen ein <a href="http://de.wikipedia.org/wiki/Vektor" rel="nofollow">Vektor</a> - aber eben keine Koordinate wie die des Schiffs, die sich ja auf einen globalen Ursprung bezieht, sondern die Richtung ist die Koordinate, die dort startet wo Dein Schiff sich gerade befindet.</p>
<p>Ich unterstelle jetzt mal, dass die x-Achse nach Osten (bzw. rechts) zeigt und Dein Koordinatensystem mathematisch positiv dreht, Dann wären die Himmelsrichtungen<br />
Osten = ( 1, 0) ein Schritt nach rechts<br />
Norden = ( 0, 1) ein Schritt nach oben<br />
Westen = (-1, 0) ein Schritt nach links<br />
Süden = ( 0,-1) ein Schritt nach unten</p>
<p>Bespiel: das Schiff befindet sich an Position (7,2) und die Richtung wäre Norden also (0,1), dann brauchst Du nur die beiden Koordinaten bzw. Vektoren addieren und das Schiff ist dann bei<br />
(7,2) + (0,1) = (7,3)<br />
im Programm ist das die Stelle</p>
<pre><code class="language-cpp">itsKoord += dir;
</code></pre>
<p>Der Vorteil dieser Methode - gegenüber dem mühseligen Abfragen (if(Norden) else if(Westen) usw.) - ist, dass die Richtung auch andere Werte z.B.20° annehmen kann. Ich unterstelle jetzt, dass 0° genau nach Osten also nach (1,0) zeigt. Dann ist:<br />
Richtung(20°) = (cos(20°); sin(20°)) = (0,940; 0,342)</p>
<p>Ein Turn nach links - also eine Drehung um 90° nach links - vertauscht einfach die Koordinaten und negiert den neuen x-Wert. Versuche es erst mit den Himmelsrichtungen<br />
aus Osten ( 1,0) wird (-0,1) = (0,1) also Norden<br />
aus Norden (0,1) wird (-1,0) als Westen usw.</p>
<p>Wäre das ein beliebiger Winkel w geht es genauso<br />
aus (cos(w), sin(w)) wird (cos(w+90°), sin(w+90°))<br />
schau Dir mal die <a href="http://de.wikipedia.org/wiki/Additionstheorem#Additionstheoreme" rel="nofollow">Additionstheoreme der Trigonometrie</a> an, so ist<br />
cos(w+90°) = cos(w)*cos(90°) - sin(w)*sin(90°) und<br />
sin(w+90°) = sin(w)*cos(90°) + cos(w)*sin(90°)</p>
<p>wenn man jetzt weiß, dass sin(90°)=1 und cos(90°)=0 ist, dann ergibt sich<br />
cos(w+90°) = -sin(w) und<br />
sin(w+90°) = cos(w)<br />
bzw. die neue Richtung<br />
(cos(w+90°), sin(w+90°)) = ( -sin(w), cos(w) )</p>
<p>Mit dem turn nach links also Drehung um -90° geht es entsprechend.</p>
<p>Gruß<br />
Werner</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1443932</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1443932</guid><dc:creator><![CDATA[Werner Salomon]]></dc:creator><pubDate>Sat, 26 Jan 2008 11:47:55 GMT</pubDate></item><item><title><![CDATA[Reply to Zufalls Funktion? on Sun, 27 Jan 2008 17:41:48 GMT]]></title><description><![CDATA[<p>ich habe das prob so gelöst:</p>
<pre><code class="language-cpp">void ship::Move(int i)
{
  double x = itsKoord.GetX();
  double y = itsKoord.GetY();

  x += std::sin(deg_to_rad(itsRichtung)) * i;
  y += std::cos(deg_to_rad(itsRichtung)) * i;

  itsKoord.SetAll(x, y);
}
</code></pre>
<p>itsRichtung ist int variable der klasse ship</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1444628</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1444628</guid><dc:creator><![CDATA[Yazoo]]></dc:creator><pubDate>Sun, 27 Jan 2008 17:41:48 GMT</pubDate></item></channel></rss>