Leiðbeiningar skref fyrir skref fyrir byrjendur
Það sem þú þarft
- FlipSight-reikning. Þú getur skráð vélmenni og sótt tengiforritið eftir að þú skráir þig inn.
- Eina mynd af vélmenninu: GIF-, JPG- eða PNG-skrá sem er 5 MB eða minni og að minnsta kosti 175 px á breidd og hæð.
- Þín eigin tölva til að keyra vélmennið Leikir vélmennisins eru reiknaðir á tölvunni þar sem tengiforritið keyrir. Jafnvel með sömu leikvél getur styrkurinn verið mismunandi eftir afli tölvunnar og stillingum leikvélarinnar, og ef þú skiptir um tölvu eða stillingar geta stigin breyst í samræmi við það.
- Python 3, ókeypis forrit sem keyrir tengiforritið. Útgáfa 3.9 eða nýrri virkar; mælt er með 3.11 eða nýrri. Þú athugar það í skrefi 5.
- Leikjavél vélmennisins þíns. Æfingavél til prófana fylgir tengiforritinu.
1. Skráðu vélmennið þitt
Skráðu þig inn og opnaðu vélmennasíðuna (othelloclub.com/is/flipsight/bot). Í reitnum Skrá vélmennið mitt efst skaltu slá inn nafn í Nafn vélmennis (2–24 stafir). Hafðu í bili aðeins Standard hakað í Studdir leikir. Veldu mynd í Hlaða upp mynd og ýttu síðan á hnappinn Skrá vélmennið mitt.
Svona lítur árangur út: reiturinn Tengilykill (birtist aðeins einu sinni) birtist með löngum texta sem byrjar á fsbm_.
2. Geymdu lykilinn
Þessi langi texti er lykillinn, lykilorð sem er aðeins fyrir vélmennið þitt. Tengiforritið notar hann til að sanna fyrir þjóninum að það tali fyrir þetta vélmenni. Afritaðu hann allan og límdu hann einhvers staðar tímabundið, til dæmis í textaritil. Þegar þú lokar reitnum geturðu ekki séð sama lykil aftur.
Farðu með lykilinn eins og lykilorð. Ekki sýna hann neinum og ekki birta skjámynd af honum. Ef þú týnir honum eða einhver sér hann skaltu opna Stjórna í listanum yfir vélmenni og ýta á Gefa út tengilykil. Þegar þú færð nýjan lykil hættir sá gamli strax að virka.
3. Sæktu tengiforritið
Ýttu á Sækja Python-dæmi til að sækja ZIP-skrána og afþjappaðu hana. Í þessum leiðbeiningum er afþjappaða mappan kölluð „vélmennamappan“. Settu hana á stað sem auðvelt er að finna, til dæmis á skjáborðið.
Svona lítur árangur út: í vélmennamöppunni eru skráin README.md og mappan tools.
4. Opnaðu skipanaglugga í vélmennamöppunni
Skipanagluggi (terminal) er gluggi þar sem þú slærð inn skipanir. Opnaðu hann svona eftir stýrikerfi.
macOS: ýttu á Command+Space, sláðu inn Terminal og opnaðu forritið. Sláðu inn cd og eitt bil, dragðu vélmennamöppuna inn í gluggann og ýttu síðan á Enter.
Linux: í skráastjóranum skaltu hægrismella á vélmennamöppuna og velja Open in Terminal (Opna í skipanaglugga). Heiti valmyndarinnar getur verið mismunandi eftir dreifingum. Ef slík valmynd er ekki til skaltu opna skipanaglugga og nota cd eins og á macOS.
Windows: opnaðu vélmennamöppuna í File Explorer. Sláðu inn powershell í veffangastikuna efst og ýttu á Enter. PowerShell-gluggi opnast í þeirri möppu.
Athugun: sláðu inn skipunina hér fyrir neðan og ýttu á Enter. Árangur þýðir að README.md og tools birtast í listanum. Þessi skipun er eins á macOS, Linux og í Windows PowerShell.
ls5. Athugaðu Python
Í sama glugga skaltu afrita þá einu skipun sem á við þitt stýrikerfi, líma hana og ýta á Enter. Þú getur notað afritunarhnappinn efst til hægri í hverjum kóðareit.
macOS / Linux
python3 --versionWindows PowerShell
py --versionSvona lítur árangur út: útgáfa sem byrjar á 3, til dæmis Python 3.11.9. Útgáfa 3.9 eða nýrri virkar. Ef skipunin finnst ekki skaltu setja upp Python eins og lýst er hér fyrir neðan, loka glugganum og byrja aftur á skrefi 4.
macOS: sæktu macOS-uppsetningarforritið (.pkg) af python.org og settu það upp. Keyrðu síðan Install Certificates.command einu sinni úr Python-möppunni í Applications. Þetta undirbýr skilríkin sem þarf fyrir öruggar (HTTPS) tengingar.
Linux: settu upp python3 með hugbúnaðarstjóra eða pakkastjóra dreifingarinnar þinnar.
Windows: settu upp Python install manager af python.org.
6. Sláðu inn lykilinn
Settu lykilinn í umhverfisbreytu. Það er tímabundin stilling sem er aðeins til inni í þessum skipanaglugga. Hún heitir FS_BOT_TOKEN. Afritaðu einnar línu skipunina fyrir þitt stýrikerfi hér fyrir neðan, límdu hana og ýttu einu sinni á Enter. Þá birtist Bot token og bíður eftir því að þú sláir eitthvað inn. Límdu nú lykilinn sem þú afritaðir í skrefi 2 og ýttu á Enter.
macOS / Linux
printf 'Bot token: '; read -r -s FS_BOT_TOKEN; printf '\n'; export FS_BOT_TOKENWindows PowerShell
$env:FS_BOT_TOKEN = [Net.NetworkCredential]::new('', (Read-Host 'Bot token' -AsSecureString)).PasswordÁ macOS og Linux sést límdi lykillinn ekki, og á Windows sérðu * í stað stafanna. Hvort tveggja er eðlilegt. Þar sem lykillinn er ekki skrifaður inn í skipunina verður hann ekki eftir í skipanasögunni. Stillingin gildir aðeins í þessum glugga. Ef þú lokaðir honum eða opnaðir nýjan glugga skaltu endurtaka skref 4 og 6.
Windows: í PowerShell límirðu með Ctrl+V eða hægrismelli. Þessi einnar línu skipun notar ritmáta sem virkar bæði í Windows PowerShell 5.1, sem fylgir Windows, og í nýrri PowerShell 7, en hún hefur ekki enn verið prófuð á raunverulegri Windows-tölvu.
Svona lítur árangur út: kvaðningin fyrir næstu skipun birtist aftur án villu.
7. Ræstu tengiforritið
Í sama glugga skaltu afrita skipunina hér fyrir neðan óbreytta, líma hana og ýta á Enter. Ekki breyta skráarheitunum í henni. Vélmennið þitt tengist með æfingavélinni. Hún er mjög veik leikvél sem leikur á löglega reitinn með lægsta númerið.
macOS / Linux
python3 tools/bot_match_client.py --engine 'python3 tools/bot_match_example_engine.py'Windows PowerShell
py tools/bot_match_client.py --engine 'py tools/bot_match_example_engine.py'Það er eðlilegt að skipunin birti engan texta og skipanalínan komi ekki aftur meðan hún er í gangi. Haltu þessum glugga opnum með tengiforritið og leikjavélina í gangi og komdu í veg fyrir að tölvan fari í svefn til að halda vélmenninu á netinu. Ef þú lokar glugganum eða ýtir á Ctrl+C stöðvast bæði forritin og vélmennið fer af netinu. Keyrðu skipunina hér að ofan aftur til að tengja það. Tengiforritið samþykkir sjálfkrafa áskoranir frá öðrum vélmennum.
Á meðan vélmennið keyrir með æfingavélinni fær það engar sjálfvirkar viðureignir, og viðureignir þess við önnur vélmenni, líka þær sem þú biður um, hafa ekki áhrif á stig. Ræstu það aftur með þinni eigin leikvél (skref 10) og þá er það parað og fær stig upp frá því.
Svona lítur árangur út: í listanum Skráð vélmenni á vélmennasíðunni er punkturinn hægra megin við nafn vélmennisins þíns grænn. Ef þú heldur bendlinum yfir honum birtist Tengt. Ef hann er grár (Ótengt) skaltu ýta á Endurhlaða.
8. Prófaðu með fyrstu viðureign
Á vélmennasíðunni skaltu velja vélmennið þitt í Spilandi vélmennið mitt. Veldu hvaða vélmenni sem er í listanum FlipSight-vélmenni, ýttu á Skora á og staðfestu í glugganum sem opnast. Í öllum leikjategundum reiknar þjónninn leiki FlipSight-vélmenna, svo þú þarft ekki að hafa leikherbergið opið. Ef kveikt er á sjálfvirkri pörun (sjálfgefið) setur vefurinn líka upp vélmennaviðureignir á meðan tengiforritið er í gangi.
Svona lítur árangur út: leikherbergið sýnir tvö borð og skífa er lögð í hvert skipti sem vélmennið þitt á leik. Æfingavélin er mjög veik, svo það er eðlilegt að tapa.
9. Láttu það keyra eftir að glugganum er lokað (valfrjálst)
Ræstu með skipuninni hér fyrir neðan í stað skrefs 7, og vélmennið heldur áfram að keyra eftir að þú lokar glugganum. Keyrðu hana í sama glugga og þú slóst lykilinn inn í (skref 6). Það stöðvast ef slökkt er á tölvunni eða hún fer í svefn. Ef þú stöðvar það í miðri viðureign tapast sú viðureign á tíma eða vegna sambandsrofs.
macOS / Linux
macOS / Linux: eftir að þú hefur keyrt ræsiskipunina geturðu lokað glugganum. Skilaboð eru skrifuð í skrána bot.log í vélmennamöppunni. Til að stöðva það opnarðu nýjan skipanaglugga og keyrir stöðvunarskipunina. Afritaðu aðeins þann kassa sem þú þarft: ef þú límir báða kassana í einu stöðvast vélmennið strax eftir að það ræsist.
Ræsa
nohup python3 tools/bot_match_client.py --engine 'python3 tools/bot_match_example_engine.py' > bot.log 2>&1 &Stöðva
pkill -f bot_match_client.pyWindows PowerShell
Windows: lágmarkaður gluggi birtist á verkefnastikunni og vélmennið keyrir í honum. Þú getur lokað núverandi PowerShell-glugga. Til að stöðva það skaltu opna lágmarkaða gluggann og ýta á Ctrl+C, eða loka þeim glugga.
Ræsa
Start-Process py -ArgumentList 'tools/bot_match_client.py --engine "py tools/bot_match_example_engine.py"' -WorkingDirectory $PWD -WindowStyle Minimized10. Skiptu yfir í þína eigin leikvél
Eftir tengiprófið skaltu skipta yfir í þína vél: sérvalkostir hér að neðan fyrir Edax eða Egaroucid, --nboard fyrir aðrar samhæfar vélar og JSON fyrir eigin vél. Haltu sama lykli.
Hakaðu aðeins við afbrigði (Anti, 10x10, Octagon, klassískt Reversi) í Studdir leikir ef leikvélin þín kann reglur þess. Önnur vélmenni og fólk geta skorað á vélmennið þitt í öllum leikjum sem hakað er við. Til að breyta því skaltu opna Stjórna í listanum yfir vélmenni, breyta Studdir leikir og ýta á Vista. Ekki er hægt að breyta því meðan viðureign er í gangi eða áskorun bíður.
Dæmi um beiðnir til leikvélar eftir leik
Tengdu NBoard-leikjavél eins og Edax
NBoard er grafískt Othello-forrit sem má nota með NTest. NBoard-samskiptareglan er opinber samskiptalýsing þess við leikjavélar og virkar með vélum sem styðja hana, eins og NTest og Edax.
Dæmin um uppsetningu og ræsingu hér að neðan nota Edax 4.6 og Egaroucid for Console 7.8.2.
Edax 4.6 fylgir ekki tengiforritinu. Sæktu skrána fyrir stýrikerfið þitt undir Assets á Edax 4.6, settu hana í vélmennamöppuna og afþjappaðu með undirbúningsskipununum hér að neðan. Windows- og Linux-skipanirnar eru fyrir x86-64.
Windows PowerShell (x86-64): edax-4.6-MS-windows-x86.zip
Undirbúningur (aðeins í fyrsta sinn)
Expand-Archive -LiteralPath edax-4.6-MS-windows-x86.zip -DestinationPath edax-4.6Ræsa
py tools/bot_match_client.py --edax "edax-4.6\wEdax-x86-64.exe"Linux (x86-64): edax-4.6-linux-x86.tar.gz
Undirbúningur (aðeins í fyrsta sinn)
mkdir -p edax-4.6
tar -xzf edax-4.6-linux-x86.tar.gz -C edax-4.6
chmod +x edax-4.6/lEdax-x86-64Ræsa
python3 tools/bot_match_client.py --edax "edax-4.6/lEdax-x86-64"macOS: edax-reversi-4.6.tar.gz
Engin opinber macOS-keyrsluskrá er til fyrir Edax 4.6. Sæktu Source code (tar.gz) og edax-4.6-linux-x86.tar.gz úr sömu útgáfu. Smíðaðu Mac-forritið úr frumkóðanum; taktu aðeins sameiginlegu matsgögnin data/eval.dat úr Linux-safninu. Xcode Command Line Tools þarf. Undirbúningsskipanirnar þýða frumkóðann.
Undirbúningur (aðeins í fyrsta sinn)
xcode-select --installtar -xzf edax-reversi-4.6.tar.gz
mv edax-reversi-4.6 edax-4.6
mkdir -p edax-4.6/bin
tar -xzf edax-4.6-linux-x86.tar.gz -C edax-4.6 data/eval.dat
(cd edax-4.6/src && make build ARCH=native OS=osx)Ræsa
python3 tools/bot_match_client.py --edax "edax-4.6/bin/mEdax-native"Edax má einnig tengja með aðeins slóð forritsins með --edax hér að neðan. Sérstakt millistykki þarf ekki; tengiforritið skiptir umhugsunartíma eftir tímanum sem er eftir í leiknum.
Skiptu slóðinni í skipuninni út fyrir fulla slóð að forritinu þínu. Settu slóðir með bilum innan gæsalappa. Finnist matskráin ekki sjálfkrafa skaltu tilgreina eval.dat með --edax-eval.
NBoard-tenging teflir aðeins venjulegar 8×8 skákir. Hafðu aðeins Standard hakað í Studdir leikir fyrir þetta vélmenni. Ef afbrigði berst spyr tengiforritið ekki leikvélina, enginn leikur er leikinn, og viðureignin ógildist eða tapast á tíma.
Egaroucid: --egaroucid
Undirbúðu Egaroucid for Console. Veldu skipanalínuforritið og hafðu resources-möppuna á sínum stað. Á macOS og Linux er notuð keyrsluskrá byggð samkvæmt opinberum leiðbeiningum. Staða og tími sem eftir er fara um setboard, settime og go án millistykkis.
Windows PowerShell
py tools/bot_match_client.py --egaroucid "egaroucid\Egaroucid_for_console.exe"macOS / Linux
python3 tools/bot_match_client.py --egaroucid "egaroucid/bin/Egaroucid_for_Console.out"Báðar leiðir styðja aðeins venjulegt 8×8, með einni vél fyrir hvern samtímis leik. --max-think-seconds er öryggishámark á leik (sjálfgefið 10 sekúndur). Ef Egaroucid nær því er leit stöðvuð, löglegur varaleikur leikinn og vélin endurræst í næstu umferð.
Heimasmíðuð leikvél: tengdu í gegnum JSON
Lestu þennan hluta aðeins ef þú vilt tengja leikvél sem þú hefur skrifað upp á eigin spýtur. Ef þú notar Edax, Egaroucid eða aðra NBoard-leikvél er verkinu þegar lokið hér að ofan og þú getur sleppt þessum hluta.
Í hvert sinn sem vélmennið þitt á leik keyrir tengiforritið my_adapter.py einu sinni. Það afhendir núverandi stöðu sem eina línu (hvar skífurnar eru, hver á leik, hvaða reitir eru löglegir, hve mikill tími er eftir), my_adapter.py svarar með einum reit sem einni línu og tengiforritið leikur þeim leik á þjóninum. my_adapter.py er lítil Python-skrá þar á milli sem biður leikvélina þína um leikinn. Tengiforritið sér um tenginguna við þjóninn, lykilinn og sendingu leikja, svo þessi skrá þarf aldrei að fást við það.
bot_match_client.py→ my_adapter.pybot_match_client.py← my_adapter.pyHvers konar leikvél ertu með?
- Leikvél sem velur leik í Python-kóða: notaðu dæmi A hér fyrir neðan.
- Forritsskrá sem prentar eina svarlínu og hættir í hvert sinn sem hún er keyrð: notaðu dæmi B hér fyrir neðan.
- Forritsskrá sem helst opin og skiptist stöðugt á skipunum: ef hún styður NBoard, tengdu hana með --nboard hér að ofan. Með annarri samskiptareglu lagarðu dæmi B að henni og lætur my_adapter.py halda vélinni opinni og skiptast á einni línu í einu í lykkju.
Skref 1: skrá sem athugar aðeins tenginguna (my_adapter.py)
Búðu til skrá sem heitir my_adapter.py í vélmennamöppunni (þar sem README.md og tools eru), límdu kóðann hér fyrir neðan inn óbreyttan og vistaðu skrána. Þessi skrá notar enga leikvél og svarar einfaldlega með fyrsta löglega reitnum. Hún er til þess að staðfesta að tengingin virki áður en þú tengir leikvélina þína.
import json
import sys
def choose_move(position):
legal = position["legal_moves"]
return legal[0] if legal else -1
line = sys.stdin.readline()
position = json.loads(line)
move = choose_move(position)
print(json.dumps({"move": move}), flush=True)
Athugaðu inntak og úttak áður en þú tengir
Skipunin í kassa 1 sendir dæmastöðuna beint inn í millistykkið. Hún á að prenta eina línu: {"move": 19}. Þegar þú sérð þá línu ræsir skipunin í kassa 2 tengiforritið með þessu millistykki, í glugganum sem hefur lykilinn úr skrefi 6. Keyrðu kassana tvo hvorn í sínu lagi. Ef leikvélin þín les þetta JSON-snið sjálf geturðu sett skipun hennar beint á eftir --engine.
1. Prófaðu millistykkið eitt og sér
macOS / Linux
printf '%s\n' '{"board":[0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,1,0,0,0,0,0,0,1,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0],"color":1,"legal_moves":[19,26,37,44],"game_mode":"std","board_size":8,"blocked_squares":[],"placed":{"1":0,"2":0},"remaining_ms":60000,"match_id":123,"leg":0,"revision":0,"history":[],"round_no":null,"room_created_at":null,"budget_ms":10000}' | python3 my_adapter.pyWindows PowerShell
'{"board":[0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,1,0,0,0,0,0,0,1,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0],"color":1,"legal_moves":[19,26,37,44],"game_mode":"std","board_size":8,"blocked_squares":[],"placed":{"1":0,"2":0},"remaining_ms":60000,"match_id":123,"leg":0,"revision":0,"history":[],"round_no":null,"room_created_at":null,"budget_ms":10000}' | py my_adapter.py2. Ræstu tengiforritið með millistykkinu
macOS / Linux
python3 tools/bot_match_client.py --engine 'python3 my_adapter.py'Windows PowerShell
py tools/bot_match_client.py --engine 'py my_adapter.py'Skref 2: skiptu yfir í skrá sem kallar á leikvélina þína
Þegar skref 1 virkar skaltu skipta öllu innihaldi my_adapter.py út fyrir dæmi A eða B hér fyrir neðan. Breyttu aðeins línunum sem eru merktar EDIT og láttu hitt vera eins og það er. Keyrðu síðan prófunarskipun 1 hér að ofan aftur og athugaðu að ein svarlína birtist. Leikvélin þín valdi leikinn, svo það er eðlilegt að fá annan reit en 19.
Dæmi A: leikvél sem velur leik með Python-falli
Þetta dæmi gerir ráð fyrir skrá sem heitir my_engine.py með fallinu search sem velur leikinn. Breyttu skráarheitinu og fallsheitinu við EDIT 1 og gildunum sem eru send inn við EDIT 2 svo þau passi við leikvélina þína. Fallið á að skila númeri reitsins (0 til 63) eða hniti eins og d3.
import json
import sys
from pathlib import Path
from my_engine import search # EDIT 1: your engine file and function name
def think_ms(position):
# Time for this move: share the remaining clock over my remaining moves.
my_moves_left = position["board"].count(0) // 2 + 1
share = position["remaining_ms"] / my_moves_left
return int(min(share, position["budget_ms"]) * 0.8)
def choose_move(position):
if not position["legal_moves"]:
return -1
# EDIT 2: pass what your function needs
return search(
board=position["board"],
color=position["color"],
legal_moves=position["legal_moves"],
time_limit_ms=think_ms(position),
)
position = json.loads(sys.stdin.readline())
legal = position["legal_moves"]
try:
move = choose_move(position)
except Exception as error:
# The engine failed: note why in my_adapter.log and play the first legal square.
with open(Path(__file__).with_name("my_adapter.log"), "a") as log:
log.write(repr(error) + "\n")
move = legal[0] if legal else -1
print(json.dumps({"move": move}), flush=True)Dæmi B: leikvél sem er forritsskrá
Þetta dæmi gerir ráð fyrir að forritið lesi eina línu með 64 borðstöfum, litnum sem á leik og umhugsunartímanum í millisekúndum, og svari með einni hnitalínu eins og D3 (. = tómt, X = svart, O = hvítt). Hver leikvél hefur sitt eigið snið, svo breyttu heiti forritsskrárinnar við EDIT 1, línunni sem er send til leikvélarinnar við EDIT 2 og hlutanum sem les svarið við EDIT 3 svo allt passi við leikvélina þína.
my_adapter.py → my_engine
...........................OX......XO........................... X 1777my_engine → my_adapter.py
D3import json
import subprocess
import sys
from pathlib import Path
# EDIT 1: your engine program file (kept in the same folder as my_adapter.py)
ENGINE = Path(__file__).with_name("my_engine.exe" if sys.platform == "win32" else "my_engine")
def think_ms(position):
# Time for this move: share the remaining clock over my remaining moves.
my_moves_left = position["board"].count(0) // 2 + 1
share = position["remaining_ms"] / my_moves_left
return int(min(share, position["budget_ms"]) * 0.8)
def choose_move(position):
if not position["legal_moves"]:
return -1
# EDIT 2: build the line your engine reads
board = "".join(".XO"[cell] for cell in position["board"])
color = "X" if position["color"] == 1 else "O"
reply = subprocess.run(
[str(ENGINE)],
input=f"{board} {color} {think_ms(position)}\n",
text=True,
capture_output=True,
check=True,
timeout=position["budget_ms"] / 1000 * 0.9,
)
# EDIT 3: take the square out of your engine's answer
return reply.stdout.strip()
position = json.loads(sys.stdin.readline())
legal = position["legal_moves"]
try:
move = choose_move(position)
except Exception as error:
# The engine failed: note why in my_adapter.log and play the first legal square.
with open(Path(__file__).with_name("my_adapter.log"), "a") as log:
log.write(repr(error) + "\n")
move = legal[0] if legal else -1
print(json.dumps({"move": move}), flush=True)Umhugsunartími: í viðureignum vélmenna hefur hvort vélmenni 1 mínútu í hvorri skák, svo löng umhugsun um einn leik leiðir fljótt til taps á tíma. think_ms í dæmunum deilir tímanum sem eftir er (remaining_ms) með fjölda leikja sem þú átt eftir til að ákveða tímann fyrir þennan leik. budget_ms er ekki tíminn sem á að nota í þennan leik. Það er lengsti tíminn sem tengiforritið bíður eftir svarinu (10 sekúndur sjálfgefið). Ef svarið kemur seinna en það getur vélmennið ekki haldið áfram í þeirri skák og tapar henni á tíma, svo sendu think_ms til leikvélarinnar þinnar en ekki budget_ms.
Þegar eitthvað bilar: ef kallið á leikvélina mistekst skrifa dæmaskrárnar ástæðuna í my_adapter.log og leika fyrsta löglega reitnum í staðinn. Ef leikirnir virðast skrýtnir skaltu opna þá skrá fyrst. Tengiforritið sýnir ekki villuboð millistykkisins á skjánum. Notaðu print aðeins fyrir svarlínuna einu og skrifaðu allan villuleitartexta í skrá.
Hraði: tengiforritið heldur my_adapter.py gangandi fyrir hverja skák og sendir eina línu í hverjum leik. Skrá sem svarar einni línu og hættir, eins og dæmin, er ræst aftur í næsta leik, svo vélin þín ræsist líka aftur í hvert sinn. Ef vélin er sein að ræsa eða á að halda vinnu fyrri leikja, gerðu my_adapter.py að lykkju: lesa línu, svara línu, endurtaka. Ekki lesa inntak til enda og gerðu flush eftir hvert svar.
Það sem eftir er af þessum hluta er uppflettiefni um það sem tengiforritið og my_adapter.py skiptast á. Ef þú notar dæmaskrárnar hér að ofan óbreyttar þarftu ekki að lesa það.
Inntaks-JSON (tengiforrit → millistykki)
Þetta eru sýnigögn frá tengiforritinu, ekki keyranlegur kóði. Ekki vista þau sem Python-skrá. Meðan á leik stendur eru nýjustu gögn send sjálfkrafa í hverri umferð.
Hér fyrir neðan er dæmi um upphafsstöðu á venjulegu 8×8 borði. Í raunverulegum skákum fyllir tengiforritið inn núverandi stöðu. board telur upp reiti frá a1 til hægri og síðan næstu röð; 0=tómt, 1=svart, 2=hvítt. color=1 biður um leik fyrir svart. legal_moves telur upp reitina sem þú mátt leika á. remaining_ms er eftirstandandi tími á klukkunni og budget_ms lengsti tíminn sem tengiforritið bíður eftir svari við þessum leik, hvort tveggja í millisekúndum (1000 = 1 sekúnda). Svið og dæmi fyrir afbrigði eru í kaflanum um afbrigði hér fyrir neðan.
{"board":[0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,1,0,0,0,0,0,0,1,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0],"color":1,"legal_moves":[19,26,37,44],"game_mode":"std","board_size":8,"blocked_squares":[],"placed":{"1":0,"2":0},"remaining_ms":60000,"match_id":123,"leg":0,"revision":0,"history":[],"round_no":null,"room_created_at":null,"budget_ms":10000}Svar-JSON (millistykki → tengiforrit)
Skrifaðu eitt af svörunum hér fyrir neðan sem eina JSON-línu sem endar á línuskiptum. move er reitanúmer eða hnit, óháð há- og lágstöfum. Á 8×8 er d3 (3−1)×8+3 = 19. Veldu alltaf úr legal_moves sem þú fékkst. Í vélmennapörum, þegar enginn löglegur leikur er til, sendu -1 eða pass; í skákum gegn manni leysir þjónninn þvinguð pass. Skrifaðu aðeins svarlínuna í stdout, engin önnur skilaboð.
{"move":19}{"move":"d3"}{"move":-1}Dæmi um beiðnir til leikvélar eftir leik
Dæmi um fyrstu beiðnina fyrir svart sem tengiforritið sendir --engine-leikvél, búin til með reglukóðanum. Raunverulegar skákir af öllum gerðum byrja í slembinni stöðu með 12 skífum, svo board og legal_moves eru ólík í hverri skák. Til að dæmin haldist óbreytt voru upphafsleikir þeirra valdir nálægt miðju borðsins. match_id og klukkugildin eru líka önnur í raunverulegum skákum.
game_mode: Eitt af std, anti, grand, octagon, reversi. XOT í skákum gegn manni berst sem std.board_size: 8, eða 10 fyrir grand og octagon.board: Fylki af lengd board_size². Lesið frá a1 til hægri, síðan næsta röð. 0=tómt (þar með taldir lokaðir reitir í Octagon), 1=svart, 2=hvítt.blocked_squares: Ónothæfir reitir í Octagon. Tómt fylki í öðrum leikjum.placed: Skífur sem hvor litur hefur lagt hingað til, að meðtöldum slembileikjunum í upphafi; lyklarnir eru strengirnir "1" og "2". Notað fyrir 32 skífa hámarkið í klassísku Reversi.
Anti (anti)
Inntaks-JSON (tengiforrit → millistykki)
{
"board": [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 2, 2, 0, 0, 0, 0, 0, 1, 2, 2, 1, 0, 0, 0, 0, 2, 2, 2, 2, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0],
"color": 1,
"legal_moves": [2, 3, 12, 25, 42, 44, 45],
"game_mode": "anti",
"board_size": 8,
"blocked_squares": [],
"placed": {
"1": 4,
"2": 4
},
"remaining_ms": 60000,
"match_id": 123,
"leg": 0,
"revision": 0,
"history": [],
"round_no": null,
"room_created_at": null,
"budget_ms": 10000
}Svar-JSON (millistykki → tengiforrit)
{"move":2}Grand (10x10) (grand)
Inntaks-JSON (tengiforrit → millistykki)
{
"board": [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 2, 0, 0, 0, 0, 0, 0, 0, 1, 2, 2, 1, 0, 0, 0, 0, 0, 0, 2, 2, 2, 2, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0],
"color": 1,
"legal_moves": [13, 14, 25, 42, 63, 65, 66],
"game_mode": "grand",
"board_size": 10,
"blocked_squares": [],
"placed": {
"1": 4,
"2": 4
},
"remaining_ms": 60000,
"match_id": 123,
"leg": 0,
"revision": 0,
"history": [],
"round_no": null,
"room_created_at": null,
"budget_ms": 10000
}Svar-JSON (millistykki → tengiforrit)
{"move":13}Octagon (octagon)
Inntaks-JSON (tengiforrit → millistykki)
{
"board": [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 2, 0, 0, 0, 0, 0, 0, 0, 1, 2, 2, 1, 0, 0, 0, 0, 0, 0, 2, 2, 2, 2, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0],
"color": 1,
"legal_moves": [13, 14, 25, 42, 63, 65, 66],
"game_mode": "octagon",
"board_size": 10,
"blocked_squares": [0, 1, 10, 8, 9, 19, 80, 90, 91, 89, 98, 99],
"placed": {
"1": 4,
"2": 4
},
"remaining_ms": 60000,
"match_id": 123,
"leg": 0,
"revision": 0,
"history": [],
"round_no": null,
"room_created_at": null,
"budget_ms": 10000
}Svar-JSON (millistykki → tengiforrit)
{"move":13}Klassískt Reversi (reversi)
Inntaks-JSON (tengiforrit → millistykki)
{
"board": [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 2, 2, 1, 1, 0, 0, 0, 0, 2, 2, 1, 1, 0, 0, 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0],
"color": 1,
"legal_moves": [18, 25, 33, 41, 42, 50, 51],
"game_mode": "reversi",
"board_size": 8,
"blocked_squares": [],
"placed": {
"1": 6,
"2": 6
},
"remaining_ms": 60000,
"match_id": 123,
"leg": 0,
"revision": 0,
"history": [],
"round_no": null,
"room_created_at": null,
"budget_ms": 10000
}Svar-JSON (millistykki → tengiforrit)
{"move":18}Algeng vandamál
| Einkenni | Orsök og lausn |
|---|---|
| Vélmennið sýnir gráan punkt (ótengt). | Athugaðu hvort glugginn með tengiforritinu sé enn í gangi. Það stöðvast þegar þú lokar glugganum, ýtir á Ctrl+C eða tölvan fer í svefn. Endurtaktu skref 6 og 7 og ýttu síðan á Endurhlaða. |
Skilaboð segja að skipunin hafi ekki fundist.command not found / is not recognized | Python vantar, eða glugginn var ekki opnaður aftur eftir uppsetningu. Sjá skref 5, opnaðu nýjan glugga og byrjaðu aftur á skrefi 4. |
Skilaboð segja að ekki sé hægt að opna skrána.can't open file | Þú keyrðir skipunina utan vélmennamöppunnar. Farðu í vélmennamöppuna eins og í skrefi 4 og athugaðu með ls að README.md og tools séu í listanum. |
Skilaboð segja að lykilinn vanti og forritið hættir.FS_BOT_TOKEN is missing or invalid | Þessi gluggi hefur engan lykil. Ef þú opnaðir nýjan glugga skaltu endurtaka skref 6. |
Skilaboð segja að lyklinum hafi verið hafnað og forritið stöðvast.Bot credential rejected | Lykillinn var límdur rangt inn eða er gamall. Eftir að þú gefur út nýjan lykil eða gerir vélmennið óvirkt virkar gamli lykillinn ekki lengur. Byrjaðu aftur á skrefi 6 með nýjasta lyklinum. |
Sama villulínan birtist aftur og aftur.Connection/state error | Athugaðu nettenginguna. Á macOS skaltu athuga hvort þú keyrðir Install Certificates.command úr skrefi 5. Ef hún birtist aðeins í skákum gæti þjónninn verið að hafna leik leikvélarinnar þinnar sem ólöglegum. Tengiforritið sendir sama leikinn aftur, svo það þarf að laga leikvélina. |
| Áskorunarhnappurinn virkar ekki, eða áskorunin er ekki samþykkt. | Bæði vélmennin verða að hafa grænan punkt. Athugaðu hvort vélmennið þitt sé valið í Spilandi vélmennið mitt. Vélmenni sem er þegar í annarri viðureign tekur ekki við nýrri áskorun. Áskorun sem er ekki samþykkt rennur út eftir 120 sekúndur. |
Vélmennið leikur ekki og tapar síðan á tíma, eða viðureignin ógildist.Engine failed for match | Leikvélin svaraði ekki í tæka tíð eða svar hennar var á röngu sniði. Athugaðu skipun leikvélarinnar og eins línu JSON-úttak hennar. Ef vélmenni leikur ekki fyrsta leik sínum innan 30 sekúndna frá upphafi ógildist viðureignin. |
| Engar áskoranir í afbrigðum berast. | Áskorunarglugginn sýnir aðeins leiki sem bæði vélmennin styðja. Athugaðu hvort hakað sé við leikinn í Studdir leikir hjá vélmenninu þínu og hvort hitt vélmennið styðji hann líka. Vélmenni sem er tengt í gegnum NBoard ætti aðeins að hafa Standard hakað. |
Orðskýringar
| Hugtak | Merking |
|---|---|
| API | Umsamin leið fyrir forrit til að senda beiðnir og svör. Tengiforritið sér um það fyrir þig. |
| Lykill | Lykilorð sem er aðeins fyrir vélmennið þitt. Tengiforritið notar það til að sanna fyrir þjóninum hvaða vélmenni það er. |
| Skipanagluggi | Gluggi þar sem þú slærð inn skipanir. Á Windows skaltu nota PowerShell. |
| Umhverfisbreyta | Tímabundin stilling sem er send til forrita sem ræst eru úr einum skipanaglugga. Hún hverfur þegar glugganum er lokað. |
| JSON | Snið til að skrifa gögn sem texta. Dæmi: {"move":19} |
| Leikvél | Forrit sem skoðar stöðu og velur leik. |
| Millistykki | Lítið forrit sem breytir gögnum milli leikvélarinnar þinnar og tengiforritsins. |
| NBoard | NBoard er grafískt Othello-forrit sem má nota með NTest. NBoard-samskiptareglan er opinber samskiptalýsing þess við leikjavélar og virkar með vélum sem styðja hana, eins og NTest og Edax. |
| Löglegur leikur | Reitur sem þú mátt leika á núna. Þjónninn telur þá upp í legal_moves. |
Niðurhal
Skráðu þig inn til að sækja. .zip inniheldur leiðbeiningar, tengiforrit og dæmivél; .json er API-lýsing og .md leiðbeiningar.
Nákvæm lýsing
Það sem eftir er af þessari síðu er nákvæm uppflettilýsing fyrir forritara sem vinna beint með leikvél eða API.
Valkostir tengiforrits
Valkostir fyrir tools/bot_match_client.py. Nákvæmlega einn af --engine og --nboard / --edax / --egaroucid er nauðsynlegur. Lykillinn er aldrei valkostur; hann er aðeins lesinn úr umhverfisbreytunni FS_BOT_TOKEN. Skilakóðar: 0 venjuleg stöðvun, 2 lykli hafnað, 3 --max-runtime náð.
| Viðföng | Lýsing |
|---|---|
--engine "COMMAND" | Ræsir skipunina einu sinni fyrir hverja skák og skiptist á einni JSON-línu í hverjum leik án þess að loka inntakinu. Vél sem svarar einni línu og hættir er ræst aftur í næsta leik. |
--nboard "COMMAND" | Heldur einni NBoard-leikvél fyrir hverja skák, tveimur alls. Aðeins venjulegt (std). |
--edax PATH | Edax má einnig tengja með aðeins slóð forritsins með --edax hér að neðan. Sérstakt millistykki þarf ekki; tengiforritið skiptir umhugsunartíma eftir tímanum sem er eftir í leiknum. |
--edax-eval PATH | Slóð að Edax eval.dat. Ef henni er sleppt er leitað að data/eval.dat í möppu forritsins eða yfirmöppu hennar. |
--egaroucid PATH | Undirbúðu Egaroucid for Console. Veldu skipanalínuforritið og hafðu resources-möppuna á sínum stað. Á macOS og Linux er notuð keyrsluskrá byggð samkvæmt opinberum leiðbeiningum. Staða og tími sem eftir er fara um setboard, settime og go án millistykkis. |
--nboard-depth N | Sendir set depth N til NBoard-leikvélarinnar. Frá 0 til 60; 0 heldur sjálfgildi leikvélarinnar. (--edax: 0 → 60). |
--max-think-seconds S | Hámarksfjöldi sekúndna sem beðið er eftir leikvélinni fyrir hvern leik. Sjálfgefið 10, hámark 300. Aldrei lengur en eftirstandandi tími á klukkunni að frádregnum 0,75 sekúndum. Þetta er öryggisþak tengiforritsins; þjónninn hefur engin tímamörk á hvern leik. Með 0 er hámark á hvern leik fjarlægt og eftirstandandi leiktími notaður. |
--engine-name NAME | Heiti leikvélar sem birtist í upplýsingum um vélmennið (120 stafir eða færri). Ekki setja inn skipanir eða slóðir. |
--cpu-name NAME | Heiti örgjörva sem á að tilgreina (120 stafir eða færri). Greint sjálfkrafa ef því er sleppt. |
--once-match ID | Sér aðeins um þessa viðureign og hættir þegar henni lýkur (lokið, ógild, útrunnin, hafnað). Neikvæð auðkenni skáka gegn manni virka líka. Í prófunum skaltu sameina það með --max-runtime. |
--max-runtime S | Gengur frá leikvélunum og hættir eftir þennan fjölda sekúndna (skilakóði 3). |
--no-stream | Notar ekki atburðastrauminn; sækir aðeins stöðuna reglulega. |
--api URL, --stream-url URL | Vefföng API og straums. Haltu venjulega sjálfgildunum. Aðeins HTTPS er samþykkt, og þar sem lykillinn er sendur með verður straumurinn að vera á API-hýslinum. |
Að útfæra API-ið sjálfur
Taktu við áskorunum og stöðum með agent_poll eða auðkenndum atburðastraumi. Sendu agent_accept fyrir áskoranir í bið þar sem þú ert bot_b, og reiknaðu síðan aðeins þær stöður þar sem þú átt leik í hvorri skák viðureignar sem er í gangi. Sendu í mesta lagi einu sinni fyrir hverja samsetningu match_id, skákar og revision, og hentu úreltri vinnu þegar staðan breytist. Skákir gegn manni nota neikvætt match_id og leg=0, og krefjast round_no og room_created_at nákvæmlega eins og þau bárust. Í venjulegum herbergjum sér þjónninn um þvinguð pass; aðeins vélmennapör senda pass.
agent_poll / bot-stream → pending (bot_b = my_id)
→ agent_accept → running → legs[0] + legs[1]
→ agent_move(match_id, leg, revision, move) → finished / abortedAfbrigði
Vélmenni fær aðeins þá leiki sem hakað er við í Studdir leikir. game_mode í beiðnum til leikvélar og í stöðu viðureignar segir þér hvaða leikur það er. Þjónninn reiknar borðstærð, lokaða reiti og löglega reiti, svo leikvélin þarf aðeins að velja úr legal_moves sem hún fær. Ekki búa til leiki fyrir 10×10 eða klassískt Reversi með leikjamyndun fyrir venjulegt 8×8.
| Leikur | game_mode | Borð | Upphafsskífur | Klukka (á skák, á lit) | Fyrstu legal_moves svarts |
|---|---|---|---|---|---|
| Standard | std | 8×8 | 12 skífur af handahófi | 60,000 ms | Fer eftir stöðunni |
| Anti | anti | 8×8 | 12 skífur af handahófi | 60,000 ms | Fer eftir stöðunni |
| Grand (10x10) | grand | 10×10 | 12 skífur af handahófi | 60,000 ms | Fer eftir stöðunni |
| Octagon | octagon | 10×10 (88) | 12 skífur af handahófi | 60,000 ms | Fer eftir stöðunni |
| Klassískt Reversi | reversi | 8×8 | 12 skífur af handahófi | 60,000 ms | Fer eftir stöðunni |
Sameiginlegar reglur: Svartur (1) leikur fyrst. Báðar skákirnar byrja í sömu stöðu með víxluðum litum og fara fram samtímis. Í vélmennapörum, þegar þú átt engan löglegan leik, berst legal_moves sem tómt fylki og vélmennið verður sjálft að senda move=-1 (pass). Þjónninn passar ekki fyrir þig og klukkan þín heldur áfram að ganga. Ólöglegt er að passa þegar löglegur leikur er til. Skák lýkur þegar hvorugur litur getur leikið. Tómir reitir eru ekki gefnir neinum; aðeins raunverulegar skífur eru lagðar saman yfir báðar skákir, og jafnar samtölur eru jafntefli. Allar viðureignir vélmenna hefjast í slembinni stöðu með 12 skífum. Í öllum leikjategundum hefur hvort vélmenni 1 mínútu í hvorri skák.
Anti: skífur eru lagðar og þeim snúið eins og í venjulegu Othello. Sá sem hefur færri skífur samanlagt í báðum skákum vinnur.
10x10: venjulegar reglur á 10×10 borði (100 reitir). Upphafsskífurnar eru á fjórum miðreitunum; vélmennapör bæta við 8 slembileikjum og byrja með 12 skífum.
Octagon: sama borð og upphafsuppstilling og í 10x10, en þrír reitir í hverju horni, 12 alls, eru ónothæfir (88 reitir í leik). Lokaðir reitir berast sem reitanúmer í blocked_squares og sem 0, sama gildi og tómt, í board. Fylkið er ekki í töluröð. Ekki er hægt að leika á lokaðan reit, og raðir skífa stöðvast þar.
Klassískt Reversi: samkvæmt reglunum byrjar það á tómu borði. Meðan einhver af fjórum miðreitunum (27, 28, 35, 36) er tómur leggurðu aðeins þar og engu er snúið. Þegar allir fjórir eru fylltir gilda venjulegar reglur. Hvor litur leggur í mesta lagi 32 skífur, að meðtöldum fyrstu fjórum leikjunum. placed telur skífurnar sem hvor litur hefur lagt hingað til; lyklar þess eru strengirnir "1" (svart) og "2" (hvítt). Vélmennapör byrja eftir að þjónninn hefur lagt 12 skífur af handahófi, að meðtöldum fjórum miðleikjunum, svo í fyrstu beiðninni er samtala beggja placed-gildanna 12 (oftast {"1":6,"2":6}). Litur sem hefur lagt allar 32 fær tómt legal_moves og sendir -1 í hvert sinn sem hann á leik.
Dæmi um beiðnir til leikvélar eftir leik
Dæmi um fyrstu beiðnina fyrir svart sem tengiforritið sendir --engine-leikvél, búin til með reglukóðanum. Raunverulegar skákir af öllum gerðum byrja í slembinni stöðu með 12 skífum, svo board og legal_moves eru ólík í hverri skák. Til að dæmin haldist óbreytt voru upphafsleikir þeirra valdir nálægt miðju borðsins. match_id og klukkugildin eru líka önnur í raunverulegum skákum.
Anti (anti)
{"board":[0,0,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,2,2,0,0,0,0,0,1,2,2,1,0,0,0,0,2,2,2,2,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0],"color":1,"legal_moves":[2,3,12,25,42,44,45],"game_mode":"anti","board_size":8,"blocked_squares":[],"placed":{"1":4,"2":4},"remaining_ms":60000,"match_id":123,"leg":0,"revision":0,"history":[],"round_no":null,"room_created_at":null,"budget_ms":10000}Grand (10x10) (grand)
{"board":[0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,2,2,0,0,0,0,0,0,0,1,2,2,1,0,0,0,0,0,0,2,2,2,2,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0],"color":1,"legal_moves":[13,14,25,42,63,65,66],"game_mode":"grand","board_size":10,"blocked_squares":[],"placed":{"1":4,"2":4},"remaining_ms":60000,"match_id":123,"leg":0,"revision":0,"history":[],"round_no":null,"room_created_at":null,"budget_ms":10000}Octagon (octagon)
{"board":[0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,2,2,0,0,0,0,0,0,0,1,2,2,1,0,0,0,0,0,0,2,2,2,2,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0],"color":1,"legal_moves":[13,14,25,42,63,65,66],"game_mode":"octagon","board_size":10,"blocked_squares":[0,1,10,8,9,19,80,90,91,89,98,99],"placed":{"1":4,"2":4},"remaining_ms":60000,"match_id":123,"leg":0,"revision":0,"history":[],"round_no":null,"room_created_at":null,"budget_ms":10000}Klassískt Reversi (reversi)
{"board":[0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,1,1,0,0,0,0,0,2,2,1,1,0,0,0,0,2,2,1,1,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0],"color":1,"legal_moves":[18,25,33,41,42,50,51],"game_mode":"reversi","board_size":8,"blocked_squares":[],"placed":{"1":6,"2":6},"remaining_ms":60000,"match_id":123,"leg":0,"revision":0,"history":[],"round_no":null,"room_created_at":null,"budget_ms":10000}Svið í beiðni til leikvélar
| Svið | Tegund | Lýsing |
|---|---|---|
game_mode | string | Eitt af std, anti, grand, octagon, reversi. XOT í skákum gegn manni berst sem std. |
board_size | integer 8 | 10 | 8, eða 10 fyrir grand og octagon. |
board | integer[board_size²] | Fylki af lengd board_size². Lesið frá a1 til hægri, síðan næsta röð. 0=tómt (þar með taldir lokaðir reitir í Octagon), 1=svart, 2=hvítt. |
blocked_squares | integer[] | Ónothæfir reitir í Octagon. Tómt fylki í öðrum leikjum. |
placed | {"1": integer, "2": integer} | Skífur sem hvor litur hefur lagt hingað til, að meðtöldum slembileikjunum í upphafi; lyklarnir eru strengirnir "1" og "2". Notað fyrir 32 skífa hámarkið í klassísku Reversi. |
legal_moves | integer[] | Reitir sem þú mátt leika á núna. Ef tómt, svaraðu move=-1. |
color | integer 1 | 2 | Liturinn sem á leik. 1=svart, 2=hvítt. |
budget_ms | integer | Tími leyfður fyrir þennan leik í millisekúndum: það minna af --max-think-seconds og eftirstandandi tíma á klukkunni að frádregnum 0,75 sekúndum. Tengiforritið stöðvar leikvélina þegar farið er yfir hann. |
remaining_ms | integer | Eftirstandandi tími á klukku þíns litar í þessari skák, í millisekúndum, eftir að tíminn sem þegar hefur verið notaður í þessari umferð hefur verið dreginn frá. |
match_id | integer ≠ 0 | Auðkenni viðureignar. Neikvætt (-herbergisnúmer) í skákum gegn manni. |
leg | integer 0 | 1 | Númer skákar, 0 eða 1. Alltaf 0 í skákum gegn manni. |
revision | integer | Stöðunúmer þessarar skákar. Sendu það óbreytt með agent_move. |
history | array | Leikir sem hafa verið leiknir í þessari skák. Byggðu ákvörðunina á board. |
round_no | integer | null | Umferðarnúmer skákar gegn manni. null fyrir vélmennapör. |
room_created_at | string | null | Stofntími leikherbergis skákar gegn manni. null fyrir vélmennapör. |
Að skora á annað vélmenni í afbrigði
Bættu game_mode við agent_challenge; sjálfgildið er std. Bæði vélmennin verða að hafa það í supported_games. Lestu leiki andstæðingsins úr bots[].supported_games í svari agent_poll. Ef annað hvort vélmennið vantar leikinn er svarið HTTP 409 með villunni hér fyrir neðan.
{"action":"agent_challenge","target_id":2,"game_mode":"anti"}
{"action":"agent_challenge","target_name":"Opponent","game_mode":"grand"}HTTP 409
{"ok":false,"error":"unsupported game mode","server_now_ms":1800000000000}Að breyta supported_games
Skráningarformið byrjar með Standard hakað, og eldri vélmenni án vistaðs lista styðja std. Þú getur aðeins breytt listanum í Stjórna á vélmennasíðunni á vefnum, aldrei með vélmennalyklinum (API). Breytingunni er hafnað meðan viðureign er í gangi eða bíður samþykkis. Ekki er hægt að vista tóman lista.
NBoard og afbrigði
--nboard-tenging styður aðeins venjulegt (std). Þegar afbrigði berst spyr tengiforritið ekki leikvélina og sleppir þeirri umferð (skilaboðin Engine failed for match). Enginn leikur er sendur, svo viðureignin ógildist fyrir fyrsta leik, eða sú skák tapast á tíma síðar. Láttu venjulegt vera eina studda leikinn hjá NBoard-vélmenni.
Fólk gegn skráðum vélmennum
Fólk getur skorað á vélmennið þitt í hvaða leik sem það hefur skráð. Ef það styður venjulegt geta bæði STD og XOT borist. XOT berst með game_mode std og byrjar á borði þar sem 8 leikir hafa þegar verið leiknir (þeir eru í history). Sá sem skorar á velur tímann, og skákin er ómetin. Viðureign gegn manni hefur eina skák (leg 0) og neikvætt match_id. Þjónninn sér um pass þegar enginn leikur er mögulegur, svo ekki senda -1. Skráð vélmenni á netinu með sjálfvirka pörun virka geta líka tekið þátt í studdum STD/XOT-hraðleikjum. Þeir telja til stiga hjá meðlimum en ekki gestum.
Ólöglegir leikir og tími
Ólöglegum leik eða úreltri revision er hafnað með HTTP 409 (illegal_move, stale_revision, not_your_turn) og borðið breytist ekki. Klukkan gengur á meðan. Tengiforritið sendir sama leikinn aftur með sömu revision, svo nema leikvélin sé löguð tapast sú skák á endanum á tíma. Þjónninn hefur engin mörk á hvern leik og athugar aðeins eftirstandandi tíma hvors litar. 10 sekúndurnar eru sjálfgildi tengiforritsins fyrir --max-think-seconds.
Auðkenning
Notaðu HTTPS, JSON POST og Authorization: Bearer. Lykillinn gildir fyrir eitt vélmenni. Settu hann ekki í vefslóðir, opinberan kóða eða annála.
Content-Type: application/json
Authorization: Bearer <FS_BOT_TOKEN>POST https://othelloclub.com/flipsight/bot_match_api.php
Leikreglur
Allar viðureignir vélmenna hefjast í slembinni stöðu með 12 skífum. Tveir leikir fara fram samtímis með víxluðum litum. Heildarfjöldi skífa ræður úrslitum; í Anti vinnur lægri talan.
Allar viðureignir vélmenna hefjast í slembinni stöðu með 12 skífum. Í öllum leikjategundum hefur hvort vélmenni 1 mínútu í hvorri skák.
Ef vélmenni hefur ekki leikið fyrsta leik sínum innan 30 sekúndna frá upphafi er viðureignin ógild og telur ekki til stiga. Ef tenging annars vélmennisins rofnar lengur en 30 sekúndur meðan á viðureigninni stendur og hitt er tengt vinnur tengda vélmennið (finish_reason: disconnect) og úrslitin telja til stiga.
Þjónninn reiknar leiki FlipSight-vélmennisins í öllum leikjategundum. Tekið er við áskorunum bæði á vefnum og í gegnum API (agent_challenge), og þjónninn hefur viðureignina strax, svo þú þarft ekki að hafa leikherbergið opið. Ef útreikningur þjónsins stöðvast í meira en 30 sekúndur er viðureignin ógilt (finish_reason: technical) og hefur ekki áhrif á stig. Afbrigði eru þung í útreikningi, svo mest 2 afbrigðaviðureignir gegn FlipSight-vélmennum eru í gangi í einu. Ef allt er fullt færðu HTTP 409 með site bot variant matches are full; reyndu aftur eftir smástund.
Sjálfvirkar vélmennaviðureignir: vefurinn heldur alltaf tveimur herbergjum fyrir vélmennaviðureignir gangandi. Á meðan skráð vélmenni með kveikt á sjálfvirkri pörun er tengt og ekki að keppa fær það áskorun um venjulega (std) vélmennaviðureign gegn vélmenni með svipuð stig (fyrst öðru skráðu vélmenni, annars FlipSight-vélmenni) sem bot_b. Tengiforritið samþykkir sjálfkrafa og viðureignin hefst. Ef vélmennið samþykkir ekki innan 120 sekúndna eða hafnar er því haldið utan sjálfvirkrar pörunar í 10 mínútur. Sjálfvirkar viðureignir hafa áhrif á stig. Sjálfvirkar vélmennaviðureignir halda áfram á meðan Arena-skákir eru í gangi. Kveikt er á sjálfvirkri pörun sjálfgefið og hægt er að slökkva á henni undir Stjórna á vélmennasíðunni. Vélmenni sem er ræst með æfingavélinni (environment.practice er true) er haldið utan sjálfvirkra viðureigna, og viðureignir þess við önnur vélmenni á meðan hafa ekki áhrif á stig.
Bein áskorun frá manni er einn leikur í venjulegu herbergi með studdum leik og tíma. Netþjónninn lætur beinar áskoranir aldrei hafa áhrif á styrkleikastig. Skráð vélmenni á netinu með sjálfvirka pörun virka geta líka tekið þátt í studdum STD/XOT-hraðleikjum. Þeir telja til stiga hjá meðlimum en ekki gestum. Skráð vélmenni tekur aðeins við jafn mörgum skákum og stillingin fyrir samtímis skákir leyfir (sjálfgefið 2). Skák við manneskju og viðureign vélmenna (tvö borð) teljast hvor um sig 1.
pending → running → finished / aborted
pending → rejected / expired
kind=human: id=-room_id, legs[0], round_no, room_created_at
agent_move: move=19 / "d3" / "D3" (8×8)
10×10: "j10" = "J0" = 99
pass: -1 / "pass" / "PA" / "PS" / "--" (paired games only)
index=row*board_size+column (0-based)Gangur viðureignar
Allar viðureignir vélmenna hefjast í slembinni stöðu með 12 skífum. Tveir leikir fara fram samtímis með víxluðum litum. Heildarfjöldi skífa ræður úrslitum; í Anti vinnur lægri talan.
Þátttakandanúmerið þitt er 0 ef þú ert bot_a og 1 ef þú ert bot_b. Þátttakandi 0 er svartur (1) í legs[0] og hvítur (2) í legs[1]; þátttakandi 1 öfugt. Þú átt leik þegar leg.status er active og leg.turn er liturinn þinn. Þú getur átt leik í báðum skákum í einu.
Ef þú átt engan löglegan leik verður þú sjálfur að senda move -1 (pass); þjónninn sleppir ekki fyrir þig. Í skákum gegn manni sér þjónninn um pass eins og í venjulegum leikherbergjum.
Þegar þú átt leik er eftirstandandi tími = clocks_ms[liturinn þinn - 1] - (server_now_ms - turn_started_ms). clocks_ms er í litaröð (svart, hvítt); totals og winner eru í röð þátttakenda (winner 0 eða 1, null við jafntefli).
Reitanúmer
Reitanúmer = röð × 8 + dálkur, svo a1=0, h1=7, a2=8 og h8=63. Til dæmis er 19 d3 og 37 f5. board-fylkið notar sömu röð, með 0=tómt, 1=svart, 2=hvítt.
a b c d e f g h
1 0 1 2 3 4 5 6 7
2 8 9 10 11 12 13 14 15
3 16 17 18 19 20 21 22 23
4 24 25 26 27 28 29 30 31
5 32 33 34 35 36 37 38 39
6 40 41 42 43 44 45 46 47
7 48 49 50 51 52 53 54 55
8 56 57 58 59 60 61 62 63Á 10×10 (grand, octagon) er reitur = röð × 10 + dálkur. Dálkarnir eru a til j, og tíunda röðin er skrifuð sem 10 eða 0 í hnitum. a1=0, j1=9, a2=10, j10=99 (sama og j0). Sama hnit hefur annað númer á hverri borðstærð: d3 er 19 á 8×8 og 23 á 10×10.
a b c d e f g h i j
1 0 1 2 3 4 5 6 7 8 9
2 10 11 12 13 14 15 16 17 18 19
3 20 21 22 23 24 25 26 27 28 29
4 30 31 32 33 34 35 36 37 38 39
5 40 41 42 43 44 45 46 47 48 49
6 50 51 52 53 54 55 56 57 58 59
7 60 61 62 63 64 65 66 67 68 69
8 70 71 72 73 74 75 76 77 78 79
9 80 81 82 83 84 85 86 87 88 89
10 90 91 92 93 94 95 96 97 98 99Octagon (octagon)
a b c d e f g h i j
1 ## ## 2 3 4 5 6 7 ## ##
2 ## 11 12 13 14 15 16 17 18 ##
3 20 21 22 23 24 25 26 27 28 29
4 30 31 32 33 34 35 36 37 38 39
5 40 41 42 43 44 45 46 47 48 49
6 50 51 52 53 54 55 56 57 58 59
7 60 61 62 63 64 65 66 67 68 69
8 70 71 72 73 74 75 76 77 78 79
9 ## 81 82 83 84 85 86 87 88 ##
10 ## ## 92 93 94 95 96 97 ## ##Atburðastraumur
Tengstu með sama Bearer-lykli við GET https://othelloclub.com/flipsight_api/bot-stream til að fá einn JSON-atburð í hverri línu (NDJSON): hello staðfestir tenginguna, match þýðir að ein af viðureignum þínum breyttist (atburðir milli vélmenna innihalda allan viðureignarhlutinn) og ping er viðhaldsmerki á 10 sekúndna fresti. Þegar þú færð match skaltu kalla einu sinni á agent_poll. Ef tengingin rofnar skaltu tengjast aftur með bið sem lengist úr 1 í 30 sekúndur og halda áfram að sækja stöðu á meðan. Meðan straumurinn er tengdur birtist vélmennið þitt sem tengt; hvert vélmenni getur opnað allt að 3 strauma.
Dæmi um atburði
curl -N 'https://othelloclub.com/flipsight_api/bot-stream' \
-H "Authorization: Bearer $FS_BOT_TOKEN"
{"type":"hello","bot_id":1,"server_now_ms":1800000000000}
{"type":"match","match":{"id":123,"bot_a":1,"bot_b":2,"status":"running","state":{...}},"server_now_ms":1800000000500}
{"type":"match","match":{"id":-45,"kind":"human","room_id":45},"server_now_ms":1800000003000}
{"type":"ping","server_now_ms":1800000010000}Leikvélarmillistykki
FlipSight-tengiforrit vélmenna (Python 3.9+, aðeins staðalsafn) keyrir á Windows, macOS og Linux og tengir vél á tvo vegu. --engine ræsir vélina einu sinni fyrir hverja skák, sendir eina JSON-línu fyrir hvern leik og les eina línu {"move": reitur}. Vél sem svarar einni línu og hættir virkar áfram því hún er ræst aftur í næsta leik, en vél sem les inntak til enda (sys.stdin.read() o.s.frv.) svarar aldrei, svo lestu eina línu í einu. legal_moves í beiðninni telur upp löglega reiti; ef listinn er tómur, svaraðu -1. --nboard heldur NBoard-vél gangandi, einni fyrir hverja skák; leitardýpt er stillt með --nboard-depth.
Edax má einnig tengja með aðeins slóð forritsins með --edax hér að neðan. Sérstakt millistykki þarf ekki; tengiforritið skiptir umhugsunartíma eftir tímanum sem er eftir í leiknum.
Undirbúðu Egaroucid for Console. Veldu skipanalínuforritið og hafðu resources-möppuna á sínum stað. Á macOS og Linux er notuð keyrsluskrá byggð samkvæmt opinberum leiðbeiningum. Staða og tími sem eftir er fara um setboard, settime og go án millistykkis.
Inntaks-JSON (tengiforrit → millistykki)
Þetta eru sýnigögn frá tengiforritinu, ekki keyranlegur kóði. Ekki vista þau sem Python-skrá. Meðan á leik stendur eru nýjustu gögn send sjálfkrafa í hverri umferð.
{"board":[0,0,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,2,2,0,0,0,0,0,1,2,2,1,0,0,0,0,2,2,2,2,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0],"color":1,"legal_moves":[2,3,12,25,42,44,45],"game_mode":"std","board_size":8,"blocked_squares":[],"placed":{"1":4,"2":4},"remaining_ms":40000,"match_id":123,"leg":1,"revision":0,"history":[],"round_no":null,"room_created_at":null,"budget_ms":10000}Svar-JSON (millistykki → tengiforrit)
{"move":2}Samstilling stöðu
Þegar straumurinn er tengdur skaltu kalla á agent_poll þegar atburður berst og á 10 sekúndna fresti. Án straums skaltu sækja á sekúndu fresti í viðureign og á 5 sekúndna fresti í bið, en aldrei oftar en einu sinni á sekúndu. Nettími dregst frá klukkunni þinni. Ef svar við leik týnist skaltu sækja nýja stöðu og senda sama leik aftur aðeins ef revision er óbreytt.
API-aðgerðir
Svardæmin sýna sniðið. Afritunarhnappurinn afritar aðeins beiðnina og kallar ekki á API.
POST agent_poll
Sækja stöðu
| Viðföng | Tegund | Nauðsynlegt | Lýsing |
|---|---|---|---|
action | string "agent_poll" | Nauðsynlegt | Heiti aðgerðarinnar sem kallað er á |
environment | object | Valfrjálst | Örgjörvi, stýrikerfi og heiti leikvélar á tengitölvunni (hvert allt að 120 stafir, valfrjálst) og practice (true eða false, valfrjálst). practice true þýðir að vélmennið er að æfa sig: því er haldið utan sjálfvirkra viðureigna og vélmennaviðureignir sem beðið er um eða samþykktar á meðan hafa ekki áhrif á stig. Tengiforritið sendir gildið sjálft þegar það er ræst með æfingavélinni. Þjónninn man síðasta gildið, svo sendu það án practice eða með false þegar æfingunni lýkur. |
Dæmi um beiðni
curl 'https://othelloclub.com/flipsight/bot_match_api.php' \
-H "Authorization: Bearer $FS_BOT_TOKEN" \
-H 'Content-Type: application/json' \
--data '{"action":"agent_poll","environment":{"cpu":"Apple M4","engine":"MyEngine","os":"Darwin"}}'Dæmi um svar
{
"ok": true,
"bots": [
{
"id": 1,
"name": "Opponent",
"owner_id": "example",
"owner_name": "Example",
"owner": {
"player_id": "example",
"name": "Example",
"photo": "/img/no_profile.gif",
"country_code": "",
"country_name": "",
"country_flag_url": "",
"donor": false,
"verified_player_id": ""
},
"engine_level": null,
"rating": {
"rating": 1200,
"rd": 300,
"official": false,
"official_progress": {
"kind": "provisional",
"current": 0,
"required": 50
},
"color": "pz-rating-unofficial",
"high_rating": 1200,
"wins": 0,
"losses": 0,
"draws": 0,
"streak": 0,
"best_streak": 0
},
"supported_games": ["std"],
"auto_match": true,
"bio": "",
"registered_at": "2026-11-12 18:00:00",
"registered_at_ts": 1794474000,
"environment": {
"cpu": "Apple M4",
"engine": "MyEngine",
"os": "Darwin",
"practice": false
},
"is_builtin": false,
"online": true,
"disabled": false,
"deleted": false,
"photo": "/flipsight/bot_match_api.php?action=photo&bot_id=1&v=1794474000000"
},
{
"id": 2,
"name": "MyBot",
"owner_id": "example",
"owner_name": "Example",
"owner": {
"player_id": "example",
"name": "Example",
"photo": "/img/no_profile.gif",
"country_code": "",
"country_name": "",
"country_flag_url": "",
"donor": false,
"verified_player_id": ""
},
"engine_level": null,
"rating": {
"rating": 1200,
"rd": 300,
"official": false,
"official_progress": {
"kind": "provisional",
"current": 0,
"required": 50
},
"color": "pz-rating-unofficial",
"high_rating": 1200,
"wins": 0,
"losses": 0,
"draws": 0,
"streak": 0,
"best_streak": 0
},
"supported_games": ["std", "anti"],
"auto_match": true,
"bio": "",
"registered_at": "2026-11-12 18:00:00",
"registered_at_ts": 1794474000,
"environment": {
"cpu": "Apple M4",
"engine": "MyEngine",
"os": "Darwin",
"practice": false
},
"is_builtin": false,
"online": true,
"disabled": false,
"deleted": false,
"photo": "/flipsight/bot_match_api.php?action=photo&bot_id=2&v=1794474000000"
}
],
"record_bots": [],
"matches": [
{
"id": 123,
"bot_a": 1,
"bot_b": 2,
"game_mode": "std",
"time_limit_sec": 60,
"status": "running",
"state": {
"version": 1,
"game_mode": "std",
"time_limit_sec": 60,
"status": "active",
"revision": 1,
"started_ms": 1799999980000,
"last_now_ms": 1799999984200,
"finished_ms": null,
"opening_moves": [19, 20, 29, 34, 26, 11, 43, 37],
"opening_history": [
{
"color": 1,
"move": 19
},
{
"color": 2,
"move": 20
},
{
"color": 1,
"move": 29
},
{
"color": 2,
"move": 34
},
{
"color": 1,
"move": 26
},
{
"color": 2,
"move": 11
},
{
"color": 1,
"move": 43
},
{
"color": 2,
"move": 37
}
],
"legs": [
{
"board": [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 2, 2, 0, 0, 0, 0, 0, 1, 2, 2, 1, 0, 0, 0, 0, 2, 1, 2, 2, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0],
"turn": 2,
"black_participant": 0,
"placed": {
"1": 5,
"2": 4
},
"clocks_ms": [55800, 60000],
"turn_started_ms": 1799999984200,
"revision": 1,
"history": [
{
"color": 1,
"participant": 0,
"move": 44,
"at_ms": 1799999984200
}
],
"status": "active",
"discs": [5, 8],
"finished_ms": null,
"legal_moves": [18, 21, 22, 25, 30, 33, 38, 42, 50, 51, 52]
},
{
"board": [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 2, 2, 0, 0, 0, 0, 0, 1, 2, 2, 1, 0, 0, 0, 0, 2, 2, 2, 2, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0],
"turn": 1,
"black_participant": 1,
"placed": {
"1": 4,
"2": 4
},
"clocks_ms": [60000, 60000],
"turn_started_ms": 1799999980000,
"revision": 0,
"history": [],
"status": "active",
"discs": [3, 9],
"finished_ms": null,
"legal_moves": [2, 3, 12, 25, 42, 44, 45]
}
],
"totals": [14, 11],
"winner": null,
"finish_reason": null,
"board_size": 8,
"blocked_squares": []
},
"auto": false,
"expires_ms": 1800000080000,
"ranked": true,
"rating_applied": false,
"rating_before": [null, null],
"rating_after": [null, null],
"created_at": "2026-11-12 19:00:00"
}
],
"me": "example",
"bot": {
"id": 2,
"name": "MyBot",
"owner_id": "example",
"owner_name": "Example",
"owner": {
"player_id": "example",
"name": "Example",
"photo": "/img/no_profile.gif",
"country_code": "",
"country_name": "",
"country_flag_url": "",
"donor": false,
"verified_player_id": ""
},
"engine_level": null,
"rating": {
"rating": 1200,
"rd": 300,
"official": false,
"official_progress": {
"kind": "provisional",
"current": 0,
"required": 50
},
"color": "pz-rating-unofficial",
"high_rating": 1200,
"wins": 0,
"losses": 0,
"draws": 0,
"streak": 0,
"best_streak": 0
},
"supported_games": ["std", "anti"],
"auto_match": true,
"bio": "",
"registered_at": "2026-11-12 18:00:00",
"registered_at_ts": 1794474000,
"environment": {
"cpu": "Apple M4",
"engine": "MyEngine",
"os": "Darwin",
"practice": false
},
"is_builtin": false,
"online": true,
"disabled": false,
"deleted": false,
"photo": "/flipsight/bot_match_api.php?action=photo&bot_id=2&v=1794474000000"
},
"server_now_ms": 1800000000000
}Viðureignarhlutur (matches[])
| Svið | Tegund | Lýsing |
|---|---|---|
id | integer | Auðkenni viðureignar (neikvætt í skákum gegn manni) |
kind | string | human í skákum gegn manni |
bot_a | integer | Auðkenni vélmennis þátttakanda 0 (0 fyrir mann) |
bot_b | integer | Auðkenni vélmennis þátttakanda 1 (0 fyrir mann) |
game_mode | string | Leikur (std, anti, grand, octagon, reversi) |
time_limit_sec | integer | Sekúndur á skák, á lit |
status | string | pending, running, finished, aborted, rejected, expired |
expires_ms | integer | Frestur til samþykkis (millisekúndur) |
ranked | boolean | Hvort viðureignin telur til stiga |
state.status | string | active, finished eða aborted |
state.game_mode | string | Leikur (std, anti, grand, octagon, reversi) |
state.board_size | integer 8 | 10 | Reitir á hverri hlið, 8 eða 10 |
state.blocked_squares | integer[] | Ónothæfir reitir (aðeins Octagon, óraðað) |
state.legs | array | Skákir (2 milli vélmenna, 1 gegn manni) |
state.totals | [integer, integer] | Samanlagðar skífur beggja skáka fyrir hvern þátttakanda |
state.winner | integer | null | Sigrandi þátttakandi 0 eða 1, null við jafntefli |
state.finish_reason | string | null | discs, timeout, double_timeout, disconnect, no_first_move |
Skákarhlutur (state.legs[])
| Svið | Tegund | Lýsing |
|---|---|---|
board | integer[64 | 100] | 64 / 100 reitir, 0=tómt 1=svart 2=hvítt |
turn | integer | Litur sem á leik, 1 (svart) eða 2 (hvítt) |
legal_moves | integer[] | Löglegir reitir fyrir litinn sem á leik. Tómt í skákum sem er lokið |
placed | {"1": integer, "2": integer} | Lagðar skífur eftir lit, lyklar "1" (svart) og "2" (hvítt) |
black_participant | integer | Þátttakandi sem leikur svörtu í þessari skák |
clocks_ms | [number, number] | Grunngildi eftirstandandi tíma í litaröð (svart, hvítt) |
turn_started_ms | integer | Tími þjóns þegar núverandi umferð hófst |
revision | integer | Hækkar um 1 í hvert sinn sem þessi skák breytist |
status | string | active, finished, timeout, stopped |
history | array | Leiknir leikir (color, participant, move, at_ms) |
discs | [integer, integer] | Fjöldi skífa í litaröð (svart, hvítt) |
result_discs | [integer, integer] (optional) | Valfrjáls úrskurðuð staða [svart, hvítt] fyrir skák sem tapaðist á tíma; hún er lögð saman í stað skífa. Stig þeirrar hliðar sem féll á tíma og andstæðings hennar: std og reversi 0 og 64, grand 0 og 100, octagon 0 og 88, anti 64 og 0. Hin skákin heldur áfram og samtölurnar ráða sigurvegaranum þegar báðum skákum er lokið. Eldri færslur sem er lokið eru ekki endurreiknaðar. |
POST agent_challenge
Skora á
Tilgreindu target_id (númer vélmennis) eða target_name (heiti vélmennis), sem eru í listanum bots í svari agent_poll. Skora má á innbyggð FlipSight-vélmenni (is_builtin: true) í gegnum API í öllum leikjategundum og þjónninn hefur viðureignina strax. Ef 2 afbrigðaviðureignir gegn innbyggðum vélmennum eru þegar í gangi færðu HTTP 409 með site bot variant matches are full.
| Viðföng | Tegund | Nauðsynlegt | Lýsing |
|---|---|---|---|
action | string "agent_challenge" | Nauðsynlegt | Heiti aðgerðarinnar sem kallað er á |
target_id | integer ≥ 1 | Valfrjálst | Auðkenni vélmennisins sem skorað er á |
target_name | string | Valfrjálst | Nafn vélmennisins sem skorað er á (í stað target_id) |
game_mode | string std | anti | octagon | grand | reversi | Valfrjálst | Leikur fyrir vélmennapar. Sjálfgefið std. Bæði vélmennin verða að styðja hann. Standard / Anti / Octagon / Grand (10x10) / Klassískt Reversi |
Dæmi um beiðni
curl 'https://othelloclub.com/flipsight/bot_match_api.php' \
-H "Authorization: Bearer $FS_BOT_TOKEN" \
-H 'Content-Type: application/json' \
--data '{"action":"agent_challenge","target_id":2,"game_mode":"anti"}'Dæmi um svar
{
"ok": true,
"match_id": 123,
"server_now_ms": 1800000000000
}POST agent_accept
Samþykkja
| Viðföng | Tegund | Nauðsynlegt | Lýsing |
|---|---|---|---|
action | string "agent_accept" | Nauðsynlegt | Heiti aðgerðarinnar sem kallað er á |
match_id | integer ≥ 1 | Nauðsynlegt | Auðkenni viðureignar (neikvætt í skákum gegn manni) |
Dæmi um beiðni
curl 'https://othelloclub.com/flipsight/bot_match_api.php' \
-H "Authorization: Bearer $FS_BOT_TOKEN" \
-H 'Content-Type: application/json' \
--data '{"action":"agent_accept","match_id":123}'Dæmi um svar
{
"ok": true,
"match": {
"id": 123,
"status": "running",
"bot_a": 1,
"bot_b": 2
},
"server_now_ms": 1800000000000
}POST agent_reject
Hafna
| Viðföng | Tegund | Nauðsynlegt | Lýsing |
|---|---|---|---|
action | string "agent_reject" | Nauðsynlegt | Heiti aðgerðarinnar sem kallað er á |
match_id | integer ≥ 1 | Nauðsynlegt | Auðkenni viðureignar (neikvætt í skákum gegn manni) |
Dæmi um beiðni
curl 'https://othelloclub.com/flipsight/bot_match_api.php' \
-H "Authorization: Bearer $FS_BOT_TOKEN" \
-H 'Content-Type: application/json' \
--data '{"action":"agent_reject","match_id":123}'Dæmi um svar
{
"ok": true,
"match": {
"id": 123,
"status": "rejected",
"bot_a": 1,
"bot_b": 2
},
"server_now_ms": 1800000000000
}POST agent_move
Senda leik
| Viðföng | Tegund | Nauðsynlegt | Lýsing |
|---|---|---|---|
action | string "agent_move" | Nauðsynlegt | Heiti aðgerðarinnar sem kallað er á |
match_id | integer ≠ 0 | Nauðsynlegt | Auðkenni viðureignar (neikvætt í skákum gegn manni) |
round_no | integer ≥ 0 | Valfrjálst | Aðeins í skákum gegn manni: round_no úr viðureignarhlutnum |
room_created_at | string | Valfrjálst | Aðeins í skákum gegn manni: room_created_at úr viðureignarhlutnum |
leg | integer 0 | 1 | Nauðsynlegt | Skák 0 eða 1 (0 í skákum gegn manni) |
revision | integer ≥ 0 | Nauðsynlegt | revision skákarinnar sem leikurinn var reiknaður fyrir; 409 stale_revision ef skákin hefur breyst |
move | integer -1..99 | string | Nauðsynlegt | Reitur 0-(board_size²−1), -1 fyrir pass / d3 / D3 / pass |
Dæmi um beiðni
curl 'https://othelloclub.com/flipsight/bot_match_api.php' \
-H "Authorization: Bearer $FS_BOT_TOKEN" \
-H 'Content-Type: application/json' \
--data '{"action":"agent_move","match_id":123,"leg":1,"revision":0,"move":2}'Dæmi um svar
{
"ok": true,
"match": {
"id": 123,
"status": "running",
"bot_a": 1,
"bot_b": 2
},
"server_now_ms": 1800000000000
}Villur
Villur líta svona út: {"ok": false, "error": "…"}. Við 401: stöðva og athuga lykil. Við 409: sækja núverandi stöðu og athuga umferð, revision og löglega leiki. 429 þýðir of marga strauma fyrir eitt vélmenni. Reyndu aftur við tengivillur og 503 með vaxandi bið og sendu aldrei ólöglegan leik aftur.
{"ok":false,"error":"stale_revision","server_now_ms":1800000000000}| HTTP | error |
|---|---|
| 400 | JSON object required / unknown action |
| 401 | invalid bot credential |
| 403 | access denied / invalid csrf |
| 405 | POST required |
| 409 | stale_revision / not_your_turn / illegal_move / leg_finished / match not running / match timed out / stale room revision / invalid move coordinate / move outside board / unsupported game mode / both bots must be connected / bot already has an active match / bot busy / challenge expired or answered / site bot variant matches are full / target bot not found |
| 413 | request too large |
| 429 | too many streams (bot-stream) |
| 503 | bot match storage unavailable |