variablenname aus variable



  • hi, wie kann ich eine variable ansprechen, deren name in einer variablen gespeichert ist? also zb

    string var = "newvar";
    int newvar[2];
    newvar[1]=5;
    cout << var[1];
    

    lässt sich das irgendwie realisieren?

    [ Dieser Beitrag wurde am 03.04.2003 um 15:16 Uhr von Prophet editiert. ]



  • nein



  • Geht nicht. Braucht man nicht. Sag mal wie du es verwenden würdest, wir zeigen dir ne gute Alternative.



  • meinst du so was?

    #include "stdafx.h"
    #include <map>
    #include <string>
    #include <iostream>
    
    int main(int argc, char* argv[])
    {
        std::map< std::string, int > theMap;
        std::string str ="newvar";
        theMap[str]=10;
        std::cout << theMap["newvar"] << std::endl;
        std::cout <<theMap[str] << std::endl;
        return 0;
    }
    


  • Meinst du so wie in PHP?



  • also ich wollte mit einem kumpel machen, dass jeder eine schachKI entwickeln und ich bin grad dabei die engine dafür zu basteln. Ich wolltes so machen, wenn weiss am zug ist und der bauer soll bewegt werden dann sollte es so aussehen:

    variable_für_farbe.bauer[zahl von bauer]

    damit ich nicht für jede figur und farbe ne fallunterscheidung hacken muss... aber wenn jemand noch ne alternative hat, währ ich ihm sehr verbunden. ich guck mir auch mal den codeschnipsen an, thx codewalker

    PS php code ich nicht, also ich weiss nich, obs da sowas gibt

    [ Dieser Beitrag wurde am 03.04.2003 um 15:15 Uhr von Prophet editiert. ]

    [ Dieser Beitrag wurde am 03.04.2003 um 15:20 Uhr von Prophet editiert. ]



  • variable_für_farbe.bauer[zahl von bauer]

    damit ich nicht für jede figur und farbe ne fallunterscheidung hacken muss...

    Tut mir leid ich schnall es nicht 😕 .
    Wenn du nen vernünftiges Klassendesign hast sollte es eigentlich nicht nötig sein für jede Figur alles neu zu programmieren.
    Vielleicht ne abstrakte Basisklasse Figur und dann für jede Figur ne spezialisierte Klasse? Die Dame könnte z.B. vom Turm und dem Läufer erben.
    Das grössere Problem sehe ich in der KI.Wie möchtest du denn deine aktuelle Stellung bewerten(interessehalber,keine Kritik)?
    Warum du nen String als Variablenbezeichner benutzen möchtest kapier ich trotzdem nicht so ganz.Ist ja nicht so dass "überraschend" noch nen paar Figuren auftauchen 😉

    MfG Spacelord

    [ Dieser Beitrag wurde am 03.04.2003 um 18:47 Uhr von Spacelord editiert. ]



  • Und die Map kann tatsächlich nicht helfen?



  • Vieleicht solltest du das einfach mit nem pointer machen.



  • hi!
    also ich habe eine struct erstellt:

    struct figuren{
    bauer[8];
    springer[2];
    ...
    }
    figuren weiss;
    figuren schwarz;
    

    verstehst du jetzt die variablenbezeichnung, Spacelord?
    schien mir für den anfang das naheliegenste. Aber langsam kommt mir der gedanke, das nochmal über den haufen zu werfen.
    so, die map funktion hilft mir weiter, ich hattes mir erst nach dem post angeguckt, und war noch nicht dazugekommen, zu antworten.
    So mit der auswertung der stellung, etc...
    Also ich wollte erstmal die engine Programmieren, und die so erstellen, dass man mit allen sprachen die Figuren steuern kann, also über ne auslagerungsdatei, etc. So könnte die KI zb die Positionen ger gegnerischen Figuren abfragen, oder sie sich gleich merken, und dann entsprechende züge vorhersagen: zb dame könnte von turm geschlagen werden, also rücke dame weg.
    Aber ein Konzept für ne KI hab ich noch nicht, das folgt später... erstmal sollte die Engine per hand eingabe funktionieren.
    So, da 2 KIs und nicht KI gegen Humanbeing antreten sollen, (ich find es einfach mal interessant sowas zu programmieren, und das verhalten zu analysieren) muss die KI ja nicht gleich menschenwürdig sein.
    String als variablenbezeichner, warum?
    kurzes Beispiel

    while (a == true)
    {
    variable_für_farbe = weiss;
    cout << "zug eingeben"; //zb: b a2 a3
    cin >> zug_variable; 
    //danach 1. buchstaben rausfiltern
    //und dann weiterarbeiten mit
    //variable_für_farbe.variable_für_ersten_buchstaben_von_zug_variable
    }
    

    ist einfacher, als wenn ich ne swich funktion mit cases von weiss bis schwarz und dann nochmal mi den einzelnen Figürchen mache 🙂

    Also nen schönen Sonnigen Tag noch...



  • Also sei mir nicht bös,aber ich finde für C++ hört sich dass irgendwie unsauber an.
    Ich würde wie gesagt so vorgehen dass ich ausgehend von einer abstrakten Basisklasse Figur für jeden Figurentyp eine Klasse ableiten würde,die dann die Zugmöglichkeiten der jeweiligen Figur enthält,so eine Art Priorität der Figur(irgendwie muss man ja deutlich machen dass eine Dame(meistens)wichtiger als ein Bauer ist,einen boolschen Wert ob die Figur bedroht ist und einen boolschen Wert ob die Figur von einer anderen gedeckt wird.Für das Schachbrett würde ich ebenfalls eine Klasse anlegen,ausgehend von einr Basisklasse Feld die auch den Status des Feldes(leer,oder besezt von Figur XY,bedroht von den Figuren x,y,...) enthält.Im Konstruktor der Schachbrettklasse würde ich dann die Felder mit der Ausgangsstellung initialisieren.Jetzt "weiss" das Schachbrett doch jederzeit welche Figur auf welchem Feld steht und kann anhand der Figurenklasse prüfen ob der gewünschte Zug erlaubt ist und diesen ausführen.
    Ist nur so nen ganz grober Ansatz.
    Ich denke du wirst später arge Probleme bekommen,ohne den Status der Felder und der Figuren etc.,eine KI auf die Beine zu stellen.

    MfG Spacelord 🙂



  • hey spacelord!
    Also es sind viele gute vorschläge drinn, wobei ich mir einiges anlesen muss. Aber den status der figuren müssen dann die KIs schon selber verwalten... das überlass ich jeder KI selber. Die "engine" die ich auf die Beine stellen will, sollte nur in erster Linie zur kommunikation der Beiden KIs dienen und zusätzlich zur überwachung, das auch alle züge erlaubt sind, und evtl zur visualisierung in form einer ordentlichen zugtabelle, mehr nicht. Und mit dem unsauber magst du recht haben, aber ich hab seit ca einem Jahr nicht mehr "intensiv" C++ gehackt, und da bin ich etwas aus der übung, bzw bin noch auf einem niedigen entwicklungslevel. 🙂
    aber danke erstmal, ich werd gucken, was und wie ich es umsetze.



  • enum { schwarz, weiß, nfarbe } farbe;
    enum { bauer, turm, springer, laeufer, dame, koenig, nfigur } figur;
    position figuren[nfarbe][nfigur][8];
    

    das bisschen overhead für die unbenutzten felder is glaub nich nennenswert



  • Original erstellt von Mr. N:
    **```cpp
    enum { schwarz, weiß, nfarbe } farbe;
    enum { bauer, turm, springer, laeufer, dame, koenig, nfigur } figur;
    position figuren[nfarbe][nfigur][8];

    Hmm, Dein König heißt "koenig" und weiß heißt "weiß"? Nenn es lieber "weisz"! 😉
    Ganz verstehe ich den Code auch nicht, Schach hat keine 2*6*8 Spielfiguren, oder? Die würden doch gar nicht auf ein 8*8-Spielbrett passen!



  • Original erstellt von nman:
    Ganz verstehe ich den Code auch nicht, Schach hat keine 2*6*8 Spielfiguren, oder? Die würden doch gar nicht auf ein 8*8-Spielbrett passen![/QB]

    Er hat ja auch gesagt, dass der Overhead für die unbenutzten Felder nicht nennenswert ist, er hat also schon beachtet dass das Feld zu groß ist.



  • Ich finde die Lösung trotzdem ziemlich unlogisch/ hässlich, wenn Prophets Framework auch überprüfen soll dass die Züge korrekt ablaufen wäre IMO eine Figurenklasse von der die einzelnen Figuren abgeleitet werden das klügste, so dass man dann auch so etwas machen könnte (Pseudocode):

    try
    {
        Figur.ziehe(x, y);
    }
    catch(ungueltigerZug)
    {
        std::cout << "Der Zug von (" << Figur.getX() << ", " << Figur.getY << ") nach ("
                x << ", " << y << ") ist nicht erlaubt, moegliche Alternativen:";
        Figur.zeigeZuege();
    }
    

    edit: Prophet, Deine Lösung ist (bis auf die std::map-Geschichte die ich einfach nicht so ganz verstehe) nicht so schlimm, sie sieht einfach ziemlich stark nach strukturierter Programmierung und nicht nach objektorientierter aus, entscheide Du selbst was Du machen möchtest.

    [ Dieser Beitrag wurde am 06.04.2003 um 01:27 Uhr von nman editiert. ]



  • ok, nochmal zu der map...
    ich versuchs nochmal deutlich zu machen(stützt sich auf die vorherigen zeilen):
    ein zug sollte so ablaufen:

    farbe_am_zug = "weiss";
    cin >> eingabe; //eingabe ist zb b a2 a4
    //ohne die map funktion viele fallunterscheidungen:
    if (farbe_am_zug = "weiss")
    {
    swich(1._zeichen_des_eingegebenen_strings) //hier "b" für bauer
    {
    case "b" {...};
    cace "k" {...};
    };
    else
    {...};
    // gekürzt währe das(mithilfe der struktur von figuren):
    farbe_am_zug.1_zeichen_der_eingabe[evtl_noch_arraynummer] = a4;
    

    so hab ich alles in einer zeile ohne lästige fallunterscheidungen.
    oder bin ich so umständlich dass ich den einfachen weg nicht sehe?

    PS sorry, wenn ich frage, aber warum ist oop besser als strukturiertes und wie sieht oop aus?



  • Für ein Schachprogramm sollte man aber eine effiziente Lösung wählen, z.B.

    enum Figur {SBauer=-6, STurm=-5, SSpringer=-4, SLaeufer=-3, SDame=-2, SKoenig=-1, Leer=0, WKoenig=1, ...};
    typedef Figur[8][8] Schachbrett;
    


  • hi! also das mit der enum funktion ist ne gute idee, aber ich verstehe nicht ganz warum ein mehrdimensionales array aus den schachfiguren, die nur 32 sind als schachbrett definiert werden, welches natürlich 8*8 felder hat, aber mit den figuren doch erstmal nix zutun-;



  • aber ich verstehe nicht ganz warum ein mehrdimensionales array aus den schachfiguren, die nur 32 sind als schachbrett definiert werden, welches natürlich 8*8 felder hat, aber mit den figuren doch erstmal nix zutun-;

    Nein, aber das ist ja wohl das Einzige, wofür du Figuren verwenden wirst: Um sie auf ein Brett zu setzen.


Anmelden zum Antworten