Cuộc thi này đã chính thức kết thúc. Đội xanh đã thắng!
Tôi tự động hai bộ 50 trận chiến và thật đáng kinh ngạc, Blue đã thắng tất cả 100 trận. Nhìn vào số liệu thống kê, rõ ràng các mục hợp tác của PhiNotPi và Sp3000 là những anh hùng thực sự. Làm tốt lắm hai bạn! Trên thực tế, nếu bạn không đủ tiêu chuẩn cho mọi thành viên khác trong Đội Xanh , thì Cấm vẫn chiến đấu rất tốt . Một số người trong Đội Đỏ đã lên kế hoạch hạ bệ Cấm, nhưng nỗ lực này dường như đã giảm bớt. Xin lỗi đội đỏ.
Cuộc thi đã chính thức kết thúc, nhưng điều đó không có nghĩa là bạn không thể trả lời được nữa, điều đó chỉ có nghĩa là tôi sẽ không bao giờ tái xác định người chiến thắng chính thức. Cả hai đội đều được chào đón để tiếp tục gửi bot, chỉ để cho vui. Bộ điều khiển sẽ duy trì và duy trì chức năng miễn là không có mục nào trong tương lai phá vỡ nó.
Đây là một cuộc thi vua , nhưng thay vì mọi người chiến đấu với nhau, sẽ có hai đội thi đấu: Đỏ và Xanh. Chỉ có một người sẽ là người chiến thắng.
Nhóm bạn tham gia phụ thuộc vào số ID người dùng PPCG của bạn . Để tìm thấy điều này, nhấp vào hình đại diện của bạn ở đầu màn hình (bạn phải đăng nhập) và xem url của trang mở ra. Số sau users/
là số ID của bạn:
https://codegolf.stackexchange.com/users/[id number]/[display name]
Ví dụ: số ID người dùng PPCG của tôi là 26997:
https://codegolf.stackexchange.com/users/26997/calvins-hobbies
Lưu ý rằng số này là khác nhau cho các trang web Stack Exchange khác nhau.
Nếu ID của bạn là số chẵn , thì bạn thuộc nhóm Đỏ .
Nếu ID của bạn là số lẻ , thì bạn thuộc nhóm Blue .
Không có cách nào để thay đổi đội.
Bạn phải làm việc với nhóm của mình để cố gắng đánh bại đội khác trong một loại chiến đấu hoàng gia nơi mọi người dùng điều khiển một "pixel" màu của đội của họ trên lưới 128 × 128 là chiến trường. Các pixel có thể di chuyển xung quanh, giao tiếp với các đồng đội của họ và lấy ra các pixel của đội khác. Sẽ vượt quá tầm kiểm soát nếu bất kỳ ai cũng có thể tạo ra bất kỳ số pixel nào, vì vậy mọi người dùng chỉ có thể gửi một câu trả lời cho câu hỏi này.
Stack Snippet này (một phiên bản rút gọn của fiddle [ toàn màn hình ]) này là bộ điều khiển cho toàn bộ cuộc thi. Nó tự động đọc các bài dự thi, đảm bảo chúng hợp lệ và diễn ra các trận chiến giữa các đội. Nó thực hiện điều này ngay trong trình duyệt của bạn bất cứ lúc nào bạn muốn, sử dụng JavaScript . Vì JavaScript là ngôn ngữ kịch bản phía máy khách duy nhất mà hầu hết các trình duyệt hỗ trợ, nên tất cả các bài nộp cũng phải được viết bằng 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>
Về khả năng hiển thị, chiến trường của Snippet được chia tỷ lệ theo hệ số 3, vì vậy, đó là 384 × 384 pixel thực và "pixel" là 3 × 3.
Pixel Team Battlebots - Tổng quan
Người chơi
Mỗi câu trả lời hợp lệ cho câu hỏi này đại diện cho một người chơi . (Để biết chi tiết về tính hợp lệ, hãy xem "Quy tắc và Không đủ tiêu chuẩn" .) Mỗi người chơi có quyền kiểm soát một ô 1 × 1 (còn gọi là pixel) trên chiến trường ô 128 × 128 . Người chơi trong đội Đỏ có pixel đỏ và người chơi trong đội Blue có pixel xanh.
Trận chiến
Một trận chiến là một cuộc chiến giữa tất cả các cầu thủ trên cả hai đội, ngay cả khi đội bóng không có một số lượng tương đương của người chơi. Một trận chiến bắt đầu với mọi người chơi được đặt ở một vị trí ngẫu nhiên trong chiến trường, nghĩa là, bất kỳ tọa độ nguyên nào từ (0,0) ở trên cùng bên trái, đến (127.127) ở dưới cùng bên phải. Nó được đảm bảo rằng không có hai người chơi sẽ bắt đầu ở cùng một vị trí.
Di chuyển
Mỗi trận chiến được chia thành 2048 di chuyển . Chỉ có một đội thực sự được di chuyển các cầu thủ của họ trong mỗi lần di chuyển. Đội đó luân phiên qua lại từ Đỏ sang Xanh, vì vậy mỗi đội thực hiện tổng cộng 1024 lần di chuyển (trừ khi trận đấu kết thúc sớm).
Đội được di chuyển trước là một tùy chọn bạn phải đặt trong bộ điều khiển.
Khi các trận chiến là autorun, đội di chuyển đầu tiên luân phiên trong mỗi trận chiến.
Di chuyển người chơi
Khi một đội di chuyển, tất cả những người chơi trong đội đó được kêu gọi tự di chuyển. Các cuộc gọi này được thực hiện theo thứ tự hoàn toàn ngẫu nhiên cho mỗi lần di chuyển. Khi được gọi, mỗi người chơi được cung cấp dữ liệu về trạng thái của trận chiến để họ có thể quyết định cách di chuyển.
Tất cả các di chuyển chỉ tối đa một pixel đi. Các quầng thâm trong các sơ đồ này đánh dấu vị trí mà mỗi người chơi màu (hình vuông) có thể di chuyển đến:
Cả hai màu có thể di chuyển theo đường chéo theo bất kỳ hướng nào hoặc đứng yên, nhưng chỉ người chơi Đỏ mới có thể di chuyển sang phải và trái và chỉ người chơi Xanh mới có thể di chuyển xuống và lên. Cảm ơn Phi và những người khác.
Nếu người chơi cố gắng di chuyển ra khỏi giới hạn chiến trường, hoặc mất quá nhiều thời gian để quyết định cách di chuyển hoặc có một số lỗi, họ sẽ tự động đứng yên.
Ngoài việc di chuyển, trong một lượt chơi, người chơi có thể đọc các tin nhắn được viết bởi đồng đội của họ và viết các tin nhắn có thể lần lượt được đọc. Điều này cho phép một hình thức thô thiển của giao tiếp nhóm.
Mã mà bạn gửi dưới dạng câu trả lời là logic xác định cách di chuyển trình phát của bạn và những thông điệp cần đọc và viết (xem "Cách trả lời" ).
Loại bỏ người chơi kẻ thù
Khi một người chơi di chuyển vào cùng một ô với một người chơi trong đội đối thủ, người chơi đối phương đó ngay lập tức bị loại khỏi trận chiến. Người chơi vừa di chuyển vẫn tiếp tục như bình thường. Đây là cơ chế duy nhất giúp loại bỏ người chơi khỏi trận chiến và làm chủ nó là chìa khóa để chiến thắng!
Nếu có nhiều người chơi kẻ thù trong ô mà một người chơi mới chuyển đến, thì tất cả những người chơi của kẻ thù sẽ bị loại bỏ. Không có gì xảy ra nếu hai người chơi trong cùng một đội chiếm cùng một ô.
Giành chiến thắng
Một trận chiến kết thúc khi tất cả 2048 di chuyển đã được thực hiện hoặc khi một đội không còn người chơi. Đội có số lượng người chơi sống sót nhiều nhất sẽ chiến thắng. Đó là hòa nếu cả hai đội có số lượng người chơi còn sống bằng nhau.
Cách trả lời
Trong câu trả lời của bạn, bạn cần cung cấp mã JavaScript quyết định cách pixel của bạn sẽ di chuyển khi được gọi để làm như vậy.
Trong mẫu mã thụt đầu tiên trong câu trả lời của bạn (các mẫu có tiền tố 4 dấu cách), hãy viết phần thân cho hàm này:
function moveMe(move, x, y, tCount, eCount, tNear, eNear, setMsg, getMsg) {
//the body goes here
}
Không cần phải đánh golf mã của bạn.
Những gì để trở về
Giá trị trả về của hàm xác định cách pixel của bạn di chuyển:
0
ở yên
1
để di chuyển sang phải cho đội Đỏ, xuống để đội Xanh
2
di chuyển sang trái cho đội Đỏ, lên để đội Xanh
3
di chuyển theo đường chéo lên và phải
4
để di chuyển theo đường chéo lên và sang trái
5
để di chuyển theo đường chéo xuống và sang trái
6
để di chuyển theo đường chéo xuống và phải
Như một sơ đồ:
Pixel của bạn sẽ đứng yên theo mặc định nếu mã của bạn thực hiện bất kỳ điều nào sau đây:
- Trả về bất cứ thứ gì ngoài một số nguyên từ 0 đến 6.
- Nỗ lực di chuyển pixel ra khỏi giới hạn chiến trường.
- Mất hơn 15 mili giây để chạy.
- Ném bất kỳ loại ngoại lệ.
Mục nhập của bạn không cần phải xác định; sử dụng Math.random
là tốt.
Những thông số
7 tham số chức năng đầu tiên moveMe
cung cấp thông tin về trạng thái của trận chiến:
move
là một số nguyên bắt đầu từ 1 và tăng sau mỗi lần di chuyển cho đến khi nó là 1024 trên lần di chuyển cuối cùng của nhóm bạn.x
là vị trí x hiện tại của bạn, một số nguyên từ 0 (ngoài cùng bên trái) đến 127 (ngoài cùng bên phải).y
là vị trí y hiện tại của bạn, một số nguyên từ 0 (trên cùng) đến 127 (đáy).tCount
là tổng số người chơi còn sống hiện tại trong đội của bạn.eCount
là tổng số người chơi còn sống hiện tại trong đội hình kẻ thù.tNear
là danh sách những người chơi còn sống hiện tại trong đội của bạn cách xa dưới 16 pixel (khoảng cách Euclide). Mỗi phần tử củatNear
là một đối tượng vớix
,y
vàid
các thuộc tính:
x
là vị trí x của người chơi khácy
là vị trí y của người chơi khácid
là số ID người dùng PPCG của người chơi khác (dưới dạng số nguyên)eNear
giống hệt nhưtNear
ngoại trừ nó là một danh sách các cầu thủ kẻ thù gần đó, không phải đồng đội.
Các vòng tròn trong đoạn trích là mỗi phạm vi tNear
và eNear
phạm vi của người chơi .
Tin nhắn
2 tham số cuối cùng, setMsg
và getMsg
, có mục đích hơi khác nhau.
Trong suốt trận chiến, mỗi người chơi có một chuỗi lên tới 64 ký tự mà họ có thể thao tác trong mỗi lần di chuyển để lưu trữ dữ liệu và có khả năng giao tiếp với đồng đội của mình. Chuỗi của mỗi người chơi bắt đầu dưới dạng chuỗi trống. Khi một người chơi bị loại khỏi trận chiến, chuỗi của họ được đặt thành "X".
setMsg
là một hàm đối số đặt chuỗi của bạn thành chuỗi được truyền vào.- Nếu giá trị được truyền vào không phải là một chuỗi, thì chuỗi của bạn không thay đổi.
- Nếu giá trị là một chuỗi có hơn 64 ký tự, chỉ 64 ký tự đầu tiên được giữ.
getMsg
là một hàm đối số lấy số ID người dùng PPCG (dưới dạng số nguyên) của ai đó trong nhóm của bạn và trả về chuỗi của họ.- Người chơi đó có thể ở bất cứ đâu trong lưới. Chúng không cần nằm trong bán kính 16 pixel của bạn.
undefined
được trả về nếu không tìm thấy ID đã cho.
Gửi ví dụ
Người chơi này di chuyển lên và sang phải nếu có kẻ thù ở bên trái, hoặc người khác xuống và sang trái nếu đồng đội có ID 123 nói, nhưng nếu không thì vẫn giữ nguyên:
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
Lưu ý rằng khối mã này là tất cả những gì cần thiết. Định nghĩa hàm và ngoặc không nên có mặt.
Nội quy và không đạt chuẩn
Nếu người dùng không tuân thủ các quy tắc được liệt kê dưới đây, tôi có thể đánh dấu họ là không đủ điều kiện và bộ điều khiển sẽ tự động bỏ qua câu trả lời của họ. Tôi tin rằng hầu hết người dùng ở đây sẽ không cố ý phá vỡ các quy tắc và sẽ chỉ có một vài trường hợp không đủ điều kiện vì các nguyên nhân ngẫu nhiên.
Các quy tắc quan trọng
Bạn chỉ có thể chỉnh sửa câu trả lời của mình trong cửa sổ 8 giờ ngay sau khi đăng nó.
Câu trả lời được chỉnh sửa sau 8 giờ kể từ khi chúng được đăng sẽ tự động bị loại bởi bộ điều khiển. Quy tắc này là để ngăn chặn các câu trả lời ban đầu liên tục tối ưu hóa cách tiếp cận của họ, có thể đánh cắp ý tưởng từ các câu trả lời sau. Nhóm của bạn phải thực hiện với bất kỳ câu trả lời nào mà nó bắt đầu.Bạn không thể xóa và đăng lại câu trả lời của mình mà không có sự cho phép đặc biệt. Tôi sẽ đưa ra điều này nếu ai đó vô tình chỉnh sửa bài đăng của bạn sau 8 giờ hoặc một cái gì đó tương tự, nhưng không chỉ vì bạn tìm thấy một lỗi.
Nếu bạn xóa bài đăng của mình và chọn hủy xóa nó, quy tắc chỉnh sửa vẫn được áp dụng. (Bộ điều khiển không thể thấy câu trả lời bị xóa.)
Khi khai báo một biến JavaScript mới, bạn phải sử dụng
var
từ khóa.
Điều này là do một biến được khai báo mà khôngvar
trở thành toàn cục thay vì cục bộ, do đó sẽ dễ dàng vô tình (hoặc cố ý) gây rối với bộ điều khiển hoặc giao tiếp tự do với những người chơi khác. Rõ ràng là bạn không cố gắng gian lận.Khi khai báo các chức năng, tốt nhất là sử dụng
var
từ khóa là tốt. tức là sử dụngvar f = function(...) {...}
thay vìfunction f(...) {...}
. Tôi không hoàn toàn chắc chắn tại sao, nhưng đôi khi nó dường như tạo ra sự khác biệt.Mã của bạn không nên chạy quá nhiều thời gian.
Nếu mã của bạn mất hơn 15 mili giây để chạy, pixel của bạn sẽ không di chuyển chút nào. Tuy nhiên, do JavaScript rất khó để dừng các chức năng thực thi giữa chừng, tất cả các tập lệnh trình phát được chạy để hoàn thành trong mỗi lần di chuyển và thời gian được kiểm tra sau đó. Điều này có nghĩa là, nếu mã của bạn làm một số việc tốn nhiều thời gian, mọi người đang chạy bộ điều khiển sẽ nhận thấy và khó chịu.
Truất quyền tự động
Bộ điều khiển tự động loại bỏ các mục vì những lý do sau:
- Người dùng đã trả lời.
- Chỉnh sửa được thực hiện hơn 8 giờ sau khi tạo.
- Người dùng được đánh dấu cụ thể là không đủ tiêu chuẩn.
Các quy tắc khác
Trong mã của bạn, bạn có thể không ...
- cố gắng truy cập hoặc sửa đổi bộ điều khiển hoặc mã của người chơi khác.
- cố gắng sửa đổi bất cứ điều gì được tích hợp vào JavaScript.
- cố gắng giao tiếp với những người chơi khác trừ khi sử dụng
getMsg
vàsetMsg
. - thực hiện các truy vấn web.
- làm những việc độc hại khác.
Tôi sẽ để mắt đến những hành vi phi thể thao khác, chẳng hạn như ăn cắp mã nguyên văn từ các câu trả lời khác hoặc sử dụng con rối sock để gây rối với nhóm khác.
Bạn được chào đón để hợp tác và lập kế hoạch với nhóm của bạn, nhưng giữ cho cuộc thi thân thiện và đạo đức.
Nếu bạn nghĩ rằng ai đó cần phải bị loại hoặc nghĩ rằng bạn đã khắc phục lý do bạn bị loại, hãy để lại nhận xét ở đây cho tôi hoặc trong cuộc trò chuyện cụ thể về câu hỏi . Tôi không tham gia cuộc thi.
Định dạng câu trả lời được đề xuất
#[team color] Team - [entry title]
//function body
//probably on multiple lines
Explanations, notes, etc.
Tiêu đề mục nhập là một tên tùy chọn bạn có thể đặt nếu bạn muốn. Bộ điều khiển không làm gì với nó.
Chấm điểm
Cuộc thi này sẽ chính thức kết thúc vào ngày 19 tháng 4 năm 2015. Vào ngày hôm đó (khoảng 11 giờ tối UTC) tôi sẽ tự động chạy ít nhất 100 trận chiến (có thể nhiều trận nữa tùy thuộc vào thời gian trận chiến kéo dài). Đội nào thắng nhiều nhất sẽ là đội chiến thắng chung cuộc. Nếu đó là một trận hòa hoặc cực kỳ gần, tôi sẽ chạy nhiều trận hơn cho đến khi rõ ràng một đội có lợi thế.
(Bạn có thể trả lời sau khi người chiến thắng được quyết định, nhưng tôi sẽ không thay đổi kết quả chính thức.)
Tôi sẽ chạy chúng trong phiên bản Google Chrome mới nhất trên máy tính xách tay có Windows 8.1 64 bit, ram 4 GB và bộ xử lý lõi tứ 1.6GHz. Đảm bảo rằng JavaScript của bạn hoạt động trong Chrome.
Chiến thắng chủ yếu là về vinh quang của đội, nhưng tôi sẽ chấp nhận câu trả lời được bình chọn cao nhất về đội chiến thắng.
Trong suốt cuộc thi, hãy nhớ rằng khía cạnh dựa trên nhóm và thực tế là nó được chạy hoàn toàn trong Stack Snippet, rất thử nghiệm. Tôi có hy vọng cao, nhưng tôi không thể nói chắc chắn mọi thứ sẽ hoạt động tốt như thế nào.
Lời khuyên:
- Bạn có thể kiểm tra các mục trước khi trả lời. Chỉnh sửa hộp văn bản "Mục nhập kiểm tra" ở gần cuối Đoạn mã và nhấp vào "Tải lại với mục kiểm tra". Nếu nó không trống, nó trở thành một người chơi trong đội được chỉ định.
- Câu trả lời được chạy trong một phạm vi đeo mặt nạ, vì vậy những thứ như
alert
vàconsole.log
sẽ không hoạt động. Đốiconsole
tượng chỉ có thể được sử dụng trong mục kiểm tra. - Kiểm tra "Thông báo gỡ lỗi" ở cuối Stack Snippet và xem bảng điều khiển của trình duyệt (F12). Rất nhiều thông tin hữu ích được in khi các trận chiến đang diễn ra.
- Bạn có thể sử dụng bài viết Meta Sandbox như một loại khu vực tổ chức. Các câu trả lời tất nhiên khác với ở đây, và bộ điều khiển ở đó có thể bị lỗi thời.
- Vì đây không phải là Ứng dụng Stack chính thức , bộ điều khiển có thể ngừng tải câu trả lời cho bạn nếu bạn khởi động lại nó hơn 300 lần trong một ngày.
"Phần tiếp theo" của thử thách này: Block Bot Bot Flocks!
đường dẫn nhanh
Bộ điều khiển Fiddle Toàn màn hình Trò chuyện chung Trò chuyện đỏ (Trò chuyện màu xanh?) SandboxPost