Bu yarışma resmen bitti. Mavi Takım kazandı!
İki sette 50 savaşa katılırım ve şaşırtıcı bir şekilde Blue hepsini 100 kazandı. İstatistiklere bakıldığında, PhiNotPi ve Sp3000'ün kooperatif girişlerinin gerçek kahramanlar olduğu açık. İyi iş ikiniz! Aslında, Mavi Takımın diğer üyelerinden diskalifiye ederseniz , Sphibots hala çok iyi bir mücadele başlattı . Bazı kırmızı takım millet edildi planlayan Sphibots aşağı çekmek, ancak bu çaba peter gibiydi. Üzgünüm Kırmızı Takım.
Yarışma resmen sona ermiştir, ancak bu artık cevap veremeyeceğiniz anlamına gelmez, bu sadece resmi galibi tekrar ilan edemeyeceğim anlamına gelir. Her iki takım da sadece eğlence için bot göndermeye devam edebilir. Denetleyici çalışmaya devam eder ve gelecekteki girişleri bozmadığı sürece işlevsel kalır.
Bu bir tepenin kralı yarışmasıdır, ancak herkes birbiriyle savaşmak yerine yarışacak iki takım olacak: Kırmızı ve Mavi. Sadece bir tane kazanacak.
Bulunduğunuz takım PPCG kullanıcı kimliği numaranıza bağlıdır . Bunu bulmak için, ekranın üst kısmındaki avatarınıza tıklayın (giriş yapmış olmalısınız) ve açılan sayfanın URL'sine bakın. Ardından gelen numara users/
, kimlik numaranızdır:
https://codegolf.stackexchange.com/users/[id number]/[display name]
Örneğin, PPCG kullanıcı kimliği numaram 26997:
https://codegolf.stackexchange.com/users/26997/calvins-hobbies
Bu numaranın farklı Stack Exchange siteleri için farklı olduğuna dikkat edin.
Kimliğiniz çift sayıysa , o zaman Kırmızı takımtasınız .
Kimliğiniz tek bir numaraysa , Mavi takımdasınız demektir .
Takım değiştirmenin yolu yok.
Diğer kullanıcıların bir takım savaş kraliyetünde , her kullanıcının kendi takımlarının renginin bir "pikselini" savaş alanı olan 128 × 128 ızgarasında kontrol ettiği bir kraliyet savaşında yenmek için ekibinizle birlikte çalışmalısınız . Piksel dolaşabilir, ekip arkadaşları ile iletişim kurabilir ve diğer takımın piksellerini çıkarabilir. Herhangi biri herhangi bir sayıda piksel oluşturabilirse, elden çıkar, bu nedenle her kullanıcı bu soruya yalnızca bir cevap verebilir.
Bu Yığın Parçacığı (bir küçültülmüş versiyonu bu keman [ tam ekran ]) tüm yarışma için kontrol cihazıdır. Gönderimleri otomatik olarak okur, geçerli olduklarından emin olur ve ekipler arasında savaşları başlatır. Bu hakkı tarayıcınızda istediğiniz zaman JavaScript kullanarak yapar . JavaScript, çoğu tarayıcı tarafından desteklenen tek istemci tarafı komut dosyası dili olduğundan, tüm gönderilerin de JavaScript ile yazılması gerekir.
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>
Görünürlük için Snippet'in savaş alanı 3 kat ölçeklenir, yani 384 × 384 gerçek piksel ve "piksel" 3 × 3'dür.
Pixel Team Battlebots - Genel Bakış
Oyuncular
Bu soruya verilen her geçerli cevap bir oyuncuyu temsil eder . (Geçerlilik hakkında ayrıntılı bilgi için, bkz. "Kurallar ve Diskalifikasyonlar" .) Her oyuncu, 128 × 128 hücreli savaş alanında tek bir 1 x 1 hücre (aka piksel) üzerinde kontrole sahiptir . Kırmızı takımdaki oyuncuların kırmızı pikselleri ve Mavi takımdaki oyuncuların mavi pikselleri vardır.
Savaşlar
Bir savaş arasındaki bir savaştır tüm takımların oyuncu eşit sayıda olmasa bile bile, iki takım oyunculara. Savaş, her oyuncunun savaş alanında rastgele bir pozisyonda, yani sol üstteki (0,0) ile sağ altındaki (127,127) arasındaki herhangi bir tamsayı koordinatına yerleştirilmesiyle başlar. İki oyuncunun aynı pozisyonda başlamayacağı garanti edilmektedir.
hamle
Her savaş 2048 hamle ayrıldı . Sadece bir takım oyuncularını her hamle sırasında oynatabiliyor. Bu takım kırmızıdan maviye ileri geri geçiş yapar, böylece her takım toplam 1024 hamle yapar (oyun erken bitmezse).
Önce hareket eden takım, kontrol ünitesinde ayarlamanız gereken bir seçenektir.
Savaşlar otomatik olunca, ilk hareket eden takım her savaşta sırayla.
Oyuncu Hamle
Bir takım hareket ettiğinde, o takımdaki tüm oyuncuların kendilerini hareket ettirmeleri istenir. Bu çağrılar her hareket için tamamen rastgele bir sırada yapılır. Çağrıldığında, her oyuncuya savaşın durumu hakkında veri verilir, böylece hangi yöne gideceğine karar verebilirler.
Tüm hareketler yalnızca bir piksele kadar uzaklıktadır. Bu şemalardaki koyu halkalar, her bir renkli oyuncunun (karelerin) aşağıdakilere gidebileceği konumu işaret eder:
Her iki renk çapraz olarak herhangi bir yönde hareket edebilir veya hareketsiz kalabilir, ancak yalnızca Kırmızı oyuncular sağa ve sola hareket edebilir ve yalnızca Mavi oyuncular aşağı ve yukarı hareket edebilir. Teşekkürler Phi ve diğerleri.
Bir oyuncu savaş sınırlarının dışına çıkmaya çalışırsa veya hangi yöne gideceğine karar vermek çok uzun sürerse veya bir tür hata varsa, otomatik olarak hareketsiz kalır.
Hareket etmenin yanı sıra, bir sıra sırasında bir oyuncu takım arkadaşları tarafından yazılan mesajları okuyabilir ve sırayla okunabilecek mesajları yazabilir. Bu, kaba bir ekip iletişimi şekli sağlar.
Cevap olarak gönderdiğiniz kod, oynatıcınızı hangi yöne taşıyacağınızı ve hangi mesajları okuyup yazacağınızı belirleyen mantıktır (bkz. "Nasıl Yanıtlanır" ).
Düşman Oyuncularını Çıkarma
Bir oyuncu, rakip takımdaki bir oyuncu ile aynı hücreye girdiğinde, rakip oyuncu derhal savaştan çıkarılır. Yeni hareket eden oyuncu normal olarak devam eder. Bu, oyuncuları savaştan kaldıran ve ustalaşmanın tek anahtarıdır!
Hücrede bir oyuncunun yeni taşındığı birden fazla düşman oyuncu varsa, o zaman tüm düşman oyuncuları kaldırılır. Aynı takımdaki iki oyuncu aynı hücreyi işgal ederse hiçbir şey olmaz.
Savaş Kazanmak
2048 hamlenin tamamı yapıldıktan sonra veya bir takımda oyuncu kalmadığında savaş sona erer. En fazla hayatta kalan oyuncu sayısına sahip olan takım kazanır. Bu bir beraberlik İki takımın da hayatta kalan oyuncularının eşit sayıda olması durumunda.
Nasıl cevap
Cevabınızda, çağrıldığında pikselinizin hangi yöne hareket edeceğine karar veren JavaScript kodunu girmeniz gerekir.
Gelen ilk Cevabınız (olanlar 4 boşluklu öneki) içinde girintili kod örneğinde, bu işlev için bir gövde yazın:
function moveMe(move, x, y, tCount, eCount, tNear, eNear, setMsg, getMsg) {
//the body goes here
}
Kodunuzu golf gerekmez.
Ne Geri Dönmeli?
İşlevin dönüş değeri, pikselinizin hangi yönde hareket edeceğini belirler:
0
hareketsiz kalmak
1
Mavi takımın aşağı, Kırmızı takım için doğru taşımak için
2
Mavi takımın yukarı, Kırmızı takımın sol hareket
3
yukarı çapraz hareket etmek ve sağa
4
çapraz yukarı taşımak için ve sol
5
çaprazdan aşağı hareket ettirmek için ve sol
6
çaprazdan taşımak aşağı ve sağ
Diyagram olarak:
Kodunuz aşağıdakilerden herhangi birini yaparsa pikseliniz varsayılan olarak kalacaktır:
- 0 ile 6 arasında bir tamsayı dışındaki her şeyi döndürür.
- Pikselleri savaş alanı sınırlarının dışına çıkarmaya çalışıyor.
- Çalıştırılması 15 milisaniyeden uzun sürüyor.
- Her türlü istisnayı atar.
Girişinizin deterministik olması gerekmez; kullanma Math.random
iyi.
Parametreler
İlk 7 fonksiyon parametresi moveMe
savaşın durumu hakkında bilgi verir:
move
1'de başlayan ve her hamleden sonra takımınızın son hamlesinde 1024 olana kadar artan bir tam sayıdır.x
şu anki x konumunuz, 0 (en solda) ile 127 (en sağda) arasında bir tam sayı.y
geçerli y konumunuz, 0 (en üst) ile 127 (en alt) arasında bir tam sayı.tCount
şu anda takımınızdaki toplam hayatta kalan oyuncu sayısı.eCount
Düşman takımında hayatta kalan toplam oyuncu sayısı.tNear
Ekibinizdeki 16 pikselden daha kısa bir süre önce mevcut olan oyuncuların bir listesidir (Öklid mesafesi). Her bir elemanıtNear
ile bir amacıx
,y
veid
özellikleri:
x
diğer oyuncunun x konumuy
diğer oyuncunun y konumuid
Diğer oyuncunun PPCG kullanıcı kimliği numarası (tamsayı olarak)eNear
AynentNear
takım arkadaşlarının değil, yakındaki düşman oyuncuların bir listesi olması dışında.
Snippet'teki daireler her oyuncunun tNear
ve eNear
menzilidir.
Mesajlar
Son 2 parametreleri setMsg
ve getMsg
, biraz farklı amaçları vardır.
Bir savaş boyunca, her oyuncunun her hamle sırasında veri depolamak ve potansiyel olarak takım arkadaşları ile iletişim kurmak için kullanabilecekleri 64 karakterden oluşan bir karakter dizisi vardır. Her oyuncunun dizesi boş dizge olarak başlar. Bir oyuncu savaştan çıkarıldığında, dize "X" olarak ayarlanır.
setMsg
dizginizi iletilen dizgeye ayarlayan tek bir argüman işlevidir.- Girilen değer bir dize değilse, dizginiz değişmez.
- Değer 64'ten fazla karakter içeren bir dize ise, yalnızca ilk 64 tutulur.
getMsg
Takımınızdaki birinin PPCG kullanıcı kimliği numarasını (tamsayı olarak) alan ve dizesini döndüren tek bir argüman işlevidir.- Bu oyuncu şebekenin herhangi bir yerinde olabilir. 16 piksel yarıçapında olmaları gerekmez.
undefined
Verilen kimlik bulunmazsa iade edilir.
Örnek Gönderme
Bu oyuncu, eğer sola bir düşman varsa yukarı veya sağa hareket eder ya da ID 123 takım arkadaşının söylediği gibi aşağı ve sola doğru hareket eder;
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
Bu kod bloğunun tek gerekli olduğunu unutmayın. Fonksiyon tanımı ve braketler mevcut olmamalıdır.
Kurallar ve Diskalifiye
Bir kullanıcı aşağıda listelenen kurallara uymuyorsa, bunları diskalifiye olarak işaretleyebilirim ve kontrol cihazı cevaplarını otomatik olarak görmezden gelir. Buradaki kullanıcıların çoğunun kasıtlı olarak kuralları çiğnemeyeceğine ve yanlışlıkla sebep olduğu için sadece birkaç geçici diskalifiye olacağına inanıyorum.
Önemli kurallar
Yanıtınızı yalnızca 8 saat boyunca doğrudan gönderdikten sonra düzenleyebilirsiniz.
Gönderildikten 8 saat sonra düzenlenen cevaplar, denetleyici tarafından otomatik olarak diskalifiye edilir. Bu kural, ilk cevapların yaklaşımlarını sürekli olarak optimize etmelerini engellemek, muhtemelen daha sonraki cevaplardan fikirlerini almaktır. Ekibiniz, başlattığı cevaplarla ne yapmak zorunda.Özel izniniz olmadan cevabınızı silip yeniden gönderemezsiniz. Birisi 8 saatlik bir nottan sonra mesajınızı istemeden düzenlerse veya bunun gibi bir şey yaparsa bunu veririm, ama sadece bir hata bulduğunuzdan değil.
Gönderinizi silip silme işlemini seçerseniz, düzenleme kuralı yine de uygulanır. (Denetleyici silinen cevapları göremez.)
Yeni bir JavaScript değişkeni bildirirken,
var
anahtar kelimeyi kullanmanız gerekir .
Bunun sebebivar
yerelden ziyade küresel olmadan ilan edilen bir değişkenin , kontrol cihazına karışması veya diğer oyuncularla serbestçe iletişim kurması veya yanlışlıkla karıştırması kolay olacaktır. Hile yapmaya çalışmadığın açık olmalı.İşlevleri bildirirken,
var
anahtar kelimeyi de kullanmak en iyisidir . yanivar f = function(...) {...}
yerine kullanınfunction f(...) {...}
. Neden olduğundan tam olarak emin değilim, ama bazen bir fark yarattığı görülüyor.Kodunuz aşırı bir süre boyunca çalıştırılmamalıdır.
Kodunuzun çalışması 15 milisaniyeden uzun sürerse, pikseliniz hiç hareket etmeyecektir. Bununla birlikte, JavaScript'te yürütmenin ortasında işlevleri durdurmak zor olduğundan, tüm oynatıcı komut dosyaları her harekette tamamlanmak üzere çalıştırılır ve daha sonra kontrol edilir. Bu, kodunuz biraz zaman harcayan bir şey yaparsa , denetleyiciyi çalıştıran herkesin farkına varacaksınız ve rahatsız edilecektir.
Otomatik Diskalifiye
Denetleyici bu nedenlerle girişleri otomatik olarak diskalifiye eder:
- Kullanıcı zaten cevapladı.
- Düzenlemeler oluşturulduktan 8 saat sonra yapıldı.
- Kullanıcı özellikle diskalifiye olarak işaretlendi.
Diğer kurallar
Kodunuzda olmayabilir ...
- denetleyiciye veya diğer oynatıcının koduna erişme veya bunları değiştirme girişiminde bulunun.
- JavaScript'te yerleşik olan herhangi bir şeyi değiştirmeye çalışın.
getMsg
ve dışında diğer oyuncularla iletişim kurmaya çalışınsetMsg
.- web sorguları yapabilir.
- aksi takdirde kötü niyetli şeyler yapın.
Diğer cevaplardan kodların kodunu çalmak veya diğer takımla uğraşmak için çorap kuklaları kullanmak gibi diğer sportmenlik dışı davranışlara dikkat edeceğim.
Ekibinizle birlikte çalışma ve düzenleme yapabilir, ancak yarışmayı arkadaşça ve etik bir şekilde sürdürebilirsiniz.
Birinin diskalifiye edilmesi gerektiğini düşünüyorsanız veya diskalifiye edilme nedenini düzelttiğinizi düşünüyorsanız, burada ya da soruya özel sohbette bir yorum bırakın . Yarışmaya katılmıyorum.
Önerilen Cevap Formatı
#[team color] Team - [entry title]
//function body
//probably on multiple lines
Explanations, notes, etc.
Giriş adı, istersen verebileceğiniz isteğe bağlı bir addır. Denetleyici onunla hiçbir şey yapmaz.
puanlama
Bu yarışma resmen 19 Nisan 2015'te bitecek. O gün (UTC 11:00 civarında) en az 100 savaş (otomatik olarak ne kadar uzun sürdüğüne bağlı olarak). En fazla kazanan takım genel kazanan olur. Eğer bir beraberlik veya çok yakınsa, bir takımın avantajı olduğu belli olana kadar daha fazla savaş yapacağım.
(Kazanan karar verildikten sonra cevap verebilirsiniz, ancak resmi sonucu değiştirmeyeceğim.)
Onları, Windows 8.1 64 bit, 4 GB ram ve 1.6GHz dört çekirdekli işlemciye sahip bir dizüstü bilgisayarda Google Chrome'un en son sürümünde çalıştırıyorum. JavaScript'inizin Chrome'da çalıştığından emin olun.
Zafer esas olarak takım zaferiyle ilgilidir, ancak kazanan takımda en yüksek oyu alan cevabı kabul edeceğim.
Yarışma boyunca, takımın temelli yönünün ve tamamen bir Yığın Parçacığında çalıştırıldığı gerçeğinin çok deneysel olduğunu unutmayın. Büyük umutlarım var ama işlerin ne kadar işe yarayacağını kesin olarak söyleyemem.
İpuçları:
- Yanıtlamadan önce girişleri test edebilirsiniz. Yığın Parçacığının altındaki "Test Girişi" metin kutusunu düzenleyin ve "Test girişi ile yeniden yükle" yi tıklayın. Boş değilse, belirtilen takımda bir oyuncu olur.
- Cevaplar maskeli bir kapsamda çalıştırılır, bu yüzden işler hoşuna gider
alert
veconsole.log
çalışmaz.console
Nesnesi yalnızca deney giriş kullanılabilir. - Yığın Pasajının altındaki "Hata ayıklama" seçeneğini işaretleyin ve tarayıcınızın konsoluna bakın (F12). Savaşlar devam ederken, çok faydalı bilgiler basılır.
- Sen kullanabilirsiniz Meta Sandbox yazı iskele bölgesinden bir tür olarak. Buradaki cevaplar elbette buradakinden farklı ve denetleyici güncel değil.
- Bu resmi bir Stack App olmadığından , kontrol cihazı günde 300 defadan fazla başlatırsanız, sizin için cevap yüklemeyi durdurabilir.
Bu meydan okuma "devamı": Blok Oluşturma Bot Sürüleri!
Hızlı Linkler
Keman Denetleyicisi Tam Ekran Genel Sohbet Kırmızı Sohbet (Mavi Sohbet?) SandboxPost