Questo concorso è ufficialmente terminato. La squadra blu ha vinto!
Autorizzo due serie da 50 battaglie e sorprendentemente, Blue ne vinse tutte e 100. Guardando le statistiche, è chiaro che le voci cooperative di PhiNotPi e Sp3000 erano i veri eroi. Ottimo lavoro voi due! In effetti, se si squalificano tutti gli altri membri della Blue Team , gli Sphibot continuano a combattere molto bene . Alcune persone della Red Team stavano pianificando di abbattere gli Sphibot, ma questo sforzo sembrava esaurirsi. Scusa squadra rossa.
Il concorso è ufficialmente terminato, ma ciò non significa che non puoi più rispondere, significa solo che non dichiarerò mai il vincitore ufficiale. Entrambe le squadre sono invitate a continuare a inviare robot, solo per divertimento. Il controller rimarrà attivo e rimarrà funzionale fino a quando nessuna voce futura lo interromperà.
Questa è una gara da re della collina , ma invece che tutti combattono l'uno contro l'altro, ci saranno due squadre che competeranno: Rosso e Blu. Solo uno sarà il vincitore.
Il team in cui ti trovi dipende dal tuo numero ID utente PPCG . Per trovarlo, fai clic sul tuo avatar nella parte superiore dello schermo (devi aver effettuato l'accesso) e guarda l'URL della pagina che si apre. Il numero dopo users/
è il tuo numero ID:
https://codegolf.stackexchange.com/users/[id number]/[display name]
Ad esempio, il mio numero ID utente PPCG è 26997:
https://codegolf.stackexchange.com/users/26997/calvins-hobbies
Si noti che questo numero è diverso per i diversi siti di Exchange Stack.
Se il tuo ID è un numero pari , allora sei nella squadra rossa .
Se il tuo ID è un numero dispari , allora sei nella squadra blu .
Non c'è modo di cambiare squadra.
Devi lavorare con la tua squadra per cercare di sconfiggere l'altra squadra in una sorta di royal battle in cui ogni utente controlla un "pixel" del colore della propria squadra sulla griglia 128 × 128 che è il campo di battaglia. I pixel possono spostarsi, comunicare con i loro compagni di squadra ed eliminare i pixel dell'altra squadra. Sarebbe fuori controllo se qualcuno potesse creare un numero qualsiasi di pixel, quindi ogni utente può inviare una sola risposta a questa domanda.
Questo frammento di stack (una versione ridotta di questo violino [a schermo intero ]) è il controller dell'intero contest. Legge automaticamente le presentazioni, si assicura che siano valide e mette in scena battaglie tra le squadre. Lo fa nel tuo browser in qualsiasi momento, usando JavaScript . Poiché JavaScript è l'unico linguaggio di scripting lato client supportato dalla maggior parte dei browser, anche tutti gli invii devono essere scritti in 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>
Per visibilità, il campo di battaglia dello Snippet è ridimensionato di un fattore 3, quindi sono 384 × 384 pixel reali e i "pixel" sono 3 × 3.
Pixel Team Battlebots - Panoramica
Giocatori
Ogni risposta valida a questa domanda rappresenta un giocatore . (Per i dettagli sulla validità, vedi "Regole e squalifiche" .) Ogni giocatore ha il controllo di una singola cella 1 × 1 (aka pixel) sul campo di battaglia di 128 × 128 celle . I giocatori della squadra rossa hanno pixel rossi e i giocatori della squadra blu hanno pixel blu.
battaglie
Una battaglia è una lotta tra tutti i giocatori di entrambe le squadre, anche se le squadre non hanno un numero uguale di giocatori. Una battaglia inizia con ogni giocatore che viene posto in una posizione casuale sul campo di battaglia, cioè qualsiasi coordinata intera da (0,0) in alto a sinistra, a (127.127) in basso a destra. È garantito che due giocatori non inizieranno nella stessa posizione.
Si sposta
Ogni battaglia è suddivisa in 2048 mosse . Solo una squadra può effettivamente spostare i propri giocatori durante ogni mossa. Quella squadra si alterna da rosso a blu, quindi ogni squadra fa 1024 mosse in totale (a meno che la partita non finisca presto).
La squadra che si sposta per prima è un'opzione che devi impostare nel controller.
Quando le battaglie sono autorun, la squadra che si muove per prima si alterna in ogni battaglia.
Mosse del giocatore
Quando una squadra si muove, tutti i giocatori di quella squadra sono chiamati a muoversi da soli. Queste chiamate vengono eseguite in un ordine completamente casuale per ogni mossa. Quando viene chiamato, ad ogni giocatore vengono dati i dati sullo stato della battaglia in modo che possano decidere in che modo muoversi.
Tutte le mosse sono a una distanza massima di un pixel. Le occhiaie in questi diagrammi indicano le posizioni in cui ciascun giocatore colorato (i quadrati) può spostarsi su:
Entrambi i colori possono muoversi in diagonale in qualsiasi direzione o rimanere fermi, ma solo i giocatori rossi possono spostarsi a destra e a sinistra e solo i giocatori blu possono spostarsi verso il basso e verso l'alto. Grazie Phi e altri.
Se un giocatore cerca di uscire dai confini del campo di battaglia, o impiega troppo tempo a decidere da che parte muoversi, o ha qualche tipo di errore, rimarrà automaticamente immobile.
Oltre a muoversi, durante un turno un giocatore può leggere i messaggi scritti dai propri compagni di squadra e scrivere messaggi che possono a loro volta essere letti. Ciò consente una forma grezza di comunicazione di gruppo.
Il codice che invii come risposta è la logica che determina il modo in cui spostare il tuo lettore e quali messaggi leggere e scrivere (vedi "Come rispondere" ).
Rimozione dei giocatori nemici
Quando un giocatore si sposta nella stessa cella di un giocatore della squadra avversaria, quel giocatore avversario viene immediatamente rimosso dalla battaglia. Il giocatore che si è appena mosso continua normalmente. Questo è l'unico meccanismo che rimuove i giocatori dalla battaglia e padroneggiarlo è la chiave per vincere!
Se ci sono più giocatori nemici nella cella in cui un giocatore si è appena spostato, tutti i giocatori nemici vengono rimossi. Non succede nulla se due giocatori della stessa squadra occupano la stessa cella.
Vincere una battaglia
Una battaglia termina una volta che sono state fatte tutte le 2048 mosse o quando una squadra non ha più giocatori. Vince la squadra con il maggior numero di giocatori sopravvissuti. È un pareggio Se entrambe le squadre hanno lo stesso numero di giocatori sopravvissuti.
Come rispondere
Nella tua risposta, devi fornire il codice JavaScript che decide in che modo si sposterà il tuo pixel quando viene chiamato per farlo.
Nel primo esempio di codice rientrato nella tua risposta (quelli con prefisso 4 spazi), scrivi un corpo per questa funzione:
function moveMe(move, x, y, tCount, eCount, tNear, eNear, setMsg, getMsg) {
//the body goes here
}
Non è necessario golf il tuo codice.
Cosa restituire
Il valore di ritorno della funzione determina in che modo si sposta il pixel:
0
rimanere fermi
1
per spostarsi a destra per la squadra rossa, in basso per la squadra blu
2
per spostarsi a sinistra per la squadra rossa, in alto per la squadra blu
3
per spostarsi in diagonale verso l'alto e a destra
4
per spostarsi in diagonale verso l'alto e a sinistra
5
per spostarsi in diagonale verso il basso e a sinistra
6
per spostarsi in diagonale in basso a destra
Come un diagramma:
Il pixel rimarrà fermo per impostazione predefinita se il codice esegue una delle seguenti operazioni:
- Restituisce qualsiasi cosa oltre a un numero intero compreso tra 0 e 6.
- Tenta di spostare i pixel fuori dai limiti del campo di battaglia.
- L'esecuzione richiede più di 15 millisecondi.
- Genera qualsiasi tipo di eccezione.
La tua iscrizione non deve essere deterministica; usare Math.random
va bene.
I parametri
I primi 7 parametri di funzione moveMe
forniscono informazioni sullo stato della battaglia:
move
è un numero intero che inizia da 1 e aumenta dopo ogni mossa fino a quando non è 1024 sull'ultima mossa della tua squadra.x
è la posizione x corrente, un numero intero compreso tra 0 (all'estrema sinistra) e 127 (all'estrema destra).y
è la posizione y corrente, un numero intero compreso tra 0 (più in alto) e 127 (in basso).tCount
è il numero totale attuale di giocatori sopravvissuti nella tua squadra.eCount
è il numero totale attuale di giocatori sopravvissuti nella squadra nemica.tNear
è un elenco degli attuali giocatori sopravvissuti nella tua squadra che sono a meno di 16 pixel di distanza (distanza euclidea). Ogni elemento ditNear
un oggetto conx
,y
eid
le proprietà:
x
è la posizione x dell'altro giocatorey
è la posizione y dell'altro giocatoreid
è il numero ID utente PPCG dell'altro giocatore (come numero intero)eNear
è esattamente cometNear
se non fosse un elenco di giocatori nemici vicini, non compagni di squadra.
I cerchi nel frammento sono di ogni giocatore tNear
e eNear
gamma.
messaggi
Gli ultimi 2 parametri setMsg
e getMsg
hanno scopi leggermente diversi.
Durante una battaglia, ogni giocatore ha una stringa di un massimo di 64 personaggi che possono manipolare durante ogni mossa per memorizzare i dati e potenzialmente comunicare con i loro compagni di squadra. La stringa di ogni giocatore inizia come stringa vuota. Quando un giocatore viene rimosso dalla battaglia, la sua stringa viene impostata su "X".
setMsg
è una funzione a argomento che imposta la stringa sulla stringa passata.- Se il valore passato non è una stringa, la stringa non cambia.
- Se il valore è una stringa con più di 64 caratteri, vengono conservati solo i primi 64.
getMsg
è una funzione a argomento che accetta il numero ID utente PPCG (come numero intero) di qualcuno nel tuo team e restituisce la sua stringa.- Quel giocatore può trovarsi ovunque nella griglia. Non devono necessariamente trovarsi nel raggio di 16 pixel.
undefined
viene restituito se l'ID specificato non viene trovato.
Esempio di presentazione
Questo giocatore si muove in alto e a destra se c'è un nemico a sinistra, oppure in basso e a sinistra se il compagno di squadra con ID 123 lo dice, ma altrimenti rimane fermo:
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
Si noti che questo blocco di codice è tutto ciò che è richiesto. La definizione della funzione e le parentesi non dovrebbero essere presenti.
Regole e squalifiche
Se un utente non rispetta le regole elencate di seguito, posso contrassegnarle come squalificate e il controller ignorerà automaticamente le loro risposte. Confido che la maggior parte degli utenti qui non infrange intenzionalmente le regole e ci saranno solo alcune squalifiche temporanee per cause accidentali.
Regole importanti
Puoi modificare la tua risposta solo durante la finestra di 8 ore direttamente dopo averla pubblicata.
Le risposte che vengono modificate dopo 8 ore da quando sono state pubblicate verranno automaticamente squalificate dal controller. Questa regola serve a impedire alle risposte iniziali di ottimizzare continuamente il loro approccio, eventualmente rubando idee da risposte successive. Il tuo team deve accontentarsi di qualsiasi risposta abbia avuto inizio.Non è possibile eliminare e ripubblicare la risposta senza autorizzazione speciale. Lo darò se qualcuno modifica inavvertitamente il tuo post dopo il segno delle 8 ore o qualcosa del genere, ma non solo perché hai trovato un bug.
Se elimini il tuo post e scegli di annullare l'eliminazione, la regola di modifica si applica comunque. (Il controller non può vedere le risposte cancellate.)
Quando si dichiara una nuova variabile JavaScript, è necessario utilizzare la
var
parola chiave.
Questo perché una variabile dichiarata senzavar
diventa globale piuttosto che locale, quindi sarebbe facile confondere accidentalmente (o intenzionalmente) con il controller o comunicare liberamente con altri giocatori. Deve essere chiaro che non stai cercando di imbrogliare.Quando si dichiarano funzioni è meglio usare anche la
var
parola chiave. cioè usarevar f = function(...) {...}
invece difunction f(...) {...}
. Non sono del tutto sicuro del perché, ma a volte sembra fare la differenza.Il codice non deve essere eseguito per un periodo di tempo eccessivo.
Se l'esecuzione del codice richiede più di 15 millisecondi, il pixel non si sposterà affatto. Tuttavia, poiché in JavaScript è difficile interrompere le funzioni a metà dell'esecuzione, tutti gli script del giocatore vengono eseguiti fino al completamento ad ogni mossa e il tempo viene verificato successivamente. Ciò significa che se il tuo codice fa un po 'di tempo, tutti quelli che eseguono il controller noteranno e saranno infastiditi.
Squalifiche automatiche
Il controller ha automaticamente squalificato le voci per questi motivi:
- L'utente ha già risposto.
- Le modifiche sono state apportate più di 8 ore dopo la creazione.
- L'utente è specificamente contrassegnato come squalificato.
Altre regole
Nel tuo codice potresti non ...
- tentare di accedere o modificare il controller o il codice di un altro giocatore.
- tenta di modificare tutto ciò che è incorporato in JavaScript.
- tentare di comunicare con altri giocatori tranne usando
getMsg
esetMsg
. - fare query web.
- fare cose altrimenti dannose.
Terrò d'occhio altri comportamenti antisportivi, come rubare il codice alla lettera da altre risposte o usare burattini per fare casino con l'altra squadra.
Sei il benvenuto a collaborare e pianificare con la tua squadra, ma mantenere il concorso amichevole ed etico.
Se ritieni che qualcuno debba essere squalificato o pensi di aver risolto il motivo per cui sei stato squalificato, lascia un commento qui per me o nella chat specifica della domanda . Non sto partecipando al concorso.
Formato di risposta suggerito
#[team color] Team - [entry title]
//function body
//probably on multiple lines
Explanations, notes, etc.
Il titolo della voce è un nome facoltativo che puoi assegnare se lo desideri. Il controller non fa nulla con esso.
punteggio
Il concorso si concluderà ufficialmente il 19 aprile 2015. In quel giorno (intorno alle 23:00 UTC) autorizzerò almeno 100 battaglie (forse molte altre a seconda della durata delle battaglie). La squadra che vincerà di più sarà il vincitore assoluto. Se è un pareggio o estremamente vicino, correrò più battaglie finché non sarà chiaro che una squadra ha il vantaggio.
(Puoi rispondere dopo aver deciso il vincitore, ma non cambierò il risultato ufficiale.)
Li eseguirò nell'ultima versione di Google Chrome su un laptop con Windows 8.1 a 64 bit, 4 GB di RAM e un processore quad core da 1,6 GHz. Assicurati che JavaScript funzioni in Chrome.
La vittoria riguarda principalmente la gloria della squadra, ma accetterò la risposta più votata alla squadra vincente.
Durante tutto il contest, tieni presente che l'aspetto basato sul team e il fatto che sia gestito interamente in uno snippet di stack sono molto sperimentali. Ho grandi speranze, ma non posso dire con certezza come funzioneranno bene le cose.
Suggerimenti:
- È possibile verificare le voci prima di rispondere. Modifica la casella di testo "Test Entry" nella parte inferiore dello Stack Snippet e fai clic su "Ricarica con test entry". Se non è vuoto, diventa un giocatore della squadra specificata.
- Le risposte vengono eseguite in un ambito mascherato, quindi cose come
alert
econsole.log
non funzioneranno. L'console
oggetto può essere utilizzato solo nella voce di prova. - Seleziona "Messaggi di debug" nella parte inferiore dello Stack Snippet e osserva la console del browser (F12). Molte informazioni utili vengono stampate quando le battaglie sono in corso.
- È possibile utilizzare il post Meta Sandbox come una specie di area di gestione temporanea. Le risposte sono ovviamente diverse da quelle qui e il controller potrebbe non essere aggiornato.
- Poiché questa non è un'app Stack ufficiale , il controller potrebbe interrompere il caricamento delle risposte se la riavvii più di 300 volte al giorno.
Il "sequel" di questa sfida: Block Building Bot Flocks!
Link veloci
Fiddle Controller Chat a schermo intero Chat generale Red Chat (Chat blu?) SandboxPost