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