Meta Tic Tac Toe oyunu oynayalım!
Bu, Meta tic-tac-toe turnuvasının bir kralı turnuvasıdır. Meta Tic Tac Toe kuralları şunlardır:
Tic Tac Toe'nun normal kuralları geçerlidir.
Bir ana tahta yapmak için düzenlenmiş dokuz tahta vardır. Bunun gibi:
0|1|2 || 0|1|2 || 0|1|2 ----- || ----- || ----- 3|4|5 || 3|4|5 || 3|4|5 ----- || ----- || ----- 6|7|8 || 6|7|8 || 6|7|8 ======================== 0|1|2 || 0|1|2 || 0|1|2 ----- || ----- || ----- 3|4|5 || 3|4|5 || 3|4|5 ----- || ----- || ----- 6|7|8 || 6|7|8 || 6|7|8 ======================== 0|1|2 || 0|1|2 || 0|1|2 ----- || ----- || ----- 3|4|5 || 3|4|5 || 3|4|5 ----- || ----- || ----- 6|7|8 || 6|7|8 || 6|7|8
tahta 0 üst sol tahtayı gösterir, tahta 1 üst orta tahtayı gösterir ... bunun gibi
0|1|2 ----- 3|4|5 ----- 6|7|8
Tahta 3, kiremit 4 dersem, bu, orta soldaki tahtanın merkez döşemesi anlamına gelir.
Yalnızca küçük panolardan birinde hareket etmenize izin verilir.
Daha küçük tahtalardan birini kazanırsanız, o tahtanın tamamı döşemeniz olarak sayılır.
Eğer herhangi bir bot kazanmadan önce panolardan biri doldurulursa, nobodies fayansı olarak sayılır.
Her kim kazanırsa asıl tahta kazanır!
Ancak, önemli bir bükülme var. Diyelim ben dönüşte araçlarının yapabilirsiniz O gemide 7, karo 2. gitmek demek sadece Sonra dönüşte Şimdi çini 5., ben yapabilirsiniz, en gemide 2'de gitmek diyelim kurulu 2. gitmek sadece tahta 5'de gidin. Diyelim ki tahta 1 dolu. (Artık leke kalmadı ya da birimiz daha önce tahta 1'i kazandı.) Şimdi tahta 5, karo 1'e gidersem, istediğiniz tahtalardan birine girebilirsiniz.
Bu kurallar şöyle kabul edilebilir:
- Bir önceki oyuncunun oynadığı pozisyona karşılık gelen tahtada oynamalısınız.
- Eğer X tahta 2'de oynarsa, fayans 5; O tahta 5 oynamak gerekir
- Hedef tahtası doluysa (bir beraberlik) veya zaten bir galibi varsa, bir sonraki hareket kısıtlanamaz.
- Bir kazanan bir kurul olabilir değil hatta kısıtsız hareket içine oynanacak.
Bu biraz kafa karıştırıcıysa, çevrimiçi olarak deneyebilirsiniz burada. ("ilk döşeme kazancı" ndan "arka arkaya 3 döşeme" arasında geçiş yaptığınızdan emin olun)
Şimdi burada meydan okuma kuralları.
Bu oyunu oynayan bir bot yazmalısınız.
Bot 1, X'ler ve önce başlıyor. Bu komut satırı argümanları ile çağrılacaktır (parantez içindeki maddeler olmadan):
X (whose turn) --------- (board 0) --------- (board 1) --------- (board 2) --------- (board 3) --------- (board 4) --------- (board 5) --------- (board 6) --------- (board 7) --------- (board 8) --------- (master board) xx (last move)
İlk karakter botun kim olduğunu gösterir. Bu durumda, bot 1 X olarak oynar. Sonraki 9 satır 9 panoya aittir. 11. satır ana panoya atıfta bulunur. "Xx" son harekettir. Şimdi, bot1, 0 ile 8 arasında iki sayı yazdırmalıdır. Sayı 1, botunuzun hareket ettiği karttır ve 2 numaralı kartta belirtilen karttur. Kontrolör bu hareketi takip edecektir. Diyelim ki bot 1 38 yazdırıyor. Şimdi tahta şöyle görünecek:
| | || | | || | | ----- || ----- || ----- | | || | | || | | ----- || ----- || ----- | | || | | || | | ========================== | | || | | || | | ----- || ----- || ----- | | || | | || | | ----- || ----- || ----- | |X || | | || | | ========================== | | || | | || | | ----- || ----- || ----- | | || | | || | | ----- || ----- || ----- | | || | | || | |
ve bot2 bu argümanlarla çağrılacak:
O --------- --------- --------- --------X --------- --------- --------- --------- --------- --------- 38
Şimdi bot 2, pano 8'de hareket etmelidir (bot1, kiremit 3'e x yerleştirilir). Diyelim ki bot2 84 yazdırıyor. Şimdi tahta böyle görünüyor.
| | || | | || | | ----- || ----- || ----- | | || | | || | | ----- || ----- || ----- | | || | | || | | ========================== | | || | | || | | ----- || ----- || ----- | | || | | || | | ----- || ----- || ----- | |X || | | || | | ========================== | | || | | || | | ----- || ----- || ----- | | || | | || |O| ----- || ----- || ----- | | || | | || | |
şimdi bot1 bu argümanlarla çağrılacak:
X --------- --------- --------- --------X --------- --------- --------- --------- ----0---- --------- 84
Şimdi bot1 tahta 4'e taşınmalı. Ancak bot1 yaramaz küçük bir bottur ve tahta 3'e girmeye karar verir. Yönetim Kurulu hiç değişmiyor. Ana bot bunu takip ediyor. Şimdi bot2 bu argümanlarla çağrılacak:
O --------- --------- --------- --------X --------- --------- --------- --------- ----0---- --------- xx
Şimdi bot 2 istediği yere gidebilir (tabii ki 38 ve 84 hariç). Bu, birisi ana kartlardan 3 tanesini kazanana kadar devam eder. Ardından, bot2'nin X olduğu ve ilk başlayacağı ikinci bir eşleşme var.
Bu, her bir bot diğer her botu oynayana kadar tekrar eder.
puanlama
Puanlama böyle çalışır:
Her maçın galibi 100 + number of open spots
puan alır . Böylece botunuz çabuk kazanırsa daha değerli olur. Botunuz geçersiz bir hamle yaptığında, 1 puan kaybeder. 250 turdan sonra, hiçbir bot kazanmazsa, her bot 10 puan kaybederse, bir sonraki tura geçiyoruz.
Her şey içeren bir dizine konur
Kontrolör botu. Bu yazdığım bir C ++ programı. Kontrolör bot kaynak koduna buradan bakabilirsiniz . Kontrol cihazında doğru olmayan bir şey görürseniz lütfen bana bildirin.
instructions.txt
Bu dosya adlı bir metin dosyası şuna benzer:[Total number of bots that are competing] [bot1Name] [bot1 command to run] [bot2Name] [bot2 command to run] ...
Her bot için bir klasör. Bu klasör programınızı tutar (ister bir komut dosyası ister ikili dosya) ve
data.txt
botunuzun istediği şeyi okuyabileceği ve yazabileceği adlı bir TEK metin dosyası .
Teknik özellikler ve kural açıklamaları
Klasörünün içinde olmayan herhangi bir yerden okuma / yazma girişiminde bulunan botlar oyundan atılır.
Programınız Yosemite çalıştıran bir macbook üzerinde çalışabilmelidir. Şu anda desteklenen diller python (2.7.9 ve 3.4.2), C / C ++, objektif-C, perl, yakut, bash, PHP, Java, C #, javascript ve Haskell. Çok daha fazlası var, ama bunlar şu an düşünebileceklerim. Zaman geçtikçe daha fazlasını ekleyeceğim. Belirli bir dilde rekabet etmek istiyorsanız, bana mesaj gönderin veya yorum yazın; mümkünse listeye eklerim.
Bir tahta kazanılırsa, ancak hala boşluk varsa, hala açık noktalardan birine giremezsiniz.
Gönderinizin çalışma dizini, denetleyiciyi içeren dizin ve botunuzu içeren dizin DEĞİLDİR.
Derlemek (varsa) ve botunuzu çalıştırmak için lütfen doğru komut ile birlikte kontrol cihazınızın bot kodunu gönderin. Bunun çoğu, linux terminaline oldukça benzeyen OS X terminalinden yapılacak.
Botlar bir saniyenin altında tamamlanmalıdır. Ne yazık ki, kontrolör botuna bir zamanlayıcı eklemek için yeterince yetkin değilim. Ancak botları manuel olarak zamanlayacağım.
Sonuçlar!
Ben haklıydım. MasterBoard'ın dolu olup olmadığını kontrol etmek için bot botunu kontrol etmeyi unuttum. MasterBoard doluysa, HER hamle geçersizdir, ancak botları çağırmaya devam eder, bu yüzden muhtemelen bu kadar çok geçersiz hamle olmuştu. Şimdi tamir ettim. İşte tüm botların en güncel versiyonunun resmi sonuçları.
Bot 1, goodRandBot, has 1 wins and made 0 illegal moves, for a total of 133 points.
Bot 2, naiveBot, has 3 wins and made 48 illegal moves, for a total of 361 points.
Bot 3, depthBot, has 5 wins and made 0 illegal moves, for a total of 664 points.
Bot 4, middleBot, has 1 wins and made 20 illegal moves, for a total of 114 points.
With 4 bots, This program took 477.471 seconds to finish.
Derinlik Bot saltanatı şampiyonu! En azından şimdilik.
XXX000---
? ya da 'O'nu kazanmasına rağmen O hiç kimse anlamadı' mı?