การประกวดครั้งนี้จบลงแล้วอย่างเป็นทางการ ทีมสีฟ้าชนะ!
ฉันทำการต่อสู้สอง ชุด 50 ครั้งและน่าประหลาดใจสีน้ำเงินชนะทั้งหมด 100 ครั้ง เมื่อดูจากสถิติแล้วเห็นได้ชัดว่ารายการความร่วมมือของPhiNotPiและSp3000เป็นฮีโร่ที่แท้จริง คุณทำได้ดีมาก! ในความเป็นจริงถ้าคุณตัดสิทธิ์สมาชิกทุกคนอื่น ๆ ของทีมสีน้ำเงินที่ Sphibots ยังคงนำขึ้นต่อสู้ที่ดีมาก ทีมสีแดงบางคนกำลังวางแผนที่จะกำจัด Sphibots แต่ความพยายามนี้ดูเหมือนจะหมดไป ขออภัยทีมสีแดง
การประกวดสิ้นสุดลงอย่างเป็นทางการแล้ว แต่นั่นไม่ได้หมายความว่าคุณจะไม่สามารถตอบได้อีกต่อไปมันหมายความว่าฉันจะไม่ประกาศผู้ชนะอย่างเป็นทางการอีกต่อไป ทั้งสองทีมยินดีที่จะส่งบอทอย่างต่อเนื่องเพื่อความสนุกสนาน คอนโทรลเลอร์จะยังคงทำงานอยู่ตราบใดที่ไม่มีรายการในอนาคตแตก
นี่คือกษัตริย์ของเนินเขาประกวด แต่แทนที่จะให้ทุกคนต่อสู้กับแต่ละอื่น ๆ จะมีสองทีมที่แข่งขัน: สีแดงและสีน้ำเงิน ผู้ชนะเพียงคนเดียวเท่านั้น
ทีมที่คุณใช้จะขึ้นอยู่กับหมายเลขประจำตัวผู้ใช้PPCGของคุณ ในการค้นหาสิ่งนี้ให้คลิกที่รูปประจำตัวของคุณที่ด้านบนของหน้าจอ (คุณต้องเข้าสู่ระบบ) และดูที่ URL ของหน้าเว็บที่เปิดขึ้นมา หมายเลขหลังจากนั้นusers/
คือหมายเลข ID ของคุณ:
https://codegolf.stackexchange.com/users/[id number]/[display name]
ตัวอย่างเช่นหมายเลขประจำตัวผู้ใช้ PPCG ของฉันคือ 26997:
https://codegolf.stackexchange.com/users/26997/calvins-hobbies
โปรดทราบว่าหมายเลขนี้แตกต่างกันสำหรับไซต์ Stack Exchange ที่แตกต่างกัน
หาก ID ของคุณเป็นเลขคู่แล้วคุณจะอยู่ในทีมสีแดง
หาก ID ของคุณเป็นเลขคี่แล้วคุณอยู่ในทีมสีฟ้า
ไม่มีทางเปลี่ยนทีมได้
คุณต้องทำงานร่วมกับทีมของคุณเพื่อพยายามเอาชนะทีมอื่นในรูปแบบการต่อสู้ที่ผู้ใช้ทุกคนควบคุม "พิกเซล" ของสีทีมของพวกเขาในตาราง 128 × 128 นั่นคือสนามรบ พิกเซลสามารถเคลื่อนที่ไปมาสื่อสารกับเพื่อนร่วมทีมและนำพิกเซลของทีมอื่นมาใช้ มันคงจะไม่เกิดอะไรขึ้นถ้าใคร ๆ ก็สามารถสร้างจำนวนพิกเซลได้ดังนั้นผู้ใช้ทุกคนอาจส่งคำตอบสำหรับคำถามนี้เพียงคำเดียวเท่านั้น
Stack Snippet นี้ (เวอร์ชั่นย่อของซอนี้ [ เต็มหน้าจอ ]) เป็นตัวควบคุมสำหรับการแข่งขันทั้งหมด มันอ่านการส่งโดยอัตโนมัติทำให้แน่ใจว่าพวกเขาถูกต้องและขั้นตอนการต่อสู้ระหว่างทีม มันไม่ได้สิทธินี้ในเบราว์เซอร์ของคุณในเวลาที่คุณต้องการโดยใช้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 เซลล์ (aka พิกเซล) บน 128 × 128 เซลล์สนามรบ ผู้เล่นในทีม Red มีพิกเซลสีแดงและผู้เล่นในทีม Blue จะมีพิกเซลสีน้ำเงิน
การต่อสู้
การต่อสู้เป็นการต่อสู้ระหว่างผู้เล่นทุกคนในทั้งสองทีมแม้ว่าทีมจะไม่มีผู้เล่นเท่ากัน การต่อสู้เริ่มต้นด้วยผู้เล่นทุกคนที่ถูกวางตำแหน่งสุ่มในสนามรบนั่นคือพิกัดจำนวนเต็มใด ๆ จาก (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
คือตำแหน่ง x ปัจจุบันของคุณจำนวนเต็มตั้งแต่ 0 (ซ้ายสุด) ถึง 127 (ขวาสุด)y
คือตำแหน่ง y ปัจจุบันของคุณจำนวนเต็มตั้งแต่ 0 (บนสุด) ถึง 127 (ล่างสุด)tCount
คือจำนวนผู้เล่นที่มีชีวิตรอดทั้งหมดในทีมของคุณeCount
คือจำนวนผู้เล่นที่มีชีวิตรอดทั้งหมดในทีมศัตรูtNear
คือรายชื่อผู้เล่นที่มีชีวิตรอดในทีมของคุณซึ่งอยู่ห่างออกไปไม่ถึง 16 พิกเซล (ระยะทางแบบยุคลิด) องค์ประกอบของแต่ละคนtNear
เป็นวัตถุที่มีx
,y
และid
คุณสมบัติ:
x
คือตำแหน่ง x ของผู้เล่นอื่นy
คือตำแหน่ง y ของผู้เล่นอื่นid
คือหมายเลขประจำตัวผู้ใช้ PPCG ของผู้เล่นอื่น (เป็นจำนวนเต็ม)eNear
เหมือนกับทุกอย่างtNear
ยกเว้นเป็นรายชื่อผู้เล่นศัตรูใกล้เคียงไม่ใช่เพื่อนร่วมทีม
วงกลมในตัวอย่างเป็นผู้เล่นแต่ละคนtNear
และeNear
ช่วง
ข้อความ
พารามิเตอร์ 2 ตัวสุดท้ายsetMsg
และgetMsg
มีจุดประสงค์ที่แตกต่างกันเล็กน้อย
ตลอดการต่อสู้ผู้เล่นแต่ละคนมีตัวละครมากถึง 64 ตัวที่พวกเขาสามารถจัดการได้ในทุก ๆ การเคลื่อนไหวเพื่อเก็บข้อมูลและสื่อสารกับเพื่อนร่วมทีมได้ สตริงของผู้เล่นแต่ละคนเริ่มจากสตริงที่ว่างเปล่า เมื่อผู้เล่นถูกนำออกจากการต่อสู้สตริงของพวกเขาจะถูกตั้งค่าเป็น "X"
setMsg
เป็นฟังก์ชั่นการโต้แย้งอย่างใดอย่างหนึ่งที่กำหนดสตริงของคุณเป็นสตริงที่ส่งผ่านมา- หากค่าที่ส่งเข้าไม่ใช่สตริงสตริงของคุณจะไม่เปลี่ยนแปลง
- หากค่าเป็นสตริงที่มีอักขระมากกว่า 64 ตัวจะเก็บเฉพาะ 64 ตัวแรกเท่านั้น
getMsg
เป็นฟังก์ชั่นการโต้แย้งหนึ่งที่ใช้หมายเลขประจำตัวผู้ใช้ PPCG (เป็นจำนวนเต็ม) ของใครบางคนในทีมของคุณและส่งคืนสตริงของพวกเขา- ผู้เล่นนั้นอาจอยู่ที่ใดก็ได้ในกริด พวกเขาไม่จำเป็นต้องอยู่ในรัศมี 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 มิลลิวินาทีพิกเซลของคุณจะไม่เคลื่อนที่เลย อย่างไรก็ตามเนื่องจากเป็นเรื่องยากใน JavaScript ที่จะหยุดฟังก์ชั่น mid-execution สคริปต์ของผู้เล่นทั้งหมดจึงถูกเรียกใช้ให้เสร็จสมบูรณ์ในทุก ๆ การเคลื่อนไหวและเวลาจะถูกตรวจสอบในภายหลัง ซึ่งหมายความว่าหากรหัสของคุณใช้เวลามากทุกคนที่เรียกใช้คอนโทรลเลอร์จะสังเกตเห็นและรำคาญ
ตัดสิทธิ์โดยอัตโนมัติ
ตัวควบคุมตัดสิทธิ์รายการโดยอัตโนมัติด้วยเหตุผลเหล่านี้:
- ผู้ใช้มีคำตอบแล้ว
- ทำการแก้ไขมากกว่า 8 ชั่วโมงหลังจากการสร้าง
- ผู้ใช้ถูกทำเครื่องหมายว่าถูกตัดสิทธิ์โดยเฉพาะ
กฎอื่น ๆ
ในรหัสของคุณคุณอาจไม่ ...
- พยายามเข้าถึงหรือแก้ไขคอนโทรลเลอร์หรือรหัสของผู้เล่นอื่น
- พยายามแก้ไขสิ่งที่มีอยู่ใน JavaScript
- พยายามที่จะสื่อสารกับผู้เล่นอื่น ๆ ยกเว้นโดยใช้และ
getMsg
setMsg
- ทำแบบสอบถามเว็บ
- ทำสิ่งที่เป็นอันตรายเป็นอย่างอื่น
ฉันจะจับตาดูพฤติกรรมที่ไม่เหมือนนักกีฬาอื่น ๆ เช่นการขโมยรหัสคำต่อคำจากคำตอบอื่น ๆ หรือการใช้หุ่นกระบอกถุงเท้าไปยุ่งกับทีมอื่น
คุณสามารถร่วมมือและวางแผนกับทีมของคุณได้ แต่ให้การแข่งขันเป็นมิตรและมีจริยธรรม
หากคุณคิดว่าคนที่จะต้องมีการขาดคุณสมบัติหรือคิดว่าคุณคงเหตุผลที่คุณถูกตัดสิทธิ์ออกความคิดเห็นที่นี่สำหรับผมหรือในการแชทโดยเฉพาะคำถาม ฉันไม่ได้เข้าร่วมการแข่งขัน
รูปแบบคำตอบที่แนะนำ
#[team color] Team - [entry title]
//function body
//probably on multiple lines
Explanations, notes, etc.
ชื่อรายการเป็นชื่อที่คุณเลือกได้หากคุณต้องการ คอนโทรลเลอร์ไม่ได้ทำอะไรกับมัน
เกณฑ์การให้คะแนน
การประกวดนี้จะมีขึ้นอย่างเป็นทางการในวันที่ 19 เมษายน 2558ในวันนั้น (ประมาณ 23.00 น. UTC) ฉันจะทำงานอัตโนมัติอย่างน้อย 100 ครั้ง (อาจมีอีกมากขึ้นอยู่กับระยะเวลาในการต่อสู้) ทีมที่ชนะมากที่สุดจะเป็นผู้ชนะโดยรวม ถ้ามันเสมอกันหรือใกล้มากฉันจะวิ่งการต่อสู้มากกว่านี้จนกว่าจะเห็นได้ชัดว่าทีมหนึ่งมีข้อได้เปรียบ
(คุณอาจตอบหลังจากผู้ชนะได้รับการตัดสิน แต่ฉันจะไม่เปลี่ยนผลอย่างเป็นทางการ)
ฉันจะใช้งานพวกเขาใน Google Chrome เวอร์ชันล่าสุดบนแล็ปท็อปที่มี Windows 8.1 64-bit, 4 GB ram และโปรเซสเซอร์ 1.6GHz quad core ตรวจสอบให้แน่ใจว่า JavaScript ของคุณใช้งานได้ใน Chrome
ชัยชนะเป็นเรื่องเกี่ยวกับความรุ่งโรจน์ของทีมเป็นหลัก แต่ฉันจะยอมรับคำตอบที่ได้รับคะแนนสูงสุดในทีมที่ชนะ
ตลอดการแข่งขันโปรดจำไว้ว่าลักษณะพื้นฐานของทีมและความจริงที่ว่ามันทำงานโดยสิ้นเชิงใน Stack Snippet นั้นเป็นการทดลองอย่างมาก ฉันมีความหวังสูง แต่ฉันไม่สามารถพูดได้อย่างแน่นอนว่าจะทำงานได้ดีเพียงใด
เคล็ดลับ:
- คุณสามารถทดสอบรายการก่อนตอบ แก้ไขกล่องข้อความ "รายการทดสอบ" ใกล้กับด้านล่างของส่วนย่อยของข้อมูลและคลิก "โหลดพร้อมรายการทดสอบ" ถ้ามันไม่ว่างเปล่ามันจะกลายเป็นผู้เล่นในทีมที่ระบุ
- รู้รอบถูกเรียกใช้ในขอบเขตที่สวมหน้ากากดังนั้นสิ่งที่ต้องการ
alert
และconsole.log
ไม่ทำงานconsole
วัตถุสามารถนำมาใช้เฉพาะในการเข้าทดสอบ - ทำเครื่องหมายที่ "Debug Messages" ที่ด้านล่างของ Stack Snippet และดูคอนโซลของเบราว์เซอร์ของคุณ (F12) ข้อมูลที่มีประโยชน์มากมายถูกพิมพ์เมื่อการต่อสู้กำลังทำงาน
- คุณสามารถใช้โพสต์ Meta Sandboxเป็นพื้นที่จัดเตรียม คำตอบมีแน่นอนแตกต่างจากที่นี่และผู้ควบคุมอาจล้าสมัย
- เนื่องจากนี่ไม่ใช่แอปสแต็คอย่างเป็นทางการผู้ควบคุมอาจหยุดโหลดคำตอบสำหรับคุณถ้าคุณรีสตาร์ทมากกว่า 300 ครั้งในหนึ่งวัน
ความท้าทาย "ภาคต่อ" ของBlock Building Bot Flocks!
ลิงค์ด่วน
Fiddle Controller Fullscreen แชททั่วไป Red Chat (แชทสีน้ำเงิน) SandboxPost