Ce concours est officiellement terminé. L'équipe bleue a gagné!
J'autoran deux séries de 50 batailles et étonnamment, Blue en a remporté 100. En regardant les statistiques, il est clair que les entrées coopératives de PhiNotPi et Sp3000 étaient les vrais héros. Bravo à vous deux! En fait, si vous disqualifiez tous les autres membres de l’équipe bleue , les Sphibots s’affronteront quand même très bien . Certains membres de la Red Team envisageaient de vaincre les Sphibots, mais leurs efforts semblaient se résorber. Désolé équipe rouge.
Le concours est officiellement terminé, mais cela ne signifie pas que vous ne pouvez plus répondre, cela signifie simplement que je ne redéclarerai jamais le gagnant officiel. Les deux équipes sont invitées à continuer de soumettre des robots, juste pour le plaisir. Le contrôleur restera actif et restera fonctionnel aussi longtemps qu'aucune autre entrée ne le divisera.
C'est un roi-de-la-colline concours, mais au lieu de tous ceux qui luttent les uns contre les autres, il y aura deux équipes qui sont en concurrence: rouge et bleu. Un seul sera le gagnant.
L’équipe sur laquelle vous travaillez dépend de votre numéro d’identifiant PPCG . Pour le trouver, cliquez sur votre avatar en haut de l'écran (vous devez être connecté) et regardez l'url de la page qui s'ouvre. Le numéro après users/
est votre numéro d'identification:
https://codegolf.stackexchange.com/users/[id number]/[display name]
Par exemple, mon numéro d’identifiant PPCG est 26997:
https://codegolf.stackexchange.com/users/26997/calvins-hobbies
Notez que ce nombre est différent pour différents sites Stack Exchange.
Si votre identifiant est un nombre pair , alors vous faites partie de l' équipe rouge .
Si votre identifiant est un nombre impair , alors vous êtes dans l' équipe bleue .
Il n'y a pas moyen de changer d'équipe.
Vous devez travailler avec votre équipe pour essayer de vaincre l’autre équipe dans une sorte de bataille royale où chaque utilisateur contrôle un "pixel" de la couleur de son équipe sur la grille 128 × 128 située sur le champ de bataille. Les pixels peuvent se déplacer, communiquer avec leurs coéquipiers et supprimer les pixels de l’autre équipe. Si quelqu'un pouvait créer un nombre quelconque de pixels, il serait incontrôlable que chaque utilisateur ne puisse soumettre qu'une seule réponse à cette question.
Cet extrait de pile (une version simplifiée de ce violon [ plein écran ]) est le contrôleur pour tout le concours. Il lit automatiquement les soumissions, s'assure de leur validité et organise des batailles entre les équipes. Il fait ce droit dans votre navigateur à tout moment, en utilisant JavaScript . Comme JavaScript est le seul langage de script côté client que la plupart des navigateurs prennent en charge, toutes les soumissions doivent également être écrites en JavaScript.
function toggleDebug(){debug=$("#debug").is(":checked")}function rnd(e){return Math.floor(Math.random()*e)}function shuffle(e){for(var t,a,r=e.length;r;t=rnd(r),a=e[--r],e[r]=e[t],e[t]=a);return e}function maskedEval(e,t){var a={};for(i in this)a[i]=void 0;for(i in t)t.hasOwnProperty(i)&&(a[i]=t[i]);return new Function("with(this) { "+e+";}").call(a)}function createBattle(e,t,a,r){function n(){var e=rnd(i.length),t=i[e];return i.splice(e,1),t}var l={};l.width=l.height=128,l.totalMoves=2048,l.radius=16,l.msgMaxLength=64,l.timeLimit=15,l.move=0,l.redToMove=a,l.animated=r,l.running=!1,l.over=!1;for(var o=0,i=new Array(l.width*l.height),d=0;d<l.height;d++)for(var s=0;s<l.width;s++)i[o++]={x:s,y:d};l.redTeam=shuffle(e.slice()),l.redMsgs={},l.redKills={};for(var o=0;o<l.redTeam.length;o++){var u=n();l.redTeam[o].x=u.x,l.redTeam[o].y=u.y,l.redMsgs[l.redTeam[o].id]="",l.redKills[l.redTeam[o].id]=0}l.blueTeam=shuffle(t.slice()),l.blueMsgs={},l.blueKills={};for(var o=0;o<l.blueTeam.length;o++){var u=n();l.blueTeam[o].x=u.x,l.blueTeam[o].y=u.y,l.blueMsgs[l.blueTeam[o].id]="",l.blueKills[l.blueTeam[o].id]=0}return l}function drawBattle(e){function t(e){var t=3*e.x,a=3*e.y;ctx.fillRect(t,a,3,3),showNames.is(":checked")&&ctx.fillText(e.title,t+5,a+12)}function a(t){ctx.beginPath(),ctx.arc(3*t.x,3*t.y,3*e.radius,0,2*Math.PI),ctx.closePath(),ctx.fill()}e.animated&&(ctx.clearRect(0,0,canvas.width,canvas.height),showCircles.is(":checked")&&(ctx.fillStyle="rgba(255, 0, 0, 0.1)",e.redTeam.forEach(a),ctx.fillStyle="rgba(0, 0, 255, 0.1)",e.blueTeam.forEach(a)),ctx.fillStyle="red",e.redTeam.forEach(t),ctx.fillStyle="blue",e.blueTeam.forEach(t),moveCounter.text((e.move+1).toString()))}function movePlayer(e,t,a,r,n,l,o,i){function d(a){t.id!==a.id&&Math.sqrt(Math.pow(t.x-a.x,2)+Math.pow(t.y-a.y,2))<e.radius&&(u.push({x:a.x,y:a.y,id:a.id}),debug&&console.log(a.title+" is near"))}debug&&(console.log("--- Moving "+t.title+" ---"),console.log("position before move = ("+t.x.toString()+", "+t.y.toString()+")"));var s={};s.move=a,s.x=t.x,s.y=t.y,s.tCount=r.length,s.eCount=n.length,s.setMsg=function(a){"string"==typeof a&&(l[t.id]=a.length>e.msgMaxLength?a.substring(0,e.msgMaxLength):a,debug&&console.log('set message to "'+l[t.id]+'"'))},s.getMsg=function(e){var t=l.hasOwnProperty(e)?l[e]:void 0;return debug&&console.log('got message "'+t+'" from player with id '+e.toString()),t};var u=[];r.forEach(d),s.tNear=u,u=[],n.forEach(d),s.eNear=u,-1===t.id&&(s.console=console);var c=0,g=performance.now();try{c=maskedEval(t.code,s)}catch(v){c=0,debug&&(console.log("encountered error:"),console.log(v))}g=performance.now()-g,debug&&console.log("time taken = "+g.toString()+"ms"),g>e.timeLimit&&(c=0,debug&&console.log("went over the time limit of "+e.timeLimit+"ms"));var m=t.x,h=t.y;switch(c){case 1:e.redToMove?++m:++h;break;case 2:e.redToMove?--m:--h;break;case 3:++m,--h;break;case 4:--m,--h;break;case 5:--m,++h;break;case 6:++m,++h}m>=0&&m<e.width&&h>=0&&h<e.height&&(t.x=m,t.y=h),debug&&console.log("move direction = "+c);for(var f=0;f<n.length;f++)t.x===n[f].x&&t.y===n[f].y&&(debug&&console.log("took out "+n[f].title),++i[t.id],o[n[f].id]="X",n.splice(f--,1))}function advanceBattle(e){debug&&console.log("====== "+(e.redToMove?"Red ":"Blue ")+e.move.toString()+" ======");var t,a,r,n,l;e.redToMove?(t=e.redTeam,a=e.blueTeam,r=e.redMsgs,n=e.blueMsgs,l=e.redKills):(t=e.blueTeam,a=e.redTeam,r=e.blueMsgs,n=e.redMsgs,l=e.blueKills),t.forEach(function(o){movePlayer(e,o,Math.floor(e.move/2)+1,t,a,r,n,l)}),drawBattle(e);var o;return 0===a.length?(o=e.redToMove?1:-1,e.over=!0):++e.move>=e.totalMoves&&(o=e.redTeam.length>e.blueTeam.length?1:e.redTeam.length<e.blueTeam.length?-1:0,e.over=!0),e.redToMove=!e.redToMove,debug&&"undefined"!=typeof o&&console.log("win status = "+o.toString()),o}function newBattle(){if(0===redTeam.length||0===blueTeam.length)return void alert("Each team must have at least one player.");"undefined"!=typeof interval&&clearInterval(interval);var e=parseInt($("#delay").val());return isNaN(e)||0>e?void alert("Delay must be a non-negative integer."):(debug&&console.log("Created new battle with delay "+e.toString()),battle=createBattle(redTeam,blueTeam,$("#redMovesFirst").is(":checked"),!0),drawBattle(battle),void moveCounter.text("0").css("color","black"))}function reportKills(e,t){for(var a="Red Kills:\n",r=0;r<redTeam.length;r++)a+=e[redTeam[r].id].toString()+" by "+redTeam[r].title+"\n";a+="\nBlue Kills:\n";for(var r=0;r<blueTeam.length;r++)a+=t[blueTeam[r].id].toString()+" by "+blueTeam[r].title+"\n";return a}function intervalCallback(){var e=advanceBattle(battle);"undefined"!=typeof e&&(clearInterval(interval),battle.running=!1,alert([0===e?"Tie!":e>0?"Red Wins!":"Blue Wins!","Red remaining: "+battle.redTeam.length,"Blue remaining: "+battle.blueTeam.length,"\n"].join("\n")+reportKills(battle.redKills,battle.blueKills)))}function run(){if("undefined"!=typeof battle&&!battle.running&&!battle.over){battle.running=!0;var e=parseInt($("#delay").val());if(isNaN(e)||0>e)return void alert("Delay must be a non-negative integer.");interval=setInterval(intervalCallback,e)}}function pause(){"undefined"!=typeof battle&&(battle.running=!1),"undefined"!=typeof interval&&clearInterval(interval)}function step(){"undefined"==typeof battle||battle.running||battle.over||intervalCallback()}function autorunBattles(){function e(e){for(var t,i=createBattle(redTeam,blueTeam,e,!1);!i.over;)if(t=advanceBattle(i),"undefined"!=typeof t){i.over=!0,1===t?++a:-1===t?++n:++r;for(var d in i.redKills)i.redKills.hasOwnProperty(d)&&(l[d]+=i.redKills[d]);for(var d in i.blueKills)i.blueKills.hasOwnProperty(d)&&(o[d]+=i.blueKills[d])}}if(pause(),battle=void 0,0===redTeam.length||0===blueTeam.length)return void alert("Each team must have at least one player.");var t=parseInt($("#N").val());if(isNaN(t)||0>t)return void alert("N must be a non-negative integer.");console.log("Autorunning "+t.toString()+" battles");for(var a=0,r=0,n=0,l={},o={},i=0;i<redTeam.length;i++)l[redTeam[i].id]=0;for(var i=0;i<blueTeam.length;i++)o[blueTeam[i].id]=0;for(var i=0;t>i;i++)console.log("Battle "+i.toString()),e(i%2===0);alert([a===n?"Tie overall!":a>n?"Red wins overall!":"Blue wins overall!","Red wins: "+a.toString(),"Blue wins: "+n.toString(),"Ties: "+r.toString(),"\n"].join("\n")+reportKills(l,o))}function changeSelect(e){var t=e?redTeam:blueTeam,a=$(e?"#redSelect":"#blueSelect").val(),r=$(e?"#redCode":"#blueCode"),n=$(e?"#redLink":"#blueLink");null!==a&&a>-1?(r.text(t[a].code),n.attr("href",t[a].link)):(r.text(""),n.attr("href","javascript:;"))}function loadEntries(){function e(e,t){url="https://api.stackexchange.com/2.2/questions/"+qid.toString()+"/answers?page="+e.toString()+"&pagesize=100&order=asc&sort=creation&site=codegolf&filter=!JDuPcYJfXobC6I9Y-*EgYWAe3jP_HxmEee",$.get(url,t)}function t(d){d.items.forEach(function(e){function t(e,t){t.append(" ").append($("<a>").text(e.owner.display_name).attr("href",e.link))}function n(e){return $("<textarea>").html(e).text()}var d=e.owner.user_id%2===0,s=d?redTeam:blueTeam;if(e.owner.display_name=n(e.owner.display_name),e.hasOwnProperty("last_edit_date")&&e.last_edit_date-e.creation_date>r||dq.indexOf(e.owner.user_id)>-1||l.indexOf(e.owner.user_id)>-1)return void t(e,o);l.push(e.owner.user_id);var u=a.exec(e.body);if(null===u||u.length<=1)return void t(e,i);var c={};c.id=e.owner.user_id,c.title=e.owner.display_name+" ["+e.owner.user_id.toString()+"]",c.code=n(u[1]),c.link=e.link;var g=$(d?"#redSelect":"#blueSelect");g.append($("<option>").text(c.title).val(s.length)),s.push(c)}),d.has_more?e(++n,t):($("#loadStatus").hide(),$("#redCount").text(redTeam.length.toString()),$("#blueCount").text(blueTeam.length.toString()),0===o.html().length&&o.html(" none"),0===i.html().length&&i.html(" none"))}var a=/<pre><code>((?:\n|.)*?)\n<\/code><\/pre>/,r=28800,n=1,l=[],o=$("#disqualified"),i=$("#invalid");pause(),battle=void 0,redTeam=[],blueTeam=[],$("#loadStatus").show(),$("#redSelect").empty(),$("#redCode").empty(),$("#redLink").attr("href","javascript:;"),$("#blueSelect").empty(),$("#blueCode").empty(),$("#blueLink").attr("href","javascript:;");var d=$("#testbot").val();if(d.length>0){debug&&console.log("Using test entry");var s={id:-1,title:"TEST ENTRY [-1]",link:"javascript:;",code:d};$("#testbotIsRed").is(":checked")?(redTeam.push(s),$("#redSelect").append($("<option>").text(s.title).val(0))):(blueTeam.push(s),$("#blueSelect").append($("<option>").text(s.title).val(0)))}e(1,t)}var qid=48353,dq=[],ctx,moveCounter,showNames,showCircles,debug=!1,battle,redTeam,blueTeam,interval;$(document).ready(function(){ctx=$("#canvas")[0].getContext("2d"),moveCounter=$("#moveCounter"),showNames=$("#showNames"),showCircles=$("#showCircles"),loadEntries()});
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script><style>html *{font-family: Consolas, Arial, sans-serif;}select{width: 100%; margin: 12px 0 0 0;}button, select, input{font-size: 100%;}input{text-align: right;}textarea{font-family: "Courier New", monospace;}textarea[readonly]{background-color: #eee; width: 100%;}canvas{margin: 12px 0 0 0; border: 2px solid gray;}.redWrapper, .blueWrapper{width: 30%;}.redWrapper{float: left;}.blueWrapper{float: right;}.arenaWrapper{width: 40%; display: inline-block;}.redTeam, .blueTeam, .arena{padding: 12px;}.arena{text-align: center;}.redTeam, .blueTeam{border-style: solid; border-width: medium;}.redTeam{border-color: red; background-color: #fee;}.blueTeam{border-color: blue; background-color: #eef;}.redTitle, .blueTitle, .arenaTitle{text-align: center; font-size: 200%;}.redTitle, .blueTitle{font-weight: bold;}.redTitle{color: red;}.blueTitle{color: blue;}.control{margin: 12px 0 0 0;}.count{font-size: 75%; margin: 0 0 12px 0;}.footnotes{font-size: 75%; clear: both; padding: 12px;}</style><div id='loadStatus'> Loading entries...</div><div> <div class='redWrapper'> <div class='redTeam'> <div class='redTitle'> Red Team </div><select id='redSelect' size='20' onchange='changeSelect(true)'> </select> <div class='count'> <span id='redCount'></span> players </div>Code: <br><textarea id='redCode' rows='12' readonly></textarea> <br><a id='redLink' href='javascript:;'> Answer Link </a> </div></div><div class='arenaWrapper'> <div class='arena'> <div class='arenaTitle'> Battlefield </div><canvas id='canvas' width='384' height='384'> Your browser does not support the canvas tag. </canvas> <div>Move <span id='moveCounter'>0</span></div><br><div> <div class='control'> <input id='showNames' type='checkbox'>show names <input id='showCircles' type='checkbox'>show circles </div><div class='control'> <input id='redMovesFirst' type='checkbox'>red moves first </div><div class='control'> <input id='delay' type='text' size='4' value='20'> millisecond delay </div><div class='control'> <button type='button' onclick='newBattle()'> New Battle </button> <button type='button' onclick='run()'> Run </button> <button type='button' onclick='pause()'> Pause </button> <button type='button' onclick='step()'> Step </button> </div><hr class='control'> <div class='control'> <button type='button' onclick='autorunBattles()'> Autorun N Battles </button> N = <input id='N' type='text' size='4' value='16'> </div><div class='footnotes'> Autoruns may hang browser tab until complete. </div></div></div></div><div class='blueWrapper'> <div class='blueTeam'> <div class='blueTitle'> Blue Team </div><select id='blueSelect' size='20' onchange='changeSelect(false)'> </select> <div class='count'> <span id='blueCount'></span> players </div>Code: <br><textarea id='blueCode' rows='12' readonly></textarea> <br><a id='blueLink' href='javascript:;'> Answer Link </a> </div></div></div><div class='footnotes'> Test Entry: (id = -1) <input id='testbotIsRed' type='checkbox'>On Red Team <br><textarea id='testbot' rows='1' cols='32'></textarea> <br><button type='button' onclick='loadEntries()'> Reload with test entry </button> <br><br>This was designed and tested in Google Chrome. It might not work in other browsers. <br>Disqualified entries:<span id='disqualified'></span> <br>Could not find code block:<span id='invalid'></span> <br><input id='debug' type='checkbox' onclick='toggleDebug()'>Debug messages <br></div>
Pour plus de visibilité, le champ de bataille de l'extrait de code est divisé par 3, il s'agit donc de 384 × 384 pixels réels et les "pixels" sont 3 × 3.
Pixel Team Battlebots - Présentation
Joueurs
Chaque réponse valide à cette question représente un joueur . (Pour plus de détails sur la validité, voir "Règles et éliminations" .) Chaque joueur a le contrôle d'une seule cellule 1 × 1 (pixel) sur le champ de bataille de 128 × 128 cellules . Les joueurs de l'équipe rouge ont des pixels rouges et les joueurs de l'équipe bleue ont des pixels bleus.
Batailles
Une bataille est un combat opposant tous les joueurs des deux équipes, même si les équipes n’ont pas le même nombre de joueurs. Une bataille commence avec chaque joueur placé à une position aléatoire sur le champ de bataille, c'est-à-dire toute coordonnée entière comprise entre (0,0) en haut à gauche et (127,127) en bas à droite. Il est garanti qu'aucun joueur ne partira dans la même position.
Se déplace
Chaque bataille est divisée en 2048 coups . Une seule équipe peut réellement déplacer ses joueurs à chaque coup. Cette équipe alternant du rouge au bleu, chaque équipe effectue 1024 coups au total (à moins que la partie se termine tôt).
L’équipe qui se déplace en premier est une option que vous devez définir dans le contrôleur.
Lorsque les batailles sont autorun, l'équipe qui se déplace en premier alterne à chaque bataille.
Le joueur bouge
Quand une équipe se déplace, tous les joueurs de cette équipe sont invités à se déplacer eux-mêmes. Ces appels sont effectués dans un ordre complètement aléatoire pour chaque mouvement. Lorsqu’il est appelé, chaque joueur reçoit des données sur l’état de la bataille pour qu’il puisse décider du chemin à suivre.
Tous les mouvements ne sont éloignés que d’un pixel. Les cercles noirs dans ces diagrammes indiquent les positions de chaque joueur coloré (les carrés) peuvent être déplacés vers:
Les deux couleurs peuvent se déplacer en diagonale dans n'importe quelle direction ou rester immobiles, mais seuls les joueurs rouges peuvent se déplacer de droite à gauche et seuls les joueurs bleus peuvent se déplacer de haut en bas. Merci Phi et les autres.
Si un joueur essaie de sortir des limites du champ de bataille, ou prend trop de temps à décider de la direction dans laquelle se déplacer, ou s'il a une sorte d'erreur, il restera automatiquement immobile.
En plus de se déplacer, un joueur peut, pendant un tour, lire les messages écrits par leurs coéquipiers et écrire des messages qui peuvent à leur tour être lus. Cela permet une forme brute de communication en équipe.
Le code que vous soumettez en tant que réponse est la logique qui détermine le moyen de déplacer votre lecteur et les messages à lire et à écrire (voir "Comment répondre" ).
Retrait des joueurs ennemis
Lorsqu'un joueur entre dans la même cellule qu'un joueur de l'équipe adverse, ce joueur est immédiatement retiré du combat. Le joueur qui vient de déménager continue normalement. C'est le seul mécanisme qui élimine les joueurs de la bataille et sa maîtrise est la clé pour gagner!
S'il y a plusieurs joueurs ennemis dans la cellule sur laquelle un joueur vient d'être transféré, tous les joueurs ennemis sont supprimés. Rien ne se passe si deux joueurs de la même équipe occupent la même cellule.
Gagner une bataille
Une bataille se termine une fois que tous les 2048 mouvements ont été effectués ou qu’une équipe n’a plus de joueurs. L'équipe avec le plus grand nombre de joueurs survivants gagne. Il y a égalité si les deux équipes ont un nombre égal de joueurs survivants.
Comment répondre
Dans votre réponse, vous devez fournir le code JavaScript qui décide de la manière dont votre pixel se déplacera lorsqu'il sera appelé à le faire.
Dans le premier exemple de code en retrait de votre réponse (ceux précédés de 4 espaces), écrivez un corps pour cette fonction:
function moveMe(move, x, y, tCount, eCount, tNear, eNear, setMsg, getMsg) {
//the body goes here
}
Il n'est pas nécessaire de jouer au golf avec votre code.
Quoi retourner
La valeur de retour de la fonction détermine le sens de déplacement de votre pixel:
0
rester immobile pour rester
1
à droite pour l'équipe rouge, pour que l'équipe bleue
2
se déplacer à gauche pour l'équipe rouge, pour que l'équipe bleue
3
se déplacer en diagonale et à droite
4
pour se déplacer en diagonale et à gauche
5
pour se déplacer en diagonale et à gauche
6
pour se déplacer en diagonale bas et à droite
Sous forme de diagramme:
Votre pixel restera immobile par défaut si votre code fait l’une de ces choses:
- Renvoie autre chose qu'un entier compris entre 0 et 6.
- Tente de déplacer le pixel hors des limites du champ de bataille.
- Prend plus de 15 millisecondes à exécuter.
- Lance toute sorte d'exception.
Votre entrée n'a pas besoin d'être déterministe; utiliser Math.random
c'est bien.
Les paramètres
Les 7 premiers paramètres de fonction de moveMe
donnent des informations sur l'état de la bataille:
move
est un entier qui commence à 1 et s'incrémente après chaque coup jusqu'à ce qu'il soit 1024 au dernier coup de votre équipe.x
est votre position x actuelle, un entier compris entre 0 (le plus à gauche) et 127 (le plus à droite).y
est votre position y actuelle, un entier compris entre 0 (le plus élevé) et 127 (le plus bas).tCount
est le nombre total actuel de joueurs survivants de votre équipe.eCount
est le nombre total actuel de joueurs survivants de l'équipe ennemie.tNear
est une liste des joueurs survivants de votre équipe qui se trouvent à moins de 16 pixels (distance euclidienne). Chaque élémenttNear
est un objetx
,y
et desid
propriétés:
x
est la position x de l'autre joueury
est la position y de l'autre joueurid
est le numéro d'utilisateur PPCG de l'autre joueur (sous forme d'entier)eNear
est exactement commetNear
sauf que c'est une liste de joueurs ennemis proches, pas de coéquipiers.
Les cercles dans l'extrait sont ceux de chaque joueur tNear
et de leur eNear
portée.
messages
Les 2 derniers paramètres, setMsg
et getMsg
, ont des objectifs légèrement différents.
Tout au long d'une bataille, chaque joueur dispose d'une chaîne de 64 caractères maximum qu'il peut manipuler à chaque déplacement pour stocker des données et potentiellement communiquer avec ses coéquipiers. La chaîne de chaque joueur commence par la chaîne vide. Lorsqu'un joueur est retiré de la bataille, sa chaîne est définie sur "X".
setMsg
est une fonction à un argument qui définit votre chaîne sur la chaîne transmise.- Si la valeur transmise n'est pas une chaîne, votre chaîne ne change pas.
- Si la valeur est une chaîne de plus de 64 caractères, seuls les 64 premiers sont conservés.
getMsg
est une fonction à un argument qui prend le numéro d'identification de l'utilisateur PPCG (sous la forme d'un entier) de quelqu'un de votre équipe et renvoie sa chaîne.- Ce joueur peut être n'importe où dans la grille. Ils n'ont pas besoin d'être dans votre rayon de 16 pixels.
undefined
est retourné si l'ID donné n'est pas trouvé.
Exemple de soumission
Ce joueur se déplace vers le haut et à droite s'il y a un ennemi à gauche, ou bien vers le bas et à gauche si son coéquipier avec ID 123 dit à, mais reste immobile:
for (var i = 0; i < eNear.length; i++) {
if (eNear[i].x === x - 1)
return 3
}
if (getMsg(123) === 'move down and left')
return 5
return 0
Notez que ce bloc de code est tout ce qui est requis. La définition de la fonction et les crochets ne doivent pas être présents.
Règles et Disqualifications
Si un utilisateur ne respecte pas les règles énumérées ci-dessous, je peux le marquer comme étant disqualifié et le contrôleur ignorera automatiquement ses réponses. J'espère que la plupart des utilisateurs ne vont pas intentionnellement enfreindre les règles et qu'il n'y aura que quelques exclusions temporaires pour cause accidentelle.
Règles importantes
Vous ne pouvez modifier votre réponse que pendant la fenêtre de 8 heures immédiatement après l'avoir postée.
Les réponses éditées 8 heures après leur publication seront automatiquement disqualifiées par le contrôleur. Cette règle vise à empêcher les réponses initiales d’optimiser continuellement leur approche, voire de voler des idées à des réponses ultérieures. Votre équipe doit se débrouiller avec les réponses avec lesquelles elle a commencé.Vous ne pouvez pas supprimer et republier votre réponse sans autorisation spéciale. Je donnerai ceci si quelqu'un modifie par inadvertance votre message après 8 heures ou quelque chose du genre, mais pas seulement parce que vous avez trouvé un bogue.
Si vous supprimez votre message et choisissez de le supprimer, la règle de modification s'applique toujours. (Le contrôleur ne peut pas voir les réponses supprimées.)
Lors de la déclaration d'une nouvelle variable JavaScript, vous devez utiliser le
var
mot clé.
En effet, une variable déclarée sansvar
devient globale plutôt que locale, il serait donc facile de jouer accidentellement (ou intentionnellement) avec le contrôleur ou de communiquer librement avec les autres joueurs. Il doit être clair que vous n'essayez pas de tricher.Lors de la déclaration de fonctions, il est également préférable d’utiliser le
var
mot - clé. c'est-à-dire utiliservar f = function(...) {...}
au lieu defunction f(...) {...}
. Je ne sais pas trop pourquoi, mais parfois, cela semble faire la différence.Votre code ne doit pas être utilisé trop longtemps.
Si votre code prend plus de 15 millisecondes à exécuter, votre pixel ne bougera pas du tout. Cependant, comme il est difficile en JavaScript d’arrêter les fonctions en cours d’exécution, tous les scripts du lecteur sont exécutés à la fin de chaque mouvement, puis la durée est vérifiée par la suite. Cela signifie que si votre code prend beaucoup de temps, toute personne utilisant le contrôleur le remarquera et en sera contrariée.
Disqualifications automatiques
Le contrôleur a automatiquement disqualifié les entrées pour les raisons suivantes:
- L'utilisateur a déjà répondu.
- Les modifications ont été effectuées plus de 8 heures après la création.
- L'utilisateur est spécifiquement marqué comme disqualifié.
Autres règles
Dans votre code, vous ne pouvez pas ...
- tenter d'accéder ou de modifier le code du contrôleur ou d'un autre joueur.
- tenter de modifier quoi que ce soit construit en JavaScript.
- essayer de communiquer avec les autres joueurs sauf en utilisant
getMsg
etsetMsg
. - faire des requêtes Web.
- faire des choses autrement malveillantes.
Je garderai un œil sur les autres comportements antisportifs, tels que voler le code mot à mot d'autres réponses ou utiliser des marionnettes à chaussettes pour déconner avec l'autre équipe.
Vous êtes invités à collaborer et à organiser avec votre équipe, mais gardez le concours amical et éthique.
Si vous pensez que quelqu'un doit être disqualifié ou si vous pensez avoir corrigé la raison de votre disqualification, laissez un commentaire ici pour moi ou dans la discussion en question . Je ne participe pas au concours.
Format de réponse suggéré
#[team color] Team - [entry title]
//function body
//probably on multiple lines
Explanations, notes, etc.
Le titre de l'entrée est un nom facultatif que vous pouvez donner si vous le souhaitez. Le contrôleur ne fait rien avec elle.
Notation
Ce concours sera officiellement terminé le 19 avril 2015. Ce jour-là (vers 23 h UTC), j'autoriserai au moins 100 batailles (probablement beaucoup plus, en fonction de la durée des batailles). L'équipe qui gagne le plus sera le vainqueur général. Si c'est à égalité ou si serré, je mènerai plus de batailles jusqu'à ce qu'il soit clair qu'une équipe a l'avantage.
(Vous pouvez répondre après la décision du gagnant, mais je ne changerai pas le résultat officiel.)
Je les utiliserai dans la dernière version de Google Chrome sur un ordinateur portable doté de Windows 8.1 64 bits, de 4 Go de RAM et d'un processeur quad-core à 1,6 GHz. Assurez-vous que votre JavaScript fonctionne dans Chrome.
La victoire concerne principalement la gloire de l’équipe, mais j’accepterai la réponse la plus votée de l’équipe gagnante.
Tout au long du concours, gardez à l'esprit que l'aspect basé sur l'équipe et le fait qu'il soit entièrement exécuté dans un extrait de pile sont très expérimentaux. J'ai de grands espoirs, mais je ne peux pas dire avec certitude à quel point les choses vont fonctionner.
Conseils:
- Vous pouvez tester les entrées avant de répondre. Éditez la zone de texte "Entrée de test" vers le bas de l'extrait de pile et cliquez sur "Recharger avec l'entrée de test". S'il n'est pas vide, il devient un joueur de l'équipe spécifiée.
- Les réponses sont exécutées dans une portée masquée, ainsi les choses comme
alert
etconsole.log
ne fonctionneront pas. L'console
objet ne peut être utilisé que dans l'entrée de test. - Vérifiez "Messages de débogage" au bas de l'extrait de pile et regardez dans la console de votre navigateur (F12). De nombreuses informations utiles sont imprimées lorsque des batailles sont en cours.
- Vous pouvez utiliser le message Meta Sandbox comme une sorte de zone de transit. Les réponses sont bien évidemment différentes de celles d’ici, et le contrôleur peut devenir obsolète.
- Comme il ne s’agit pas d’une application officielle de pile , le contrôleur peut arrêter de charger les réponses si vous la relancez plus de 300 fois par jour.
La "suite" de ce défi: Block Building Bot Flocks!
Liens rapides
Fiddle Controller Fullscreen General Chat ( Discussion générale générale ) Discussion rouge (discussion en ligne?) SandboxPost
la source
Réponses:
Blue Team - SphiNotPi3000
Ce bot forme une paire avec le bot de Sp3000 .
L'idée de base est que deux robots, placés l'un à côté de l'autre, aident à couvrir les faiblesses de l'autre, de sorte qu'aucun des deux robots ne possède un côté exposé. Cela permet de se protéger des menaces et de limiter les options d’échappement de la cible.
Au début du jeu, ils se dirigent l'un vers l'autre et forment une paire. Cette paire se déplace alors comme une seule unité, avec un bot en tête de l’autre. Les deux robots ont un code presque identique, leur permettant d’échanger des positions et des rôles si nécessaire.
Au repos, les robots se déplacent sur le tableau à la recherche d'ennemis. Une fois qu'ils ont repéré un ennemi, ils se sont soigneusement positionnés pour attaquer. Une caractéristique très intéressante est la capacité de la formation à se déplacer droit horizontalement, obtenue en faisant alterner les bots.
la source
var
n'est pas utilisé dans cet article et celui de Sp3000. Ils affectentj
immédiatement à 0 et cela n'interfère pas du tout avec le contrôleur, ce n'est donc heureusement pas un problème dans ce cas.Blue Team - SphiNotPi3000
Ce bot forme une paire avec le bot de PhiNotPi . Voir le post de Phi pour une brève explication de notre stratégie.
la source
Équipe Rouge - SeekerBot
La priorité absolue de SeekerBot est la survie. Par conséquent, il ne considérera que les mouvements qui ne le mettront pas en danger d'être tué au prochain tour (tant que de tels mouvements existent).
Quand aucun adversaire n'est en vue, il se déplacera de manière régulière sur le champ de bataille, ce qui garantira que la plus grande partie du sol sera régulièrement à distance de vue.
Si SeekerBot repère un ennemi, il se déplacera vers lui. S'il peut tuer un ennemi, il le fera tant que le mouvement est enregistré.
S'il ne peut pas tuer un ennemi mais que celui-ci est en mesure de le tuer lors de son prochain tour, SeekerBot tentera d'attirer l'ennemi vers un ami (le cas échéant). Si aucun membre de l'équipe n'est en vue, il essaiera de se déplacer dans une position où il pourra tuer l'ennemi lors du prochain tour. Si cela ne fonctionne pas 5 fois de suite, il changera de tactique et commencera à se déplacer de manière aléatoire, se rapprochant éventuellement de l'ennemi lors du prochain tour.
Pour ce que ça vaut, il utilisera les 7 premiers caractères du message pour crier sa propre position dans le format "x; y" (où x et y sont remplis de zéro).
Ce n'est certainement pas le code le plus propre, mais il semble en faire ce que j'attendais de lui.
la source
Équipe Rouge - Groomba
Notes dans les commentaires.
la source
self
. Cette variable est réservée à pointerwindow.self
. UtilisezI
(capital i) à la place. Oume
. Ou mêmemyself
.Red Team - Slayer Slayer
C'est le plus fondamental, je pourrais l'obtenir.Ce n'est plus 100% de base.Il ne se déplace que si nécessaire .
Si un utilisateur envoie un message avec 2 chiffres entre-1
et1
(par exemple:)'1,0'
, séparés par une virgule, il s'y déplacera. Il fait totalement confiance à ses coéquipiers.Cela communique maintenant via JSON. Il a une structure très basique:
Un exemple de message pour le contrôler:
Qui enverra:
Il est aussi un peu égoïste
et ne vous aidera paset maintenant il est utile en tant que balise fixe.Si ce message est incorrect (le format n'est pas correct), essayez d'ajouter à la
"}
place de}
.Cette édition a été modifiée après la limite de 6 heures et après avoir été étendue à 8 heures.
Il n'est plus cassé et restera comme la version finale.
la source
Red Team - Le lâche
Ce bot reste toujours pour éviter d'être détecté autant que possible. Lorsqu'un ou plusieurs ennemis sont en vue, plusieurs choses peuvent se produire:
Ne communique avec personne, au cas où quelqu'un pourrait l'entendre et le poursuivre.
Ce n'est peut-être pas le bot le plus utile pour l'équipe, mais c'était amusant de le regarder essayer de s'éloigner de tout le monde.
la source
Blue team - Eagle
Je suis assez content de mon bot pour le moment. Il a la tactique suivante:
la source
Équipe bleue - Enemyeater
Ce petit pixel cherche des échantillons autour de lui et essaie de le manger. S'il n'y a pas de pixel, il se déplace dans une direction aléatoire. J'ai hâte de voir ce que les autres peuples proposeront.
la source
Math.floor
nonMath.float
!(Math.random() * 6) & 6
ou(Math.random() * 6) << 0
ou(Math.random() * 6) >> 0
(utile pour codegolf).Math.random() * 7
? J'ai essayé quelques essais et il semble que votre bot ne va pas en bas à droite. L'IIRCMath.random()
est 0 inclusif et 1 exclusif, ce qui signifie qu'il* 6
n'est jamais 6.Équipe Rouge - Chargeur Rouge Jittery
Red Charger ne se déplace que de gauche à droite, dans l'espoir d'exploiter l'incapacité de la Blue Team de se déplacer dans ces directions. Après avoir atteint un mur, il se retourne et charge dans la direction opposée, dans l’espoir de détruire aveuglément les robots sur son passage.
EDIT: Red Charger vient de prendre un gallon de boisson énergisante et ne peut plus arrêter de trembler, il espère pouvoir en tirer parti. Il est trop caféiné pour écouter ses coéquipiers, mais il crie chacun de ses mouvements.
la source
Blue team - LazySoldier
la source
JSON.parse
dans un bloc try / catch ou quelque chose comme ça ... ça cause beaucoup trop d'erreurs.Blue Team - Mass Killer
Je suppose que la tactique est assez simple. Je compte les ennemis directement accessibles par moi (je suppose qu’il y en aura des tonnes :)) et tue le plus gros montant. S'il n'y en a pas, au moins j'essaierai de me protéger en passant au-dessus ou au-dessous du plus grand nombre d'ennemis dans l'espoir de les tuer.
J'ai abandonné la prise en compte des murs, alors je les ignore. C'est quand même assez long.
Je n'ai pas pu tester / exécuter ce code, il y aura donc beaucoup de bugs.
la source
Blue Team - Chien de garde
Il se déplace de manière aléatoire jusqu'à ce qu'il attrape un allié, s'il le suit. Il essaie d'éviter d'être tué et de tuer s'il le peut. Désolé pour le code horrible, je suis allé tout droit et j'ai oublié de refactoriser. J'essaierai de gagner en lisibilité si j'ai le temps :)
la source
Équipe Rouge - Commandant à la recherche
Celui-ci est une copie du SeekerBot de Minos avec quelques modifications.
Mémoire interne compressée pour une meilleure distribution des messages
"$":[seekmode]
Lit les positions ennemies des alliés en utilisant le format JSON de Lazy Slayer
"e":"[positions]"
; accepte[positions]
compensé par les deux32
et174
Affiche les positions ennemies au format JSON de Lazy Slayer,
"e":"[positions]"
compensées par174
Rapports derniers mouvements avec
"m":[move]
pour indiquer que ce bot peut être commandéÉmet des commandes à d'autres robots en utilisant
"[ally_id]":{"m":[move],"a":1,"id":29354}
. La commande utilise le même algorithme de chercheur, sauf à l'emplacement de l'allié. Si d'autres robots écoutent ces ordres, ils doivent se regrouper et chasser dans un groupe. Ordres donnés seulement si le message de l'allié comprend"m":
Suit les commandes d’autres robots, telles que:
"29354":[move]
ou"29354":{"m":[move]
. Les commandes ne sont suivies que lorsqu'il n'y a pas d'ennemis à proximité et qu'aucun autre allié ne les rapportela source
""a":0,"o":[122,70],"m":0,"e":"f""
. Vous pouvez nous rejoindre dans le chat si vous voulez aussi.Équipe Rouge - BouncerBot
Mon bot rebondit de mur en mur (pas exactement, il couvre donc un terrain différent) à la recherche d'ennemis. S'il en a un dans son rayon d'action, il attaque, les traîne vers un mur et tente de les éliminer (pensez au videur dans un club).
la source
Équipe rouge - SideKick
Aime suivre ses coéquipiers, heureusement qu'il y en a beaucoup!
la source
Blue Team - aimant indécis
Il a plusieurs stratégies: s'il peut vaincre un ennemi immédiatement, il le fera, et il s'éloignera des groupes d'ennemis s'il est suffisamment éloigné, sinon il se battra. Autre que cela, il est juste à la recherche de membres de l'équipe et d'essayer de les suivre.
la source
Blue Team - Récupération [38953]
[modifications: il s'avère que cela fonctionne BEAUCOUP mieux lorsque j'utilise mon identifiant actuel et non -1!]
Un petit robot stupide qui court autour du tableau, faisant de son mieux pour attirer l'attention et attirer les poursuivants, puis se précipiter vers le milieu où (espérons-le) il trouvera quelqu'un pour l'aider, ou il bloquera simplement le poursuivant et l'arrêtera de la chasse.
Cela ne semble pas avoir un impact énorme sur le score total en raison de la puissance des équipes de Blue, mais au moins, je n’ai pas aggravé la situation!
Criez dans les 8 prochaines heures si vous voulez que je rajoute quelque chose d’utile à mon message.
la source
Blue Team - PatrolBot
Le code est en quelque sorte auto-documenté. Ce qui pourrait être fait pour améliorer PatrolBot
if (canBeKilled() || isInWall()) { moveToBetterPosition() }
juste avant le retour.la source
BLUE TEAM - 1 Point Awesome
Les priorités du pixel:
La gravité est réglée sur 64,64 au coup 1
La gravité est réglée sur l'emplacement de l'ennemi le plus proche (pour guider le pixel vers l'emplacement du dernier ennemi, si l'ennemi s'échappe)
La gravité change de manière aléatoire lorsque le pixel a atteint le centre de gravité ou près du bord.
la source
Rouge - LoyalFollower [15080]
Essaie de trouver Minos et de tuer ses ennemis. Malheureusement, l'équipe rouge perd toujours, peut-être parce que nous sommes moins joueurs ...
la source
Blue Team - MiddleMan
MiddleMan est le frère jumeau de WallFlower (qu'il a remplacé). Comme son frère, il n'a pas tendance à être un type social. Il préférait rester au milieu de la pièce, regarder et attendre. Mais cela ne veut pas dire qu'il est passif ou timide. À son poste ou sur son chemin, s’il trouve un ennemi, quelle que soit sa taille, il se chargera de le combattre. Sachant qu'il y a de la force dans le nombre, il les attirera volontiers vers ses coéquipiers ou vers le centre dans l'espoir de trouver d'autres personnes. Une fois ses affaires terminées, il retourne à son poste, prêt pour la prochaine occasion d'aider son équipe.
Attention, équipe rouge. Bien qu'il puisse ne pas sembler beaucoup, il est aussi féroce et persistant qu'ils viennent; un maître de combat rapproché en solo. Il ne peut pas communiquer directement avec son équipe, mais il les reconnaît et travaillera ensemble pour vaincre l'ennemi commun. Il a récemment appris à envoyer des messages, même s'il n'écoute rien, mais pas son style. Le format est une chaîne JSON contenant un tableau comme celui-ci:,
[[selfX,selfY],[[enemy1X,enemy1Y],[enemy2X,enemy2Y]]]
et ainsi de suite pour plus d'ennemis.la source
Blue Team - VersaBot, un moteur polymorphe
Mon code suivra automatiquement le bot le plus proche situé à proximité, offrant une puissance de feu et une protection supplémentaires.
Prendre plaisir!
la source