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
sumber
Jawaban:
Tim Biru - SphiNotPi3000
Bot ini membentuk pasangan dengan bot Sp3000 .
Ide dasarnya adalah bahwa dua bot, diposisikan berdekatan satu sama lain, membantu menutupi kelemahan satu sama lain, sehingga bot tidak memiliki sisi yang terbuka. Ini membantu melindungi dari ancaman dan membatasi opsi melarikan diri dari target.
Di awal permainan, mereka bernavigasi satu sama lain dan membentuk pasangan. Pasangan ini kemudian bergerak sebagai satu unit, dengan satu bot memimpin yang lain. Kedua bot memiliki kode yang hampir identik, memungkinkan mereka untuk bertukar posisi dan peran saat diperlukan.
Saat menganggur, bot bergerak di sekitar papan mencari musuh. Begitu mereka melihat musuh, mereka dengan hati-hati bermanuver ke posisi yang benar untuk diserang. Fitur yang sangat rapi adalah kemampuan formasi untuk bergerak lurus secara horizontal, dicapai dengan menempatkan bot sebagai alternatif.
sumber
var
tidak digunakan dalam posting ini dan Sp3000. Mereka menetapkanj
ke 0 segera dan itu tidak mengganggu controller sama sekali, jadi untungnya bukan masalah dalam hal ini.Tim Biru - SphiNotPi3000
Bot ini membentuk pasangan dengan bot PhiNotPi . Lihat posting Phi untuk penjelasan singkat tentang strategi kami.
sumber
Tim Merah - SeekerBot
Prioritas tertinggi SeekerBot adalah bertahan hidup. Oleh karena itu, ia hanya akan mempertimbangkan langkah-langkah yang tidak akan membahayakannya untuk dibunuh di giliran berikutnya (selama gerakan itu ada).
Ketika tidak ada lawan yang terlihat, itu akan bergerak dalam pola di atas medan perang, yang akan memastikan bahwa sebagian besar tanah akan secara teratur dalam jarak pandang.
Jika SeekerBot melihat musuh, itu akan bergerak ke arahnya. Jika itu dapat membunuh musuh, itu akan melakukannya selama langkah itu disimpan.
Jika tidak dapat membunuh musuh tetapi musuh berada dalam posisi untuk membunuhnya pada giliran berikutnya, SeekerBot akan mencoba memikat musuh ke arah seorang teman (jika ada yang terlihat). Jika tidak ada anggota tim yang terlihat, ia akan mencoba bergerak ke posisi, di mana ia dapat membunuh musuh di giliran berikutnya. Jika ini tidak berhasil 5 kali berturut-turut, itu akan mengubah taktik dan mulai bergerak dalam pola acak, mungkin mendekati musuh lagi di babak berikutnya.
Untuk apa nilainya, itu akan menggunakan 7 karakter pertama dari pesan untuk meneriakkan posisinya sendiri dalam format "x; y" (di mana x dan y adalah nol padded).
Tentu bukan kode terbersih, tetapi tampaknya melakukan apa yang saya harapkan.
sumber
Tim Merah - Groomba
Catatan dalam komentar.
sumber
self
. Variabel itu disediakan untuk menunjuk kewindow.self
. GunakanI
(modal i) sebagai gantinya. Ataume
. Atau bahkanmyself
.Red Team - Lazy Slayer
Ini adalah hal paling mendasar yang bisa saya dapatkan.Ini tidak lagi 100% dasar.Ini hanya bergerak JIKA DIBUTUHKAN .
Jika pengguna mengirim pesan dengan 2 angka di antara-1
dan1
(misalnya:)'1,0'
, dipisahkan dengan koma, ia akan pindah ke sana. Ini benar-benar mempercayai rekan setimnya.Ini sekarang berkomunikasi melalui JSON. Ini memiliki struktur yang sangat mendasar:
Contoh pesan untuk mengendalikannya:
Yang akan mengirim:
Dia juga sedikit egois
dan tidak akan membantumudan sekarang dia membantu sebagai mercusuar yang diam.Jika pesan ini salah (formatnya tidak benar), coba tambahkan
"}
saja}
.Ini diedit setelah batas 6 jam, dan setelah itu diperpanjang menjadi 8.
Tidak lagi rusak dan akan tetap sebagai versi final.
sumber
Tim Merah - Si Pengecut
Bot ini masih tetap untuk menghindari deteksi sebanyak mungkin. Ketika satu atau lebih musuh terlihat, beberapa hal dapat terjadi:
Tidak berkomunikasi dengan siapa pun, kalau-kalau ada yang bisa mendengarnya dan mengejarnya.
Ini mungkin bukan bot yang paling berguna bagi tim, tapi itu menyenangkan melihatnya berusaha keluar dari semua orang.
sumber
Tim biru - Elang
Saya cukup senang dengan bot saya saat ini. Ini memiliki taktik berikut:
sumber
Tim biru - Enemyeater
Pixel kecil ini mencari enimens di sekitarnya dan mencoba memakannya, jika tidak ada pixel di sekitarnya bergerak secara acak. Saya menantikan untuk melihat apa yang muncul dari orang lain.
sumber
Math.floor
, TidakMath.float
!(Math.random() * 6) & 6
atau(Math.random() * 6) << 0
atau(Math.random() * 6) >> 0
(berguna untuk codegolf).Math.random() * 7
? Saya sudah mencoba beberapa uji coba, dan sepertinya bot Anda tidak mengarah ke kanan bawah. IIRCMath.random()
termasuk 0 dan eksklusif 1 yang berarti* 6
tidak pernah benar-benar 6.Tim merah - Charger Merah Jittery
Red Charger hanya bergerak ke kiri dan ke kanan, berharap untuk mengeksploitasi ketidakmampuan Tim Biru untuk bergerak ke arah itu. Setelah mencapai dinding, itu berbalik dan menyerang ke arah yang berlawanan, berharap untuk membinasakan setiap bot di jalannya.
EDIT: Red Charger baru saja menghabiskan satu galon minuman energi dan sekarang tidak bisa berhenti jittering, itu berharap untuk menggunakan ini untuk keuntungannya juga. Terlalu berkafein untuk mendengarkan rekan satu timnya, tetapi ia berteriak setiap gerakannya.
sumber
Tim biru - LazySoldier
sumber
JSON.parse
dalam blok coba / tangkap atau sesuatu ... itu menyebabkan terlalu banyak kesalahan.Tim Biru - Mass Killer
Saya kira taktik yang cukup mudah. Saya menghitung musuh yang secara langsung dapat dijangkau oleh saya (saya kira akan ada banyak dari mereka :)) dan membunuh jumlah terbesar. Jika tidak ada, setidaknya saya akan mencoba melindungi diri saya dengan melangkah di atas atau di bawah jumlah terbesar musuh berharap untuk membunuh mereka langkah selanjutnya.
Saya menyerah memperhitungkan tembok, jadi saya mengabaikannya. Itu cukup lama.
Saya tidak dapat menguji / menjalankan kode ini, jadi akan ada banyak bug.
sumber
Tim Biru - WatchDog
Itu bergerak secara acak sampai meraih sekutu, jika demikian itu mengikutinya. Mencoba menghindari terbunuh, dan membunuh jika dia bisa. Maaf untuk kode yang mengerikan, saya langsung dan lupa tentang refactoring. Saya akan mencoba untuk mendorong keterbacaan jika saya punya waktu :)
sumber
Red Team - Seeker Commander
Yang ini adalah salinan Mineker SeekerBot dengan beberapa modifikasi.
Memori internal terkompresi untuk distribusi pesan yang lebih baik
"$":[seekmode]
Membaca posisi musuh dari sekutu menggunakan format JSON Lazy Slayer
"e":"[positions]"
; menerima[positions]
diimbangi oleh keduanya32
dan174
Melaporkan posisi musuh dalam format JSON Lazy Slayer,
"e":"[positions]"
diimbangi oleh174
Laporan langkah terakhir dengan
"m":[move]
menunjukkan bahwa bot ini dapat diperintahkanMasalah perintah ke bot lain menggunakan
"[ally_id]":{"m":[move],"a":1,"id":29354}
. Perintah menggunakan algoritma pencari yang sama kecuali di lokasi sekutu. Jika bot lain mendengarkan perintah ini, mereka harus berkelompok dan berburu dalam satu paket. Pesanan hanya diberikan jika pesan sekutu termasuk"m":
Mengikuti perintah dari bot lain, seperti:
"29354":[move]
atau"29354":{"m":[move]
. Perintah hanya diikuti ketika tidak ada musuh dalam jangkauan dan tidak ada sekutu lain yang melaporkan musuhsumber
""a":0,"o":[122,70],"m":0,"e":"f""
. Anda dapat bergabung dengan kami dalam obrolan jika Anda mau.Tim Merah - BouncerBot
Bot saya memantul dari dinding ke dinding (tidak persis, sehingga menutupi tanah yang berbeda) mencari musuh. Jika ada satu dalam jangkauannya, ia menyerang, menyeretnya ke dinding, dan mencoba mengeluarkannya (pikirkan penjaga di sebuah klub).
sumber
Tim Merah - SideKick
Senang mengikuti rekan satu tim sekitar, untungnya ada banyak dari mereka!
sumber
Tim Biru - magnet bimbang
Ini memiliki beberapa strategi: Jika ia dapat mengalahkan musuh dengan segera, ia akan melakukannya, dan ia akan melarikan diri dari kelompok musuh jika mereka cukup jauh, jika tidak ia akan bertarung. Selain itu hanya mencari anggota tim dan mencoba mengikuti mereka.
sumber
Tim Biru - Ambil [38953]
[edit: ternyata ini BANYAK lebih baik ketika saya menggunakan id saya yang sebenarnya dan bukan -1!]
Bot kecil bodoh yang berjalan di sekitar papan, melakukan yang terbaik untuk menarik perhatian dan menggambar pemburu, dan kemudian berlari ke tengah di mana (mudah-mudahan) dia akan menemukan seseorang untuk membantunya, atau dia hanya akan menghentikan pengejar dan menghentikannya dari berburu.
Tampaknya tidak membuat dampak yang besar pada skor keseluruhan karena seberapa kuat tagteam Blue, tapi setidaknya saya tidak membuat segalanya lebih buruk!
Berteriaklah dalam 8 jam ke depan jika Anda ingin saya menambahkan sesuatu yang berguna untuk pesan saya.
sumber
Tim Biru - PatrolBot
Kode semacam mendokumentasikan diri. Hal-hal yang bisa dilakukan untuk meningkatkan PatrolBot
if (canBeKilled() || isInWall()) { moveToBetterPosition() }
sesaat sebelum kembali.sumber
TIM BIRU - 1 Poin Luar Biasa
Prioritas piksel:
Gravitasi diatur ke 64,64 saat bergerak 1
Gravity diatur ke lokasi musuh terdekat (untuk mengarahkan piksel ke lokasi musuh terakhir, jika musuh lolos)
Gravitasi berubah secara acak ketika piksel telah mencapai pusat gravitasi atau ketika di dekat tepi
sumber
Merah - LoyalFollower [15080]
Mencoba untuk menemukan Minos dan membunuh musuh. Sayangnya, tim merah masih kalah, mungkin karena kita kurang pemain ...
sumber
Tim Biru - MiddleMan
MiddleMan adalah saudara kembar WallFlower (yang dia gantikan). Seperti saudaranya, ia tidak cenderung menjadi tipe sosial. Dia lebih suka nongkrong di tengah ruangan, menonton dan menunggu. Tapi bukan berarti dia pasif atau malu-malu. Saat berada di tempatnya atau dalam perjalanan ke sana, jika dia menemukan musuh, tidak peduli ukurannya, dia akan mengenakan biaya untuk membawanya. Mengetahui ada kekuatan dalam jumlah, dia dengan senang hati akan menarik mereka ke arah rekan setim yang dia temukan, atau sebagai alternatif, menuju pusat dengan harapan menemukan orang lain. Setelah bisnisnya selesai, dia kembali ke tempatnya, siap untuk kesempatan berikutnya untuk membantu timnya.
Waspadalah, tim merah. Meskipun dia mungkin tidak tampak banyak, dia sama ganas dan gigihnya mereka; master pertempuran jarak dekat solo. Dia mungkin tidak berkomunikasi langsung dengan timnya, tetapi dia mengakui mereka, dan akan bekerja sama untuk mengalahkan musuh bersama. Dia baru-baru ini belajar bagaimana mengirim pesan, meskipun dia tidak akan mendengarkannya sendiri, hanya saja bukan gayanya. Formatnya adalah string JSON yang berisi array seperti ini:,
[[selfX,selfY],[[enemy1X,enemy1Y],[enemy2X,enemy2Y]]]
dan seterusnya untuk lebih banyak musuh.sumber
Tim Biru - VersaBot, mesin polimorfik
Kode saya akan secara otomatis mengikuti bot terdekat di dekatnya, memberikan daya tembak dan perlindungan tambahan.
Nikmati!
sumber