이 콘테스트는 공식적으로 끝났습니다. 블루 팀이 승리했습니다!
나는 50 번의 전투에서 두 세트 를 자란 했고, 놀랍게도 Blue는 그중 100 번을 모두 이겼습니다. 통계를 살펴보면 PhiNotPi 와 Sp3000 의 협업 항목이 진정한 영웅 이라는 것이 분명합니다 . 잘 하셨어요. 사실, 당신 이 블루 팀의 다른 모든 멤버 를 실격시킬 경우 , Sphibots는 여전히 아주 좋은 싸움을 펼쳤습니다 . 일부 레드 팀 사람들은 Sphibots을 무너 뜨릴 계획 이었지만, 이러한 노력은 사라져 버린 것 같습니다. 미안 레드 팀.
대회가 공식적으로 종료되었지만 더 이상 답변을 할 수 없다는 의미는 아니며 공식 승자를 다시 선언하지 않을 것입니다. 두 팀 모두 재미있게 봇을 계속 제출할 수 있습니다. 향후 항목이 끊어지지 않는 한 컨트롤러는 계속 작동 상태를 유지합니다.
이 게임은 실전 킹 콘테스트이지만, 서로 싸우는 모든 사람 대신 Red와 Blue의 두 팀이 있습니다. 오직 하나만이 승자가 될 것입니다.
귀하의 팀은 PPCG 사용자 ID 번호 에 따라 다릅니다 . 이를 찾으려면 화면 상단의 아바타를 클릭하고 (로그인해야 함) 열려있는 페이지의 URL을보십시오. 다음 번호 users/
는 ID 번호입니다.
https://codegolf.stackexchange.com/users/[id number]/[display name]
예를 들어, 내 PPCG 사용자 ID 번호는 26997입니다.
https://codegolf.stackexchange.com/users/26997/calvins-hobbies
이 숫자는 Stack Exchange 사이트마다 다릅니다.
귀하의 ID가 짝수 인 경우 , 귀하는 레드 팀에 있습니다.
ID가 홀수 인 경우 블루 팀에있는 것 입니다.
팀을 바꿀 방법이 없습니다.
모든 사용자가 전장 인 128 × 128 그리드에서 팀 색상의 "픽셀"을 제어하는 일종의 배틀 로얄 에서 다른 팀을 물리 치기 위해 팀과 협력해야합니다 . 픽셀은 이동하고 팀원과 의사 소통하며 다른 팀의 픽셀을 꺼낼 수 있습니다. 누구든지 원하는 수의 픽셀을 만들 수 있다면 손이 닿지 않으므로 모든 사용자는이 질문에 대해 하나의 답변 만 제출할 수 있습니다.
이 스택 스 니펫 ( 이 바이올린 [ 전체 화면 ] 의 축소 버전 )은 전체 컨테스트의 컨트롤러입니다. 제출 내용을 자동으로 읽고 유효한지 확인하고 팀 간의 전투를 준비합니다. 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입니다.
픽셀 팀 배틀 봇-개요
선수
이 질문에 대한 각 유효한 답변은 선수를 나타냅니다 . 유효성에 대한 자세한 내용은 "규칙 및 실격"을 참조하십시오 . 모든 플레이어는 128 × 128 셀 전장 에서 단일 1 × 1 셀 (일명 픽셀)을 제어 할 수 있습니다. 레드 팀의 플레이어는 빨간색 픽셀을, 블루 팀의 플레이어는 파란색 픽셀을 갖습니다.
전투
전투 사이에 싸움 모든 팀이 선수의 동일한 번호가없는 경우에도, 두 팀의 선수. 모든 플레이어는 전장에서 임의의 위치, 즉 왼쪽 상단의 (0,0)에서 오른쪽 하단의 (127,127)까지의 정수 좌표로 배치됩니다. 두 선수가 같은 위치에서 시작하지는 않을 것입니다.
이동
각 전투는 2048 개의 동작 으로 나뉩니다 . 실제로는 한 팀만이 각 이동 중에 플레이어를 움직입니다. 이 팀은 빨강에서 파랑으로 번갈아 가며 교대로 움직이므로 각 팀은 총 1024 번 움직입니다 (게임이 일찍 끝나지 않는 한).
먼저 이동하는 팀은 컨트롤러에서 설정해야하는 옵션입니다.
전투가 자동으로 진행되면, 먼저 움직 인 팀이 모든 전투에서 번갈아 가며 움직입니다.
플레이어 이동
팀이 이동하면 해당 팀의 모든 플레이어가 자신을 움직여야합니다. 이 통화는 각 이동에 대해 완전히 임의의 순서로 수행됩니다. 전화를 받으면 각 플레이어에게 전투 상태에 대한 데이터가 제공되므로 이동 방법을 결정할 수 있습니다.
모든 움직임은 최대 1 픽셀 떨어져 있습니다. 이 다이어그램의 어두운 원은 각 색상 플레이어 (사각형)가 이동할 수있는 위치를 표시합니다.
두 색상 모두 대각선 방향으로 움직이거나 정지 상태를 유지할 수 있지만 빨간색 플레이어 만 좌우로 움직일 수 있으며 파란색 플레이어 만 위아래로 움직일 수 있습니다. 고마워 Phi와 다른 사람.
플레이어가 전장 밖으로 나 가려고 시도하거나 이동 방법을 결정하는 데 너무 오래 걸리거나 어떤 종류의 오류가 발생하면 자동으로 정지 상태를 유지합니다.
이동하는 것 외에도 한 턴 동안 플레이어는 팀원이 작성한 메시지를 읽고 읽을 수있는 메시지를 쓸 수 있습니다. 이것은 조잡한 형태의 팀 커뮤니케이션을 가능하게합니다.
답변으로 제출 한 코드는 플레이어를 이동하는 방법과 읽고 쓸 메시지를 결정하는 논리입니다 ( "응답 방법" 참조 ).
적 플레이어 제거
플레이어가 상대 팀의 플레이어와 동일한 셀로 이동하면 해당 상대 플레이어는 즉시 전투에서 제거됩니다. 방금 움직 인 플레이어는 평상시처럼 계속됩니다. 이것은 전투에서 플레이어를 제거하고 마스터하는 것이 승리의 열쇠입니다!
셀에 여러 명의 적 플레이어가있는 경우 플레이어가 방금 이동 한 경우 모든 적 플레이어가 제거됩니다. 같은 팀의 두 선수가 같은 칸을 점령하면 아무 일도 일어나지 않습니다.
전투에서 승리
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
는 현재 x 위치이며 0 (가장 왼쪽)에서 127 (가장 오른쪽)의 정수입니다.y
는 현재 y 위치이며 0 (최상위)에서 127 (최상위) 사이의 정수입니다.tCount
팀에서 현재 생존 한 총 플레이어 수입니다.eCount
적 팀에서 생존 한 총 플레이어 수입니다.tNear
팀에서 16 픽셀 미만 (유클리드 거리) 미만인 현재 생존중인 플레이어의 목록입니다. 각 요소tNear
와 목적x
,y
및id
성질 :
x
다른 플레이어의 x 위치입니다y
다른 플레이어의 y 위치입니다id
다른 플레이어의 PPCG 사용자 ID 번호 (정수)eNear
tNear
팀원이 아닌 근처의 적 플레이어 목록이라는 점을 제외하고 는 정확히 같습니다 .
스 니펫의 원은 각 선수의 수 있습니다 tNear
및 eNear
범위.
메시지
마지막 2 개의 매개 변수 setMsg
및 getMsg
은 목적이 약간 다릅니다.
전투 중에 각 플레이어는 최대 64 자의 문자열을 가지고있어 이동 중에 데이터를 저장하고 팀원들과 의사 소통하기 위해 조작 할 수 있습니다. 각 플레이어의 현은 빈 현으로 시작합니다. 플레이어가 전투에서 제거되면 문자열은 "X"로 설정됩니다.
setMsg
문자열을 전달 된 문자열로 설정하는 하나의 인수 함수입니다.- 전달 된 값이 문자열이 아닌 경우 문자열이 변경되지 않습니다.
- 값이 64자를 초과하는 문자열 인 경우 처음 64 개만 유지됩니다.
getMsg
팀의 누군가의 PPCG 사용자 ID 번호 (정수)를 가져 와서 문자열을 리턴하는 인수 함수입니다.- 그 플레이어는 그리드의 어느 곳에 나있을 수 있습니다. 16 픽셀 반경 일 필요는 없습니다.
undefined
주어진 ID를 찾지 못하면가 반환됩니다.
제출 예
이 플레이어는 왼쪽에 적이 있으면 위아래로 움직이고 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 밀리 초 이상이 걸리면 픽셀이 전혀 움직이지 않습니다. 그러나 자바 스크립트에서는 실행 중 기능을 중지하기가 어렵 기 때문에 모든 플레이어 스크립트는 매번 이동할 때마다 실행이 완료되고 그 이후에는 시간이 확인됩니다. 즉, 코드에서 시간이 많이 걸리는 작업을 수행하면 컨트롤러를 실행하는 모든 사람 이 알아 차리고 짜증을냅니다.
자동 실격
컨트롤러는 다음과 같은 이유로 자동으로 참가 자격을 박탈합니다.
- 사용자가 이미 답변했습니다.
- 작성 후 8 시간 이상이 지나서 편집했습니다.
- 사용자는 구체적으로 실격으로 표시됩니다.
다른 규칙
귀하의 코드에서 당신은 할 수 없습니다 ...
- 컨트롤러 또는 다른 플레이어의 코드에 액세스하거나 수정하십시오.
- JavaScript에 내장 된 모든 것을 수정하십시오.
- 및를 사용하지
getMsg
않고 다른 플레이어와 의사 소통을 시도합니다setMsg
. - 웹 검색어를 작성하십시오.
- 그렇지 않으면 악의적 인 일을합니다.
다른 답변에서 코드를 그대로 훔치거나 양말 꼭두각시를 사용하여 다른 팀과 엉망으로하는 것과 같이 스포츠맨이 아닌 다른 행동을 주시하겠습니다.
팀과 협력하고 계획을 세우는 것은 환영하지만 콘테스트는 친절하고 윤리적으로 유지하십시오.
누군가 자격이 박탈 될 필요가 있다고 생각하거나 자격이 박탈 된 이유를 고쳤다 고 생각되면 여기 또는 질문 별 채팅 에 의견을 남겨주십시오 . 컨테스트에 참여하지 않습니다.
제안 된 답변 형식
#[team color] Team - [entry title]
//function body
//probably on multiple lines
Explanations, notes, etc.
항목 제목은 원하는 경우 지정할 수있는 선택적 이름입니다. 컨트롤러는 아무 것도하지 않습니다.
채점
이 컨테스트는 공식적으로 2015 년 4 월 19 일에 끝납니다. 그 날 (UTC 오후 11 시경) 최소 100 번의 전투 (자동 전투 시간에 따라 더 많은 전투)가 자동으로 진행됩니다. 가장 많이이기는 팀이 전체 우승자가됩니다. 동점이거나 매우 가까운 경우 한 팀이 유리하다는 것이 확실해질 때까지 더 많은 전투를 진행할 것입니다.
(승자가 결정된 후에 답변 할 수 있지만 공식 결과는 변경되지 않습니다.)
Windows 8.1 64 비트, 4GB 램 및 1.6GHz 쿼드 코어 프로세서가 장착 된 랩톱에서 최신 버전의 Chrome에서 실행할 것입니다. 자바 스크립트가 Chrome에서 작동하는지 확인하세요.
승리는 주로 팀 영광에 관한 것이지만, 나는 승리 한 팀에서 가장 높은 투표 응답을 받아 들일 것입니다.
컨테스트 전체에서 팀 기반 측면과 스택 스 니펫에서 완전히 실행된다는 사실은 매우 실험적이라는 점을 명심하십시오. 나는 큰 희망을 가지고 있지만 일이 얼마나 잘 작동하는지 확실히 말할 수는 없습니다.
팁 :
- 응답하기 전에 항목을 테스트 할 수 있습니다. 스택 스 니펫 하단 근처에있는 "테스트 항목"텍스트 상자를 편집하고 "테스트 항목으로 다시로드"를 클릭하십시오. 비어 있지 않으면 지정된 팀의 선수가됩니다.
- 답변은 마스크 범위에서 실행되므로 좋아
alert
하고console.log
작동하지 않습니다.console
개체는 시험 항목에 사용할 수 있습니다. - 스택 스 니펫 하단의 "디버그 메시지"를 확인하고 브라우저 콘솔 (F12)을 확인하십시오. 전투가 진행 중일 때 유용한 정보가 많이 인쇄됩니다.
- 메타 샌드 박스 게시물 을 일종의 준비 영역으로 사용할 수 있습니다 . 답변은 물론 여기와 다르며 컨트롤러가 오래되었을 수 있습니다.
- 이것은 공식 Stack App 이 아니므 로 하루에 300 번 이상 다시 시작하면 컨트롤러가 응답로드를 중지 할 수 있습니다.
이 도전의 "속편": 블록 빌딩 봇 무리!