The Latar Belakang Masa Depan
Di tahun 2017, Anda dan lawan Anda akan berhadapan dalam pertempuran senjata futuristik di mana hanya satu yang bisa bertahan. Apakah Anda cukup berpengalaman untuk mengalahkan lawan Anda? Sekarang adalah waktunya untuk memoles keterampilan meriam Anda dalam bahasa pemrograman favorit Anda dan berjuang melawan segala rintangan!
Hasil Turnamen
Turnamen ini berakhir pada UTC pagi Feburary 2 nd , 2017. Berkat kontestan kami, kami telah memiliki turnamen futuristik menarik!
MontePlayer adalah pemenang akhir setelah pertarungan dekat dengan CBetaPlayer dan StudiousPlayer. Tiga duel guen top telah mengambil foto peringatan:
MontePlayer - by TheNumberOne
+------------+
CBetaPlayer | | - by George V. Williams
+------------+ # 1 | StudiousPlayer - by H Walters
| +----------------+
| # 2 # 3 |
+------------------------------------------+
The Futurustic Gun Duel @ PPCG.SE 2017
Selamat untuk para pemenang! Papan peringkat terperinci terlihat di dekat akhir tulisan ini.
Panduan Umum
- Kunjungi repositori resmi untuk kode sumber yang digunakan dalam turnamen ini.
- Entri C ++: silakan mewarisi
Player
kelas. - Entri Non C ++: pilih satu antarmuka di bagian Antarmuka untuk pengiriman Non-C ++ .
- Saat ini diizinkan bahasa yang bukan C ++: Python 3, Java.
Pertarungan
- Setiap pemain mulai dengan pistol tanpa muatan yang dapat memuat amunisi dalam jumlah tak terbatas.
- Setiap belokan, pemain akan secara bersamaan memilih dari salah satu tindakan berikut:
0
- Muat 1 amunisi ke dalam pistol.1
- Menembakkan peluru ke arah lawan; biaya 1 amunisi dimuat.2
- Tembakan sinar plasma pada lawan; biaya 2 amunisi dimuat.-
- Pertahankan peluru yang masuk menggunakan pelindung logam.=
- Pertahankan sinar plasma yang masuk menggunakan deflektor termal.
- Jika kedua pemain bertahan hidup setelah giliran ke- 100 , mereka berdua kelelahan sampai mati, yang menghasilkan hasil seri .
Seorang pemain kehilangan duel senjata jika mereka
- Apakah tidak menggunakan perisai logam untuk mempertahankan sebuah peluru yang masuk.
- Apakah tidak menggunakan deflektor termal mempertahankan sebuah plasma yang masuk.
- Tembakan senjata tanpa memuat amunisi yang cukup, di mana senjata mereka akan meledak sendiri dan membunuh pemiliknya.
Peringatan
Menurut Manual untuk Pemilik Gun Futuristik :
- Perisai logam TIDAK BISA bertahan dari sinar plasma yang masuk. Demikian juga, deflektor termal TIDAK BISA bertahan dari peluru yang masuk.
- Sinar plasma mengalahkan peluru (karena peluru membutuhkan lebih banyak amunisi). Oleh karena itu, jika seorang pemain menembakkan sinar plasma pada lawan yang menembakkan peluru pada belokan yang sama, lawan terbunuh.
- Jika kedua pemain menembakkan peluru satu sama lain dalam belokan yang sama, peluru membatalkan dan kedua pemain bertahan. Demikian juga, jika kedua pemain menembakkan sinar plasma satu sama lain dalam belokan yang sama, kedua pemain bertahan.
Perlu dicatat bahwa:
- Anda TIDAK akan mengetahui tindakan lawan Anda secara bergantian sampai berakhir.
- Membengkokkan sinar plasma dan melindungi peluru TIDAK akan membahayakan lawan Anda.
Oleh karena itu, ada total 25 kombinasi tindakan yang valid setiap belokan:
+-------------+---------------------------------------------+
| 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.
Contoh Duel
Ini duel yang pernah kumiliki dengan seorang teman. Saat itu, kami tidak tahu banyak tentang pemrograman, jadi kami menggunakan gerakan tangan dan memberi sinyal dengan kecepatan dua putaran per detik. Dari kiri ke kanan, tindakan kami pada gilirannya:
Me: 001-000-1201101001----2
Friend: 00-10-=1-==--0100-1---1
Sesuai aturan di atas, saya kalah. Apakah kamu melihat mengapa? Itu karena aku menembakkan sinar plasma terakhir ketika aku hanya punya 1 amunisi, menyebabkan senjataku meledak.
C ++ Player
Anda , sebagai programmer futuristik yang beradab, tidak akan langsung menangani senjata. Alih-alih, Anda membuat kode Player
yang bertempur melawan yang lain. Dengan mewarisi kelas c ++ secara publik di proyek GitHub, Anda dapat mulai menulis legenda urban Anda.
Player.hpp can be found in Tournament\Player.hpp
An example of a derived class can be found in Tournament\CustomPlayer.hpp
Apa yang harus atau dapat Anda lakukan
- Anda harus mewarisi
Player
kelas melalui warisan publik dan menyatakan final kelas Anda. - Anda harus mengganti
Player::fight
, yang mengembalikan yang validPlayer::Action
setiap kali dipanggil. - Secara opsional, menimpa
Player::perceive
danPlayer::declared
untuk mengawasi tindakan lawan Anda dan melacak kemenangan Anda. - Secara opsional, gunakan anggota statis pribadi dan metode di kelas turunan Anda untuk melakukan perhitungan yang lebih kompleks.
- Secara opsional, gunakan pustaka standar C ++ lainnya.
Apa yang tidak boleh Anda lakukan
- Anda TIDAK boleh menggunakan metode langsung apa pun untuk mengenali lawan Anda selain pengenal lawan yang diberikan, yang dikocok di awal setiap turnamen. Anda hanya bisa menebak siapa pemain melalui permainan-permainan mereka dalam suatu turnamen.
- Anda TIDAK boleh mengganti metode apa pun di
Player
kelas yang tidak dinyatakan virtual. - Anda TIDAK boleh mendeklarasikan atau menginisialisasi apa pun dalam lingkup global.
- Sejak debut (sekarang didiskualifikasi)
BlackHatPlayer
, pemain TIDAK diizinkan untuk mengintip atau memodifikasi kondisi lawan Anda.
Contoh duel
Proses duel senjata dilakukan menggunakan GunDuel
kelas. Untuk contoh pertarungan, lihat Source.cpp
di bagian Memulai duel .
Kami memamerkan GunClubPlayer
, HumanPlayer
dan GunDuel
kelas, yang dapat ditemukan di Tournament\
direktori repositori.
Dalam setiap duel, GunClubPlayer
akan memuat peluru; tembak itu; bilas dan ulangi. Selama setiap belokan, HumanPlayer
akan meminta Anda untuk bermain melawan lawan. Kontrol keyboard Anda adalah karakter 0
, 1
, 2
, -
dan =
. Di Windows, Anda dapat menggunakan HumanPlayer
untuk men-debug kiriman Anda.
Memulai duel
Ini adalah bagaimana Anda dapat men-debug pemain Anda melalui konsol.
// 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();
}
Contoh Game
Jumlah putaran paling tidak yang Anda butuhkan untuk mengalahkan GunClubPlayer
adalah 3. Inilah ulangan dari bermain 0-1
melawan GunClubPlayer
. Angka dalam paranthesis adalah jumlah amunisi yang dimuat untuk setiap pemain saat belokan berakhir.
:: 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 . . .
Cara tercepat untuk dikalahkan dengan GunClubPlayer
tanpa membuat gerakan yang tidak valid adalah urutannya 0=
, karena peluru menembak menembus deflektor termal. Replaynya adalah
:: 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 . . .
Turnamen
Turnamen ini mengikuti format "Last Player Standing". Dalam sebuah turnamen, semua pengiriman yang valid (termasuk GunClubPlayer
) ditempatkan di kumpulan. Setiap pengiriman diberikan pengidentifikasi acak namun unik yang akan tetap sama selama seluruh turnamen. Selama setiap putaran:
- Setiap pengiriman dimulai dengan 0 poin dan akan bermain 100 duel melawan setiap pengiriman lainnya.
- Setiap duel yang menang akan memberikan 1 poin; menggambar dan kalah memberi 0 poin.
- Di akhir babak, pengajuan dengan poin minimum meninggalkan turnamen. Dalam hal seri, pemain dengan jumlah poin paling sedikit yang diperoleh sejak awal turnamen akan pergi.
- Jika lebih dari satu pemain tersisa, babak selanjutnya akan dimulai.
- Poin TIDAK terbawa ke babak selanjutnya.
pengajuan
Anda akan mengirimkan satu pemain per jawaban. Anda dapat mengirim beberapa file untuk pemain, selama mereka TIDAK mengganggu pengiriman lainnya. Agar hal-hal terus mengalir, silakan:
- Beri nama file header utama Anda sebagai
<Custom>Player.hpp
, - Beri nama file Anda yang lain
<Custom>Player*.*
, misalnyaMyLittlePlayer.txt
jika nama kelas AndaMyLittlePlayer
, atauEmoPlayerHates.cpp
jika nama kelas AndaEmoPlayer
. - Jika nama Anda mengandung
Shooter
atau kata-kata serupa yang sesuai dengan konteks turnamen ini, Anda tidak perlu menambahkanPlayer
di akhir. Jika Anda merasa yakin bahwa nama kiriman Anda berfungsi lebih baik tanpa akhiranPlayer
, Anda juga tidak perlu menambahkanPlayer
. - Pastikan kode Anda dapat dikompilasi dan ditautkan di bawah Windows.
Anda dapat berkomentar untuk meminta klarifikasi atau untuk menemukan celah. Semoga Anda menikmati Duel Senjata Futuristik ini dan mengucapkan Selamat Tahun Baru!
Klarifikasi
- Anda diizinkan memiliki perilaku acak.
- Tindakan tidak valid (menembak ketika amunisi yang dimuat tidak cukup) diizinkan.
- Jika seorang pemain membuat input yang tidak valid, pistol mereka akan segera meledak.
- Anda diizinkan mempelajari jawabannya.
- Anda secara eksplisit diizinkan untuk merekam perilaku lawan dalam setiap turnamen.
- Setiap putaran, Anda akan memainkan 100 duel melawan setiap lawan; urutan 100 duel, bagaimanapun, adalah acak - Anda tidak dijamin untuk melawan 100 duel lawan yang sama berturut-turut.
Sumber daya tambahan
@ flawr telah menerjemahkan sumber C ++ yang disediakan ke Jawa sebagai referensi jika Anda ingin mengirimkan entri C ++.
Antarmuka untuk Pengajuan Non-C ++
Saat ini diterima: Python 3, Java.
Silakan ikuti salah satu spesifikasi di bawah ini:
Spesifikasi antarmuka 1: kode keluar
Kiriman Anda akan berjalan sekali per giliran.
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.
Anda dapat menguji kiriman PythonPlayer\
dan JavaPlayer\
direktori Anda.
Spesifikasi antarmuka 2: stdin / stdout
(Kredit ke H Walters)
Kiriman Anda akan berjalan sekali per turnamen.
Ada persyaratan tetap untuk semua entri tentang cara melakukan I / O, karena stdin dan stdout terhubung ke driver turnamen. Melanggar ini bisa menyebabkan kebuntuan. Semua entri HARUS mengikuti algoritma EXACT ini (dalam pseudo-code):
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
Di sini, F adalah salah satu dari 0
, 1
, 2
, -
, atau =
untuk load / bullet / plasma / metal / thermal
. PROSES berarti secara opsional menanggapi apa yang dilakukan lawan Anda (termasuk melacak amunisi lawan Anda jika Anda melakukan ini). Perhatikan bahwa tindakan lawan juga merupakan salah satu dari '0', '1', '2', '-', atau '=', dan berada dalam karakter kedua.
Papan Skor Akhir
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 |
Turnamen ini akan berlangsung hingga 1 Februari 2017 kecuali dinyatakan lain.
sumber
Player
implementasi yang memanggil proses lain untuk menghitung giliran saat ini. Itu akan memungkinkan orang untuk berpartisipasi dalam bahasa apa pun yang Anda senang jalankan di mesin Anda.Player::fight
" / "Anda bisa mewarisiPlayer::perceive
" ... dalam kedua kasus, istilah tersebut menimpa , bukan mewarisi .GunDuel.hpp
, baikvalidA
danvalidB
gunakanactionA
Jawaban:
MontePlayer
Pemain ini menggunakan algoritma UCT Monte Carlo Tree Search Decoupled untuk memutuskan pilihan apa yang harus dibuat. Ini melacak apa yang dilakukan musuh untuk memprediksi tindakannya. Ini mensimulasikan musuh sebagai dirinya sendiri jika tidak memiliki data.
Bot ini bekerja sangat baik terhadap setiap bot lain kecuali cβ. Dalam pertandingan duel 10.000 melawan cβ, Monte memenangkan 5246 duel. Dengan sedikit matematika, itu berarti bahwa Monte akan memenangkan duel melawan cβ 51.17% menjadi 53.74% dari waktu (kepercayaan 99%).
sumber
Sekarang: Saya hampir yakin bahwa ini harus segera didiskualifikasi, tetapi lucu bahwa saya tidak secara eksplisit melanggar aturan yang disebutkan di atas:
BlackHat tidak mencoba mengenali lawan - sebenarnya, sama sekali tidak relevan siapa lawannya, mengingat otaknya segera diganti.
Semuanya terjadi secara lokal ke
fight
fungsi virtual.sumber
#ifdef __BLACKHAT_PLAYER_HPP__
␊#error "Dependency issue; to compile, please include this file before BlackHatPlayer.hpp"
␊#else
␊#define __BLACKHAT_PLAYER_HPP__
␊#endif
␊#pragma once
;-)Selanjutnya, yang paling ditakuti dari semua makhluk, sudah ke neraka dan kembali dan bertarung dengan 900.000 bot lainnya , itu ...
BotRobot dinamai, dilatih dan dibangun secara otomatis oleh algoritma Genetika yang sangat dasar.
Dua tim dari 9 didirikan melawan satu sama lain, dalam setiap generasi, masing-masing robot dari tim 1 ditempatkan melawan masing-masing robot tim 2. Robot dengan lebih banyak kemenangan daripada kerugian, menyimpan ingatannya, yang lain, dikembalikan kembali ke langkah terakhir , dan punya kesempatan untuk melupakan sesuatu, semoga buruk. Bot itu sendiri adalah tabel pencarian yang dimuliakan, di mana jika mereka menemukan sesuatu yang belum pernah mereka lihat sebelumnya, mereka hanya akan memilih opsi acak yang valid dan menyimpannya ke memori. Versi C ++ tidak melakukan ini, itu seharusnya sudah dipelajari . Seperti yang dinyatakan sebelumnya, bot yang menang menyimpan memori yang baru ditemukan ini, karena jelas itu berfungsi. Kehilangan bot tidak, dan simpan apa yang mereka mulai.
Pada akhirnya, pertarungan bot cukup dekat, jarang terjadi kebuntuan. Pemenangnya dipilih dari kumpulan dua tim pasca evolusi, yaitu 100.000 generasi.
BotRobot, dengan nama yang dihasilkan secara acak dan INDAH , adalah yang beruntung.
Generator
bot.lua
Revisi: Meskipun robot itu cukup pintar terhadap dirinya sendiri dan robot lain yang dihasilkan serupa, ia terbukti cukup berguna dalam pertempuran yang sebenarnya. Jadi, saya meregenerasi otaknya melawan beberapa bot yang sudah dibuat.
Hasilnya, seperti dapat dengan mudah dilihat, adalah otak yang jauh lebih kompleks, dengan opsi hingga pemain musuh memiliki 12 amunisi.
Saya tidak yakin apa yang dia lawan hingga mencapai 12 amunisi, tetapi sesuatu berhasil.
Dan tentu saja, produk jadi ...
Saya benci C ++ sekarang ...
sumber
00
.sumber
GetRandomDouble
, Anda dapat menghapus argumen maks.Saya kekurangan komentar di mana-mana, jadi saya belum bisa mengajukan pertanyaan. Jadi ini adalah pemain yang sangat mendasar untuk menang melawan bot pertama.
[Sunting] Terima kasih, sekarang status sebelumnya tidak benar lagi, tetapi saya pikir lebih baik menyimpannya agar kita dapat memahami konteks bot ini.
Sang oportunis sering mengunjungi klub senjata yang sama dengan GunClubPlayers, namun, dia bertaruh kepada pendatang baru bahwa dia bisa mengalahkan setiap GunClubPlayers. Jadi dia mengeksploitasi kebiasaan yang sudah lama dia perhatikan dan memaksakan dirinya untuk tidak menembak tetapi hanya menunggu sedikit untuk menang.
sumber
Perubahan terbaru:
Angka acak yang ditingkatkan (terima kasih Frenzy Li).
sumber
getAmmoOpponent
tidakgetOpponentAmmo
. Anda juga ketinggalan#endif // !__BARRICADE_PLAYER_HPP__
Perhatikan bahwa ini melacak informasi tentang lawan sesuai dengan aturan tantangan; lihat metode "Meyers style singleton" scoped "SavedLs ()" di bagian bawah. (Beberapa orang bertanya-tanya bagaimana melakukan ini; sekarang Anda tahu!)
sumber
Ini
GunClubPlayer
seperti pergi ke klub senjata. Selama setiap duel, pertama-tama mereka akan memuat amunisi, lalu menembakkan peluru, dan mengulangi proses ini sampai akhir dueldunia. Mereka sebenarnya tidak peduli apakah mereka menang atau tidak, dan hanya berfokus pada pengalaman yang menyenangkan.sumber
sumber
sumber
Bot ini tidak terlalu bagus - namun, setiap KOTH membutuhkan beberapa entri awal untuk membuatnya berjalan :)
Pengujian lokal menemukan bahwa ini menang melawan keduanya
GunClubPlayer
danOpportunist
100% dari waktu. Pertempuran melawanBotRobotPlayer
sepertinya selalu menghasilkan hasil imbang karena keduanya bersembunyi di balik perisai mereka.sumber
Saya tidak kode dalam c ++ sehingga setiap perbaikan kode akan diterima.
sumber
DeceptivePlayer
nama yang lebih baik?HanSoloPlayer
Tembak dulu! Masih berusaha merevisinya, tapi ini cukup bagus.
sumber
sumber
#endif // ! __CAMTO_HPP__
<>&
.using namespace std
karena mengganggu turnamen. Jika Anda ingin men-debug, Anda bisa menggunakanstd::cout
dll.sumber
... karena saya ingin melihat bagaimana peringkat pemain secara acak.
sumber
Pemain Khusus
SpecificPlayer mengikuti rencana sederhana untuk memilih beberapa tindakan acak (valid). Namun fitur utamanya adalah melihat situasi tertentu dengan menganalisis jumlah amunisi dan gerakan lawan sebelumnya.
Ini adalah pertama kalinya saya menulis apa pun dalam C ++, dan pertama kali mencoba melakukan segala jenis penulisan bot yang kompetitif. Jadi saya berharap usaha saya yang sedikit setidaknya melakukan sesuatu yang menarik. :)
sumber
NotSoPatientPlayer
sumber