Der Hintergrund der Zukunft
Im Jahr 2017 werden Sie und Ihr Gegner in einem futuristischen Feuergefecht gegeneinander antreten, in dem nur einer überleben kann. Hast du genug Erfahrung, um deinen Gegner zu besiegen? Jetzt ist die Zeit , um Ihre polieren Pistolen Fähigkeiten in Ihrer bevorzugten Programmiersprache und den Kampf gegen alle Widrigkeiten!
Turnierergebnisse
Dieses Turnier auf dem UTC Morgen des 2. Feburar beendet nd 2017. Dank unsere Wettbewerber haben wir ein spannendes futuristisches Turnier haben!
MontePlayer ist der endgültige Gewinner nach einem engen Kampf mit CBetaPlayer und StudiousPlayer. Die drei besten Guen-Duelle haben ein Erinnerungsfoto gemacht:
MontePlayer - by TheNumberOne
+------------+
CBetaPlayer | | - by George V. Williams
+------------+ # 1 | StudiousPlayer - by H Walters
| +----------------+
| # 2 # 3 |
+------------------------------------------+
The Futurustic Gun Duel @ PPCG.SE 2017
Glückwunsch an die Gewinner! Eine detaillierte Bestenliste ist am Ende dieses Beitrags zu sehen.
Allgemeine Anleitung
- Besuchen Sie das offizielle Repository für den in diesem Turnier verwendeten Quellcode.
- C ++ - Einträge: Bitte erben Sie die
Player
Klasse. - Nicht-C ++ - Einträge: Wählen Sie eine Schnittstelle im Abschnitt Schnittstelle für Nicht-C ++ - Übermittlungen aus .
- Derzeit erlaubte Nicht-C ++ - Sprachen: Python 3, Java.
Das Duell
- Jeder Spieler beginnt mit einer unbeladenen Waffe, die unendlich viel Munition laden kann.
- In jeder Runde wählen die Spieler gleichzeitig eine der folgenden Aktionen aus:
0
- Laden Sie 1 Munition in die Waffe.1
- Feuern Sie eine Kugel auf den Gegner ab. kostet 1 geladene Munition.2
- Feuern Sie einen Plasmastrahl auf den Gegner ab. kostet 2 geladene Munition.-
- Verteidigen Sie die ankommende Kugel mit einem Metallschild.=
- Eingehenden Plasmastrahl mit einem thermischen Deflektor abwehren.
- Wenn beide Spieler überleben nach dem 100 - ten wiederum beide Auspuff zu Tode, was dazu führt , ein Unentschieden .
Ein Spieler verliert das Waffenduell, wenn sie
- Hat nicht das Metallschild verwenden , um eine eingehende Kugel zu verteidigen.
- Habe nicht den thermischen Deflektor verwenden , um einen eingehenden Plasma zu verteidigen.
- Feuern Sie eine Waffe ab, ohne genügend Munition zu laden, in der sich die Waffe selbst explodiert und den Besitzer tötet.
Vorbehalte
Nach dem Handbuch für futuristische Waffenbesitzer :
- Ein Metallschild KANN NICHT vor einfallendem Plasmastrahl verteidigen. Ebenso kann ein thermischer Deflektor NICHT gegen einfallende Kugeln verteidigen.
- Der Plasmastrahl überwältigt die Kugel (weil die erstere mehr geladene Munition erfordert). Wenn also ein Spieler mit einem Plasmastrahl auf den Gegner schießt, der im selben Zug eine Kugel abgefeuert hat, wird der Gegner getötet.
- Wenn beide Spieler im selben Zug eine Kugel aufeinander abfeuern, brechen die Kugeln ab und beide Spieler überleben. Wenn sich beide Spieler im selben Zug mit einem Plasmastrahl beschießen, überleben beide Spieler.
Es ist auch bemerkenswert, dass:
- Du wirst die Aktion deines Gegners in einer Runde NICHT kennen, bis sie endet.
- Das Ablenken von Plasmastrahlen und Abschirmen von Kugeln schadet Ihrem Gegner NICHT .
Daher gibt es insgesamt 25 gültige Aktionskombinationen pro Runde:
+-------------+---------------------------------------------+
| Outcome | P L A Y E R B |
| Table +--------+-----------------+------------------+
| for Players | Load | Bullet Plasma | Metal Thermal |
+---+---------+--------+--------+--------+--------+---------+
| P | Load | | B wins | B wins | | |
| L +---------+--------+--------+--------+--------+---------+
| A | Bullet | A wins | | B wins | | A wins |
| Y | +--------+--------+--------+--------+---------+
| E | Plasma | A wins | A wins | | A wins | |
| R +---------+--------+--------+--------+--------+---------+
| | Metal | | | B wins | | |
| | +--------+--------+--------+--------+---------+
| A | Thermal | | B wins | | | |
+---+---------+--------+--------+---------------------------+
Note: Blank cells indicate that both players survive to the next turn.
Beispiel Duell
Hier ist ein Duell, das ich einmal mit einem Freund hatte. Damals wussten wir nicht viel über das Programmieren, deshalb verwendeten wir Handgesten und signalisierten mit einer Geschwindigkeit von zwei Umdrehungen pro Sekunde. Von links nach rechts waren unsere Aktionen wiederum:
Me: 001-000-1201101001----2
Friend: 00-10-=1-==--0100-1---1
Nach den obigen Regeln habe ich verloren. Siehst du warum Das liegt daran, dass ich den letzten Plasmastrahl abgefeuert habe, als ich nur 1 geladene Munition hatte, wodurch meine Waffe explodierte.
Der C ++ Player
Sie , als zivilisierter futuristischer Programmierer, nicht direkt die Waffen handhaben . Stattdessen codierst du ein Player
, das gegen andere kämpft. Indem Sie die c ++ - Klasse im GitHub-Projekt öffentlich erben , können Sie mit dem Schreiben Ihrer urbanen Legende beginnen.
Player.hpp can be found in Tournament\Player.hpp
An example of a derived class can be found in Tournament\CustomPlayer.hpp
Was du tun musst oder kannst
- Sie müssen
Player
Klasse durch öffentliche Vererbung erben und Ihre Klasse für endgültig erklären. - Sie müssen überschreiben
Player::fight
, was beiPlayer::Action
jedem Aufruf eine gültige zurückgibt . - Optional können Sie die Aktionen Ihres Gegners überschreiben
Player::perceive
undPlayer::declared
im Auge behalten und Ihre Siege im Auge behalten. - Verwenden Sie optional private statische Member und Methoden in Ihrer abgeleiteten Klasse, um komplexere Berechnungen durchzuführen.
- Verwenden Sie optional andere C ++ - Standardbibliotheken.
Was du NICHT tun darfst
- Sie dürfen KEINE andere direkte Methode anwenden, um Ihren Gegner zu erkennen, als die angegebene Gegner-ID, die zu Beginn jedes Turniers gemischt wird. Sie dürfen nur raten, wer ein Spieler während eines Turniers ist.
- Sie dürfen KEINE Methoden in einer
Player
Klasse überschreiben , die nicht als virtuell deklariert sind. - Sie dürfen KEINE Elemente im globalen Bereich deklarieren oder initialisieren.
- Seit dem Debüt von (jetzt disqualifiziert) dürfen die
BlackHatPlayer
Spieler den Zustand Ihres Gegners NICHT einsehen oder ändern.
Ein Beispielduell
Der Prozess eines Waffenduells wird mit der GunDuel
Klasse durchgeführt. Ein Beispiel für einen Kampf finden Sie Source.cpp
im Abschnitt Initiieren eines Duells .
Wir präsentieren GunClubPlayer
, HumanPlayer
und die GunDuel
Klasse, die in dem gefunden werden kann Tournament\
Verzeichnis des Repository.
In jedem Duell GunClubPlayer
wird eine Kugel geladen; feuere es ab; spülen und wiederholen. HumanPlayer
Fordert Sie in jedem Zug auf, eine Aktion gegen Ihren Gegner auszuführen. Ihre Tastatur - Steuerung sind die Zeichen 0
, 1
, 2
, -
und =
. Unter Windows können Sie HumanPlayer
Ihre Übermittlung mit debuggen.
Ein Duell einleiten
Auf diese Weise können Sie Ihren Player über die Konsole debuggen.
// Source.cpp
// An example duel between a HumanPlayer and GunClubPlayer.
#include "HumanPlayer.hpp"
#include "GunClubPlayer.hpp"
#include "GunDuel.hpp"
int main()
{
// Total number of turns per duel.
size_t duelLength = 100;
// Player identifier 1: HumanPlayer.
HumanPlayer human(2);
// Player identifier 2: GunClubPlayer.
GunClubPlayer gunClub(1);
// Prepares a duel.
GunDuel duel(human, gunClub, duelLength);
// Start a duel.
duel.fight();
}
Beispielspiele
Die geringste Anzahl an Runden, die du besiegen musst, GunClubPlayer
ist 3. Hier ist die Wiederholung des Spiels 0-1
gegen GunClubPlayer
. Die Zahl in der Klammer ist die Anzahl geladener Munition für jeden Spieler, wenn der Zug endet.
:: Turn 0
You [0/12/-=] >> [0] load ammo (1 ammo)
Opponent selects [0] load ammo (1 ammo)
:: Turn 1
You [0/12/-=] >> [-] defend using metal shield (1 ammo)
Opponent selects [1] fire a bullet (0 ammo)
:: Turn 2
You [0/12/-=] >> [1] fire a bullet (0 ammo)
Opponent selects [0] load ammo (1 ammo)
:: You won after 3 turns!
:: Replay
YOU 0-1
FOE 010
Press any key to continue . . .
Der schnellste Weg, um besiegt zu werden, GunClubPlayer
ohne ungültige Züge zu machen, ist die Sequenz 0=
, da die Kugel direkt durch den thermischen Deflektor schießt. Die Wiederholung ist
:: Turn 0
You [0/12/-=] >> [0] load ammo (1 ammo)
Opponent selects [0] load ammo (1 ammo)
:: Turn 1
You [0/12/-=] >> [=] defend using thermal deflector (1 ammo)
Opponent selects [1] fire a bullet (0 ammo)
:: You lost after 2 turns!
:: Replay
YOU 0=
FOE 01
Press any key to continue . . .
Der Wettbewerb
Das Turnier folgt dem Format "Last Player Standing". In einem Turnier werden alle gültigen Einsendungen (einschließlich der GunClubPlayer
) in einen Pool gestellt. Jeder Einreichung wird eine zufällige und dennoch eindeutige Kennung zugewiesen, die während des gesamten Turniers gleich bleibt. Während jeder Runde:
- Jede Einsendung beginnt mit 0 Punkten und spielt 100 Duelle gegen jede andere Einsendung.
- Jedes siegreiche Duell gewährt 1 Punkt; Ziehen und Verlieren geben 0 Punkte.
- Am Ende der Runde verlassen Einsendungen mit den Mindestpunkten das Turnier. Bei einem Unentschieden verlässt der Spieler, der seit Beginn des Turniers am wenigsten Punkte gesammelt hat, das Turnier.
- Wenn mehr als ein Spieler übrig ist, beginnt die nächste Runde.
- Punkte werden NICHT in die nächste Runde übertragen.
Einreichung
Sie senden einen Spieler pro Antwort. Sie können mehrere Dateien für einen Player einreichen, sofern diese andere Einreichungen NICHT beeinträchtigen. Um die Dinge am Laufen zu halten, bitte:
- Nennen Sie Ihre Haupt-Header-Datei als
<Custom>Player.hpp
, - Benennen Sie Ihre anderen Dateien wie
<Custom>Player*.*
z.MyLittlePlayer.txt
B. Ihren KlassennamenMyLittlePlayer
oderEmoPlayerHates.cpp
Ihren KlassennamenEmoPlayer
. - Wenn Ihr Name
Shooter
oder ähnliche Wörter enthält , die in den Kontext dieses Turniers passen, müssen Sie diesePlayer
am Ende nicht hinzufügen . Wenn Sie der Meinung sind, dass Ihr Einreichungsname ohne das Suffix besser funktioniertPlayer
, müssen Sie auch nichts hinzufügenPlayer
. - Stellen Sie sicher, dass Ihr Code unter Windows kompiliert und verlinkt werden kann.
Sie können einen Kommentar abgeben, um Klarheit zu erlangen oder Lücken zu finden. Hoffe, Sie genießen dieses futuristische Waffenduell und wünschen Ihnen ein frohes neues Jahr!
Klärung
- Sie dürfen zufälliges Verhalten haben.
- Ungültige Aktionen (Abfeuern, wenn geladene Munition nicht ausreicht) sind zulässig.
- Wenn ein Spieler eine ungültige Eingabe macht, explodiert seine Waffe sofort.
- Sie dürfen die Antworten studieren.
- Es ist Ihnen ausdrücklich gestattet , das Verhalten des Gegners in jedem Turnier aufzuzeichnen.
- In jeder Runde spielen Sie 100 Duelle gegen jeden Gegner. Die Reihenfolge der 100 Duelle ist jedoch zufällig - es ist nicht garantiert, dass Sie gegen denselben Gegner 100 Duelle hintereinander kämpfen.
Zusätzliche Ressourcen
@flawr hat die bereitgestellte C ++ - Quelle als Referenz in Java übersetzt, wenn Sie C ++ - Einträge senden möchten.
Schnittstelle für Nicht-C ++ - Einreichungen
Derzeit akzeptiert: Python 3, Java.
Bitte befolgen Sie eine der folgenden Spezifikationen:
Schnittstellenspezifikation 1: Beendigungscode
Ihre Einreichung wird einmal pro Spielzug ausgeführt.
Expected Command Line Argument Format:
<opponent-id> <turn> <status> <ammo> <ammo-opponent> <history> <history-opponent>
Expected Return Code: The ASCII value of a valid action character.
'0' = 48, '1' = 49, '2' = 50, '-' = 45, '=' = 61
<opponent-id> is an integer in [0, N), where N is size of tournament.
<turn> is 0-based.
If duel is in progress, <status> is 3.
If duel is draw / won / lost, <status> is 0 / 1 / 2.
<history> and <history-opponent> are strings of actions, e.g. 002 0-=
If turn is 0, <history> and <history-opponent> are not provided.
You can ignore arguments you don't particularly need.
Sie können Ihre Einreichung in PythonPlayer\
und JavaPlayer\
Verzeichnissen testen .
Schnittstellenspezifikation 2: stdin / stdout
(Dank an H Walters)
Ihre Einreichung wird einmal pro Turnier ausgeführt.
Es gibt eine feste Anforderung für alle Eingaben zur I / O-Ausführung, da sowohl stdin als auch stdout mit dem Turniertreiber verbunden sind. Ein Verstoß kann zu einem Deadlock führen. Alle Einträge MÜSSEN diesem EXAKTEN Algorithmus (in Pseudocode) folgen :
LOOP FOREVER
READ LINE INTO L
IF (LEFT(L,1) == 'I')
INITIALIZE ROUND
// i.e., set your/opponent ammo to 0, if tracking them
// Note: The entire line at this point is a unique id per opponent;
// optionally track this as well.
CONTINUE LOOP
ELSE IF (LEFT(L,1) == 'F')
WRITELN F // where F is your move
ELSE IF (LEFT(L,1) == 'P')
PROCESS MID(L,2,1) // optionally perceive your opponent's action.
END IF
CONTINUE LOOP
QUIT
Hier ist F eine der 0
, 1
, 2
, -
, oder =
für load / bullet / plasma / metal / thermal
. PROZESS bedeutet, optional auf das zu antworten, was Ihr Gegner getan hat (einschließlich der Verfolgung der Munition Ihres Gegners, wenn Sie dies tun). Beachten Sie, dass die Aktion des Gegners auch eine von '0', '1', '2', '-' oder '=' ist und sich im zweiten Zeichen befindet.
Abschließender Anzeiger
08:02 AM Tuesday, February 2, 2017 Coordinated Universal Time (UTC)
| Player | Language | Points | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 |
|:------------------ |:---------- | ------:| -----:| -----:| -----:| -----:| -----:| -----:| -----:| -----:| -----:| -----:| -----:| -----:| -----:| -----:| -----:| -----:|
| MontePlayer | C++ | 11413 | 1415 | 1326 | 1247 | 1106 | 1049 | 942 | 845 | 754 | 685 | 555 | 482 | 381 | 287 | 163 | 115 | 61 |
| CBetaPlayer | C++ | 7014 | 855 | 755 | 706 | 683 | 611 | 593 | 513 | 470 | 414 | 371 | 309 | 251 | 192 | 143 | 109 | 39 |
| StudiousPlayer | C++ | 10014 | 1324 | 1233 | 1125 | 1015 | 907 | 843 | 763 | 635 | 555 | 478 | 403 | 300 | 201 | 156 | 76 |
| FatedPlayer | C++ | 6222 | 745 | 683 | 621 | 655 | 605 | 508 | 494 | 456 | 395 | 317 | 241 | 197 | 167 | 138 |
| HanSoloPlayer | C++ | 5524 | 748 | 668 | 584 | 523 | 490 | 477 | 455 | 403 | 335 | 293 | 209 | 186 | 153 |
| SurvivorPlayer | C++ | 5384 | 769 | 790 | 667 | 574 | 465 | 402 | 354 | 338 | 294 | 290 | 256 | 185 |
| SpecificPlayer | C++ | 5316 | 845 | 752 | 669 | 559 | 488 | 427 | 387 | 386 | 340 | 263 | 200 |
| DeceptivePlayer | C++ | 4187 | 559 | 445 | 464 | 474 | 462 | 442 | 438 | 369 | 301 | 233 |
| NotSoPatientPlayer | C++ | 5105 | 931 | 832 | 742 | 626 | 515 | 469 | 352 | 357 | 281 |
| BarricadePlayer | C++ | 4171 | 661 | 677 | 614 | 567 | 527 | 415 | 378 | 332 |
| BotRobotPlayer | C++ | 3381 | 607 | 510 | 523 | 499 | 496 | 425 | 321 |
| SadisticShooter | C++ | 3826 | 905 | 780 | 686 | 590 | 475 | 390 |
| TurtlePlayer | C++ | 3047 | 754 | 722 | 608 | 539 | 424 |
| CamtoPlayer | C++ | 2308 | 725 | 641 | 537 | 405 |
| OpportunistPlayer | C++ | 1173 | 426 | 420 | 327 |
| GunClubPlayer | C++ | 888 | 500 | 388 |
| PlasmaPlayer | C++ | 399 | 399 |
Das Turnier dauert bis zum 1. Februar 2017, sofern nicht anders angegeben.
quelle
Player
Implementierung zulassen, die einen anderen Prozess aufruft, um die aktuelle Runde zu berechnen. Auf diese Weise können Benutzer an jeder Sprache teilnehmen, die Sie gerne auf Ihrem Computer ausführen.Player::fight
" / "Sie können erbenPlayer::perceive
" ... in beiden Fällen wird der Begriff außer Kraft gesetzt und nicht geerbt .GunDuel.hpp
beidenvalidA
undvalidB
verwendenactionA
Antworten:
MontePlayer
Dieser Player verwendet den UCT-Suchalgorithmus für entkoppelte Monte-Carlo-Bäume, um zu entscheiden, welche Auswahl getroffen werden soll. Es verfolgt, was der Feind tut, um seine Aktionen vorherzusagen. Es simuliert den Feind als sich selbst, wenn ihm Daten fehlen.
Dieser Bot schlägt sich wirklich gut gegen jeden anderen Bot außer cβ. In einem 10000 Duell gegen cβ gewann Monte 5246 Duelle. Mit ein bisschen Mathe bedeutet das, dass Monte in 53,74% der Fälle ein Duell gegen cβ 51,17% gewinnt (99% Selbstvertrauen).
quelle
Nun: Ich bin mir fast sicher, dass dies sofort disqualifiziert werden sollte, aber es ist lustig, dass ich nicht explizit gegen eine der oben genannten Regeln verstoße:
BlackHat versucht nicht, den Gegner zu erkennen - eigentlich ist es völlig irrelevant, wer der Gegner ist, da sein Gehirn sofort ersetzt wird.
Alles passiert lokal mit der
fight
virtuellen Funktion.quelle
#ifdef __BLACKHAT_PLAYER_HPP__
␊#error "Dependency issue; to compile, please include this file before BlackHatPlayer.hpp"
␊#else
␊#define __BLACKHAT_PLAYER_HPP__
␊#endif
␊#pragma once
;-)Als nächstes, das am meisten gefürchtete aller Kreaturen, war es in der Hölle und zurück und hat mit buchstäblich 900000 anderen Bots gekämpft , es ist ...
BotRobot wurde nach einem sehr einfachen genetischen Algorithmus benannt, trainiert und automatisch erstellt.
Es wurden zwei 9er-Teams gegeneinander aufgestellt, in jeder Generation wird jeder Roboter von Team 1 gegen jeden Roboter von Team 2 aufgestellt. Die Roboter mit mehr Siegen als Verlusten behielten ihr Gedächtnis, der andere kehrte zum letzten Schritt zurück und hatte die Chance, etwas zu vergessen, hoffentlich schlecht. Die Bots selbst sind verherrlichte Nachschlagetabellen. Wenn sie etwas fanden, das sie vorher nicht gesehen hatten, wählten sie einfach eine zufällig gültige Option und speicherten sie im Speicher. Die C ++ - Version macht das nicht, sie hätte es lernen sollen . Wie bereits erwähnt, behalten Gewinn-Bots diesen neu gefundenen Speicher bei, da er eindeutig funktioniert hat. Bots verlieren nicht und behalten, womit sie angefangen haben.
Am Ende waren die Bot-Kämpfe ziemlich eng und blieben selten aus. Der Gewinner wurde aus einem Pool der beiden Teams nach der Evolution ausgewählt, der 100.000 Generationen umfasste.
BotRobot, mit seinem zufällig generierten und SCHÖNEN Namen, war der Glückliche.
Generator
bot.lua
Revision: Obwohl der Roboter ziemlich schlau gegen sich selbst und andere ähnlich erzeugte Roboter war, erwies er sich in tatsächlichen Schlachten als ziemlich nutzlos. Also habe ich sein Gehirn gegen einige der bereits erstellten Bots regeneriert.
Das Ergebnis ist, wie man leicht sehen kann, ein viel komplexeres Gehirn, bei dem der gegnerische Spieler über 12 Munition verfügt.
Ich bin nicht sicher, wogegen er gekämpft hat, aber irgendetwas hat es getan.
Und natürlich das fertige Produkt ...
Ich hasse C ++ jetzt ...
quelle
00
.quelle
GetRandomDouble
, können Sie das Argument max entfernen.Mir fehlt überall der Kommentar, deshalb kann ich meine Fragen noch nicht stellen. Das ist also ein sehr einfacher Spieler, um gegen den ersten Bot zu gewinnen.
[Bearbeiten] Danke, jetzt stimmt der vorherige Status nicht mehr, aber ich denke, es ist besser, ihn beizubehalten, damit wir den Kontext dieses Bots verstehen können.
Der Opportunist besucht den gleichen Waffenclub wie die GunClubPlayers. Er hat jedoch auf einen Neuling gewettet, dass er alle GunClubPlayers schlagen kann. Also nutzt er die Angewohnheit aus, die er schon lange bemerkt hat, und zwingt sich, nicht zu schießen, sondern nur ein wenig zu warten, um zu gewinnen.
quelle
Neueste Änderungen:
Verbesserte Zufallszahlen (danke Frenzy Li).
quelle
getAmmoOpponent
nichtgetOpponentAmmo
. Sie verpassen auch#endif // !__BARRICADE_PLAYER_HPP__
Beachten Sie, dass dies Informationen über Gegner gemäß den Regeln der Herausforderung verfolgt. Siehe die "Meyers style singleton" -Methode "savedLs ()" am unteren Rand. (Einige Leute fragten sich, wie das geht. Jetzt wissen Sie es!)
quelle
Sie
GunClubPlayer
gehen gerne in den Waffenclub. Während jedes Duell würde laden sie zum ersten Mal Munition, dann eine Kugel abzufeuern, und wiederholen Sie diesen Vorgang , bis zum Ende derWeltDuell. Es ist ihnen eigentlich egal, ob sie gewinnen oder nicht, und sie konzentrieren sich ausschließlich darauf, selbst eine angenehme Erfahrung zu machen.quelle
quelle
quelle
Dieser Bot ist nicht besonders gut - jedoch benötigt jeder KOTH einige erste Einträge, um ihn zum Laufen zu bringen :)
Lokale Tests festgestellt , dass diese Siege gegen beide
GunClubPlayer
undOpportunist
100% der Zeit. Ein Kampf gegenBotRobotPlayer
schien immer mit einem Unentschieden zu enden, da sich beide hinter ihren Schilden verstecken.quelle
Ich codiere nicht in c ++, daher sind Verbesserungen des Codes willkommen.
quelle
DeceptivePlayer
ist es ein besserer Name?HanSoloPlayer
Schießt zuerst! Ich arbeite immer noch daran, es zu überarbeiten, aber das ist ziemlich gut.
quelle
quelle
#endif // ! __CAMTO_HPP__
<>&
ist ein Schmerz.using namespace std
da es das Turnier stört. Wenn Sie debuggen möchten, könnten Sie verwenden,std::cout
etc.quelle
... weil ich sehen möchte, wie ein zufälliger Spieler rangiert.
quelle
SpecificPlayer
SpecificPlayer folgt einem einfachen Plan, bei dem zufällige (gültige) Aktionen ausgewählt werden. Das Hauptmerkmal ist jedoch, dass es nach bestimmten Situationen Ausschau hält, indem es die Munitionszahlen und den vorherigen Zug des Gegners analysiert.
Dies ist das erste Mal, dass ich etwas in C ++ schreibe und das erste Mal, dass ich versuche, eine Art von konkurrenzfähigem Bot-Schreiben durchzuführen. Ich hoffe also, dass mein dürftiger Versuch zumindest etwas Interessantes bringt. :)
quelle
NotSoPatientPlayer
quelle