Eğer hiç Spacewar oynamışsanız ! , eğlenceli bir oyun olduğunu biliyorsun. Bunu yapmadıysanız, şunu bilin: ilk ve en önemli bilgisayar oyunlarından biriydi (ve öyle). Ve hala eğlenceli! Ben büyüdüm klon bu bir görünüşe ve ne yazık ki, sadece Windows vardır. Bu yüzden onu yeniden yarattım!
KotH burada barındırılmaktadır: PPCG - Spacewar! Tepenin Kralı . Oyunun nasıl çalıştığını hissetmek için en az bir botla insan olarak oynamanı tavsiye ediyorum.
Oyun
- Bir kare 30 milisaniyedir (yani, saniyede yaklaşık 33 kare).
- Alan 800 piksel genişliğinde ve 600 piksel yüksekliğindedir.
- Alan toroidaldir, yani alanın dışına hareket eden uzay ve füzelerin karşı tarafta tekrar göründüğü anlamına gelir.
- İki uzay gemisi var, kırmızı ve mavi.
- Kırmızı, x = 50 konumunda ve rasgele y, 50 (alan yüksekliği - 50) piksel arasında konumlandırılmıştır.
- Mavi, x = (alan genişliği - 50) olarak ve rasgele y, 50, (alan yüksekliği - 50) piksel arasında konumlandırılır.
- Her iki yüz x = (alan genişliği) / 2.
- Mevcut kontroller:
- Sola çevirin - kare başına 5 derece saat yönünün tersine.
- Sağa çevirin - kare başına 5 derece saat yönünde.
- Ateş füzesi - gemi hızına ek olarak, gemi işaret ettiği yöne ek olarak, kare başına ekstra 10 piksel hareket eder.
- İtfaiye aracı - uzay gemisinin işaret ettiği yönde her kare için 0,30 piksel ile uzay gemisini hızlandırır.
- Hyperspace jump - Alandaki bazı rasgele koordinatlara ışınlar,% 25'lik bir patlama şansı. Bu rasgele koordinatlar güneşin üstünde olabilir.
- Gemiler için maksimum hız, motor gücü altındaki çerçeve başına 15 piksel ve yerçekimi artırıldığında kare başına 40 pikseldir.
- Çerçeve başına 15 pikselden daha hızlı seyahat ederken, motor itişi yalnızca yön değiştirebilir veya yavaşlayabilir.
- Füzeler ile ilgili olarak:
- Füzeler düz bir çizgide ilerliyor.
- Füzeler 0,1 saniyede maksimum 1 oranında ateşlenebilir.
- Füzelerin ömrü 2.25 saniyedir.
- Gemilerin her birinde en fazla 20 füze var.
- Füzeler dahili olarak partikül parçacıklarıdır.
- Merkezde, geminiz için son derece tehlikeli olan bir güneş var. En ufak temas ölümcüldür. Bu güneş aynı zamanda füzeleri de yok ediyor.
- Güneş yerçekimi vardır. Elde edilen ivme 5000 / (mesafe ^ 2) piksel / kare ^ 2'dir, burada mesafe piksel cinsindendir. Uzay gemileri ve füzeler etkilenir.
- Her iki geminin de üç vuruş bölgesi var: burun, sol kanat ve sağ kanat.
- Burunda bir vuruş anında ölümdür.
- Her iki kanattaki vuruş, uzay gemisinin dönüş hızını ve motor ivmesini yarı yarıya azaltır.
- Her iki kanat da tahrip olursa, uzay gemisi manevra yapamaz ve yalnızca füze ateşleyebilir.
- Gemiler birbiriyle çarpışabilir.
- Her iki gemi için bir burun-burun etkisi ölümcüldür.
- Bir burun kanadı darbesi kanadı yok eder.
- Kanat kanadı darbesi her iki kanadı da yok eder.
- Ölü gemiler sağlam ve 1 saniye sonra patlayana kadar donmuş.
- En az bir gemi öldükten sonra, saha 3 saniye sonra sıfırlanır. O zamana kadar güneş ve kalan füzeler hala tehlikelidir.
Orijinal oyun aynı zamanda ölümcül ve tahrip edilemez asteroitler de içeriyor, ama ben bunları dahil etmeyeceğim.
Kurallar
- Botunuz JavaScript ile yazılmalıdır.
- Botunuz kararını yaklaşık 10 milisaniye ile sınırlandırmalıdır. Botunuzdan dolayı sürekli bir gecikme olduğunu fark edersem, diskalifiye edeceğim ve düzeltebilmeniz için size haber vereceğim.
- Botlar aşağıdakilere erişebilecek:
- Alan genişliği ve alan yüksekliği
- Güneş pozisyonu ve yarıçapı
- Her iki geminin de konumu, dönüşü, hızı, şekli, füze stoğu ve hiper-uzayda durumu
- Tüm füzelerin konumu ve hızı
- İstendiğinde, botunuz bir dizeler listesi döndürmelidir.
- Bu dizeler aşağıdaki biri olmalıdır:
turn left
,turn right
,fire engine
,fire missile
,hyperspace
. Başka bir dize göz ardı edilir. - Herhangi bir kopya varsa, yalnızca ilk not alınacaktır.
hyperspace
tüm diğerlerine göre önceliklidir.turn left
veturn right
aynı zamanda bir etkisi olmayacak.fire engine
Geminin sadece burnu varsa veya ölmüşse etkisi olmaz.fire missile
Çok yakın zamanda bir füze ateşlendiğinde etkisi olmayacak.
- Bu dizeler aşağıdaki biri olmalıdır:
- Normalden farklı olarak botunuzun diğer botların davranışlarından yararlanmasına izin verilir. Bir meta oyunu teşvik etmek istiyorum.
- Botlar olmayabilir diğer botlar taklit. (Yani, zihin okuma yok.)
- Botlar olmayabilir oyun ve fizik kodu tarafından kullanılan herhangi bir değişken olarak ayarlayın. (Yani, hile yapmak yok.)
Bot Uygulama Detayları
Botunuzu, dosya adıyla birlikte otomatik olarak eklenen kendi JavaScript dosyasında depolayacağım bot_<name>.js
. Bu yüzden, bununla ya da JavaScript'te bir işlevin isimlendirilmesine müdahale edecek boşluk veya karakter koymayın. Çünkü şu fonksiyonları tanımlamanız gerekir: <name>_setup(team)
ve <name>_getActions(gameInfo, botVars)
. Sayfanın ilerleyen kısımlarında , kodunuzu test etmek için düzenleyebileceğiniz kullanıcıbot için bir yazı var .
<name>_setup(team)
Bu işlev, sürdürmek istediğiniz değişkenleri tanımlamanız içindir. team
ya "red"
da olacak "blue"
. Bu işlev bir nesne döndürmelidir. Bunun gibi değişkenleri tanımlayın:
var vars = {};
vars['example'] = "example";
return vars;
Bu vars
nesne diğer işleve geçer:
<name>_getActions(gameInfo, botVars)
botVars
tarafından döndürülen nesne <name>_setup(team)
. gameInfo
aşağıdaki değişkenleri içeren bir nesnedir:
redScore
blueScore
timeLeft
fieldWidth
fieldHeight
sun_x
sun_y
sun_r //sun's radius
gravityStrength //acceleration in pixels/frame^2 at 1 pixel away from the sun's center
engineThrust //acceleration in pixels/frame^2
speedLimit //maximum speed under engine power
maxSpeed //maximum speed from gravity boosts
red_x
red_y
red_rot //rotation in degrees
red_xv //x velocity
red_yv //y velocity
red_shape //one of "full ship", "left wing", "right wing", "nose only"
red_missileStock //the number of missiles red has left
red_inHyperspace //true if red is in hyperspace
red_exploded //until red explodes, it is still solid and hazardous
red_alive
// likewise for blue //
numMissiles
missiles //this is a list of objects, each with the following variables
x
y
xv
yv
Botunuz bunlara tam erişime sahip. Ben oldukça emin onlara yazıp değil orijinal değişkenleri etkiler, ancak yine de yapmayın ki. Bir rotasyonlar üzerinde not: gemiler işaret gemiye uyum sağlamak istiyoruz aşağıya + y yönünde, yani her şey 90 derece ofset gerekmektedir. Ayrıca, pozitif dönüş saat yönündedir.
Bu işlev botunuzun eylemlerini temsil eden bir dizge listesi döndürmelidir. Örneğin, ["turn right","thrust"]
. Bununla ilgili daha fazla ayrıntı Kurallar bölümündedir.
ek detaylar
Ayrıca aşağıdakilerden de yararlanabilirsiniz:
LineIntersection(L1, L2)
L1 ve L2, iki elemanlı dizilerin iki elemanlı dizileridir. Bu L1 := [[x1,y1],[x2,y2]]
ve L2 := [[u1,v1],[u2,v2]]
. Bu fonksiyon iki satır kesişim hesaplar ve bu döndürür: [[x,y], [a,b]]
. [x,y]
kesişme noktasının koordinatlarıdır ve kesişme noktasının [a,b]
her bir çizgisi boyunca ne kadar uzak olduğunu ifade eden bir oran çiftidir. Olduğu gibi, a = 0.25
kesişme noktası yolu dörtte dan anlamına gelir [x1,y1]
için [x2,y2]
ve aynı şekilde için b
. Kesişme yoksa, boş bir dizi döndürülür.
window["shipShapes"]
var shipShapes = {
'full ship': [[-8,16],[0,-8],[8,16]],
'left wing': [[-8,16],[0,-8],[4,4],[0,8],[0,16]],
'right wing':[[-4,4],[0,-8],[8,16],[0,16],[0,8]],
'nose only': [[-4,4],[0,-8],[4,4],[0,8]]
};
Bunlar gemilerin çokgenlerinin koordinatları. Geçerli koordinatları almayı kolaylaştırmak için, ayrıca ...
getShipCoords(<color>)
getShipCoords("red")
Red'in gemisinin köşelerinin mevcut koordinatlarını ve aynı şekilde ve Mavi'yi döndürür getShipCoords("blue")
. Bu koordinatlar şöyle bir listede şunlardır: [[x1,y1],[x2,y2],[x3,y3],...]
. Çokgenler örtük olarak kapalıdır, bu nedenle ilk ve son koordinat çiftleri arasında bir çizgi vardır.
Oyun / web sitesi tarafından kullanılan diğer değişkenlere veya işlevlere erişemez veya bunları değiştiremezsiniz. Ve kesinlikle işlevlerinizi aynı şekilde adlandırmayın. Bunun bir sorun olacağını öngörmüyorum, ancak botunuz oyun kodunu kırarsa, bu bir olasılık. Hiçbir kayıt veya istisna yakalama yoktur.
Kazanan
- Her bot eşleştirmesi, her iki şekilde de en az 10 defa oynanacaktır. (Yani, en az 20 oyun toplam.)
- Genel olarak en yüksek kazanç / kayıp oranlarına sahip olmayı hedefleyin . Eğer botunuz diğer bir bota karşı çok iyi performans gösteriyorsa, ancak diğer üçüne karşı kaybederse, bu iki kişiye karşı kazanmak ve iki kişiye karşı kaybetmek kadar iyi değildir (genel bir kural olarak).
- Her bot için, oranlar (+ + 1) / (+ + 1 kazanç), daha sonra bu oranların ortalama ve standart sapmaları hesaplanacaktır. Daha yüksek bir ortalama önceliğe sahip olacak ve araçların birbirinin 1 birimi içinde olması durumunda, düşük varyans önceliğe sahip olacaktır.
- Puanlama, bugünden itibaren bir hafta içinde veya yeni başvuru yapılmadan üç gün sonra başlayacaktır. Bu yüzden herhangi bir bot çiftini tekrarlamak zorunda kalmam.
Her şeyden önce, eğlenin!
Büyük Afiş (2016-01-08 05:15):
# Name Mean StdDev
1. Helios 13.625 6.852
2. EdgeCase 8.335 8.155
3. OpponentDodger 8.415 8.186
4. OrbitBot 5.110 6.294
5. SunAvoider 5.276 6.772
6. DangitBobby 3.320 4.423
7. SprayAndPray 3.118 4.642
8. Engineer 3.903 6.315
9. RighthandedSpasms 1.805 2.477
10. AttackAndComeBack 2.521 2.921
11. PanicAttack 2.622 3.102
12. FullSpeedAhead 2.058 3.295
13. UhhIDKWhatToCallThisBot 2.555 3.406
14. MissilesPlusScore 0.159 0.228
15. Hyper 0.236 0.332
16. RandUmmm 0.988 1.329
17. Kamikaze 0.781 1.793
Not: Bu, daha fazla oyun çalıştırdıkça değişebilir. Artı, 9-13 arasındaki sıralamada beni rahatsız ediyor, bu yüzden nasıl derecelendirilmeleri gerektiği konusundaki sezgisini daha iyi eşleştirmek için puanlama yöntemini ince ayarlayabilirim.
(Ortalamalar ve standart sapmalar üç ondalık basamağa yuvarlanmıştır. Ayrıca, vurgulanması Hyper
zor olan da olmalıdır HYPER
.: P)
LineIntersection
Kesişmeyen bölümlere yapılan çağrıların boş bir dizi döndürdüğünü belirtmelisiniz .