Du bist nicht angemeldet.

Werbeanzeige

Helmut

5x Contest-Sieger

  • »Helmut« ist der Autor dieses Themas

Beiträge: 691

Wohnort: Bielefeld

  • Private Nachricht senden

31

16.02.2015, 15:13

(Ich glaube aber eh nicht, dass ich gute Chancen hätte, da ich von KI wirklich keinen Schimmer habe.)

Ich erinner mich noch bei meinem ersten Spiel, dass ich extrem Schiss davor hatte, mit der KI zu beginnen. Aber letztlich war's erstaunlich einfach. Man muss sich nicht mit fremden APIs herumschlagen, der Code ist zentral, leicht zu separieren und man kann sich auf das eigentliche Problem konzentrieren.

Zitat

Und was passiert eigentlich bei 0:0 Unentschieden? Sollte vielleicht derjenige gewinnen, der weniger Rechenzeit verbraucht hat?

Dann bleibt der Teilnehmer Champion, der es auch vorher war. Das dürfte aber nur passieren, wenn beide KIs über 200% Rechenzeit benutzen oder die KIs identisch sind.

Zitat

Und ist es Absicht, dass die Angsthase-KI nie springt?

Ja, ich wollte die so einfach wie möglich halten.
Sei stets geduldig gegenüber Leuten, die nicht mit dir übereinstimmen. Sie haben ein Recht auf ihren Standpunkt - trotz ihrer lächerlichen Meinung. (F. Hollaender)

DeKugelschieber

Community-Fossil

Beiträge: 2 629

Wohnort: Rheda-Wiedenbrück

Beruf: Software-Entwickler

  • Private Nachricht senden

32

16.02.2015, 15:40

Ich bin heute Abend auch dabei :)
Gerade hier schon mal den Code angeguckt, sieht sehr übersichtlich aus und die erste iteration der KI muss ja kein Einstein werden ;)
MfG Marvin

domin

1x Contest-Sieger

  • Private Nachricht senden

33

16.02.2015, 22:03

Sind denn Gleitkommazahlen nun eigentlich komplett verboten oder wie muss ich den Kommentar zur "isqrt"-Methode verstehen?

C-/C++-Quelltext

1
2
//Sämtliche Spiellogik läuft mit ganzen Zahlen, da floating point Zahlen
//nicht immer und überall ganz definiert sind


Ansonsten sieht das Ganze schon sehr solide aus, werde auch mal mein Glück versuchen :)
Meine Projekte:
LightBulb, TurtleRun

Helmut

5x Contest-Sieger

  • »Helmut« ist der Autor dieses Themas

Beiträge: 691

Wohnort: Bielefeld

  • Private Nachricht senden

34

16.02.2015, 22:49

Der Kommentar soll nur verständlich machen, warum da eine sqrt Funktion mit Integerparametern ist:) float und double sind verboten, weil ich vermute, dass unterschiedliche Compiler unterschiedliche Ergebnisse mit Fließkommazahlen liefern würden.
Sei stets geduldig gegenüber Leuten, die nicht mit dir übereinstimmen. Sie haben ein Recht auf ihren Standpunkt - trotz ihrer lächerlichen Meinung. (F. Hollaender)

LetsGo

Alter Hase

Beiträge: 1 434

Beruf: Software Engineer

  • Private Nachricht senden

35

16.02.2015, 23:31

Erstaunlich finde ich ja, dass der simple Ansatz vom Angsthase schon so gut funktioniert.

Zitat von »Chad Fowlder«

Leider hat die Software-Branche viele flache Spezialisten hervorgebracht, die die Bezeichnung Spezialist nur als Entschuldigung dafür verwenden, nur eine Sache zu kennen.

KeksX

Community-Fossil

  • Private Nachricht senden

36

17.02.2015, 11:02

Naja, er versucht ja nur nicht zu verlieren. Ihn zu schlagen war das geringste Problem. Ich habe eher Angst und Bamme wenn ich daran denke, womit ihr kommen werdet!

Wird echt spannend, bin gespannt auf die erste Runde :)
WIP Website: kevinheese.de

Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von »KeksX« (17.02.2015, 11:14)


DeKugelschieber

Community-Fossil

Beiträge: 2 629

Wohnort: Rheda-Wiedenbrück

Beruf: Software-Entwickler

  • Private Nachricht senden

37

17.02.2015, 11:32

Mir geht CodeLite etwas auf die nerven, der akzeptiert keine [] bei mir ^^
Ich packs heute mal in eclipse, ist ja wurst da ich nur die Klasse senden muss.
MfG Marvin

TGGC

1x Rätselkönig

Beiträge: 1 657

Beruf: Software Entwickler

  • Private Nachricht senden

38

17.02.2015, 14:57

Leider funktioniert bei mir irgendwas nicht korekkt und es zeigt alle Prozentzahlen (CPU, LS und Std) als 0% an. Wenns erlaubt ist, wuerde ich mal kurz einen Beispielcode zeigen nur um zu wissen, ob man so ueberhaupt vorgehen darf.

Helmut

5x Contest-Sieger

  • »Helmut« ist der Autor dieses Themas

Beiträge: 691

Wohnort: Bielefeld

  • Private Nachricht senden

39

17.02.2015, 15:33

Also bei der Beispiel KI ist das mit den 0% normal, weil sie so wenig berechnet. Du kannst hier gerne Code posten, kannst mir aber auch was per PM schicken wenn du willst.
Sei stets geduldig gegenüber Leuten, die nicht mit dir übereinstimmen. Sie haben ein Recht auf ihren Standpunkt - trotz ihrer lächerlichen Meinung. (F. Hollaender)

TGGC

1x Rätselkönig

Beiträge: 1 657

Beruf: Software Entwickler

  • Private Nachricht senden

40

17.02.2015, 15:41

Also meine Idee ginge in folgende Richtung. Ist nur ein Ansatz, theoretisch liesse sich das beliebig weit treiben. Die Frage ist halt, ob sowas akzeptabel ist, weil ich glaube man kann so jede single Threaded KI schlagen, wenn man sie 1:1 kopiert.

C-/C++-Quelltext

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
GameState StateBuffer[2];
volatile int ReadableState = -1;
volatile int ReadingState = -1;
volatile int BestNextMove[2] = {0, 0};
volatile int Calculated = 0;

void* ThreadedKI(void*)
{
    const int Tests = 5;
    int TestStep = 250;
    int KeyCombos[Tests] =
    {
        K_Right,
        K_Jump | K_Right,
        K_Jump,
        K_Left,
        K_Jump | K_Left,
    };
    GameState gsCur;
    GameState gsPre[Tests];
    int TestScores[Tests];
    int LastRead = 0;
    while (true)
    {
        if(ReadableState != -1)
        {
            ReadingState = ReadableState;

            gsCur = StateBuffer[ReadableState];
            LastRead = ReadableState;

            ReadingState = -1;
            ReadableState = -1;
            for(int i = 0; i < Tests; ++i)
            {
                gsPre[i] = gsCur;
                TestScores[i] = 0;
            }
        }
        for(int i = 0; i < Tests; ++i)
        {
            for(int j = 0; j < TestStep; ++j)
            {
                gsPre[i].Move(KeyCombos[i], 0, true);
            }
            TestScores[i] = gsPre[i].Players[0].Score - gsPre[i].Players[1].Score;
        }

        int BestScore = TestScores[0];
        int Next = 0;
        for(int i = 1; i < Tests; ++i)
        {
            if (BestScore < TestScores[i])
            {
                Next = i;
                BestScore = TestScores[i];
            }
        }
        if(ReadableState == -1)
        {
            BestNextMove[LastRead] = KeyCombos[Next];
            Calculated++;
        }
        while (Calculated > 0)
        {
            Next++;
        }
    }

    return 0;
}

class MyNicknameKI : public KI
{
public:
    MyNicknameKI()
    {
        Reset();
        BeginThread(ThreadedKI);
    }
    virtual const char* GetKIName() const
    {
        return "TGGC_Threaddemo";
    }
    virtual void Reset()
    {
        m_WriteState = 0;
    }
    virtual int CalculateNextStep(const GameState& GS)
    {
        while (Calculated < 1)
        {
            LittleNap();
        }
        int Next = BestNextMove[m_WriteState];
        m_WriteState = 1 - m_WriteState; 
        while (m_WriteState == ReadingState)
        {
            m_WriteState = 1 - m_WriteState; 
        }
        StateBuffer[m_WriteState] = GS;
        ReadableState = m_WriteState;
        Calculated = 0;
        return Next;
    }
    int m_WriteState;
};

Werbeanzeige

Ähnliche Themen