Du bist nicht angemeldet.

Werbeanzeige

n0_0ne

1x Contest-Sieger

  • Private Nachricht senden

71

27.07.2009, 21:26

1:0?? schießt du immer nur 1 mal? ^^
oder kann keine KI so perfekt ausweichen? weil dann kann ich gleich aufgeben :D

Edit: woohooow, 400 posts :D

babelfish

Alter Hase

Beiträge: 1 225

Wohnort: Schweiz

Beruf: Informatiker

  • Private Nachricht senden

72

27.07.2009, 21:28

Vielen Dank an Helmut für den Contest. Ich glaube dass ich mich an diesen wagen könnte, auch wenn die Chancen schlecht stehen.

Nexxtron

Alter Hase

Beiträge: 424

Wohnort: Heilbronn

Beruf: Student - Software Engineering

  • Private Nachricht senden

73

27.07.2009, 23:23

nach den 5 min. stehts bei mir immer 1:0, also sie treffen sich die ganzen 5 min. nur einmal...und sonst weichen sie aus...aber so dolle is meine KI auch net... wahrscheinlich auch voll schlecht

meine KI beschleunigt immer und is dann voll schnell....
:lol:


Edit: hab grad was kleines verändert, und was passiert...die KI bleibt am Bildschirmrand stehen...schaut zur Sonne und beschleunigt :roll:
lol
New Project: Operation CityRacer

n0_0ne

1x Contest-Sieger

  • Private Nachricht senden

74

28.07.2009, 10:15

ich hab ein kleines mathematisches problem, und zwar will ich den winkel haben, zwischen meiner blickrichtung und dem gegner. ich versuch das hiermit:

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
virtual float GetAngleToEnemy(const GameState& GS, int Me, int You)
{
    float angle;
    // get vars

    float myAngle, youAngle, myxPos, myyPos, youxPos, youyPos;
    myxPos = GS.Players[Me].xPos;
    myyPos = GS.Players[Me].yPos;
    youxPos = GS.Players[You].xPos;
    youyPos = GS.Players[You].yPos;
    myAngle = GS.Players[Me].Angle;
    youAngle = GS.Players[You].Angle;

    // create normalized direction vector

    float myxDirection = sin(myAngle);
    float myyDirection = cos(myAngle);

    // move enemy vector into local coord-system and normalize

    youxPos -= myxPos;
    youyPos -= myyPos;
    Normalize(youxPos, youyPos);

    // get angle with dotprod

    angle = acos(myxDirection * youxPos + myyDirection * youyPos);

    return angle;
}


das funktioniert auch halbwegs, allerdings nicht ganz. er liefert mir schon passend einen wert zwischen 0 (ich schaue direkt drauf) und Pi (gegner ist genau hinter mir). wenn er jetzt aber links im 90° winkel neben mir ist, bekomme ich Pi/2. soweit sogut, das problem ist aber, dass er mir auch Pi/2 liefert, wenn er rechts im 90° winkel neben mir ist. und so kann ich nachtürlich nicht wissen, in welche richtung ich mich drehen muss, damit ich ihn ansehe. wie mache ich das?? hoffe ihr helft mir, auch wenns um die konkurrenz geht :D

Nexxtron

Alter Hase

Beiträge: 424

Wohnort: Heilbronn

Beruf: Student - Software Engineering

  • Private Nachricht senden

75

28.07.2009, 15:57

ich weiss nich ganz, aber das objekt könnte man doch relativ nehmen, dann hätte es den punkt (0,0) und das andere auch und den Punkt immer deiner Blickrichtung ausrichten dann könnte man doch einfach abfragen ob das andere Raumschiff kleiner oder größer als x = 0 ist.....war grad nur so ne überlegung...vllt. gehts auch einfacher
New Project: Operation CityRacer

n0_0ne

1x Contest-Sieger

  • Private Nachricht senden

76

28.07.2009, 16:23

ich hab absolut kein stück verstanden, wie du dir das vorstellst ^^

edit: hab weiter gegoogled, und durch ne kleine bemerkung da auf einmal verstanden was du gemeint hast ^^

C-/C++-Quelltext

1
2
3
4
if (myxPos > GS.Players[You].xPos)
    return angle;
else
    return 2*Pi-angle;

bringt jetzt das gewünschte ergebnis ;)
Danke :D

Edit2: oh man, nur in meinem testfall hat es zufälligerweise genau das richtige gemacht ^^ sieht jemand irgendwo einen fehler?

n0_0ne

1x Contest-Sieger

  • Private Nachricht senden

77

28.07.2009, 19:14

Wie auch immer, ich hab jetzt meine usprüngliche funktion genommen, und dann einfach wieder mit nem virtuellen GS getestet, ob der winkel mit K_Left oder K_Right kleiner werden würde.

Edit:

Zitat von »"Helmut"«

Hi,
@MMAnfänger
Es gibt natürlich kein Codezeilenlimit oder so. Man darf nur nicht vergessen, dass die KI für die 5 Minuten Spielzeit auch nur 5 CPU Zeitsekunden hat. Im Durchschnitt muss sie also in Echtzeit laufen. Danach wird die KI nicht mehr aufgerufen.

du meinst 5 zeitminuten, oder?

und nochmal zur auswertung, geht es darum, wer am ende die meisten punkte aus allen spielen hat, oder wer am ende gegen alle gewonnen hat, also eine art KO-system. ich tippe auf letzteres, oder?

Helmut

5x Contest-Sieger

  • »Helmut« ist der Autor dieses Themas

Beiträge: 691

Wohnort: Bielefeld

  • Private Nachricht senden

78

28.07.2009, 20:21

Ja natürlich Minuten.
Es geht darum, die meisten Spiele gewonnen zu haben. Gegen alle muss man also nicht notwendigerweise gewinnen ;)

Ciao
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)

79

28.07.2009, 20:51

Ich hab auchmal gegen die Zufalls-KI gespielt (eher spielen lassen :lol: )
Und es kam raus:

89:6
5:87

Und gegen die Referenz:
1:83

80

31.07.2009, 09:51

Anleitung für Linux mit wine:
1. die beiden .cpp aus dem zip entpacken
2. typo fixen: Sternman?ver.cpp -> sternmanöver.cpp, mynickname.cpp -> MyNickname.cpp
3. Irgendwo weit oben in sternmanöver.cpp einfügen:

Quellcode

1
2
3
4
5
6
7
8
9
10
#include <stdio.h>
#include <stdarg.h>
int sprintf_s(char* str, size_t str_size, const char *format, ...)
{
    va_list ap;
    va_start(ap, format);
    int res = vsprintf(str, format, ap);
    va_end(ap);
    return res;
}

4. 'wineg++ -lgdi32 -o sternmanöver sternmanöver.cpp' zum compilieren
5. './sternmanöver.exe' zum starten

Es scheint auf den ersten Blick alles zu funktionieren, ob wirklich alles korrekt funktioniert, weiß ich nicht.

Werbeanzeige