Date: Tue, 4 Oct 2016 21:13:31 +0200
Subject: [PATCH 132/144] specs fr
---
countBattles.txt | 2 +-
src/arenas/tron/TronGame.php | 4 +-
src/arenas/tron/doc-fr.html | 75 ++++++++++++++++++++++++++++++++++++
src/arenas/tron/style.css | 5 +++
4 files changed, 84 insertions(+), 2 deletions(-)
diff --git a/countBattles.txt b/countBattles.txt
index f350689..07c5b74 100755
--- a/countBattles.txt
+++ b/countBattles.txt
@@ -1 +1 @@
-1677
\ No newline at end of file
+1681
\ No newline at end of file
diff --git a/src/arenas/tron/TronGame.php b/src/arenas/tron/TronGame.php
index c002205..660cb8c 100755
--- a/src/arenas/tron/TronGame.php
+++ b/src/arenas/tron/TronGame.php
@@ -175,7 +175,9 @@ class TronGame
for ($i = 0; $i < count($iasUrls); $i++){
if(isset($postParams[$i])){ //dont use already deads bots
$data_string = json_encode($postParams[$i]);
-
+
+ error_log($data_string);
+
$ch[$i] = curl_init($iasUrls[$i]);
curl_setopt($ch[$i], CURLOPT_CUSTOMREQUEST, "POST");
curl_setopt($ch[$i], CURLOPT_SSL_VERIFYHOST, false);
diff --git a/src/arenas/tron/doc-fr.html b/src/arenas/tron/doc-fr.html
index e69de29..f3ceb05 100755
--- a/src/arenas/tron/doc-fr.html
+++ b/src/arenas/tron/doc-fr.html
@@ -0,0 +1,75 @@
+Fonctionnement des combats de Tron
+Règles du jeu (hors specs techniques)
+Chaque bot démarre depuis une case choisie au hazard par l'arène.
+A chaque tour, il est demandé aux bots de grandir d'une case. Il peut choisir la direction. Sa queue s'allonge.
+Si un bot percute une case déjà prise par sa queue ou celle d'un autre, il perd.
+Ce n'est pas du tour par tour, les bots jouent simultanément, ils peuvent donc perdre en choisissant la même case de destination qu'un autre serpent
+Exemple:
+
+9 | | | | | | | | | |
+8 | | | | | | | | | |
+7 | | | | | | | | | |
+6 | | | | | | | | | |
+5 | | | | | | | | | |
+4 | | | oO | | oO | | | | |
+3 | | | | | | | | | |
+2 | | | | | | | | | |
+1 | | | | | | | | | |
+0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 |
+
+Si dans le même tour le serpent vert et le serpent rouge décident d'aller respectivement vers la gauche et vers la droite, ils vont se télescopper et perdre tous les deux.
+
+9 | | | | | | | | | |
+8 | | | | | | | | | |
+7 | | | | | | | | | |
+6 | | | | | | | | | |
+5 | | | | | | | | | |
+4 | | | | ): :( | | | | | |
+3 | | | | | | | | | |
+2 | | | | | | | | | |
+1 | | | | | | | | | |
+0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 |
+
+Lorsqu'un serpent meurt, (lorsqu'un bot perd) Sa queue est effacée et les cases prises par cette dernière devienent libres pour les serpents encore en vie.
+Le jeu prend fin lorsqu'il reste moins de deux serpents.
+La grille
+
+ - largeur: 1000 cases
+ - hauteur: 1000 cases
+
+
+Communications entre l'arène et les bots
+L'arène fait emet des requetes http(s) à destination des bots.
+
+ - Type: POST
+ - informations: au format JSON dans le corps de la requetes
+
+
+Initialisation de la partie
+L'arène (ce site) envoie le message (exemple) suivant à votre bot:
+
+{"game-id":"1679","action":"init","game":"tron","board":"","players":4,"player-index":2}
+
+
+ - game-id String Identifiant unique de la partie. Votre bot peut être emmené à jouer plusieurs parties en simultané. Si le fonctionnement de votre bot nécessite de suivre / conserver des valeurs entre deux tours dfe l'arène, cet identifiant vous sera utile.
+ - action String, peut prendre les valeurs init ou play-turn, mais à cette étape, c'est init
+ - game String, sera toujours "tron" ici. Peut vous servir si vous utilisez la même URL pour plusieurs bots.
+ - board Sera vide à cette étape
+ - players Entier Vous indique le nombre de joueurs sur cette partie. Il est possible que votre bot "joue" plusieurs joueurs. Et si vous les faisiez collaborer en ce cas là?
+ - player-index Entier Le numéro de votre bot. Le premier bot a le numéro 0. Vous gardez le même numéro durant toute la partie, même si des joueurs sont déjà morts
+
+
+Votre bot doit répondre par un tableau au format json, comme ceci:
+
+{"name":"botName"}
+
+L'arène ne vérifie pas actuellement cette réponse, l'étape d'init a été insérée pour assurer la compatibilité avec Bolosseum.
+ Si votre bot repond une page blanche à cette étape (action=init), ça marchera dans le cadre de botsarena.
+
+Tours de jeu
+Exemple de message envoyé par l'arène au premier tour de jeu:
+
+Exemple de message envoyé par l'arène après quelques tours de jeu:
+
+{"game-id":"1680","action":"play-turn","game":"tron","board":[[[687,110],[687,111],[686,111],[686,110],[686,109],[686,108],[686,107],[685,107],[685,108],[685,109],[684,109],[684,110],[684,111],[684,112],[684,113],[683,113],[682,113],[681,113],[681,114],[681,115],[681,116],[680,116],[680,117],[679,117],[679,116],[679,115],[679,114],[679,113],[679,112],[679,111],[679,110],[679,109],[678,109],[678,108],[677,108],[676,108],[676,107],[676,106],[676,105],[676,104],[676,103],[675,103],[674,103],[674,102],[673,102],[672,102],[672,101],[671,101],[670,101],[669,101],[669,102],[669,103],[669,104],[669,105],[669,106],[669,107],[668,107],[668,108],[668,109],[668,110],[668,111],[668,112],[667,112],[667,111],[667,110],[666,110],[666,109],[666,108],[665,108],[664,108],[664,107],[664,106],[663,106],[663,107],[663,108],[662,108],[661,108],[660,108],[660,107],[659,107],[659,106],[658,106],[657,106],[657,105],[657,104],[656,104],[656,103],[655,103],[655,102],[655,101],[654,101],[654,102],[654,103],[654,104],[653,104],[653,103],[653,102],[653,101],[653,100],[652,100],[651,100],[651,101],[651,102],[651,103],[651,104],[650,104],[650,105],[650,106],[649,106],[649,105],[648,105]],[[100,225],[100,226],[100,227],[100,228],[100,229],[100,230],[100,231],[99,231],[98,231],[98,232],[97,232],[96,232],[96,231],[96,230],[96,229],[96,228],[96,227],[96,226],[96,225],[96,224],[96,223],[95,223],[95,222],[94,222],[94,221],[94,220],[93,220],[92,220],[92,219],[92,218],[92,217],[92,216],[92,215],[91,215],[91,214],[90,214],[89,214],[89,213],[89,212],[88,212],[88,213],[88,214],[87,214],[87,213],[86,213],[86,214],[86,215],[85,215],[85,214],[84,214],[84,215],[83,215],[83,216],[83,217],[82,217],[82,216],[81,216],[81,215],[80,215],[80,216],[79,216],[79,215],[79,214],[78,214],[77,214],[77,213],[77,212],[76,212],[75,212],[75,211],[75,210],[75,209],[74,209],[74,210],[74,211],[73,211],[73,210],[72,210],[72,209],[71,209],[71,210],[70,210],[70,209],[69,209],[68,209],[68,210],[68,211],[67,211],[67,210],[67,209],[67,208],[66,208],[66,207],[66,206],[66,205],[66,204],[66,203],[65,203],[65,204],[64,204],[64,203],[63,203],[63,204],[63,205],[63,206],[62,206],[61,206],[61,207],[60,207],[60,208],[59,208]]],"player-index":0,"players":2}
+
\ No newline at end of file
diff --git a/src/arenas/tron/style.css b/src/arenas/tron/style.css
index eac3e3a..c848e32 100755
--- a/src/arenas/tron/style.css
+++ b/src/arenas/tron/style.css
@@ -1,3 +1,8 @@
+.tabledoc{border-collapse:collapse;}
+.tabledoc tr td,.tabledoc tr th{border: 1px solid green; padding-left: 5px;width: 20px; height: 20px;}
+.green{background-color: green;}
+.red{background-color: red;}
+.brown{background-color: grey;}
#configurePlayers{width: 100%;}
#configurePlayers fieldset{display: block; width: 100px; float:left;}
#logs{display:block;padding-left:10px; height: 200px; overflow-y: scroll;}
From db1dc561e5f93c4dc06e8aa69ca91ac0589b8a1f Mon Sep 17 00:00:00 2001
From: Gnieark
Date: Wed, 12 Oct 2016 18:53:43 +0200
Subject: [PATCH 133/144] doc
---
countBattles.txt | 2 +-
src/arenas/tron/TronPlayer.php | 2 +-
src/arenas/tron/act.php | 2 +-
src/arenas/tron/doc-fr.html | 71 +++++++++++++++++++++++++++++++++-
src/arenas/tron/js.js | 43 ++++++++++++++++----
src/arenas/tron/style.css | 3 +-
6 files changed, 111 insertions(+), 12 deletions(-)
diff --git a/countBattles.txt b/countBattles.txt
index 07c5b74..870e31e 100755
--- a/countBattles.txt
+++ b/countBattles.txt
@@ -1 +1 @@
-1681
\ No newline at end of file
+1697
\ No newline at end of file
diff --git a/src/arenas/tron/TronPlayer.php b/src/arenas/tron/TronPlayer.php
index e1ce1de..de123e1 100755
--- a/src/arenas/tron/TronPlayer.php
+++ b/src/arenas/tron/TronPlayer.php
@@ -20,7 +20,7 @@ class TronPlayer{
public function loose(){
$this->isAlive = false;
$this->trail->emptyTrail();
- error_log($this->name." a perdu");
+ //error_log($this->name." a perdu");
return false;
}
public function make($botId, Coords $initialsCoords,$name,$url){
diff --git a/src/arenas/tron/act.php b/src/arenas/tron/act.php
index 7fffca6..374ca48 100755
--- a/src/arenas/tron/act.php
+++ b/src/arenas/tron/act.php
@@ -3,7 +3,7 @@
#
# This file is part of botsArena.
#
-# Copyright (C) Gnieark et contributeurs
+# Copyright (C) Gnieark https://blog-du-grouik.tinad.fr et contributeurs
# Licensed under the GPL version 3.0 license.
# See LICENSE file or
# http://www.gnu.org/licenses/gpl-3.0-standalone.html
diff --git a/src/arenas/tron/doc-fr.html b/src/arenas/tron/doc-fr.html
index f3ceb05..2231cfb 100755
--- a/src/arenas/tron/doc-fr.html
+++ b/src/arenas/tron/doc-fr.html
@@ -72,4 +72,73 @@
Exemple de message envoyé par l'arène après quelques tours de jeu:
{"game-id":"1680","action":"play-turn","game":"tron","board":[[[687,110],[687,111],[686,111],[686,110],[686,109],[686,108],[686,107],[685,107],[685,108],[685,109],[684,109],[684,110],[684,111],[684,112],[684,113],[683,113],[682,113],[681,113],[681,114],[681,115],[681,116],[680,116],[680,117],[679,117],[679,116],[679,115],[679,114],[679,113],[679,112],[679,111],[679,110],[679,109],[678,109],[678,108],[677,108],[676,108],[676,107],[676,106],[676,105],[676,104],[676,103],[675,103],[674,103],[674,102],[673,102],[672,102],[672,101],[671,101],[670,101],[669,101],[669,102],[669,103],[669,104],[669,105],[669,106],[669,107],[668,107],[668,108],[668,109],[668,110],[668,111],[668,112],[667,112],[667,111],[667,110],[666,110],[666,109],[666,108],[665,108],[664,108],[664,107],[664,106],[663,106],[663,107],[663,108],[662,108],[661,108],[660,108],[660,107],[659,107],[659,106],[658,106],[657,106],[657,105],[657,104],[656,104],[656,103],[655,103],[655,102],[655,101],[654,101],[654,102],[654,103],[654,104],[653,104],[653,103],[653,102],[653,101],[653,100],[652,100],[651,100],[651,101],[651,102],[651,103],[651,104],[650,104],[650,105],[650,106],[649,106],[649,105],[648,105]],[[100,225],[100,226],[100,227],[100,228],[100,229],[100,230],[100,231],[99,231],[98,231],[98,232],[97,232],[96,232],[96,231],[96,230],[96,229],[96,228],[96,227],[96,226],[96,225],[96,224],[96,223],[95,223],[95,222],[94,222],[94,221],[94,220],[93,220],[92,220],[92,219],[92,218],[92,217],[92,216],[92,215],[91,215],[91,214],[90,214],[89,214],[89,213],[89,212],[88,212],[88,213],[88,214],[87,214],[87,213],[86,213],[86,214],[86,215],[85,215],[85,214],[84,214],[84,215],[83,215],[83,216],[83,217],[82,217],[82,216],[81,216],[81,215],[80,215],[80,216],[79,216],[79,215],[79,214],[78,214],[77,214],[77,213],[77,212],[76,212],[75,212],[75,211],[75,210],[75,209],[74,209],[74,210],[74,211],[73,211],[73,210],[72,210],[72,209],[71,209],[71,210],[70,210],[70,209],[69,209],[68,209],[68,210],[68,211],[67,211],[67,210],[67,209],[67,208],[66,208],[66,207],[66,206],[66,205],[66,204],[66,203],[65,203],[65,204],[64,204],[64,203],[63,203],[63,204],[63,205],[63,206],[62,206],[61,206],[61,207],[60,207],[60,208],[59,208]]],"player-index":0,"players":2}
-
\ No newline at end of file
+
+Les champs suivants sont les mêmes qu'au paragraphe précédent:
+
+- game-id
+- game
+- players
+- player-index
+
+
+Les champs qui différent sont:
+
+ - actionString, est toujours "play-turn" à cette étape
+ - boardJe vous explique ça au chapitre suivant.
+
+La Carte (board)
+Elle est repésentée dans le champs "board" du JSON envoyé par l'arène. Elle décrit les cases prises par chaque joueur.
+ Elle est composée de plusieurs sous-arrays/sous-objets (en fonction de votre language de programmation). Elle se décompose en sous tableaux de la forme suivante:
+
+ - Board:
+
+ - Joueur 1
+
+ - Case1
+
+ - coordonée X
+ - Coordonée Y
+
+
+ - Case2
+
+ - coordonée X
+ - Coordonée Y
+
+
+
+
+ - Joueur 2>
+
+ - Case1
+
+ - coordonée X
+ - Coordonée Y
+
+
+ - Case2
+
+ - coordonée X
+ - Coordonée Y
+
+
+
+
+
+ - ...
+
+
+ La représentation JSON est la suivante:
+
+
+[
+ [
+ [x1,y1],[x2,y2],[x3,y3]
+ ],
+ [
+ (...)
+ ]
+
+L'ordre des "queues" des serpents dans ce tableau correspond à l'ordre des joueurs. Donc votre serpent est representée par la queue correspondant à player-index (le décompte de player-index commence par 0).
+L'ordre des couples de coordonnées de chaque bot, est dans le sens queue vers la tête. Les bots grandissent à chaque tour en déplaçant leur tête.
diff --git a/src/arenas/tron/js.js b/src/arenas/tron/js.js
index 9cde497..826b72c 100755
--- a/src/arenas/tron/js.js
+++ b/src/arenas/tron/js.js
@@ -84,16 +84,30 @@ function applyInitMessage(req,xd_check){
function drawMap(map){
- console.log(map);
+ //console.log(map);
var botsColor = ['cyan','darkmagenta','darkred','darkslategrey','deeppink','dodgerblue','goldenrod','grey','indigo','lightgreen','mediumslateblue','midnightblue'];
- for (var botId in map){
- //draw the point
- var rect=createElemNS('rect',{'x':map[botId]['x'],'y':map[botId]['y'],'width':'2','height':'2','style':'fill:' + botsColor[botId] + ';'});
- document.getElementById('map').appendChild(rect);
+ for (var botId in map){
+ if(typeof(map[botId]['x']) != 'undefined'){ //don't draw deads bots
+ //draw the point
+ var rect=createElemNS('rect',{'x':map[botId]['x'],'y':map[botId]['y'],'width':'2','height':'2','style':'fill:' + botsColor[botId] + ';'});
+ document.getElementById('map').appendChild(rect);
+ }
}
}
-
+function delTrail(order){
+ var botsColor = ['cyan','darkmagenta','darkred','darkslategrey','deeppink','dodgerblue','goldenrod','grey','indigo','lightgreen','mediumslateblue','midnightblue'];
+ //on supprime tous les elements ayant la couleur correspndante.
+
+ var container = document.getElementById('map');
+
+ var listNode = container.children;
+ for (var i= 0; i < listNode.length; i++){
+ if( listNode[i].style.fill == botsColor[order] ){
+ container.removeChild(listNode[i]);
+ }
+ }
+}
function play(gameId,xd_check){
var req = new XMLHttpRequest();
@@ -101,7 +115,22 @@ function play(gameId,xd_check){
if(req.readyState == 4){
if(req.status == 200) {
//addLog(req.responseText);
- var reponse = JSON.parse(req.responseText);
+ var reponse = JSON.parse(req.responseText);
+
+ //to do Effacer les bots perdants
+ for(var i=0; i < reponse['lap']['loosers'].length; i++){
+ //alert (req.responseText);
+ //return;
+ delTrail(reponse['lap']['loosers'][i]['order']);
+
+ //find the bot name
+ for (var j = 0; j < botsAvailable.length; j ++){
+ if(botsAvailable[j]['id'] == reponse['lap']['loosers'][i]['order']){
+ var botName = botsAvailable[j]['name'];
+ }
+ }
+ addLog("Bot " + reponse['lap']['loosers'][i]['order'] + "id " + reponse['lap']['loosers'][i]['id'] + " Name: " + botName + " a perdu.");
+ }
drawMap(reponse['lap']['last_points']);
if(reponse['continue'] == '1'){
diff --git a/src/arenas/tron/style.css b/src/arenas/tron/style.css
index c848e32..b307116 100755
--- a/src/arenas/tron/style.css
+++ b/src/arenas/tron/style.css
@@ -6,4 +6,5 @@
#configurePlayers{width: 100%;}
#configurePlayers fieldset{display: block; width: 100px; float:left;}
#logs{display:block;padding-left:10px; height: 200px; overflow-y: scroll;}
-#logs p em {color: grey; font-size: 70%; test-transform:italic;}
\ No newline at end of file
+#logs p em {color: grey; font-size: 70%; test-transform:italic;}
+code{font-family: monospace;}
\ No newline at end of file
From 3b4957398871466f6d461b9479df9d7e7c7b6f74 Mon Sep 17 00:00:00 2001
From: Gnieark
Date: Wed, 12 Oct 2016 19:24:24 +0200
Subject: [PATCH 134/144] fixes
---
countBattles.txt | 2 +-
src/arenas/tron/TronGame.php | 16 +++++++++-------
src/arenas/tron/act.php | 1 +
3 files changed, 11 insertions(+), 8 deletions(-)
diff --git a/countBattles.txt b/countBattles.txt
index 870e31e..9b21444 100755
--- a/countBattles.txt
+++ b/countBattles.txt
@@ -1 +1 @@
-1697
\ No newline at end of file
+1703
\ No newline at end of file
diff --git a/src/arenas/tron/TronGame.php b/src/arenas/tron/TronGame.php
index 660cb8c..4d6a949 100755
--- a/src/arenas/tron/TronGame.php
+++ b/src/arenas/tron/TronGame.php
@@ -22,19 +22,21 @@ class TronGame
private function apply_looses($loosersArr){
//save draws
- if( count($loosersArr) > 1 ){
+ if( count($loosersArr) > 0 ){
$loosersById = array();
foreach($loosersArr as $bot){
$loosersById[] = $this->bots[$bot]->id;
}
+
+ }
+ if( count($loosersArr) > 1 ){ //...que si au moins deux joueurs ont perdu sur le meme tour
$this->save_draw_bots($loosersById);
}
-
//save victories
if( count($loosersArr) > 0 ){
//make victorous bots array
$vbots = array();
- for ($botCount = 0; $botCount < $nbeBots; $botCount++){
+ for ($botCount = 0; $botCount < count($this->bots); $botCount++){
if($this->bots[$botCount]->isAlive){
$vbots[] = $this->bots[$botCount]->id;
}
@@ -62,8 +64,8 @@ class TronGame
private function save_losers_winers($arrLoosers,$arrWiners){
foreach($arrWiners as $winner){
- foreach($arrLoosers as $loser){
- save_battle('tron',$winer,$loser,1,'id');
+ foreach($arrLoosers as $looser){
+ save_battle('tron',$winner,$looser,1,'id');
}
}
}
@@ -161,7 +163,7 @@ class TronGame
'id' => $this->bots[$looser]->id
);
}
-
+ $this->apply_looses($loosersList);
return array(
'last_points' => $this->get_lasts_trails(),
'loosers' => $loosersList
@@ -176,7 +178,7 @@ class TronGame
if(isset($postParams[$i])){ //dont use already deads bots
$data_string = json_encode($postParams[$i]);
- error_log($data_string);
+ //error_log($data_string);
$ch[$i] = curl_init($iasUrls[$i]);
curl_setopt($ch[$i], CURLOPT_CUSTOMREQUEST, "POST");
diff --git a/src/arenas/tron/act.php b/src/arenas/tron/act.php
index 374ca48..3a4714b 100755
--- a/src/arenas/tron/act.php
+++ b/src/arenas/tron/act.php
@@ -28,6 +28,7 @@ switch ($_POST['act']){
$botsArrayTemp = json_decode($_POST['bots']);
+ error_log($botsArrayTemp);
$botsInfos = array();
foreach($botsArrayTemp as $id){
From 7939a6a91119c2905109cad5b13f77a36b14f56c Mon Sep 17 00:00:00 2001
From: Gnieark
Date: Fri, 14 Oct 2016 21:24:55 +0200
Subject: [PATCH 135/144] fixes
---
countBattles.txt | 2 +-
src/arenas/tron/ScoreLap.php | 57 ++++++++++++++++++++++++++++++++++++
src/arenas/tron/TronGame.php | 18 +++++++-----
src/arenas/tron/act.php | 5 ++--
src/arenas/tron/doc-fr.html | 7 +++++
src/functions.php | 1 +
6 files changed, 79 insertions(+), 11 deletions(-)
create mode 100644 src/arenas/tron/ScoreLap.php
diff --git a/countBattles.txt b/countBattles.txt
index 9b21444..f754216 100755
--- a/countBattles.txt
+++ b/countBattles.txt
@@ -1 +1 @@
-1703
\ No newline at end of file
+1716
\ No newline at end of file
diff --git a/src/arenas/tron/ScoreLap.php b/src/arenas/tron/ScoreLap.php
new file mode 100644
index 0000000..9c42848
--- /dev/null
+++ b/src/arenas/tron/ScoreLap.php
@@ -0,0 +1,57 @@
+playersIdsByOrder[$order] = $id;
+ }
+
+ public function addLoser($order){
+ $this->looserList[] = $order;
+ }
+ public function __construct() {
+ $this->playersIdsByOrder = array();
+ $this->looserList = array();
+ }
+ public function make($botsList){
+ //$botsList must be like array[{botOrder:BotId},{botOrder:BotId}]
+ $this->looserList = $botsList;
+ }
+
+ private function ApplyDraws(){
+ //apply draw match to all losers
+ if(count($this->looserList) > 1){ //no draw if only 0 or one user at this lap
+ foreach($looserList as $looser1){
+ foreach($looserList as $looser2){
+ save_battle('tron',
+ $this->playersIdsByOrder[$looser1],
+ $this->playersIdsByOrder[$looser2],
+ 0,
+ 'id');
+ }
+ }
+ }
+ }
+ private function ApplyWins(){
+ foreach($this->looserList as $looser){
+ foreach($playersIdsByOrder as $order=>$player){
+ if(!in_array($order,$this->looserList)){
+ save_battle('tron',
+ $this->playersIdsByOrder[$looser],
+ $player,
+ 2,
+ 'id');
+ }
+ }
+ }
+
+ }
+ public function ApplyScores(){
+ $this-> ApplyDraws();
+ $this-> ApplyWins();
+
+ }
+}
\ No newline at end of file
diff --git a/src/arenas/tron/TronGame.php b/src/arenas/tron/TronGame.php
index 4d6a949..6288e0c 100755
--- a/src/arenas/tron/TronGame.php
+++ b/src/arenas/tron/TronGame.php
@@ -20,12 +20,15 @@ class TronGame
}
}
- private function apply_looses($loosersArr){
+ private function apply_looses($loosersArr){
+ //$loosersArr est construit comme ça: [{"order":1,"id":54"},{"order":3,"id":54"}]
+
//save draws
if( count($loosersArr) > 0 ){
$loosersById = array();
foreach($loosersArr as $bot){
- $loosersById[] = $this->bots[$bot]->id;
+ //error_log('apply lose '.$bot['id']);
+ $loosersById[] = $bot['id'];
}
}
@@ -96,9 +99,13 @@ class TronGame
$loosers = array();
$lastsCells = array();
+ $scoring = new ScoreLap();
+
+
for ($botCount = 0; $botCount < $nbeBots; $botCount++){
if ($this->bots[$botCount]->isAlive){
+ $scoreLap->addBotOnLap($botCount,$this->bots[$botCount]->id);
$urls[$botCount] = $this->bots[$botCount]->url;
$paramsToSend[$botCount] = array(
@@ -134,8 +141,6 @@ class TronGame
}
}
}
-
-
//test if loose
for ($botCount = 0; $botCount < $nbeBots; $botCount++){
if ($this->bots[$botCount]->isAlive){
@@ -148,13 +153,10 @@ class TronGame
$loosers[] = $botCount;
$this->bots[$botCount]->loose();
break;
- }
-
+ }
}
-
}
}
-
//loosers list (in order to pass their id)
$loosersList = array();
foreach($loosers as $looser){
diff --git a/src/arenas/tron/act.php b/src/arenas/tron/act.php
index 3a4714b..d88e0ee 100755
--- a/src/arenas/tron/act.php
+++ b/src/arenas/tron/act.php
@@ -17,6 +17,7 @@ require_once ("TronPlayer.php");
require_once ("Direction.php");
require_once ("Trail.php");
require_once ("Coords.php");
+require_once ("ScoreLap.php");
switch ($_POST['act']){
case "initGame":
@@ -28,12 +29,12 @@ switch ($_POST['act']){
$botsArrayTemp = json_decode($_POST['bots']);
- error_log($botsArrayTemp);
+ //error_log($_POST['bots']);
$botsInfos = array();
foreach($botsArrayTemp as $id){
//tester si le bot existe dans la bdd
- if(isset($botsFullArr[$id])){
+ if((isset($botsFullArr[$id])) && ($id > 0)){
$botsInfos[] = $botsFullArr[$id];
}
}
diff --git a/src/arenas/tron/doc-fr.html b/src/arenas/tron/doc-fr.html
index 2231cfb..1170785 100755
--- a/src/arenas/tron/doc-fr.html
+++ b/src/arenas/tron/doc-fr.html
@@ -142,3 +142,10 @@ Les champs qui différent sont:
L'ordre des "queues" des serpents dans ce tableau correspond à l'ordre des joueurs. Donc votre serpent est representée par la queue correspondant à player-index (le décompte de player-index commence par 0).
L'ordre des couples de coordonnées de chaque bot, est dans le sens queue vers la tête. Les bots grandissent à chaque tour en déplaçant leur tête.
+Scoring
+Le scorring (classement EHLO) reste sur une logique de duels, bien que ce jeu puisse contenir plus de deux bots par match. Le score est modifié au fur et à mesure de la partie à chaque fois qu'un bot "décède":
+
+ - Lors de la défaite d'un bot, l'arène enregistre un match nul contre tous les autres bots qui ont aussi perdu au même tour de jeu.
+ - Elle enregistre aussi une défaite des bots morts contre tous les bots encore en course à la fin du tour.
+
+
diff --git a/src/functions.php b/src/functions.php
index 8fd041a..3c44b40 100755
--- a/src/functions.php
+++ b/src/functions.php
@@ -114,6 +114,7 @@ function get_language_array(){
return $lang;
}
function error($code,$message){
+ error_log($code." ".$message);
switch($code){
case 404:
header("HTTP/1.0 404 Not Found");
From 87d2c4cf1e7dfb6782bd229830a46a73c85257d1 Mon Sep 17 00:00:00 2001
From: Gnieark
Date: Tue, 18 Oct 2016 20:18:32 +0200
Subject: [PATCH 136/144] scoring class
---
countBattles.txt | 2 +-
src/arenas/tron/ScoreLap.php | 45 +++++++++++++-------
src/arenas/tron/TronGame.php | 80 +++++-------------------------------
3 files changed, 42 insertions(+), 85 deletions(-)
diff --git a/countBattles.txt b/countBattles.txt
index f754216..44fb745 100755
--- a/countBattles.txt
+++ b/countBattles.txt
@@ -1 +1 @@
-1716
\ No newline at end of file
+1726
\ No newline at end of file
diff --git a/src/arenas/tron/ScoreLap.php b/src/arenas/tron/ScoreLap.php
index 9c42848..ddd0a91 100644
--- a/src/arenas/tron/ScoreLap.php
+++ b/src/arenas/tron/ScoreLap.php
@@ -3,40 +3,55 @@
class ScoreLap
{
private $playersIdsByOrder; //array containing id's of alive players at the beginning of the match, Put only alive bots in!
- private $looserList; //only containing theirs orders
+ private $looserList; //idem but only loosers
public function addBotOnLap($order,$id){
$this->playersIdsByOrder[$order] = $id;
}
- public function addLoser($order){
- $this->looserList[] = $order;
+ public function addLoser($order,$id){
+ $this->looserList[$order] = $order;
}
public function __construct() {
$this->playersIdsByOrder = array();
$this->looserList = array();
}
- public function make($botsList){
- //$botsList must be like array[{botOrder:BotId},{botOrder:BotId}]
- $this->looserList = $botsList;
- }
+
+ public function getLoosersList(){
+ return $this->looserList;
+ }
+
+ //NO!
+ // public function make($botsList){
+ // //$botsList must be like array[{botOrder:BotId},{botOrder:BotId}]
+ // $this->looserList = $botsList;
+ // }
private function ApplyDraws(){
//apply draw match to all losers
if(count($this->looserList) > 1){ //no draw if only 0 or one user at this lap
- foreach($looserList as $looser1){
- foreach($looserList as $looser2){
- save_battle('tron',
- $this->playersIdsByOrder[$looser1],
- $this->playersIdsByOrder[$looser2],
- 0,
- 'id');
+ foreach($looserList as $order1 => $looser1){
+ foreach($looserList as $order2 => $looser2){
+ if($order1 <> $order2){
+ save_battle('tron',
+ $this->playersIdsByOrder[$looser1],
+ $this->playersIdsByOrder[$looser2],
+ 0,
+ 'id');
+ }
}
}
}
}
private function ApplyWins(){
- foreach($this->looserList as $looser){
+
+ //need to make losers List. simply array of orders
+ $loosersOrdersArr = array();
+ foreach($this->looserList as $order => $looser){
+ $loosersOrdersArr[] = $order;
+ }
+
+ foreach($this->looserList as $looserOrder => $looserId){
foreach($playersIdsByOrder as $order=>$player){
if(!in_array($order,$this->looserList)){
save_battle('tron',
diff --git a/src/arenas/tron/TronGame.php b/src/arenas/tron/TronGame.php
index 6288e0c..00edf86 100755
--- a/src/arenas/tron/TronGame.php
+++ b/src/arenas/tron/TronGame.php
@@ -20,58 +20,6 @@ class TronGame
}
}
- private function apply_looses($loosersArr){
- //$loosersArr est construit comme ça: [{"order":1,"id":54"},{"order":3,"id":54"}]
-
- //save draws
- if( count($loosersArr) > 0 ){
- $loosersById = array();
- foreach($loosersArr as $bot){
- //error_log('apply lose '.$bot['id']);
- $loosersById[] = $bot['id'];
- }
-
- }
- if( count($loosersArr) > 1 ){ //...que si au moins deux joueurs ont perdu sur le meme tour
- $this->save_draw_bots($loosersById);
- }
- //save victories
- if( count($loosersArr) > 0 ){
- //make victorous bots array
- $vbots = array();
- for ($botCount = 0; $botCount < count($this->bots); $botCount++){
- if($this->bots[$botCount]->isAlive){
- $vbots[] = $this->bots[$botCount]->id;
- }
- }
- $this->save_losers_winers($loosersById,$vbots);
- }
-
- }
- private function save_draw_bots($arr){
- /*
- * Recursive function who save all combionaisons of draw matches
- */
-
- if(count($arr) < 2){
- return;
- }else{
- $a = $arr[0];
- array_shift($arr);
- foreach($arr as $bot){
- save_battle('tron',$a,$bot,0,'id');
- }
- $this->save_draw_bots($arr);
- }
- }
-
- private function save_losers_winers($arrLoosers,$arrWiners){
- foreach($arrWiners as $winner){
- foreach($arrLoosers as $looser){
- save_battle('tron',$winner,$looser,1,'id');
- }
- }
- }
public function get_trails(){
//return all trails for draw svg
$trailsArr = array();
@@ -96,7 +44,6 @@ class TronGame
$paramToSend = array();
$board = $this->get_trails();
//$board = $this->get_lasts_trails();
- $loosers = array();
$lastsCells = array();
$scoring = new ScoreLap();
@@ -104,8 +51,8 @@ class TronGame
for ($botCount = 0; $botCount < $nbeBots; $botCount++){
if ($this->bots[$botCount]->isAlive){
-
- $scoreLap->addBotOnLap($botCount,$this->bots[$botCount]->id);
+
+ $scoring->addBotOnLap($botCount,$this->bots[$botCount]->id);
$urls[$botCount] = $this->bots[$botCount]->url;
$paramsToSend[$botCount] = array(
@@ -127,15 +74,16 @@ class TronGame
if(!$dir = Direction::make($responses[$botCount]['responseArr']['play'])){
//he loses , non conform response
- $loosers[] = $botCount;
+ $scoring-> addLoser($botCount,$this->bots[$botCount]->id);
$this->bots[$botCount]->loose();
}else{
$lastsCells[$botCount] = $this->bots[$botCount]->grow($dir);
if($lastsCells[$botCount] === false){
- $loosers[] = $botCount;
- $this->bots[$botCount]->loose();
+ //$loosers[] = $botCount;
+ $scoring-> addLoser($botCount,$this->bots[$botCount]->id);
+ $this->bots[$botCount]->loose();
}
}
@@ -150,25 +98,19 @@ class TronGame
if(($botCount <> $botCount2)
&& ($this->bots[$botCount2]->trail->contains($lastsCells[$botCount]))
){
- $loosers[] = $botCount;
+
+ $scoring-> addLoser($botCount,$this->bots[$botCount]->id);
$this->bots[$botCount]->loose();
break;
}
}
}
}
- //loosers list (in order to pass their id)
- $loosersList = array();
- foreach($loosers as $looser){
- $loosersList[] = array(
- 'order' => $looser,
- 'id' => $this->bots[$looser]->id
- );
- }
- $this->apply_looses($loosersList);
+
+ //$this->apply_looses($loosersList);
return array(
'last_points' => $this->get_lasts_trails(),
- 'loosers' => $loosersList
+ 'loosers' => $scoring->getLoosersList()
);
}
private function get_multi_IAS_Responses($iasUrls, $postParams){
From c4e99fccc7c91ffa898c9d55746c61a836f397c2 Mon Sep 17 00:00:00 2001
From: root
Date: Wed, 2 Nov 2016 19:39:23 +0100
Subject: [PATCH 137/144] rewrite trongame
---
countBattles.txt | 2 +-
src/arenas/tron/Coords.php | 7 +-
src/arenas/tron/ScoreLap.php | 74 +++++--------
src/arenas/tron/Trail.php | 13 +--
src/arenas/tron/TronGame.php | 195 ++++++++++++++++++++++-----------
src/arenas/tron/TronPlayer.php | 14 ++-
src/arenas/tron/functions.php | 4 -
7 files changed, 186 insertions(+), 123 deletions(-)
diff --git a/countBattles.txt b/countBattles.txt
index 44fb745..e6d1b72 100755
--- a/countBattles.txt
+++ b/countBattles.txt
@@ -1 +1 @@
-1726
\ No newline at end of file
+1747
\ No newline at end of file
diff --git a/src/arenas/tron/Coords.php b/src/arenas/tron/Coords.php
index fe760e2..9fdb5e4 100755
--- a/src/arenas/tron/Coords.php
+++ b/src/arenas/tron/Coords.php
@@ -1,14 +1,15 @@
min) || ($x > $this->max) || ($y < $this->min) || ($y > $this->max)){
+ if (($x < Coords::$min) || ($x > Coords::$max) || ($y < Coords::$min) || ($y > Coords::$max)){
//out of limits
+ error_log("a bot out of limits");
return false;
}
diff --git a/src/arenas/tron/ScoreLap.php b/src/arenas/tron/ScoreLap.php
index ddd0a91..a529252 100644
--- a/src/arenas/tron/ScoreLap.php
+++ b/src/arenas/tron/ScoreLap.php
@@ -2,71 +2,57 @@
class ScoreLap
{
- private $playersIdsByOrder; //array containing id's of alive players at the beginning of the match, Put only alive bots in!
- private $looserList; //idem but only loosers
- public function addBotOnLap($order,$id){
- $this->playersIdsByOrder[$order] = $id;
+ private $participants; //array containing bots objects
+ private $loosers; //those who losed
+
+
+ public function addBotOnLap(TronPlayer $bot){
+ $this->participants[] = $bot;
}
- public function addLoser($order,$id){
- $this->looserList[$order] = $order;
+ public function addLoser(TronPlayer $bot){
+ $this->loosers[] = $bot;
}
public function __construct() {
- $this->playersIdsByOrder = array();
- $this->looserList = array();
+ $this->participants= array();
+ $this->loosers = array();
}
public function getLoosersList(){
- return $this->looserList;
+ return $this->$loosers;
}
-
- //NO!
- // public function make($botsList){
- // //$botsList must be like array[{botOrder:BotId},{botOrder:BotId}]
- // $this->looserList = $botsList;
- // }
+
+ private function ApplyDraws(){
- private function ApplyDraws(){
//apply draw match to all losers
- if(count($this->looserList) > 1){ //no draw if only 0 or one user at this lap
- foreach($looserList as $order1 => $looser1){
- foreach($looserList as $order2 => $looser2){
- if($order1 <> $order2){
- save_battle('tron',
- $this->playersIdsByOrder[$looser1],
- $this->playersIdsByOrder[$looser2],
- 0,
- 'id');
- }
- }
+ if(count($this->looserList) < 2) return;
+
+ foreach($loosers as $$looser1){
+ foreach($loosers as $looser2){
+ if($looser1->playerIndex == $looser2->playerIndex) continue;
+ save_battle('tron', $looser1->id, $looser2->id, 0, 'id' );
}
- }
+ }
}
- private function ApplyWins(){
+
+
+ private function ApplyWins(){
//need to make losers List. simply array of orders
- $loosersOrdersArr = array();
- foreach($this->looserList as $order => $looser){
- $loosersOrdersArr[] = $order;
+ $loosersIndexArr = array();
+ foreach($this->looserList as $looser){
+ $loosersIndexArr[] = $looser->playerIndex;
}
-
- foreach($this->looserList as $looserOrder => $looserId){
- foreach($playersIdsByOrder as $order=>$player){
- if(!in_array($order,$this->looserList)){
- save_battle('tron',
- $this->playersIdsByOrder[$looser],
- $player,
- 2,
- 'id');
- }
+ foreach($this->loosers as $looser){
+ foreach($this->participants as $participant){
+ if(in_array($participant->playerIndex,$loosersIndexArr)) continue;
+ save_battle('tron', $looser->id, $participant->id, 2, 'id');
}
}
-
}
public function ApplyScores(){
$this-> ApplyDraws();
$this-> ApplyWins();
-
}
}
\ No newline at end of file
diff --git a/src/arenas/tron/Trail.php b/src/arenas/tron/Trail.php
index 7361574..9740d18 100755
--- a/src/arenas/tron/Trail.php
+++ b/src/arenas/tron/Trail.php
@@ -18,15 +18,14 @@ class Trail {
public function emptyTrail(){
$this->trail = new SplStack();
}
-
+ public function mergeWith($trailToMerge){
+ foreach($trailToMerge as $value) {
+ $this->trail->add($value);
+ }
+ }
public function add($value) {
if(!$this->trail->isEmpty()) {
if(Trail::kind($this->trail->bottom()) !== Trail::kind($value)) {
-
- //
- // throw new TypeError(
- // 'items added to a trail must be of the same kind'
- // );
return false;
}
@@ -43,7 +42,7 @@ class Trail {
public function __toString(){
return json_encode($this->getTrailAsArray());
}
-
+
public function getTrailAsArray(){
$arr = array();
foreach($this->trail as $coord) {
diff --git a/src/arenas/tron/TronGame.php b/src/arenas/tron/TronGame.php
index 00edf86..0d55fb6 100755
--- a/src/arenas/tron/TronGame.php
+++ b/src/arenas/tron/TronGame.php
@@ -4,16 +4,38 @@ class TronGame
private $bots; //array of bots
public $gameId;
private $status; //false => Game ended or not initialised
+
+ private function getAliveBots(){
+ $aliveBots = array();
+ foreach($this->bots as $bot){
+ if($bot->isAlive){
+ $aliveBots[] = $bot;
+ }
+ }
+ return $aliveBots;
+ }
- public function get_continue(){
- //count bots alive. if less than 1, game is ended
- $count = 0;
+ private function getBotByPlayerIndex($index){
foreach($this->bots as $bot){
- if( $bot->isAlive == true){
- $count++;
+ if($bot->playerIndex == $index){
+ return $bot;
}
}
- if($count > 1){
+ return false;
+ }
+ private function initScoring(){
+ /*
+ *Add all alive bots on a ScoreLap object and return it
+ */
+ $scoring = new ScoreLap();
+ foreach($this->getAliveBots()as $bot){
+ $scoring->addBotOnLap($bot);
+ }
+ return $scoring;
+ }
+ public function get_continue(){
+ //count bots alive. if less than 1, game is ended
+ if(count($this->getAliveBots()) > 1){
return true;
}else{
return false;
@@ -28,6 +50,14 @@ class TronGame
}
return $trailsArr;
}
+ private function get_map_as_an_unique_trail(){
+ $trail = new Trail;
+ foreach($this->bots as $bot){
+ $trail->mergeWith($bot->trail);
+ }
+ return trail;
+
+ }
public function get_lasts_trails(){
//return only the lasts coords for each tail
$trailsArr = array();
@@ -37,83 +67,126 @@ class TronGame
return $trailsArr;
}
public function new_lap(){
- // for all alive bots
- $logs = "";
- $nbeBots = count($this->bots);
- $urls = array();
- $paramToSend = array();
- $board = $this->get_trails();
- //$board = $this->get_lasts_trails();
- $lastsCells = array();
+
+ if($this->get_continue() === false){
+ return false;
+ }
+
+ $scoreObj = $this->initScoring();
+ $aliveBots = $this->getAliveBots();
- $scoring = new ScoreLap();
+ //fixed Query parameters
+ $nbeBots = count($this->bots);
+ $board = $this->get_trails(); //same for each bot
+ $initialMapAsATrail = $this->get_map_as_an_unique_trail();
+ //Open curl multi
+ $cmh = curl_multi_init();
+ $ch = array();
- for ($botCount = 0; $botCount < $nbeBots; $botCount++){
- if ($this->bots[$botCount]->isAlive){
-
- $scoring->addBotOnLap($botCount,$this->bots[$botCount]->id);
- $urls[$botCount] = $this->bots[$botCount]->url;
-
- $paramsToSend[$botCount] = array(
+
+
+ foreach($aliveBots as $bot){
+ $i = $bot->playerIndex; //because $i is shorter
+
+ $bodyRequestArr[$i] = array(
'game-id' => "".$this->gameId,
'action' => 'play-turn',
'game' => 'tron',
'board' => $board,
- 'player-index' => $botCount, // To do: verifier que ça restera le même à chaque tour
+ 'player-index' => $i,
'players' => $nbeBots
);
- }
+ $data_string = json_encode($bodyRequestArr[$i]);
+ $ch[$i] = curl_init($bot->url);
+ curl_setopt($ch[$i], CURLOPT_CUSTOMREQUEST, "POST");
+ curl_setopt($ch[$i], CURLOPT_SSL_VERIFYHOST, false);
+ curl_setopt($ch[$i], CURLOPT_SSL_VERIFYPEER, false);
+ curl_setopt($ch[$i], CURLOPT_POSTFIELDS, $data_string);
+ curl_setopt($ch[$i], CURLOPT_RETURNTRANSFER, true);
+ curl_setopt($ch[$i], CURLOPT_HTTPHEADER, array(
+ 'Content-Type: application/json',
+ 'Content-Length: ' . strlen($data_string))
+ );
+ curl_multi_add_handle($cmh,$ch[$i]);
}
-
- $responses = $this->get_multi_IAS_Responses($urls,$paramsToSend);
- //grow bots'tails
- for ($botCount = 0; $botCount < $nbeBots; $botCount++){
- if ($this->bots[$botCount]->isAlive){
+ //send the requests
+ do {
+ $returnVal = curl_multi_exec($cmh, $runningHandles);
+ }while($runningHandles > 0);
+
+ //get results
+ foreach($ch as $playerIndex=>$cr){
+ $currentBot = $this->getBotByPlayerIndex($playerIndex);
+
+ // Check for errors
+ $curlError = curl_error($cr);
+ $response = curl_multi_getcontent($cr);
- if(!$dir = Direction::make($responses[$botCount]['responseArr']['play'])){
- //he loses , non conform response
- $scoring-> addLoser($botCount,$this->bots[$botCount]->id);
- $this->bots[$botCount]->loose();
- }else{
+ if($curlError !== "") {
+ //erreur curl, he loses
+ $scoreObj-> addLoser($currentBot);
+ $currentBot->loose();
+
+ }elseif(! $arr = json_decode($response,TRUE)){
+ //la reponse n'est pas un json, il a perdu
+ $scoreObj-> addLoser($currentBot);
+ $currentBot->loose();
- $lastsCells[$botCount] = $this->bots[$botCount]->grow($dir);
-
- if($lastsCells[$botCount] === false){
- //$loosers[] = $botCount;
- $scoring-> addLoser($botCount,$this->bots[$botCount]->id);
- $this->bots[$botCount]->loose();
- }
-
- }
+ }elseif(Direction::make($arr['play']) === false){
+ //tester ici la réponse
+ //he loose il utilise probablement une de ses propres cases
+ $scoreObj-> addLoser($currentBot);
+ $currentBot->loose();
+ }elseif($initialMapAsATrail->contains($currentBot->trail->last()->addDirection(Direction::make($arr['play'])))){ //ounch
+ //le bot tente d'aller sur une case qui était prise au début du round
+ $scoreObj-> addLoser($currentBot);
+ $currentBot->loose();
+ }else{
+ //mettre de coté la direction du bot
+ $currentBot->nextDir = Direction::make($arr['play']);
}
+ //close curl
+ curl_multi_remove_handle($cmh, $cr);
+ curl_close($cr);
+
}
- //test if loose
- for ($botCount = 0; $botCount < $nbeBots; $botCount++){
- if ($this->bots[$botCount]->isAlive){
-
- //tester si collusion avec les cases actuelles
- for( $botCount2 = 0; $botCount2 < $nbeBots; $botCount2++){
- if(($botCount <> $botCount2)
- && ($this->bots[$botCount2]->trail->contains($lastsCells[$botCount]))
- ){
-
- $scoring-> addLoser($botCount,$this->bots[$botCount]->id);
- $this->bots[$botCount]->loose();
- break;
- }
+
+ $aliveBots = $this->getAliveBots();
+ //pour tous les bots encore vivants, on teste si deux d'entre eux ne cibleraient pas la même case
+ foreach ($aliveBots as $bot1){
+ foreach ($aliveBots as $bot2){
+ if($bot1-> $playerIndex == $bot2-> $playerIndex) continue;
+ if($bot1->trail->last()->addDirection($bot1->nextDir) == $bot2->trail->last()->addDirection($bot2->nextDir)){
+ //he loose
+ $scoreObj-> addLoser($bot1);
+ $bot1->loose();
+ break;
}
}
}
- //$this->apply_looses($loosersList);
+ //ok, faire grossir les bots qui restent
+ foreach($this->getAliveBots() as $bot){
+ $bot-> applyNextDir();
+ }
+
+ //apply scores:
+ $scoreObj-> ApplyScores();
+
return array(
'last_points' => $this->get_lasts_trails(),
- 'loosers' => $scoring->getLoosersList()
+ 'loosers' => $scoreObj->getLoosersList()
);
}
+
+
+
private function get_multi_IAS_Responses($iasUrls, $postParams){
+ //bug here le resultat retourné ne prend pas les bots ayant déjà perdus
+
+
//same as the get_IAS_Responses function
// but more than one bot requested parallely
@@ -158,7 +231,7 @@ class TronGame
}
$res[$i] = array(
'messageSend' => json_encode($postParams[$i]),
- 'response' => $response,
+ 'response' => $response,
'httpStatus' => curl_getinfo($ch[$i])['http_code'],
'responseArr' => $arr
);
@@ -222,7 +295,7 @@ class TronGame
$startCoord = new Coords($x,$y);
$this->bots[$botCount] = new TronPlayer();
- $this->bots[$botCount]->make($bot['id'],$startCoord,$bot['name'],$bot['url']);
+ $this->bots[$botCount]->make($bot['id'],$startCoord,$bot['name'],$bot['url'],$botCount);
if ($this->bots[$botCount]->isAlive === false){
$err .= "Something went wrong for ".$this->bots[$botCount]->getName()."
";
diff --git a/src/arenas/tron/TronPlayer.php b/src/arenas/tron/TronPlayer.php
index de123e1..8949332 100755
--- a/src/arenas/tron/TronPlayer.php
+++ b/src/arenas/tron/TronPlayer.php
@@ -4,12 +4,14 @@ class TronPlayer{
public $id;
public $name;
public $trail;
- private $direction;
public $isAlive = true;
+ public $playerIndex = -1; //if unset is -1
+ public $looseCause = "";
+ public $nextDir;
public function grow(Direction $dir){
$dest = $this->trail->last()->addDirection($dir);
- if($dest == false){
+ if($dest === false){
$this->loose();
return false;
}
@@ -17,19 +19,25 @@ class TronPlayer{
$this->trail->add($this->trail->last()->addDirection($dir));
return $this->trail->last();
}
+
+ public function applyNextDir(){
+ $this-> grow($this->nextDir);
+ }
+
public function loose(){
$this->isAlive = false;
$this->trail->emptyTrail();
//error_log($this->name." a perdu");
return false;
}
- public function make($botId, Coords $initialsCoords,$name,$url){
+ public function make($botId, Coords $initialsCoords,$name,$url,$playerIndex = -1){
$this->id = $botId;
$this->trail = new Trail;
$this->trail->add($initialsCoords);
$this->name = $name;
$this->url = $url;
$this->state = true;
+ $this->playerIndex = $playerIndex;
}
public function __construct(){
$this->state = false;
diff --git a/src/arenas/tron/functions.php b/src/arenas/tron/functions.php
index 0705b1d..b3d9bbc 100755
--- a/src/arenas/tron/functions.php
+++ b/src/arenas/tron/functions.php
@@ -1,5 +1 @@
Date: Tue, 8 Nov 2016 19:27:55 +0100
Subject: [PATCH 138/144] Scoring
---
countBattles.txt | 2 +-
src/DUEL.php | 80 +++++++++++++++++++++++
src/arenas/tron/ScoreLap.php | 16 +++--
src/arenas/tron/Trail.php | 13 +++-
src/arenas/tron/TronGame.php | 85 +++++-------------------
src/arenas/tron/doc-fr.html | 2 +-
src/functions.php | 123 ++++++++++++++---------------------
7 files changed, 167 insertions(+), 154 deletions(-)
create mode 100644 src/DUEL.php
diff --git a/countBattles.txt b/countBattles.txt
index e6d1b72..e6ad4d7 100755
--- a/countBattles.txt
+++ b/countBattles.txt
@@ -1 +1 @@
-1747
\ No newline at end of file
+1784
\ No newline at end of file
diff --git a/src/DUEL.php b/src/DUEL.php
new file mode 100644
index 0000000..0b158c5
--- /dev/null
+++ b/src/DUEL.php
@@ -0,0 +1,80 @@
+rank1 = $r1;
+ $this->rank2 = $r2;
+ }
+ private function get_k($rank){
+ if ($rank < 1000) return 80;
+ if ($rank < 2000) return 50;
+ if ($rank <= 2400) return 30;
+ return 20;
+ }
+ private function changeScores($score){
+ $this->rank1 = $this->rank1 + $this->get_k($this->rank1) * ($score - (1/ (1 + pow(10,(($this->rank2 - $this->rank1) / $this->factor)))));
+ $this->rank2 = $this->rank2 + $this->get_k($this->rank2) * (1 - $score - (1/ (1 + pow(10,(($this->rank1 - $this->rank2) / $this->factor)))));
+ }
+
+ public function oneWinsAgainstTwo(){
+ $this->changeScores(1);
+ }
+ public function twoWinsAgainstOne(){
+ $this->changeScores(0);
+ }
+ public function drawGame(){
+ $this->changeScores(0.5);
+ }
+}
+
+
+
+
+
+
+
+
+
+
+
+class ELO
+{
+ public $rank = 1500; //default rank
+
+ public function __construct($v=1500) {
+ $this->rank = $v;
+ }
+
+ private function ELO_get_new_ranks($elo1,$elo2,$score){
+ /*
+ * return an array containing new ELO scores after a battle
+ * $score : 0 player 2 won
+ * 0.5 draws
+ * 1 player 1 won
+ */
+
+ //good luck for understanding it
+ //(see https://blog.antoine-augusti.fr/2012/06/maths-et-code-le-classement-elo/)
+ return array(
+ $elo1 + ELO_get_k($elo1) * ($score - (1/ (1 + pow(10,(($elo2 - $elo1) / 400))))),
+ $elo2 + ELO_get_k($elo2) * (1 - $score - (1/ (1 + pow(10,(($elo1 - $elo2) / 400)))))
+ );
+ }
+
+
+
+ public function looseAgainst(ELO $winer){
+
+ }
+ public function winAgainst(ELO $looser){
+
+ }
+ public function drawAgainst(ELO $drawPlayer){
+
+ }
+
+}
diff --git a/src/arenas/tron/ScoreLap.php b/src/arenas/tron/ScoreLap.php
index a529252..eb6f7a2 100644
--- a/src/arenas/tron/ScoreLap.php
+++ b/src/arenas/tron/ScoreLap.php
@@ -20,16 +20,22 @@ class ScoreLap
}
public function getLoosersList(){
- return $this->$loosers;
+ //return losers as a digest array
+ $arr = array();
+
+ foreach($this->loosers as $looser){
+ $arr[] = array("id" => $looser->id,"order" => $looser->playerIndex);
+ }
+ return $arr;
}
private function ApplyDraws(){
//apply draw match to all losers
- if(count($this->looserList) < 2) return;
+ if(count($this->loosers) < 2) return;
- foreach($loosers as $$looser1){
- foreach($loosers as $looser2){
+ foreach($this->loosers as $looser1){
+ foreach($this->loosers as $looser2){
if($looser1->playerIndex == $looser2->playerIndex) continue;
save_battle('tron', $looser1->id, $looser2->id, 0, 'id' );
}
@@ -41,7 +47,7 @@ class ScoreLap
//need to make losers List. simply array of orders
$loosersIndexArr = array();
- foreach($this->looserList as $looser){
+ foreach($this->loosers as $looser){
$loosersIndexArr[] = $looser->playerIndex;
}
foreach($this->loosers as $looser){
diff --git a/src/arenas/tron/Trail.php b/src/arenas/tron/Trail.php
index 9740d18..17604d0 100755
--- a/src/arenas/tron/Trail.php
+++ b/src/arenas/tron/Trail.php
@@ -18,11 +18,18 @@ class Trail {
public function emptyTrail(){
$this->trail = new SplStack();
}
+ public function getTrail(){
+ return $this->trail;
+ }
public function mergeWith($trailToMerge){
- foreach($trailToMerge as $value) {
- $this->trail->add($value);
+ if($trailToMerge->getTrail()->isEmpty()) return;
+
+ foreach($trailToMerge->getTrail() as $value) {
+ $this->trail->push($value);
}
+
}
+
public function add($value) {
if(!$this->trail->isEmpty()) {
if(Trail::kind($this->trail->bottom()) !== Trail::kind($value)) {
@@ -42,7 +49,7 @@ class Trail {
public function __toString(){
return json_encode($this->getTrailAsArray());
}
-
+
public function getTrailAsArray(){
$arr = array();
foreach($this->trail as $coord) {
diff --git a/src/arenas/tron/TronGame.php b/src/arenas/tron/TronGame.php
index 0d55fb6..f49905e 100755
--- a/src/arenas/tron/TronGame.php
+++ b/src/arenas/tron/TronGame.php
@@ -48,14 +48,16 @@ class TronGame
foreach($this->bots as $bot){
$trailsArr[] = $bot->trail->getTrailAsArray();
}
+ //error_log("*********".json_encode($trailsArr,true)."********");
return $trailsArr;
+
}
private function get_map_as_an_unique_trail(){
$trail = new Trail;
foreach($this->bots as $bot){
$trail->mergeWith($bot->trail);
}
- return trail;
+ return $trail;
}
public function get_lasts_trails(){
@@ -125,24 +127,33 @@ class TronGame
$response = curl_multi_getcontent($cr);
if($curlError !== "") {
+
//erreur curl, he loses
$scoreObj-> addLoser($currentBot);
$currentBot->loose();
-
+ error_log("no curl response".$playerIndex); //debug
+
}elseif(! $arr = json_decode($response,TRUE)){
+
//la reponse n'est pas un json, il a perdu
$scoreObj-> addLoser($currentBot);
$currentBot->loose();
+ error_log("la reponse est pas JSON".$playerIndex); //debug
}elseif(Direction::make($arr['play']) === false){
+
//tester ici la réponse
//he loose il utilise probablement une de ses propres cases
$scoreObj-> addLoser($currentBot);
$currentBot->loose();
+ error_log("La reponse ne contient pas une direction".$playerIndex); //debug
+
}elseif($initialMapAsATrail->contains($currentBot->trail->last()->addDirection(Direction::make($arr['play'])))){ //ounch
+
//le bot tente d'aller sur une case qui était prise au début du round
$scoreObj-> addLoser($currentBot);
$currentBot->loose();
+ error_log("Il joue sur une case deja prise".$playerIndex); //debug
}else{
//mettre de coté la direction du bot
$currentBot->nextDir = Direction::make($arr['play']);
@@ -157,7 +168,7 @@ class TronGame
//pour tous les bots encore vivants, on teste si deux d'entre eux ne cibleraient pas la même case
foreach ($aliveBots as $bot1){
foreach ($aliveBots as $bot2){
- if($bot1-> $playerIndex == $bot2-> $playerIndex) continue;
+ if($bot1->playerIndex == $bot2->playerIndex) continue;
if($bot1->trail->last()->addDirection($bot1->nextDir) == $bot2->trail->last()->addDirection($bot2->nextDir)){
//he loose
$scoreObj-> addLoser($bot1);
@@ -183,73 +194,7 @@ class TronGame
- private function get_multi_IAS_Responses($iasUrls, $postParams){
- //bug here le resultat retourné ne prend pas les bots ayant déjà perdus
-
-
- //same as the get_IAS_Responses function
- // but more than one bot requested parallely
-
- $cmh = curl_multi_init();
- for ($i = 0; $i < count($iasUrls); $i++){
- if(isset($postParams[$i])){ //dont use already deads bots
- $data_string = json_encode($postParams[$i]);
-
- //error_log($data_string);
-
- $ch[$i] = curl_init($iasUrls[$i]);
- curl_setopt($ch[$i], CURLOPT_CUSTOMREQUEST, "POST");
- curl_setopt($ch[$i], CURLOPT_SSL_VERIFYHOST, false);
- curl_setopt($ch[$i], CURLOPT_SSL_VERIFYPEER, false);
- curl_setopt($ch[$i], CURLOPT_POSTFIELDS, $data_string);
- curl_setopt($ch[$i], CURLOPT_RETURNTRANSFER, true);
- curl_setopt($ch[$i], CURLOPT_HTTPHEADER, array(
- 'Content-Type: application/json',
- 'Content-Length: ' . strlen($data_string))
- );
- curl_multi_add_handle($cmh,$ch[$i]);
- }
- }
-
- //send the requests
- do {
- $returnVal = curl_multi_exec($cmh, $runningHandles);
- }while($runningHandles > 0);
-
-
- //Get results
-
- for ($i = 0; $i < count($iasUrls); $i++){
-
- if(isset($postParams[$i])){
- // Check for errors
- $curlError = curl_error($ch[$i]);
- if($curlError == "") {
- $response = curl_multi_getcontent($ch[$i]);
- if(! $arr = json_decode($response,TRUE)){
- $arr=array();
- }
- $res[$i] = array(
- 'messageSend' => json_encode($postParams[$i]),
- 'response' => $response,
- 'httpStatus' => curl_getinfo($ch[$i])['http_code'],
- 'responseArr' => $arr
- );
-
- }else{
- $res[$i] = false;
- }
- //close
- curl_multi_remove_handle($cmh, $ch[$i]);
- curl_close($ch[$i]);
-
- }
-
- }
- // Clean up the curl_multi handle
- curl_multi_close($cmh);
- return $res;
- }
+
public function init_game(){
//send init messages to bots
diff --git a/src/arenas/tron/doc-fr.html b/src/arenas/tron/doc-fr.html
index 1170785..d821de8 100755
--- a/src/arenas/tron/doc-fr.html
+++ b/src/arenas/tron/doc-fr.html
@@ -141,7 +141,7 @@ Les champs qui différent sont:
]
L'ordre des "queues" des serpents dans ce tableau correspond à l'ordre des joueurs. Donc votre serpent est representée par la queue correspondant à player-index (le décompte de player-index commence par 0).
-L'ordre des couples de coordonnées de chaque bot, est dans le sens queue vers la tête. Les bots grandissent à chaque tour en déplaçant leur tête.
+L'ordre des couples de coordonnées de chaque bot, est dans le sens tête vers queue. Les bots grandissent à chaque tour en déplaçant leur tête.
Scoring
Le scorring (classement EHLO) reste sur une logique de duels, bien que ce jeu puisse contenir plus de deux bots par match. Le score est modifié au fur et à mesure de la partie à chaque fois qu'un bot "décède":
diff --git a/src/functions.php b/src/functions.php
index 3c44b40..da9153e 100755
--- a/src/functions.php
+++ b/src/functions.php
@@ -9,6 +9,7 @@
# http://www.gnu.org/licenses/gpl-3.0-standalone.html
#
# -- END LICENSE BLOCK -----------------------------------------
+include(__DIR__."/DUEL.php");
function get_arenas_list(){
include (__DIR__."/arenas_lists.php");
@@ -203,99 +204,73 @@ function ELO_get_podium($arena){
}
return $podium;
}
-function ELO_get_k($elo){
- if ($elo < 1000){
- return 80;
- }
- if ($elo < 2000){
- return 50;
- }
- if ($elo <= 2400){
- return 30;
- }
- return 20;
-}
-function ELO_get_new_ranks($elo1,$elo2,$score){
- /*
- * return an array containing new ELO scores after a battle
- * $score : 0 player 2 won
- * 0.5 draws
- * 1 player 1 won
- */
-
- //good luck for understanding it
- //(see https://blog.antoine-augusti.fr/2012/06/maths-et-code-le-classement-elo/)
- return array(
- $elo1 + ELO_get_k($elo1) * ($score - (1/ (1 + pow(10,(($elo2 - $elo1) / 400))))),
- $elo2 + ELO_get_k($elo2) * (1 - $score - (1/ (1 + pow(10,(($elo1 - $elo2) / 400)))))
- );
-}
-function save_battle($game,$bot1,$bot2,$resultat,$nameOrIds = 'name'){
- //$bots1 and $bots2 are bots'names
- //resultat: 0 match nul, 1 bot1 gagne 2 bot 2 gagne
+function save_battle($game,$bot1,$bot2,$result,$nameOrIds = 'name'){
+ /*
+ * Calculate new ELO ranks and save them on conn_bdd
+ */
+
global $lnMysql;
$game=substr($game,0,8); //limit 8 char for limitting mysql index size
-
- if($nameOrIds == "name"){
- //chercher les id de bot 1 et bot2
- $rs=mysqli_query($lnMysql,"SELECT name,id,ELO FROM bots
- WHERE name='".mysqli_real_escape_string($lnMysql,$bot1)."'
- OR name='".mysqli_real_escape_string($lnMysql,$bot2)."'");
+
+ if($nameOrIds == "name"){
+ for( $i=1; $i<3; $i++){
+ $str = "bot".$i;
+ $botName = $$str;
+ $rs=mysqli_query($lnMysql,"SELECT id,ELO FROM bots WHERE name='".mysqli_real_escape_string($lnMysql,$botName)."'");
+ $r = mysqli_fetch_row($rs);
+ $bot[$i] = array(
+ 'id' => $r[0],
+ 'ELO' => $r[1]
+ );
+ }
}else{
- $rs = mysqli_query($lnMysql, "SELECT name,id,ELO FROM bots
- WHERE id='".mysqli_real_escape_string($lnMysql,$bot1)."'
- OR id='".mysqli_real_escape_string($lnMysql,$bot2)."'");
- }
- while($r=mysqli_fetch_row($rs)){
- $bots[$r[0]]=$r[1];
- $actualELO[$r[0]]=$r[2];
+ //the same, but query by id
+ for( $i=1; $i<3; $i++){
+ $str = "bot".$i;
+ $botName = $$str;
+ $rs=mysqli_query($lnMysql,"SELECT id,ELO FROM bots WHERE id='".mysqli_real_escape_string($lnMysql,$botName)."'");
+ $r = mysqli_fetch_row($rs);
+ $bot[$i] = array(
+ 'id' => $r[0],
+ 'ELO' => $r[1]
+ );
+ }
}
- if((!isset($bots[$bot1])) OR (!isset($bots[$bot2]))){
- error (500,"database corrupt");
- die;
- }
-
- switch($resultat){
+ //apply $result
+ $duel = new DUEL( $bot[1]["ELO"] , $bot[2]["ELO"]);
+
+ switch ($result){
case 0:
+ $duel->drawGame();
$field="nulCount";
- $eloScore = 0.5;
break;
case 1:
- $field="player1_winsCount";
- $eloScore = 1;
+ $duel->oneWinsAgainstTwo();
+ $field="player1_winsCount";
break;
case 2:
- $field="player2_winsCount";
- $eloScore = 0;
- break;
+ $duel->twoWinsAgainstOne();
+ $field="player2_winsCount";
+ break;
default:
- error (500,"something impossible has happened");
+ error (500,"Oups");
break;
}
- $newRanks = ELO_get_new_ranks($actualELO[$bot1],$actualELO[$bot2],$eloScore);
-
- mysqli_multi_query($lnMysql,
- "
- UPDATE bots
- SET ELO='".$newRanks[0]."'
- WHERE id='".$bots[$bot1]."';
-
- UPDATE bots
- SET ELO='".$newRanks[1]."'
- WHERE id='".$bots[$bot2]."';
-
-
- INSERT INTO arena_history(game,player1_id,player2_id,".$field.") VALUES
+ //update ELO rank on database
+ mysqli_multi_query($lnMysql,"
+ UPDATE bots SET ELO = '".$duel->rank1."' WHERE id='".$bot[1]["id"]."';
+ UPDATE bots SET ELO = '".$duel->rank2."' WHERE id='".$bot[2]["id"]."';
+ INSERT INTO arena_history(game,player1_id,player2_id,".$field.") VALUES
('".mysqli_real_escape_string($lnMysql,$game)."',
- '".$bots[$bot1]."',
- '".$bots[$bot2]."',
+ '".$bot[1]["id"]."',
+ '".$bot[2]["id"]."',
'1')
- ON DUPLICATE KEY UPDATE ".$field." = ".$field." + 1;");
-
+ ON DUPLICATE KEY UPDATE ".$field." = ".$field." + 1;
+ ");
}
function get_unique_id(){
//increment the number
From 79e3054c85a1d8a991112224399d635283a49d39 Mon Sep 17 00:00:00 2001
From: Gnieark
Date: Thu, 10 Nov 2016 21:33:13 +0100
Subject: [PATCH 139/144] .
---
countBattles.txt | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/countBattles.txt b/countBattles.txt
index e6ad4d7..e0ae305 100755
--- a/countBattles.txt
+++ b/countBattles.txt
@@ -1 +1 @@
-1784
\ No newline at end of file
+1790
\ No newline at end of file
From 15da3fd2ccc20b2ce99bcf76843ee904b4a72342 Mon Sep 17 00:00:00 2001
From: Gnieark
Date: Tue, 15 Nov 2016 18:54:27 +0100
Subject: [PATCH 140/144] orthographe dans la doc
---
countBattles.txt | 2 +-
src/arenas/tron/doc-en.html | 151 ++++++++++++++++++++++++++++++++++++
src/arenas/tron/doc-fr.html | 28 +++----
3 files changed, 166 insertions(+), 15 deletions(-)
diff --git a/countBattles.txt b/countBattles.txt
index e0ae305..d870964 100755
--- a/countBattles.txt
+++ b/countBattles.txt
@@ -1 +1 @@
-1790
\ No newline at end of file
+1822
\ No newline at end of file
diff --git a/src/arenas/tron/doc-en.html b/src/arenas/tron/doc-en.html
index e69de29..200a99c 100755
--- a/src/arenas/tron/doc-en.html
+++ b/src/arenas/tron/doc-en.html
@@ -0,0 +1,151 @@
+Fonctionnement des combats de Tron
+Règles du jeu (hors specs techniques)
+Chaque bot démarre depuis une case choisie au hasard par l'arène.
+A chaque tour, il est demandé aux bots de grandir d'une case. Il peut choisir la direction. Sa queue s'allonge.
+Si un bot percute une case déjà prise par sa queue ou celle d'un autre, il perd.
+Ce n'est pas du tour par tour, les bots jouent simultanément, ils peuvent donc perdre en choisissant la même case de destination qu'un autre serpent
+Exemple:
+
+9 | | | | | | | | | |
+8 | | | | | | | | | |
+7 | | | | | | | | | |
+6 | | | | | | | | | |
+5 | | | | | | | | | |
+4 | | | oO | | oO | | | | |
+3 | | | | | | | | | |
+2 | | | | | | | | | |
+1 | | | | | | | | | |
+0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 |
+
+Si dans le même tour le serpent vert et le serpent rouge décident d'aller respectivement vers la gauche et vers la droite, ils vont se télescoper et perdre tous les deux.
+
+9 | | | | | | | | | |
+8 | | | | | | | | | |
+7 | | | | | | | | | |
+6 | | | | | | | | | |
+5 | | | | | | | | | |
+4 | | | | ): :( | | | | | |
+3 | | | | | | | | | |
+2 | | | | | | | | | |
+1 | | | | | | | | | |
+0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 |
+
+Lorsqu'un serpent meurt, (lorsqu'un bot perd) Sa queue est effacée et les cases prises par cette dernière deviennent libres pour les serpents encore en vie.
+Le jeu prend fin lorsqu'il reste moins de deux serpents.
+La grille
+
+ - largeur: 1000 cases
+ - hauteur: 1000 cases
+
+
+Communications entre l'arène et les bots
+L'arène fait émet des requêtes http(s) à destination des bots.
+
+ - Type: POST
+ - informations: au format JSON dans le corps de la requetes
+
+
+Initialisation de la partie
+L'arène (ce site) envoie le message (exemple) suivant à votre bot:
+
+{"game-id":"1679","action":"init","game":"tron","board":"","players":4,"player-index":2}
+
+
+ - game-id String Identifiant unique de la partie. Votre bot peut être emmené à jouer plusieurs parties en simultané. Si le fonctionnement de votre bot nécessite de suivre / conserver des valeurs entre deux tours de l'arène, cet identifiant vous sera utile.
+ - action String, peut prendre les valeurs init ou play-turn, mais à cette étape, c'est init
+ - game String, sera toujours "tron" ici. Peut vous servir si vous utilisez la même URL pour plusieurs bots.
+ - board Sera vide à cette étape
+ - players Entier Vous indique le nombre de joueurs sur cette partie. Il est possible que votre bot "joue" plusieurs joueurs. Et si vous les faisiez collaborer en ce cas là?
+ - player-index Entier Le numéro de votre bot. Le premier bot a le numéro 0. Vous gardez le même numéro durant toute la partie, même si des joueurs sont déjà morts
+
+
+Votre bot doit répondre par un tableau au format json, comme ceci:
+
+{"name":"botName"}
+
+L'arène ne vérifie pas actuellement cette réponse, l'étape d'init a été insérée pour assurer la compatibilité avec Bolosseum.
+ Si votre bot repond une page blanche à cette étape (action=init), ça marchera dans le cadre de botsarena.
+
+Tours de jeu
+Exemple de message envoyé par l'arène au premier tour de jeu:
+
+Exemple de message envoyé par l'arène après quelques tours de jeu:
+
+{"game-id":"1680","action":"play-turn","game":"tron","board":[[[687,110],[687,111],[686,111],[686,110],[686,109],[686,108],[686,107],[685,107],[685,108],[685,109],[684,109],[684,110],[684,111],[684,112],[684,113],[683,113],[682,113],[681,113],[681,114],[681,115],[681,116],[680,116],[680,117],[679,117],[679,116],[679,115],[679,114],[679,113],[679,112],[679,111],[679,110],[679,109],[678,109],[678,108],[677,108],[676,108],[676,107],[676,106],[676,105],[676,104],[676,103],[675,103],[674,103],[674,102],[673,102],[672,102],[672,101],[671,101],[670,101],[669,101],[669,102],[669,103],[669,104],[669,105],[669,106],[669,107],[668,107],[668,108],[668,109],[668,110],[668,111],[668,112],[667,112],[667,111],[667,110],[666,110],[666,109],[666,108],[665,108],[664,108],[664,107],[664,106],[663,106],[663,107],[663,108],[662,108],[661,108],[660,108],[660,107],[659,107],[659,106],[658,106],[657,106],[657,105],[657,104],[656,104],[656,103],[655,103],[655,102],[655,101],[654,101],[654,102],[654,103],[654,104],[653,104],[653,103],[653,102],[653,101],[653,100],[652,100],[651,100],[651,101],[651,102],[651,103],[651,104],[650,104],[650,105],[650,106],[649,106],[649,105],[648,105]],[[100,225],[100,226],[100,227],[100,228],[100,229],[100,230],[100,231],[99,231],[98,231],[98,232],[97,232],[96,232],[96,231],[96,230],[96,229],[96,228],[96,227],[96,226],[96,225],[96,224],[96,223],[95,223],[95,222],[94,222],[94,221],[94,220],[93,220],[92,220],[92,219],[92,218],[92,217],[92,216],[92,215],[91,215],[91,214],[90,214],[89,214],[89,213],[89,212],[88,212],[88,213],[88,214],[87,214],[87,213],[86,213],[86,214],[86,215],[85,215],[85,214],[84,214],[84,215],[83,215],[83,216],[83,217],[82,217],[82,216],[81,216],[81,215],[80,215],[80,216],[79,216],[79,215],[79,214],[78,214],[77,214],[77,213],[77,212],[76,212],[75,212],[75,211],[75,210],[75,209],[74,209],[74,210],[74,211],[73,211],[73,210],[72,210],[72,209],[71,209],[71,210],[70,210],[70,209],[69,209],[68,209],[68,210],[68,211],[67,211],[67,210],[67,209],[67,208],[66,208],[66,207],[66,206],[66,205],[66,204],[66,203],[65,203],[65,204],[64,204],[64,203],[63,203],[63,204],[63,205],[63,206],[62,206],[61,206],[61,207],[60,207],[60,208],[59,208]]],"player-index":0,"players":2}
+
+Les champs suivants sont les mêmes qu'au paragraphe précédent:
+
+- game-id
+- game
+- players
+- player-index
+
+
+Les champs qui différent sont:
+
+ - actionString, est toujours "play-turn" à cette étape
+ - boardJe vous explique ça au chapitre suivant.
+
+La Carte (board)
+Elle est représentée dans le champs "board" du JSON envoyé par l'arène. Elle décrit les cases prises par chaque joueur.
+ Elle est composée de plusieurs sous-arrays/sous-objets (en fonction de votre language de programmation). Elle se décompose en sous tableaux de la forme suivante:
+
+ - Board:
+
+ - Joueur 1
+
+ - Case1
+
+ - Coordonnée X
+ - Coordonnée Y
+
+
+ - Case2
+
+ - coordonnée X
+ - Coordonnée Y
+
+
+
+
+ - Joueur 2>
+
+ - Case1
+
+ - coordonnée X
+ - Coordonnée Y
+
+
+ - Case2
+
+ - coordonnée X
+ - Coordonnée Y
+
+
+
+
+
+ - ...
+
+
+ La représentation JSON est la suivante:
+
+
+[
+ [
+ [x1,y1],[x2,y2],[x3,y3]
+ ],
+ [
+ (...)
+ ]
+
+L'ordre des "queues" des serpents dans ce tableau correspond à l'ordre des joueurs. Donc votre serpent est representée par la queue correspondant à player-index (le décompte de player-index commence par 0).
+L'ordre des couples de coordonnées de chaque bot, est dans le sens tête vers queue. Les bots grandissent à chaque tour en déplaçant leur tête.
+Scoring
+Le scorring (classement EHLO) reste sur une logique de duels, bien que ce jeu puisse contenir plus de deux bots par match. Le score est modifié au fur et à mesure de la partie à chaque fois qu'un bot "décède":
+
+ - Lors de la défaite d'un bot, l'arène enregistre un match nul contre tous les autres bots qui ont aussi perdu au même tour de jeu.
+ - Elle enregistre aussi une défaite des bots morts contre tous les bots encore en course à la fin du tour.
+
+
diff --git a/src/arenas/tron/doc-fr.html b/src/arenas/tron/doc-fr.html
index d821de8..200a99c 100755
--- a/src/arenas/tron/doc-fr.html
+++ b/src/arenas/tron/doc-fr.html
@@ -1,6 +1,6 @@
Fonctionnement des combats de Tron
Règles du jeu (hors specs techniques)
-Chaque bot démarre depuis une case choisie au hazard par l'arène.
+Chaque bot démarre depuis une case choisie au hasard par l'arène.
A chaque tour, il est demandé aux bots de grandir d'une case. Il peut choisir la direction. Sa queue s'allonge.
Si un bot percute une case déjà prise par sa queue ou celle d'un autre, il perd.
Ce n'est pas du tour par tour, les bots jouent simultanément, ils peuvent donc perdre en choisissant la même case de destination qu'un autre serpent
@@ -17,7 +17,7 @@
1 | | | | | | | | | |
0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 |
-Si dans le même tour le serpent vert et le serpent rouge décident d'aller respectivement vers la gauche et vers la droite, ils vont se télescopper et perdre tous les deux.
+Si dans le même tour le serpent vert et le serpent rouge décident d'aller respectivement vers la gauche et vers la droite, ils vont se télescoper et perdre tous les deux.
9 | | | | | | | | | |
8 | | | | | | | | | |
@@ -30,7 +30,7 @@
1 | | | | | | | | | |
0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 |
-Lorsqu'un serpent meurt, (lorsqu'un bot perd) Sa queue est effacée et les cases prises par cette dernière devienent libres pour les serpents encore en vie.
+Lorsqu'un serpent meurt, (lorsqu'un bot perd) Sa queue est effacée et les cases prises par cette dernière deviennent libres pour les serpents encore en vie.
Le jeu prend fin lorsqu'il reste moins de deux serpents.
La grille
Communications entre l'arène et les bots
-L'arène fait emet des requetes http(s) à destination des bots.
+L'arène fait émet des requêtes http(s) à destination des bots.
- Type: POST
- informations: au format JSON dans le corps de la requetes
@@ -51,7 +51,7 @@
{"game-id":"1679","action":"init","game":"tron","board":"","players":4,"player-index":2}
- - game-id String Identifiant unique de la partie. Votre bot peut être emmené à jouer plusieurs parties en simultané. Si le fonctionnement de votre bot nécessite de suivre / conserver des valeurs entre deux tours dfe l'arène, cet identifiant vous sera utile.
+ - game-id String Identifiant unique de la partie. Votre bot peut être emmené à jouer plusieurs parties en simultané. Si le fonctionnement de votre bot nécessite de suivre / conserver des valeurs entre deux tours de l'arène, cet identifiant vous sera utile.
- action String, peut prendre les valeurs init ou play-turn, mais à cette étape, c'est init
- game String, sera toujours "tron" ici. Peut vous servir si vous utilisez la même URL pour plusieurs bots.
- board Sera vide à cette étape
@@ -87,7 +87,7 @@ Les champs qui différent sont:
- boardJe vous explique ça au chapitre suivant.
La Carte (board)
-Elle est repésentée dans le champs "board" du JSON envoyé par l'arène. Elle décrit les cases prises par chaque joueur.
+Elle est représentée dans le champs "board" du JSON envoyé par l'arène. Elle décrit les cases prises par chaque joueur.
Elle est composée de plusieurs sous-arrays/sous-objets (en fonction de votre language de programmation). Elle se décompose en sous tableaux de la forme suivante:
- Board:
@@ -96,14 +96,14 @@ Les champs qui différent sont:
- Case1
- - coordonée X
- - Coordonée Y
+ - Coordonnée X
+ - Coordonnée Y
- Case2
- - coordonée X
- - Coordonée Y
+ - coordonnée X
+ - Coordonnée Y
@@ -112,14 +112,14 @@ Les champs qui différent sont:
- Case1
- - coordonée X
- - Coordonée Y
+ - coordonnée X
+ - Coordonnée Y
- Case2
- - coordonée X
- - Coordonée Y
+ - coordonnée X
+ - Coordonnée Y
From 3758ab5866905bad0a40b54775a1cdfc4a1a444e Mon Sep 17 00:00:00 2001
From: Gnieark
Date: Tue, 15 Nov 2016 19:18:39 +0100
Subject: [PATCH 141/144] .
---
src/arenas/tron/doc-en.html | 20 ++++++++++++++++++++
src/arenas/tron/doc-fr.html | 20 ++++++++++++++++++++
2 files changed, 40 insertions(+)
diff --git a/src/arenas/tron/doc-en.html b/src/arenas/tron/doc-en.html
index 200a99c..eeeabe5 100755
--- a/src/arenas/tron/doc-en.html
+++ b/src/arenas/tron/doc-en.html
@@ -142,10 +142,30 @@ Les champs qui différent sont:
L'ordre des "queues" des serpents dans ce tableau correspond à l'ordre des joueurs. Donc votre serpent est representée par la queue correspondant à player-index (le décompte de player-index commence par 0).
L'ordre des couples de coordonnées de chaque bot, est dans le sens tête vers queue. Les bots grandissent à chaque tour en déplaçant leur tête.
+La réponse de votre bot
+Il retourne la direction qu'il souhaite prendre sous la forme d'un array.
4 possibilités:
+
+
+{"play":"x+"}
+
+
+{"play":"x-"}
+
+
+{"play":"y+"}
+
+
+{"play":"y-"}
+
+La façon de noter les directions me semble assez explicite pour que je ne détaille pas.
Scoring
Le scorring (classement EHLO) reste sur une logique de duels, bien que ce jeu puisse contenir plus de deux bots par match. Le score est modifié au fur et à mesure de la partie à chaque fois qu'un bot "décède":
- Lors de la défaite d'un bot, l'arène enregistre un match nul contre tous les autres bots qui ont aussi perdu au même tour de jeu.
- Elle enregistre aussi une défaite des bots morts contre tous les bots encore en course à la fin du tour.
+
+Outils pour développer et tester votre bot
+
Malheureusement aucun outil pour le moment. Ca viendra dans les semaines qui viennent, peut être sous la forme d'une interface swagger
+Et il faut aussi que je développe une AI moins stupide que stupid IA, car actuellement comme il se suicide trop vite, ça ne permet ni de tester l'arène ni un bot plus intelligent
\ No newline at end of file
diff --git a/src/arenas/tron/doc-fr.html b/src/arenas/tron/doc-fr.html
index 200a99c..eeeabe5 100755
--- a/src/arenas/tron/doc-fr.html
+++ b/src/arenas/tron/doc-fr.html
@@ -142,10 +142,30 @@ Les champs qui différent sont:
L'ordre des "queues" des serpents dans ce tableau correspond à l'ordre des joueurs. Donc votre serpent est representée par la queue correspondant à player-index (le décompte de player-index commence par 0).
L'ordre des couples de coordonnées de chaque bot, est dans le sens tête vers queue. Les bots grandissent à chaque tour en déplaçant leur tête.
+La réponse de votre bot
+Il retourne la direction qu'il souhaite prendre sous la forme d'un array.
4 possibilités:
+
+
+{"play":"x+"}
+
+
+{"play":"x-"}
+
+
+{"play":"y+"}
+
+
+{"play":"y-"}
+
+La façon de noter les directions me semble assez explicite pour que je ne détaille pas.
Scoring
Le scorring (classement EHLO) reste sur une logique de duels, bien que ce jeu puisse contenir plus de deux bots par match. Le score est modifié au fur et à mesure de la partie à chaque fois qu'un bot "décède":
- Lors de la défaite d'un bot, l'arène enregistre un match nul contre tous les autres bots qui ont aussi perdu au même tour de jeu.
- Elle enregistre aussi une défaite des bots morts contre tous les bots encore en course à la fin du tour.
+
+Outils pour développer et tester votre bot
+
Malheureusement aucun outil pour le moment. Ca viendra dans les semaines qui viennent, peut être sous la forme d'une interface swagger
+Et il faut aussi que je développe une AI moins stupide que stupid IA, car actuellement comme il se suicide trop vite, ça ne permet ni de tester l'arène ni un bot plus intelligent
\ No newline at end of file
From aa35d1a2bb4a523ae3ceb763d153284eaee10dee Mon Sep 17 00:00:00 2001
From: Gnieark
Date: Wed, 16 Nov 2016 19:19:50 +0100
Subject: [PATCH 142/144] en doc
---
src/arenas/tron/doc-en.html | 140 ++++++++++++++++++------------------
1 file changed, 72 insertions(+), 68 deletions(-)
diff --git a/src/arenas/tron/doc-en.html b/src/arenas/tron/doc-en.html
index eeeabe5..f764fef 100755
--- a/src/arenas/tron/doc-en.html
+++ b/src/arenas/tron/doc-en.html
@@ -1,10 +1,10 @@
-Fonctionnement des combats de Tron
-Règles du jeu (hors specs techniques)
-Chaque bot démarre depuis une case choisie au hasard par l'arène.
-A chaque tour, il est demandé aux bots de grandir d'une case. Il peut choisir la direction. Sa queue s'allonge.
-Si un bot percute une case déjà prise par sa queue ou celle d'un autre, il perd.
-Ce n'est pas du tour par tour, les bots jouent simultanément, ils peuvent donc perdre en choisissant la même case de destination qu'un autre serpent
-Exemple:
+ How Tron Fights Works
+ Game's rules (excluding technical specs)
+ Each bot starts from a point randomly selected by the arena.
+ At each turn, bots are asked to grow one square. they can choose the direction.
+ If a bot strikes a cell already taken by its trail or that of another, it loses.
+ It is not turn-based, bots are playinig simultaneously, so they can lose by choosing the same destination cell as another snake.
+ Example:
9 | | | | | | | | | |
8 | | | | | | | | | |
@@ -17,7 +17,7 @@
1 | | | | | | | | | |
0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 |
-Si dans le même tour le serpent vert et le serpent rouge décident d'aller respectivement vers la gauche et vers la droite, ils vont se télescoper et perdre tous les deux.
+If in the same turn the green snake and the red snake decide to go respectively to the left and to the right, they will telescope and both will lose.
9 | | | | | | | | | |
8 | | | | | | | | | |
@@ -30,96 +30,99 @@
1 | | | | | | | | | |
0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 |
-Lorsqu'un serpent meurt, (lorsqu'un bot perd) Sa queue est effacée et les cases prises par cette dernière deviennent libres pour les serpents encore en vie.
-Le jeu prend fin lorsqu'il reste moins de deux serpents.
-La grille
+When a snake dies, (when a bot loses) its tail is erased and cells taken by it become free for snakes still alive.
+The game ends when there are less than two snakes left
+Grid
- - largeur: 1000 cases
- - hauteur: 1000 cases
+ - width: 1000 cells
+ - Height: 1000 cells
-Communications entre l'arène et les bots
-L'arène fait émet des requêtes http(s) à destination des bots.
+Communications between the arena and the bots
+The arena does send http (s) requests to the bots.
- Type: POST
- - informations: au format JSON dans le corps de la requetes
+ - in JSON format inside the query's body
-Initialisation de la partie
-L'arène (ce site) envoie le message (exemple) suivant à votre bot:
+Initialization of the game
+The arena (this site) sends the following exemple message to your bot:
{"game-id":"1679","action":"init","game":"tron","board":"","players":4,"player-index":2}
- - game-id String Identifiant unique de la partie. Votre bot peut être emmené à jouer plusieurs parties en simultané. Si le fonctionnement de votre bot nécessite de suivre / conserver des valeurs entre deux tours de l'arène, cet identifiant vous sera utile.
- - action String, peut prendre les valeurs init ou play-turn, mais à cette étape, c'est init
- - game String, sera toujours "tron" ici. Peut vous servir si vous utilisez la même URL pour plusieurs bots.
- - board Sera vide à cette étape
- - players Entier Vous indique le nombre de joueurs sur cette partie. Il est possible que votre bot "joue" plusieurs joueurs. Et si vous les faisiez collaborer en ce cas là?
- - player-index Entier Le numéro de votre bot. Le premier bot a le numéro 0. Vous gardez le même numéro durant toute la partie, même si des joueurs sont déjà morts
+ - game-id String The unique identifier of the game. Your bot can be led to play several parts simultaneously. If the functioning of your bot requires to keep data between two turns of the arena, this identifier will be useful.
+ - action String, can be "init" or "play-turn". For the current step, it's "init"
+ - game String, Always "tron" here,can be usefull if you use the same URL to serve many bots
+ - board Is empty at this step./li>
+
- players Intreger indicating how many bots are playing this game.Your bot can "play" several players on the same game. What if you had them collaborate in that case?
+ - player-index Entier Your bot number. The first bot is player-index: 0. You'll keep the same number throughout the game, even if some others players are already dead.
-Votre bot doit répondre par un tableau au format json, comme ceci:
+Your bot must respond with an array in json format, like this:
{"name":"botName"}
-L'arène ne vérifie pas actuellement cette réponse, l'étape d'init a été insérée pour assurer la compatibilité avec Bolosseum.
- Si votre bot repond une page blanche à cette étape (action=init), ça marchera dans le cadre de botsarena.
-
-Tours de jeu
-Exemple de message envoyé par l'arène au premier tour de jeu:
+
+The arena does not currently verify this response, the init step has been inserted to ensure compatibility with Bolosseum. If your bot answers a blank page at this stage (action = init), it will work as part of botsarena.
+
-Exemple de message envoyé par l'arène après quelques tours de jeu:
+Game's laps
+Exemple of arena's message send on the first lap:
+
+
+Exemple of arena's message send after some laps:
{"game-id":"1680","action":"play-turn","game":"tron","board":[[[687,110],[687,111],[686,111],[686,110],[686,109],[686,108],[686,107],[685,107],[685,108],[685,109],[684,109],[684,110],[684,111],[684,112],[684,113],[683,113],[682,113],[681,113],[681,114],[681,115],[681,116],[680,116],[680,117],[679,117],[679,116],[679,115],[679,114],[679,113],[679,112],[679,111],[679,110],[679,109],[678,109],[678,108],[677,108],[676,108],[676,107],[676,106],[676,105],[676,104],[676,103],[675,103],[674,103],[674,102],[673,102],[672,102],[672,101],[671,101],[670,101],[669,101],[669,102],[669,103],[669,104],[669,105],[669,106],[669,107],[668,107],[668,108],[668,109],[668,110],[668,111],[668,112],[667,112],[667,111],[667,110],[666,110],[666,109],[666,108],[665,108],[664,108],[664,107],[664,106],[663,106],[663,107],[663,108],[662,108],[661,108],[660,108],[660,107],[659,107],[659,106],[658,106],[657,106],[657,105],[657,104],[656,104],[656,103],[655,103],[655,102],[655,101],[654,101],[654,102],[654,103],[654,104],[653,104],[653,103],[653,102],[653,101],[653,100],[652,100],[651,100],[651,101],[651,102],[651,103],[651,104],[650,104],[650,105],[650,106],[649,106],[649,105],[648,105]],[[100,225],[100,226],[100,227],[100,228],[100,229],[100,230],[100,231],[99,231],[98,231],[98,232],[97,232],[96,232],[96,231],[96,230],[96,229],[96,228],[96,227],[96,226],[96,225],[96,224],[96,223],[95,223],[95,222],[94,222],[94,221],[94,220],[93,220],[92,220],[92,219],[92,218],[92,217],[92,216],[92,215],[91,215],[91,214],[90,214],[89,214],[89,213],[89,212],[88,212],[88,213],[88,214],[87,214],[87,213],[86,213],[86,214],[86,215],[85,215],[85,214],[84,214],[84,215],[83,215],[83,216],[83,217],[82,217],[82,216],[81,216],[81,215],[80,215],[80,216],[79,216],[79,215],[79,214],[78,214],[77,214],[77,213],[77,212],[76,212],[75,212],[75,211],[75,210],[75,209],[74,209],[74,210],[74,211],[73,211],[73,210],[72,210],[72,209],[71,209],[71,210],[70,210],[70,209],[69,209],[68,209],[68,210],[68,211],[67,211],[67,210],[67,209],[67,208],[66,208],[66,207],[66,206],[66,205],[66,204],[66,203],[65,203],[65,204],[64,204],[64,203],[63,203],[63,204],[63,205],[63,206],[62,206],[61,206],[61,207],[60,207],[60,208],[59,208]]],"player-index":0,"players":2}
-Les champs suivants sont les mêmes qu'au paragraphe précédent:
+Following fields are as in the previous paragraph:
- game-id
- game
- players
- player-index
-
-Les champs qui différent sont:
+Not same fields are:
- - actionString, est toujours "play-turn" à cette étape
- - boardJe vous explique ça au chapitre suivant.
+ - actionString, always "play-turn" for this step.
+ - boardA full chapter is needed ti explain that.
-La Carte (board)
-Elle est représentée dans le champs "board" du JSON envoyé par l'arène. Elle décrit les cases prises par chaque joueur.
- Elle est composée de plusieurs sous-arrays/sous-objets (en fonction de votre language de programmation). Elle se décompose en sous tableaux de la forme suivante:
+
The map / the board
+It is contained on "board" field. All the cells taken by each player are writted in.
+
+It is composed of several subarrays / subobjects (depending on your programming language).
+the sub-tables haved the following form:
- Board:
- - Joueur 1
+
- Player 1
- - Case1
+
- Cell 1
- - Coordonnée X
- - Coordonnée Y
+ - Coordinate X
+ - Coordinate Y
- - Case2
+
- Cell2
- - coordonnée X
- - Coordonnée Y
+ - Coordinate X
+ - Coordinate Y
- - Joueur 2>
+
- Player 2>
- - Case1
+
- Cell 1
- - coordonnée X
- - Coordonnée Y
+ - Coordinate X
+ - Coordinate Y
- - Case2
+
- Cell 2
- - coordonnée X
- - Coordonnée Y
+ - Coordinate X
+ - Coordinate Y
@@ -129,7 +132,7 @@ Les champs qui différent sont:
- La représentation JSON est la suivante:
+ JSON form is as follows:
[
@@ -140,10 +143,11 @@ Les champs qui différent sont:
(...)
]
-L'ordre des "queues" des serpents dans ce tableau correspond à l'ordre des joueurs. Donc votre serpent est representée par la queue correspondant à player-index (le décompte de player-index commence par 0).
-L'ordre des couples de coordonnées de chaque bot, est dans le sens tête vers queue. Les bots grandissent à chaque tour en déplaçant leur tête.
-La réponse de votre bot
-Il retourne la direction qu'il souhaite prendre sous la forme d'un array.
4 possibilités:
+Trails'order on this table is the same as Player's order. So, your "snake" has the trail corresponding with player-index. (First player-index value is 0).
+coordinate's are from the head to the trail. Bots grow by moving their heads.
+
+Bot's awnser
+ It returns direction it wants on a JSON array.
4 possibilies:
{"play":"x+"}
@@ -157,15 +161,15 @@ Les champs qui différent sont:
{"play":"y-"}
-La façon de noter les directions me semble assez explicite pour que je ne détaille pas.
+The way to note the directions seems fairly explicit for me to not explain.
Scoring
-Le scorring (classement EHLO) reste sur une logique de duels, bien que ce jeu puisse contenir plus de deux bots par match. Le score est modifié au fur et à mesure de la partie à chaque fois qu'un bot "décède":
-
- - Lors de la défaite d'un bot, l'arène enregistre un match nul contre tous les autres bots qui ont aussi perdu au même tour de jeu.
- - Elle enregistre aussi une défaite des bots morts contre tous les bots encore en course à la fin du tour.
-
-
+
The scoring (EHLO classification) remains on a logic of duels, although this game can contain more than two bots per game. The score is changed as the game happens each time a bot dies:
+
+ - During the defeat of a bot, the arena records a draw against all the other bots that also lost in the same round of play.
+ - It also records a defeat of the dead bots against all the bots still in the race at the end of the round.
+
-Outils pour développer et tester votre bot
-Malheureusement aucun outil pour le moment. Ca viendra dans les semaines qui viennent, peut être sous la forme d'une interface swagger
-Et il faut aussi que je développe une AI moins stupide que stupid IA, car actuellement comme il se suicide trop vite, ça ne permet ni de tester l'arène ni un bot plus intelligent
\ No newline at end of file
+Tools to develop and test your bot
+Unfortunately no tools yet. It will come in the weeks to come, maybe in the form of a swagger interface
+And I must also develop an AI less stupid than stupid IA, because currently as it commits suicide too fast, it does not allow to test the arena nor a more intelligent bot.
+ent
\ No newline at end of file
From 5173d10fe4dc0963ba30a62c83b9ee247ecd9639 Mon Sep 17 00:00:00 2001
From: Gnieark
Date: Wed, 16 Nov 2016 19:26:49 +0100
Subject: [PATCH 143/144] en doc
---
countBattles.txt | 2 +-
src/arenas/tron/public.php | 1 +
2 files changed, 2 insertions(+), 1 deletion(-)
diff --git a/countBattles.txt b/countBattles.txt
index d870964..688e608 100755
--- a/countBattles.txt
+++ b/countBattles.txt
@@ -1 +1 @@
-1822
\ No newline at end of file
+1825
\ No newline at end of file
diff --git a/src/arenas/tron/public.php b/src/arenas/tron/public.php
index 7479ade..671c790 100755
--- a/src/arenas/tron/public.php
+++ b/src/arenas/tron/public.php
@@ -18,6 +18,7 @@ foreach($bots as $bot){
}
?>
+ Cette arène n'est qu'à moitié ouverte. Elle fonctionne et la documentation est écrite, mais les outils pour vous aider à débogguer et tester un bot n'ont pas été créés. Ca viendra.