Этот конкурс официально завершен. Синяя команда победила!
Я произвел два сета по 50 битв, и удивительно, что Blue выиграл все 100 из них. Глядя на статистику, становится ясно, что совместные записи PhiNotPi и Sp3000 были настоящими героями. Отличная работа, вы двое! Фактически, если вы дисквалифицируете любого другого члена Синей Команды , Сфиботы все равно будут вести очень хороший бой . Некоторые члены Красной команды планировали уничтожить Сфиботов, но это усилие, казалось, прекратилось. Извините, Красная Команда.
Конкурс официально завершен, но это не значит, что вы больше не можете отвечать, это лишь означает, что я никогда не буду повторно объявлять официального победителя. Обе команды могут отправлять ботов, просто для удовольствия. Контроллер останется включенным и будет функционировать до тех пор, пока его не нарушат никакие будущие записи.
Это состязание царя горы , но вместо всех, кто сражается друг против друга, будут соревноваться две команды: Красная и Синяя. Только один будет победителем.
Команда, в которую вы входите, зависит от вашего идентификационного номера PPCG . Чтобы найти это, нажмите на свой аватар в верхней части экрана (вы должны войти в систему) и посмотрите на URL открывшейся страницы. Число после users/
вашего идентификационного номера:
https://codegolf.stackexchange.com/users/[id number]/[display name]
Например, мой идентификатор пользователя PPCG - 26997:
https://codegolf.stackexchange.com/users/26997/calvins-hobbies
Обратите внимание, что это число отличается для разных сайтов Stack Exchange.
Если у вас четное число , значит вы в команде Red .
Если у вас нечетное число , значит, вы в команде Blue .
Нет возможности сменить команду.
Вы должны работать со своей командой, чтобы попытаться победить другую команду в своего рода королевской битве, где каждый пользователь контролирует «пиксель» цвета своей команды на сетке 128 × 128, которая является полем битвы. Пиксели могут перемещаться, общаться со своими товарищами по команде и снимать пиксели другой команды. Было бы плохо, если бы кто-нибудь мог создать любое количество пикселей, поэтому каждый пользователь может отправить только один ответ на этот вопрос.
Этот фрагмент стека (уменьшенная версия этой скрипки [ fullscreen ]) является контроллером для всего соревнования. Он автоматически читает представленные материалы, проверяет их правильность и устраивает сражения между командами. Он делает это прямо в вашем браузере в любое время, используя JavaScript . Поскольку JavaScript является единственным языком сценариев на стороне клиента, который поддерживается большинством браузеров, все представления должны быть также написаны на 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>
Для наглядности поле битвы Сниппета масштабируется в 3 раза, поэтому оно составляет 384 × 384 реальных пикселей, а «пиксели» - 3 × 3.
Pixel Team Battlebots - Обзор
игроки
Каждый действительный ответ на этот вопрос представляет игрока . (Подробнее о действительности см. «Правила и дисквалификации» .) Каждый игрок имеет контроль над одной ячейкой 1 × 1 (она же пиксель) на поле битвы 128 × 128 . У игроков красной команды красные пиксели, а у синих - синие.
Сражения
Битва борьба между всеми игроками обеих команд, даже если команды не имеют одинаковое количество игроков. Битва начинается с того, что каждый игрок находится на случайной позиции на поле битвы, то есть с любой целочисленной координатой от (0,0) в верхнем левом углу до (127,127) в нижнем правом углу. Гарантируется, что никакие два игрока не начнут игру в одной и той же позиции.
Ходы
Каждое сражение разбито на 2048 ходов . Только одна команда может перемещать своих игроков во время каждого хода. Эта команда чередуется взад-вперед от красного до синего, поэтому каждая команда делает 1024 хода (если игра не заканчивается раньше).
Команда, которая должна двигаться первым - это опция, которую вы должны установить в контроллере.
Когда сражения запускаются автоматически, команда, которая движется первой, чередуется в каждом сражении.
Ход игрока
Когда команда движется, все игроки этой команды должны двигаться сами. Эти вызовы выполняются в абсолютно случайном порядке для каждого хода. При вызове каждому игроку предоставляется информация о состоянии битвы, чтобы он мог решить, каким путем двигаться.
Все ходы находятся на расстоянии до одного пикселя. Темные круги на этих диаграммах отмечают, в какие позиции каждый цветной игрок (квадраты) может перейти:
Оба цвета могут двигаться по диагонали в любом направлении или оставаться на месте, но только красные игроки могут двигаться вправо и влево, и только синие игроки могут двигаться вниз и вверх. Спасибо Фи и другим.
Если игрок пытается выйти за пределы поля битвы, или слишком долго решает, в каком направлении двигаться, или имеет какую-то ошибку, он автоматически останется на месте.
Помимо перемещения, во время хода игрок может читать сообщения, написанные его товарищами по команде, и писать сообщения, которые, в свою очередь, могут быть прочитаны. Это позволяет грубую форму командного общения.
Код, который вы отправляете в качестве ответа, представляет собой логику, которая определяет, каким образом перемещать проигрыватель и какие сообщения читать и писать (см. «Как ответить» ).
Удаление Вражеских Игроков
Когда игрок входит в ту же ячейку, что и игрок в противостоящей команде, этот противоборствующий игрок немедленно удаляется из битвы. Игрок, который только что переехал, продолжает игру как обычно. Это единственный механизм, который удаляет игроков из битвы, и овладение им является ключом к победе!
Если в ячейке есть несколько вражеских игроков, в которых только что перешел игрок, то все вражеские игроки удаляются. Ничего не происходит, если два игрока в одной команде занимают одну и ту же клетку.
Выиграть битву
Битва заканчивается, когда все 2048 ходов сделаны или когда в одной команде не осталось игроков. Команда с наибольшим количеством выживших игроков побеждает. Это ничья, если в обеих командах одинаковое количество выживших игроков.
Как ответить
В своем ответе вам необходимо предоставить код JavaScript, который решает, в каком направлении будет перемещаться ваш пиксель, когда для этого потребуется.
В первом примере кода с отступом в вашем ответе (префикс с 4 пробелами) напишите тело для этой функции:
function moveMe(move, x, y, tCount, eCount, tNear, eNear, setMsg, getMsg) {
//the body goes here
}
Там нет необходимости играть в гольф ваш код.
Что вернуть
Возвращаемое значение функции определяет, в каком направлении движется ваш пиксель:
0
оставаться неподвижным,
1
чтобы двигаться вправо для красной команды, вниз для голубой команды,
2
чтобы двигаться влево для красной команды, вверх для голубой команды,
3
чтобы двигаться по диагонали вверх и вправо,
4
чтобы двигаться по диагонали вверх и влево,
5
чтобы двигаться по диагонали вниз и влево,
6
чтобы двигаться по диагонали вниз и вправо
В виде диаграммы:
Ваш пиксель останется неподвижным по умолчанию, если ваш код выполняет одно из следующих действий:
- Возвращает все, кроме целого числа от 0 до 6.
- Попытки вывести пиксель за пределы поля боя.
- Занимает более 15 миллисекунд.
- Выбрасывает любые исключения.
Ваша запись не должна быть детерминированной; использование Math.random
в порядке.
Параметры
Первые 7 функциональных параметров moveMe
дают информацию о состоянии битвы:
move
целое число, которое начинается с 1 и увеличивается после каждого хода, пока не станет 1024 на последнем ходу вашей команды.x
ваша текущая позиция х, целое число от 0 (крайний левый) до 127 (крайний правый).y
ваша текущая позиция у, целое число от 0 (самый верхний) до 127 (самый нижний).tCount
текущее общее количество выживших игроков в вашей команде.eCount
текущее общее количество выживших игроков вражеской команды.tNear
это список текущих выживших игроков в вашей команде, которые находятся на расстоянии менее 16 пикселей (евклидово расстояние). Каждый элементtNear
представляет собой объект сx
,y
иid
свойствами:
x
х позиция другого игрокаy
позиция у другого игрокаid
является идентификатором пользователя PPCG другого игрока (в виде целого числа)eNear
точно так же, какtNear
только список вражеских игроков, а не товарищей по команде.
Круги в фрагменте каждого игрока tNear
и eNear
диапазон.
Сообщения
Последние 2 параметра, setMsg
и getMsg
, имеют несколько иное назначение.
В течение битвы у каждого игрока есть до 64 символов, которыми они могут манипулировать во время каждого хода, чтобы хранить данные и потенциально общаться со своими товарищами по команде. Строка каждого игрока начинается с пустой строки. Когда игрок удаляется из битвы, его строка устанавливается на «X».
setMsg
является функцией с одним аргументом, которая устанавливает вашу строку в строку, переданную в.- Если переданное значение не является строкой, то ваша строка не изменяется.
- Если значение является строкой с более чем 64 символами, сохраняются только первые 64 символа.
getMsg
это функция с одним аргументом, которая берет идентификационный номер пользователя PPCG (в виде целого числа) кого-то из вашей команды и возвращает его строку.- Этот игрок может быть где угодно в сетке. Они не должны быть в вашем радиусе 16 пикселей.
undefined
возвращается, если данный идентификатор не найден.
Пример представления
Этот игрок движется вверх и вправо, если есть враг слева, или вниз и влево, если товарищ по команде с ID 123 говорит, но в остальном остается неподвижным:
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
Обратите внимание, что этот блок кода - это все, что требуется. Определение функции и скобки не должны присутствовать.
Правила и дисквалификации
Если пользователь не соблюдает правила, перечисленные ниже, я могу пометить их как дисквалифицированных, и контроллер автоматически проигнорирует их ответы. Я верю, что большинство пользователей здесь не будут намеренно нарушать правила, и будет только несколько временных дисквалификаций по случайным причинам.
Важные правила
Вы можете редактировать свой ответ только в течение 8 часов после публикации.
Ответы, отредактированные через 8 часов после их публикации, будут автоматически дисквалифицированы контроллером. Это правило запрещает первоначальным ответам постоянно оптимизировать свой подход, возможно, крадя идеи из более поздних ответов. Ваша команда должна делать то, с чего она начинала.Вы не можете удалять и публиковать свой ответ без специального разрешения. Я дам это, если кто-то случайно отредактирует ваш пост после 8-часовой отметки или что-то в этом роде, но не только потому, что вы нашли ошибку.
Если вы удалите свое сообщение и решите его удалить, правило редактирования будет по-прежнему применяться. (Контроллер не может видеть удаленные ответы.)
При объявлении новой переменной JavaScript вы должны использовать
var
ключевое слово.
Это связано с тем, что переменная, объявленная без,var
становится глобальной, а не локальной, поэтому было бы легко случайно (или намеренно) связываться с контроллером или свободно общаться с другими игроками. Должно быть ясно, что вы не пытаетесь обмануть.При объявлении функций лучше всего использовать
var
ключевое слово. т.е. использоватьvar f = function(...) {...}
вместоfunction f(...) {...}
. Я не совсем уверен, почему, но иногда кажется, что это что-то меняет.Ваш код не должен выполняться слишком много времени.
Если ваш код выполняется более 15 миллисекунд, ваш пиксель не будет двигаться вообще. Однако, поскольку в JavaScript трудно остановить выполнение функций в середине, все сценарии игрока выполняются до конца при каждом движении, а время проверяется позже. Это означает, что если ваш код требует много времени, все , кто работает с контроллером, заметят это и будут раздражены.
Автоматическая дисквалификация
Контроллер автоматически дисквалифицировал записи по следующим причинам:
- Пользователь уже ответил.
- Изменения были сделаны более чем через 8 часов после создания.
- Пользователь специально помечен как дисквалифицированный.
Другие правила
В вашем коде вы не можете ...
- попытаться получить доступ или изменить контроллер или код другого игрока.
- попытаться изменить что-либо встроенное в JavaScript.
- пытаться общаться с другими игроками, кроме как с помощью
getMsg
иsetMsg
. - делать веб-запросы.
- делать иначе злые вещи.
Я буду следить за другим неспортивным поведением, таким как кража дословного кода из других ответов или использование марионеток с носками, чтобы связываться с другой командой.
Вы можете сотрудничать и составить схему со своей командой, но примите участие в конкурсе дружелюбно и этично.
Если вы считаете, что кто-то должен быть дисквалифицирован, или считаете, что вы исправили причину, по которой вы были дисквалифицированы, оставьте комментарий здесь для меня или в чате по конкретному вопросу . Я не участвую в конкурсе.
Предлагаемый формат ответа
#[team color] Team - [entry title]
//function body
//probably on multiple lines
Explanations, notes, etc.
Заголовок записи - это необязательное имя, которое вы можете дать, если хотите. Контроллер ничего с этим не делает.
счет
Этот конкурс будет официально завершен 19 апреля 2015 года. В этот день (около 23:00 по Гринвичу) я буду автоматически запускать не менее 100 боев (возможно, еще больше в зависимости от того, сколько времени займет сражение). Команда, которая победит больше всего, будет абсолютным победителем. Если это ничья или очень близко, я буду проводить больше сражений, пока не станет ясно, что одна команда имеет преимущество.
(Вы можете ответить после определения победителя, но я не буду менять официальный результат.)
Я буду использовать их в последней версии Google Chrome на ноутбуке с 64-битной Windows 8.1, 4 ГБ оперативной памяти и четырехъядерным процессором 1,6 ГГц. Убедитесь, что ваш JavaScript работает в Chrome.
Победа, прежде всего, в командной славе, но я приму самый высокий голос за команду-победителя.
На протяжении всего конкурса имейте в виду, что командный аспект и тот факт, что он полностью выполняется в фрагменте стека, являются очень экспериментальными. У меня большие надежды, но я не могу точно сказать, насколько хорошо все будет работать.
Подсказки:
- Вы можете проверить записи, прежде чем ответить. Отредактируйте текстовое поле «Тестовая запись» в нижней части фрагмента стека и нажмите «Перезагрузить с тестовой записью». Если он не пуст, он становится игроком указанной команды.
- Ответы запускаются в замаскированном объеме, поэтому такие вещи, как
alert
иconsole.log
не будут работать.console
Объект может быть использован только в записи теста. - Отметьте «Отладочные сообщения» в нижней части фрагмента стека и посмотрите на консоль вашего браузера (F12). Много полезной информации печатается во время сражений.
- Вы можете использовать Meta Sandbox как своеобразную площадку для постановки. Ответы там, конечно, разные, чем здесь, и контроллер там может устареть.
- Поскольку это не официальное приложение Stack , контроллер может прекратить загрузку ответов для вас, если вы перезапустите его более 300 раз в день.
«Продолжение» этого задания : Блочная сборка ботов!
Быстрые ссылки
Fiddle Controller Полноэкранный режим Общий чат Красный чат (Blue Chat?) SandboxPost