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.
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 erben Player::perceive
" ... in beiden Fällen wird der Begriff außer Kraft gesetzt und nicht geerbt .
GunDuel.hpp
beiden validA
und validB
verwendenactionA