<?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[Konzeptfrage(Arrays, struct...?)]]></title><description><![CDATA[<p>Hallo, ich habe da eine Konzeptfrage...</p>
<p>ich habe ein kleines Spiel mit Charaktern(einfache Konsolenanwendung). Nun soll es auch Attacken geben, die benutzt werden können.</p>
<p>Ich habe 15 Attacken. Jede Attacke ist etwa so aufgebaut:</p>
<pre><code class="language-cpp">struct Attack    //liegt im Header
{
    string name;    //Name der Attacke
    short index;    //Index
    short damage;   //Schaden
    short type;     //Typ - noch nicht so wichtig...
};
</code></pre>
<p>Ich muss jetzt in einer externen Datei alle Attacken und ihre Variablendefinitionen unterbringen. Auf die Variablen soll nur zugegriffen werden, sie werden nur ein mal initialisiert und danach nicht mehr verändert.</p>
<p>Ich hab es mit struct und folgender externen Datei gelöst:</p>
<pre><code class="language-cpp">Attack At1;
{
    At1.name = &quot;Schubser&quot;;
    At1.index = 1;
    At1.damage = 10;
}

Attack At1;
{
    At1.name = &quot;Schlagen&quot;;
    At1.index = 2;
    At1.damage = 50;
}
</code></pre>
<p>Wichtig noch: Die verschiedenen Attacken sollten sich durch ihren Index identifizieren können. D.h. wenn Charakter1 die Attacke 1 bekommt, soll auch gleichzeitig der Rest der Werte erhältlich sein. Also sowas wie:</p>
<pre><code class="language-cpp">attackiere(att[1]) ; Fügt 10 Schaden hinzu
attackiere(att[2]) ; Fügt 50 Schaden hinzu

//...

void attackiere(short index)
{
    meinSchaden = index.damage
}
</code></pre>
<p>Wie würde man so etwas elegant lösen? Und bin ich mit struct auf der richtigen Spur? Ich benötige einfach nur Ideen, es braucht keiner fertigen Code zu posten...</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/240804/konzeptfrage-arrays-struct</link><generator>RSS for Node</generator><lastBuildDate>Mon, 21 Sep 2026 19:05:42 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/240804.rss" rel="self" type="application/rss+xml"/><pubDate>Mon, 11 May 2009 19:52:34 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to Konzeptfrage(Arrays, struct...?) on Mon, 11 May 2009 19:52:34 GMT]]></title><description><![CDATA[<p>Hallo, ich habe da eine Konzeptfrage...</p>
<p>ich habe ein kleines Spiel mit Charaktern(einfache Konsolenanwendung). Nun soll es auch Attacken geben, die benutzt werden können.</p>
<p>Ich habe 15 Attacken. Jede Attacke ist etwa so aufgebaut:</p>
<pre><code class="language-cpp">struct Attack    //liegt im Header
{
    string name;    //Name der Attacke
    short index;    //Index
    short damage;   //Schaden
    short type;     //Typ - noch nicht so wichtig...
};
</code></pre>
<p>Ich muss jetzt in einer externen Datei alle Attacken und ihre Variablendefinitionen unterbringen. Auf die Variablen soll nur zugegriffen werden, sie werden nur ein mal initialisiert und danach nicht mehr verändert.</p>
<p>Ich hab es mit struct und folgender externen Datei gelöst:</p>
<pre><code class="language-cpp">Attack At1;
{
    At1.name = &quot;Schubser&quot;;
    At1.index = 1;
    At1.damage = 10;
}

Attack At1;
{
    At1.name = &quot;Schlagen&quot;;
    At1.index = 2;
    At1.damage = 50;
}
</code></pre>
<p>Wichtig noch: Die verschiedenen Attacken sollten sich durch ihren Index identifizieren können. D.h. wenn Charakter1 die Attacke 1 bekommt, soll auch gleichzeitig der Rest der Werte erhältlich sein. Also sowas wie:</p>
<pre><code class="language-cpp">attackiere(att[1]) ; Fügt 10 Schaden hinzu
attackiere(att[2]) ; Fügt 50 Schaden hinzu

//...

void attackiere(short index)
{
    meinSchaden = index.damage
}
</code></pre>
<p>Wie würde man so etwas elegant lösen? Und bin ich mit struct auf der richtigen Spur? Ich benötige einfach nur Ideen, es braucht keiner fertigen Code zu posten...</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1709179</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1709179</guid><dc:creator><![CDATA[B0b0]]></dc:creator><pubDate>Mon, 11 May 2009 19:52:34 GMT</pubDate></item><item><title><![CDATA[Reply to Konzeptfrage(Arrays, struct...?) on Mon, 11 May 2009 20:27:00 GMT]]></title><description><![CDATA[<p>ich würde den index an sich nicht mit in dem struct speichern - hat ja nix mit der attacke an sich zu tun, wie man sie auswählt!?</p>
<p>des weiteren finde ich short nich gerade gut gewählt... (ich würde int nehmen, weil durch alignment etc eh 4byte verbraucht werden und man nix gekonnt hat - schneller ist es auch nicht - es sei denn, du programmierst für 16bit plattformen ^^)<br />
ich würd es eigtl irgendwie in die richtung lösen:</p>
<pre><code class="language-cpp">namespace attack_type
{
 enum T
 {
  normal,
  magic //usw
 }
}

struct Attack
{
private:
    std::string name; //evtl auch const, oder willst du das später ändern können? von 'schubser' in 'großer schubser' oder so...
    unsigned int damage;
    attack_type::T type;
public:
    Attack(const std::string &amp;_name, unsigned int _damage, attack_type::T _type) : name(_name), damage(_damage), type(_type) {}

    attack_type::T GetType() const {return type;}
    unsigned int GetDamage() const {return damage;}
    const std::string&amp; GetName() const {return name;}
};
</code></pre>
<p>die werte würde ich in ne *.txt datei oder so speichern (möglichst nicht binär, da du dir so vieles verbaust bzw unnötig schwerer machst) - also solltest du noch die operatoren &gt;&gt; und &lt;&lt; überladen</p>
<p>speicherung würde ich ein std::set nehmen - also würdest du noch ein paar vergleichsoperatoren brauchen...</p>
<p>wenns aber eh nur 15 attacken sind und die nicht gerade 1mal pro millisekunde durchsucht werden, würde es auch ein std::vector tun - weils bei 15 nicht darauf ankommt, ob die Suchdauer logarithmisch oder linear ist...</p>
<p>falls du viele attacken hast, die gleich heißen, bräuchtest du doch wieder nen index oder so...<br />
allerdings würde ich dann nur nen const char* als name speichern, der nur auf den jeweiligen namen zeigt... in etwa so:</p>
<pre><code class="language-cpp">const char*[] attacken_v = {&quot;eins&quot;, &quot;zwei&quot;, &quot;drei&quot;, &quot;vier&quot;};
const size_t attacken_c = sizeof(attacken_v) / sizeof(attacken_v[0]);

const char* GetAttackNamePtr(const std::string &amp;val)
{
 for(size_t i(0); i != attacken_c; ++i)
 {
  if (std::string(attacken_v[i]) == val)
    return attacken_v;
 }
 throw std::invalid_argument (&quot;GetAttackNamePtr&quot;);
}
</code></pre>
<p>Fällt aber vermutlich unter frühzeitige Optimierung, da das eigtl Design davon nicht wirklich betroffen wäre...<br />
Außerdem würde ich auch die Werte wieder in ner *.txt-Datei speichern und am Anfang auslesen - also hat man auch nicht mehr das hässliche C-Array sondern nen std::vector...<br />
Allg. geht das sehr viel schöner zu lösen, aber es sollen ja auch alles nur Ansätze sein ^^</p>
<p>bb</p>
<p>PS:</p>
<pre><code class="language-cpp">void attackiere(const Attack&amp; att)
{
 unsigned int dmg = att.GetDamage();
//...
}
</code></pre>
<p>aber du müsstest der Fkt vermutlich noch ein Ziel übergeben <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f61b.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--face_with_tongue"
      title=":-P"
      alt="😛"
    /></p>
]]></description><link>https://www.c-plusplus.net/forum/post/1709187</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1709187</guid><dc:creator><![CDATA[unskilled]]></dc:creator><pubDate>Mon, 11 May 2009 20:27:00 GMT</pubDate></item><item><title><![CDATA[Reply to Konzeptfrage(Arrays, struct...?) on Tue, 12 May 2009 16:14:07 GMT]]></title><description><![CDATA[<p>Eine kurze Frage: Was sind diese &quot;:&quot; nach den Funktionsdeklarationen?</p>
<pre><code class="language-cpp">Attack(const std::string &amp;_name, unsigned int _damage, attack_type::T _type)
    : name(_name), damage(_damage), type(_type) {}   //und diese Variablendeklarationen?

    attack_type::T GetType() const {return type;}
    unsigned int GetDamage() const {return damage;}
    const std::string&amp; GetName() const {return name;}
};
</code></pre>
<p>Und auf was bezieht sich das const?</p>
<pre><code class="language-cpp">unsigned int GetDamage() const {return damage;}
const unsigned int GetDamage() {return damage;}   // Ist das nicht das Gleiche?
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/1709508</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1709508</guid><dc:creator><![CDATA[Noobi]]></dc:creator><pubDate>Tue, 12 May 2009 16:14:07 GMT</pubDate></item><item><title><![CDATA[Reply to Konzeptfrage(Arrays, struct...?) on Tue, 12 May 2009 16:27:37 GMT]]></title><description><![CDATA[<p>1. Initialisierungsliste</p>
<p>2. Nein:</p>
<pre><code class="language-cpp">unsigned int GetDamage() const //diese funktion ist eine konstante member-fkt - sie darf das objekt nicht verändern - ob sie aufgerufen wird oder nicht (bzw wie oft), spielt keine rolle
{
//wenn du das hier auskommentierst, wirst du einen compiler-fehler bekommen:
//  damage = 3;

  return damage;
}

const unsigned int GetDamage() {return damage;} //dieses const bezieht sich auf den rückgabe-typen - da der allerdings kopiert wird, ist das ziemlich egal, ob der const ist oder nicht ^^
</code></pre>
<p>bb</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1709512</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1709512</guid><dc:creator><![CDATA[unskilled]]></dc:creator><pubDate>Tue, 12 May 2009 16:27:37 GMT</pubDate></item></channel></rss>