Этот конкурс официально завершен. Синяя команда победила!
Я произвел два сета по 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
источник
Ответы:
Синяя команда - SphiNotPi3000
Этот бот образует пару с ботом Sp3000 .
Основная идея заключается в том, что два бота, расположенные рядом друг с другом, помогают скрыть слабости друг друга, так что ни один бот не имеет открытой стороны. Это помогает защитить от угроз и ограничить возможности побега цели.
В начале игры они движутся навстречу друг другу и образуют пару. Эта пара затем движется как единое целое, причем один бот ведет другого. Два бота имеют практически идентичный код, что позволяет им обменивать позиции и роли в случае необходимости.
В режиме ожидания боты перемещаются по доске в поисках врагов. Как только они обнаруживают врага, они осторожно маневрируют в правильные позиции для атаки. Очень аккуратная особенность - способность формации двигаться прямо по горизонтали, достигаемая наличием ботов в разных местах.
источник
var
не используется в этом посте и Sp3000. Они сразу присваиваютj
0, и это не мешает контроллеру, так что, к счастью, в этом случае это не проблема.Синяя команда - SphiNotPi3000
Этот бот образует пару с ботом PhiNotPi . Смотрите сообщение Фи для краткого объяснения нашей стратегии.
источник
Красная Команда - SeekerBot
Наивысшим приоритетом SeekerBot является выживание. Следовательно, он будет рассматривать только ходы, которые не поставят его под угрозу быть убитым в следующем ходу (пока существуют такие ходы).
Когда противники не видны, они будут перемещаться по полю битвы, что обеспечит регулярную дистанцию обзора большей части земли.
Если SeekerBot обнаружит врага, он будет двигаться к нему. Если он может убить врага, он будет делать это до тех пор, пока ход спасен.
Если он не может убить врага, но враг может убить его в следующий ход, SeekerBot попытается заманить врага к другу (если он виден). Если ни один из членов команды не виден, он попытается перейти в положение, где он может убить врага в следующем ходу. Если это не сработает 5 раз подряд, он переключит тактику и начнет двигаться в случайном порядке, возможно, снова приблизившись к врагу в следующем раунде.
Для чего он стоит, он будет использовать первые 7 символов сообщения, чтобы выкрикнуть свою собственную позицию в формате «x; y» (где x и y дополняются нулями).
Это, конечно, не самый чистый код, но он, кажется, делает то, что я ожидал от него.
источник
Красная Команда - Грумба
Заметки в комментариях.
источник
self
. Эта переменная зарезервирована для указанияwindow.self
. ИспользуйтеI
(заглавная I) вместо. Илиme
. Или дажеmyself
.Красная Команда - Ленивый Убийца
Это самое основное, что я мог получить.Это больше не является базовым на 100%.Это только двигается, ЕСЛИ ТРЕБУЕТСЯ .
Если пользователь отправляет сообщение с двумя числами между-1
и1
(например:)'1,0'
, разделенными запятой, оно переместится туда. Это полностью доверяет своим товарищам по команде.Это теперь общается через JSON. Он имеет очень базовую структуру:
Пример сообщения для управления им:
Который отправит:
Он также немного эгоистичен
и не поможет тебеи теперь он полезен как стационарный маяк.Если это сообщение неправильное (формат неправильный), попробуйте добавить
"}
вместо}
.Это было отредактировано после 6-часового лимита, и после того, как было расширено до 8.
Это больше не сломано и останется как окончательная версия.
источник
Красная Команда - Трус
Этот бот остается неподвижным, чтобы избежать его обнаружения в максимально возможной степени. Когда один или несколько врагов видны, может произойти несколько вещей:
Ни с кем не общается, если кто-то может его услышать и пойти за ним.
Возможно, это не самый полезный бот для команды, но было забавно наблюдать, как он пытается уйти от всех.
источник
Синяя команда - Орел
Я вполне доволен своим ботом в данный момент. Он имеет следующую тактику:
источник
Синяя команда - Enemyeater
Этот маленький пиксель ищет окружающие его окружения и пытается съесть его, если вокруг него нет пикселя, который движется в случайном направлении. Я с нетерпением жду, чтобы увидеть, что придумают другие народы.
источник
Math.floor
нетMath.float
!(Math.random() * 6) & 6
или(Math.random() * 6) << 0
или(Math.random() * 6) >> 0
(полезно для Codegolf).Math.random() * 7
? Я пробовал несколько тестовых прогонов, и кажется, что ваш бот не идет внизу справа. IIRCMath.random()
включает 0 и 1, что означает, что* 6
никогда не бывает 6.Красная команда - Jittery Red Charger
Red Charger движется только влево и вправо, надеясь использовать неспособность Blue Team двигаться в этих направлениях. Достигнув стены, он поворачивается и атакует в противоположном направлении, надеясь вслепую уничтожить любых ботов на своем пути.
РЕДАКТИРОВАТЬ: Red Charger только что выпил галлон энергетического напитка и теперь не может перестать дрожать, он надеется использовать это также в своих интересах. В нем слишком кофеин, чтобы слушать своих товарищей по команде, но он кричит каждый из своих шагов.
источник
Синяя команда - LazySoldier
источник
JSON.parse
в блок try / catch или что-то ... это вызывает слишком много ошибок.Синяя команда - массовый убийца
Я предполагаю довольно простую тактику. Я считаю врагов, которых я непосредственно могу достать (полагаю, их будет множество :)) и убиваю наибольшее количество. Если их нет, по крайней мере, я попытаюсь защитить себя, ступая выше или ниже наибольшего количества врагов, надеющихся убить их следующим шагом.
Я отказался от учета стен, поэтому просто игнорирую их. Все равно довольно долго.
Я не смог протестировать / запустить этот код, поэтому будет много ошибок.
источник
Синяя команда - WatchDog
Он двигается случайным образом, пока не схватит союзника, если он следует за ним. Он пытается избежать быть убитым, и убить, если он может. Извините за ужасный код, я пошел прямо и забыл о рефакторинге. Я постараюсь улучшить читаемость, если у меня будет время :)
источник
Красная Команда - Искатель Командир
Это копия SeekerBot от Minos с несколькими модификациями.
Сжатая внутренняя память для лучшего распределения сообщений
"$":[seekmode]
Читает вражеские позиции от союзников, используя формат JSON Lazy Slayer's
"e":"[positions]"
; принимает[positions]
смещение как32
и174
Сообщает о позициях противника в формате JSON Lazy Slayer,
"e":"[positions]"
смещенное на174
Сообщает последний ход,
"m":[move]
чтобы указать, что этим ботом можно командоватьВыдает команды другим ботам, используя
"[ally_id]":{"m":[move],"a":1,"id":29354}
. Команда использует тот же алгоритм поиска, за исключением местоположения союзника. Если другие боты слушают эти приказы, они должны сгруппироваться и охотиться в стае. Заказы выдаются только если сообщение союзника включает"m":
Следует командам других ботов, таких как:
"29354":[move]
или"29354":{"m":[move]
. Команды выполняются только тогда, когда нет врагов в радиусе действия, и другие союзники не сообщают о врагах.источник
""a":0,"o":[122,70],"m":0,"e":"f""
. Вы можете присоединиться к нам в чате, если хотите.Красная Команда - BouncerBot
Мой бот подпрыгивает от стены к стене (не совсем так, так что он покрывает другую землю) в поисках врагов. Если он получает один в своем диапазоне, он атакует, тащит их к стене и пытается их убить (подумайте, вышибала в дубинке).
источник
Красная Команда - SideKick
Любит следить за товарищами по команде, хорошо, что их много!
источник
Синяя команда - нерешительный магнит
У него есть несколько стратегий: если он может немедленно победить врага, он сделает это, и он убежит от групп врагов, если они будут достаточно далеко, иначе он будет сражаться. Кроме этого он просто ищет членов команды и пытается следовать за ними.
источник
Синяя команда - выборка [38953]
[редактирует: оказывается, это работает намного лучше, когда я использую свой фактический идентификатор, а не -1!]
Тупой маленький бот, который бегает по доске, делает все возможное, чтобы привлечь внимание и привлечь преследователей, а затем побежит к середине, где (надеюсь) он найдет кого-нибудь, чтобы помочь ему, или он просто остановит преследователя и остановит его с охоты.
Похоже, что это не оказывает большого влияния на общий счет из-за того, насколько сильна команда Blue Tagteam, но, по крайней мере, я не ухудшил ситуацию!
Кричите в течение следующих 8 часов, если вы хотите, чтобы я добавил что-нибудь полезное в мое сообщение.
источник
Синяя команда - PatrolBot
Код является своего рода самодокументированием. Что можно сделать, чтобы улучшить PatrolBot
if (canBeKilled() || isInWall()) { moveToBetterPosition() }
только до возвращения.источник
ГОЛУБАЯ КОМАНДА - 1 очко
Приоритеты пикселя:
Гравитация установлена на 64,64 на 1-м ходу
Гравитация устанавливается для местоположения ближайших врагов (чтобы направлять пиксель к местоположению последнего врага, если враг убегает)
Гравитация изменяется случайным образом, когда пиксель достигает центра тяжести или когда он приближается к краю
источник
Красный - LoyalFollower [15080]
Пытается найти Миноса и убить врагов. К сожалению, красная команда все еще проигрывает, возможно, потому что мы меньше игроков ...
источник
Синяя команда - MiddleMan
MiddleMan - брат-близнец WallFlower (которого он заменил). Как и его брат, он не склонен быть социальным парнем. Он предпочел бы просто посидеть посреди комнаты, наблюдая и ожидая. Но это не значит, что он пассивен или робок. Находясь на своем месте или на пути к нему, если он найдет врага, независимо от его размера, он примет на себя ответственность, чтобы победить его. Зная, что в численности есть сила, он с удовольствием потянет их к любым товарищам по команде, которых он найдет, или, наоборот, к центру в надежде найти других. Как только его бизнес закончен, он возвращается на свое место, готовый к следующей возможности помочь своей команде.
Осторожно, красная команда. Хотя он может показаться не таким уж большим, он такой же яростный и настойчивый, как и они; мастер ближнего боя в одиночном бою. Он может не общаться напрямую со своей командой, но он признает их и будет работать вместе, чтобы победить общего врага. Недавно он научился отправлять сообщения, хотя сам не будет слушать, только не в своем стиле. Формат представляет собой строку JSON, содержащую массив, подобный следующему:
[[selfX,selfY],[[enemy1X,enemy1Y],[enemy2X,enemy2Y]]]
и т. Д. Для большего количества врагов.источник
Blue Team - VersaBot, полиморфный движок
Мой код будет автоматически следовать ближайшему боту рядом с ним, обеспечивая дополнительную огневую мощь и защиту.
Наслаждайтесь!
источник