Kontes ini resmi berakhir. Tim Biru menang!
Saya autoran dua set 50 pertempuran dan luar biasa, Blue memenangkan semua 100 dari mereka. Melihat statistik, jelas bahwa entri kooperatif PhiNotPi dan Sp3000 adalah pahlawan nyata. Kerja bagus kalian berdua! Bahkan, jika Anda mendiskualifikasi setiap anggota Tim Biru lainnya , Sphibot masih melakukan perlawanan yang sangat baik . Beberapa orang dari Tim Merah berencana untuk menjatuhkan Sphibots, tetapi upaya ini tampaknya mereda. Maaf Tim Merah.
Kontes resmi berakhir, tetapi itu tidak berarti Anda tidak dapat lagi menjawab, itu hanya berarti bahwa saya tidak akan pernah mengumumkan pemenang resmi. Kedua tim dipersilakan untuk terus mengirimkan bot, hanya untuk bersenang-senang. Pengontrol akan tetap aktif dan tetap berfungsi selama tidak ada entri yang akan memutusnya.
Ini adalah kontes king-of-the-hill , tetapi alih-alih setiap orang bertarung satu sama lain, akan ada dua tim yang bersaing: Merah dan Biru. Hanya satu yang akan menjadi pemenang.
Tim tempat Anda berada tergantung pada nomor ID pengguna PPCG Anda . Untuk menemukan ini, klik avatar Anda di bagian atas layar (Anda harus masuk) dan lihat url halaman yang terbuka. Nomor setelahnya users/
adalah nomor ID Anda:
https://codegolf.stackexchange.com/users/[id number]/[display name]
Misalnya, nomor ID pengguna PPCG saya adalah 26997:
https://codegolf.stackexchange.com/users/26997/calvins-hobbies
Perhatikan bahwa nomor ini berbeda untuk situs Stack Exchange yang berbeda.
Jika ID Anda adalah nomor genap , maka Anda berada di tim Merah .
Jika ID Anda adalah nomor ganjil , maka Anda berada di tim Biru .
Tidak ada cara untuk mengubah tim.
Anda harus bekerja dengan tim Anda untuk mencoba mengalahkan tim lain dalam semacam pertempuran kerajaan di mana setiap pengguna mengontrol "pixel" warna tim mereka di grid 128 × 128 yang merupakan medan perang. Piksel dapat bergerak, berkomunikasi dengan rekan satu timnya, dan mengeluarkan piksel tim lain. Itu akan keluar dari tangan jika ada yang bisa membuat jumlah piksel, jadi setiap pengguna hanya dapat mengirimkan satu jawaban untuk pertanyaan ini.
Cuplikan Stack ini (versi kecil dari biola ini [ layar penuh ]) adalah pengontrol untuk seluruh kontes. Secara otomatis membaca kiriman, memastikan valid, dan tahap pertempuran antara tim. Ini melakukan ini dengan benar di browser Anda kapan saja Anda inginkan, menggunakan JavaScript . Karena JavaScript adalah satu-satunya bahasa skrip sisi-klien yang didukung sebagian besar browser, semua kiriman juga harus ditulis dalam 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>
Untuk visibilitas, medan perang Snippet diskalakan dengan faktor 3, jadi 384 × 384 piksel nyata dan "piksel" adalah 3 × 3.
Pixel Team Battlebots - Ikhtisar
Pemain
Setiap jawaban yang valid untuk pertanyaan ini mewakili pemain . (Untuk perincian tentang validitas, lihat "Aturan dan Diskualifikasi" .) Setiap pemain memiliki kendali atas sel 1 × 1 tunggal (alias piksel) di medan perang sel 128 × 128 . Pemain di tim Merah memiliki piksel merah dan pemain di tim Biru memiliki piksel biru.
Pertempuran
Sebuah pertempuran adalah pertarungan antara semua pemain di kedua tim, bahkan jika tim tidak memiliki jumlah yang sama pemain. Pertarungan dimulai dengan setiap pemain ditempatkan pada posisi acak di medan perang, yaitu, koordinat bilangan bulat mulai dari (0,0) di kiri atas, hingga (127.127) di kanan bawah. Dijamin tidak ada dua pemain yang akan mulai di posisi yang sama.
Bergerak
Setiap pertempuran dipecah menjadi 2048 gerakan . Hanya satu tim yang benar-benar dapat memindahkan pemain mereka selama setiap gerakan. Tim itu bergantian bolak-balik dari Merah ke Biru, sehingga setiap tim membuat total 1024 gerakan (kecuali permainan berakhir lebih awal).
Tim yang bergerak pertama adalah opsi yang harus Anda atur di controller.
Ketika pertempuran adalah autorun, tim yang bergerak pertama bergantian dalam setiap pertempuran.
Pemain Bergerak
Ketika sebuah tim bergerak, semua pemain di tim itu dipanggil untuk bergerak sendiri. Panggilan-panggilan ini dilakukan dalam urutan yang sepenuhnya acak untuk setiap gerakan. Saat dipanggil, masing-masing pemain diberikan data tentang keadaan pertempuran sehingga mereka dapat memutuskan ke mana harus bergerak.
Semua gerakan hanya berjarak satu piksel saja. Lingkaran hitam pada diagram ini menandai posisi masing-masing pemain berwarna (kotak) yang dapat bergerak ke:
Kedua warna dapat bergerak secara diagonal ke segala arah atau diam, tetapi hanya pemain Merah yang bisa bergerak ke kanan dan ke kiri, dan hanya pemain Biru yang bisa bergerak ke bawah dan ke atas. Terima kasih Phi dan lainnya.
Jika seorang pemain mencoba untuk keluar dari batas medan perang, atau terlalu lama memutuskan ke mana harus bergerak, atau memiliki beberapa jenis kesalahan, mereka akan secara otomatis diam.
Selain bergerak, selama giliran pemain dapat membaca pesan yang ditulis oleh rekan satu tim mereka dan menulis pesan yang pada gilirannya dapat dibaca. Ini memungkinkan bentuk komunikasi tim yang kasar.
Kode yang Anda kirimkan sebagai jawaban adalah logika yang menentukan cara untuk memindahkan pemain Anda dan pesan apa yang harus dibaca dan ditulis (lihat "Cara Menjawab" ).
Menghapus Pemain Musuh
Ketika seorang pemain bergerak ke sel yang sama dengan pemain di tim lawan, pemain lawan itu segera dikeluarkan dari pertempuran. Pemain yang baru saja pindah berlanjut seperti biasa. Ini adalah satu-satunya mekanisme yang menghilangkan pemain dari pertempuran dan menguasainya adalah kunci untuk menang!
Jika ada beberapa pemain musuh dalam sel yang baru saja dipindahkan, maka semua pemain musuh dihapus. Tidak ada yang terjadi jika dua pemain di tim yang sama menempati sel yang sama.
Memenangkan Pertempuran
Pertempuran berakhir setelah semua 2048 gerakan dilakukan atau ketika satu tim tidak memiliki pemain yang tersisa. Tim dengan jumlah pemain yang bertahan terbanyak menang. Ini seri jika kedua tim memiliki jumlah pemain yang sama.
Bagaimana menjawab
Dalam jawaban Anda, Anda perlu memberikan kode JavaScript yang memutuskan ke arah mana piksel Anda akan bergerak ketika diminta untuk melakukannya.
Dalam contoh kode indentasi pertama dalam jawaban Anda (yang diawali dengan 4 spasi), tuliskan badan untuk fungsi ini:
function moveMe(move, x, y, tCount, eCount, tNear, eNear, setMsg, getMsg) {
//the body goes here
}
Tidak perlu membuat kode Anda golf.
Apa yang harus kembali
Nilai pengembalian fungsi menentukan ke arah mana piksel Anda bergerak:
0
untuk tetap diam
1
bergerak ke kanan untuk tim Merah, turun untuk tim Biru
2
untuk bergerak ke kiri untuk tim Merah, naik untuk tim Biru
3
untuk bergerak secara diagonal ke atas dan
4
ke kanan untuk bergerak secara diagonal ke atas dan
5
ke kiri untuk bergerak secara diagonal ke bawah dan
6
ke kiri untuk bergerak secara diagonal bawah dan kanan
Sebagai diagram:
Pixel Anda akan tetap diam secara default jika kode Anda melakukan hal-hal berikut:
- Mengembalikan apa pun selain bilangan bulat dari 0 hingga 6.
- Mencoba untuk memindahkan piksel dari batas medan perang.
- Butuh waktu lebih dari 15 milidetik untuk berjalan.
- Melemparkan segala macam pengecualian.
Entri Anda tidak perlu bersifat deterministik; menggunakan Math.random
baik-baik saja.
Parameter
7 parameter fungsi pertama moveMe
memberikan informasi tentang keadaan pertempuran:
move
adalah bilangan bulat yang dimulai dari 1 dan bertambah setelah setiap gerakan hingga 1024 pada gerakan terakhir tim Anda.x
adalah posisi x Anda saat ini, bilangan bulat dari 0 (paling kiri) ke 127 (paling kanan).y
adalah posisi Anda saat ini, bilangan bulat dari 0 (paling atas) ke 127 (paling bawah).tCount
adalah jumlah total pemain yang masih ada di tim Anda saat ini.eCount
adalah jumlah total pemain yang bertahan saat ini di tim musuh.tNear
adalah daftar pemain yang masih ada saat ini di tim Anda yang berjarak kurang dari 16 piksel (jarak Euclidean). Setiap elemen daritNear
sebuah objek denganx
,y
, danid
sifat:
x
adalah posisi x pemain lainy
adalah posisi pemain lainid
adalah nomor ID pengguna PPCG dari pemain lain (sebagai bilangan bulat)eNear
persis sepertitNear
kecuali itu adalah daftar pemain musuh di dekatnya, bukan rekan satu tim.
Lingkaran di cuplikan adalah masing-masing pemain tNear
dan eNear
jangkauan.
Pesan
2 parameter terakhir, setMsg
dan getMsg
, memiliki tujuan yang sedikit berbeda.
Sepanjang pertempuran, setiap pemain memiliki string hingga 64 karakter yang dapat mereka manipulasi selama setiap gerakan untuk menyimpan data dan berpotensi berkomunikasi dengan rekan tim mereka. Setiap string pemain dimulai sebagai string kosong. Ketika seorang pemain dihapus dari pertempuran, string mereka diatur ke "X".
setMsg
adalah fungsi satu argumen yang mengatur string Anda ke string yang diteruskan.- Jika nilai yang diteruskan bukan string, maka string Anda tidak berubah.
- Jika nilainya berupa string dengan lebih dari 64 karakter, hanya 64 karakter pertama yang disimpan.
getMsg
adalah fungsi satu argumen yang mengambil nomor ID pengguna PPCG (sebagai integer) dari seseorang di tim Anda dan mengembalikan string mereka.- Pemain itu mungkin ada di mana saja di grid. Mereka tidak perlu berada dalam radius 16 piksel Anda.
undefined
dikembalikan jika ID yang diberikan tidak ditemukan.
Contoh Pengiriman
Pemain ini bergerak ke atas dan ke kanan jika ada musuh di sebelah kiri, atau yang lain ke bawah dan ke kiri jika rekan setimnya dengan ID 123 mengatakan demikian, tetapi jika tidak tetap:
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
Perhatikan bahwa hanya diperlukan kode blok ini. Definisi fungsi dan tanda kurung tidak boleh ada.
Aturan dan Diskualifikasi
Jika pengguna tidak mematuhi aturan yang tercantum di bawah ini, saya dapat menandainya sebagai didiskualifikasi dan pengontrol akan secara otomatis mengabaikan jawaban mereka. Saya percaya bahwa sebagian besar pengguna di sini tidak akan dengan sengaja melanggar aturan dan hanya akan ada beberapa diskualifikasi sementara untuk penyebab yang tidak disengaja.
Aturan Penting
Anda hanya dapat mengedit jawaban Anda selama jendela 8 jam secara langsung setelah mempostingnya.
Jawaban yang diedit setelah 8 jam sejak diposting akan secara otomatis didiskualifikasi oleh pengontrol. Aturan ini adalah untuk mencegah jawaban awal dari terus mengoptimalkan pendekatan mereka, mungkin mencuri ide dari jawaban nanti. Tim Anda harus puas dengan jawaban apa pun yang dimulai.Anda tidak boleh menghapus dan mengirim ulang jawaban Anda tanpa izin khusus. Saya akan memberikan ini jika seseorang secara tidak sengaja mengedit posting Anda setelah tanda 8 jam atau sesuatu seperti itu, tetapi bukan hanya karena Anda menemukan bug.
Jika Anda menghapus posting dan memilih untuk membatalkan penghapusan, aturan edit masih berlaku. (Pengontrol tidak dapat melihat jawaban yang dihapus.)
Saat mendeklarasikan variabel JavaScript baru, Anda harus menggunakan
var
kata kunci.
Ini karena variabel yang dideklarasikan tanpavar
menjadi global daripada lokal, sehingga akan mudah untuk secara tidak sengaja (atau sengaja) mengacaukan controller atau berkomunikasi secara bebas dengan pemain lain. Harus jelas bahwa Anda tidak mencoba menipu.Saat mendeklarasikan fungsi, yang terbaik adalah menggunakan
var
kata kunci juga. yaitu menggunakanvar f = function(...) {...}
alih-alihfunction f(...) {...}
. Saya tidak sepenuhnya yakin mengapa, tetapi kadang - kadang tampaknya ada bedanya.Kode Anda tidak boleh berjalan untuk waktu yang berlebihan.
Jika kode Anda membutuhkan lebih dari 15 milidetik untuk dijalankan, piksel Anda tidak akan bergerak sama sekali. Namun, karena sulit dalam JavaScript untuk menghentikan fungsi pertengahan eksekusi, semua skrip pemain dijalankan hingga selesai pada setiap gerakan, dan waktu diperiksa sesudahnya. Ini berarti, jika kode Anda melakukan hal intensif waktu, semua orang yang menjalankan pengontrol akan melihat dan merasa terganggu.
Diskualifikasi Otomatis
Pengontrol secara otomatis mendiskualifikasi entri karena alasan berikut:
- Pengguna sudah menjawab.
- Suntingan dilakukan lebih dari 8 jam setelah pembuatan.
- Pengguna secara khusus ditandai sebagai didiskualifikasi.
Peraturan Lainnya
Dalam kode Anda, Anda mungkin tidak ...
- mencoba mengakses atau memodifikasi controller atau kode pemain lain.
- mencoba untuk memodifikasi apa pun yang ada di dalam JavaScript.
- mencoba berkomunikasi dengan pemain lain kecuali dengan menggunakan
getMsg
dansetMsg
. - buat kueri web.
- jika tidak lakukan hal-hal jahat.
Saya akan mengawasi perilaku tidak sportif lainnya, seperti mencuri kode kata demi kata dari jawaban lain atau menggunakan boneka kaus kaki untuk mengacaukan tim lain.
Anda dipersilakan untuk berkolaborasi dan merencanakan dengan tim Anda, tetapi tetap membuat kontes ramah dan etis.
Jika Anda berpikir seseorang perlu didiskualifikasi atau Anda pikir Anda telah memperbaiki alasan Anda didiskualifikasi, tinggalkan komentar di sini untuk saya atau dalam obrolan spesifik pertanyaan . Saya tidak berpartisipasi dalam kontes.
Format Jawaban yang Disarankan
#[team color] Team - [entry title]
//function body
//probably on multiple lines
Explanations, notes, etc.
Judul entri adalah nama opsional yang dapat Anda berikan jika Anda suka. Kontroler tidak melakukan apa-apa dengannya.
Mencetak gol
Kontes ini akan berakhir secara resmi pada 19 April 2015. Pada hari itu (sekitar jam 11 malam UTC) saya akan melakukan autorun setidaknya 100 pertempuran (mungkin lebih banyak tergantung pada berapa lama pertempuran berlangsung). Tim yang paling banyak menang akan menjadi pemenang keseluruhan. Jika itu seri atau sangat dekat, saya akan menjalankan lebih banyak pertempuran sampai jelas bahwa satu tim memiliki keunggulan.
(Anda dapat menjawab setelah pemenang diputuskan, tetapi saya tidak akan mengubah hasil resmi.)
Saya akan menjalankannya dalam versi terbaru Google Chrome pada laptop dengan Windows 8.1 64-bit, ram 4 GB, dan prosesor quad core 1.6GHz. Pastikan JavaScript Anda berfungsi di Chrome.
Kemenangan ini terutama tentang kemuliaan tim, tetapi saya akan menerima jawaban dengan suara terbanyak di tim yang menang.
Sepanjang kontes, ingatlah bahwa aspek berbasis tim, dan fakta bahwa itu dijalankan sepenuhnya dalam Cuplikan Stack, sangat eksperimental. Saya memiliki harapan yang tinggi, tetapi saya tidak bisa mengatakan dengan pasti seberapa baik hal-hal akan bekerja.
Kiat:
- Anda dapat menguji entri sebelum menjawab. Edit kotak teks "Test Entry" di dekat bagian bawah Stack Snippet dan klik "Reload with entry test". Jika tidak kosong itu menjadi pemain di tim yang ditentukan.
- Jawaban dijalankan dalam cakupan bertopeng, sehingga hal-hal seperti
alert
danconsole.log
tidak akan berhasil. Theconsole
objek hanya dapat digunakan dalam entri tes. - Periksa "Pesan debug" di bagian bawah Stack Snippet dan lihat konsol browser Anda (F12). Banyak info berguna dicetak saat pertempuran berjalan.
- Anda dapat menggunakan pos Meta Sandbox sebagai semacam area pementasan. Jawabannya tentu saja berbeda dari di sini, dan pengontrol di sana mungkin sudah ketinggalan zaman.
- Karena ini bukan Aplikasi Stack resmi , pengontrol dapat berhenti memuat jawaban untuk Anda jika Anda me-restart lebih dari 300 kali dalam sehari.
"Sekuel" tantangan ini: Block Building Bot Flocks!
tautan langsung
Fiddle Controller Layar Penuh Obrolan Umum Obrolan Merah (Obrolan Biru?) SandboxPost