Connect 4 oynayın!


20

Connect 4 oyununu oynamak için bir program yazın . Tahta durumunu girdi olarak alırsınız ve ya arka arkaya 4 (yatay, dikey veya çapraz) almak veya rakibinizin aynı şeyi yapmasını engellemek için hangi sütunu yerleştireceğinize karar vermelisiniz.

Tahta, her hücrenin boş ('') olabileceği, parçanızı ('X') veya rakibinizin parçasını ('O') içerebileceği 6x7 dizisidir. Bir örnek tahta:

O      
XX    X
XOX  OO
XOO OXO
OXXOXXO
XOXOXOX

Çapraz kazanç için 3. sütunda (sütunlar soldan numaralandırılmış 0-6) oynamak istersiniz. Böylece çıktı:

3

Kodunuzun bir sütun numarası vermesi ve aşağıdaki ölçütleri karşılaması gerekir:

  1. İçinde zaten 6 adet olan bir sütunda oynayamazsınız.
  2. En az bir kazanan hamle varsa, bunlardan birini oynamalısınız.
  3. Rakibinizin bir sonraki hamlesinde kazanmasını engelleyebiliyorsanız, bunu yapmanız gerekir.

Optimal oyunun gerekli olmadığını, sadece anında kazanmanızı veya rakibinizin anında kazanmasını önlemenizi unutmayın. Rakibinizin birden fazla kazanma yolu varsa, hiçbirini engellemenize gerek yoktur.

Standart girişte kart verilir ve standart çıkışta oynamak istediğiniz bir sütun numarası yazdırmanız gerekir. Kartın iyi biçimlendirilmesi (delik yok, en az bir hamle) ve her iki oyuncu için zaten bir galibiyetin olmaması garanti edilir.

En kısa kod kazanır.

örnek 1

      X
      O
      X
      O
 OOO  X
 XXX  O

Kazanmak için 0 veya 4 numaralı sütunlardan birini oynamalısınız.

ÖRNEK 2

      X
X     X
O     O
XOX  XO
XXO XOX
XXO XXO

Rakibinizin hemen kazanmasını engellemek için 3. sütunu oynamalısınız.

ÖRNEK 3

X      
XO     
OX    O
XO   XX
XXO OOO
OOO XXO

Rakibinizi kazanamaz veya kazanmasını durduramazsınız, bu nedenle 1-6. Sütunları (0 dolu) oynayabilirsiniz.

Örnek 4

X      
O      
X      
OOO    
XOX    
OXOX   

3. sütunda oynayamazsınız, çünkü rakibinizin hemen kazanmasına izin verir. 1-2 veya 4-6. Sütunlarda oynayabilirsiniz.

Yanıtlar:


9

Cı, 234 286 , 256 karakter

Denenen her hamleyi takiben rakip kazanan hamleleri kontrol ederek sorunu doğru bir şekilde çözmek için düzeltildi.

Bu kod, giriş dosyası biçimine çok duyarlıdır - her satır 7 karakter + yeni satır içermelidir.
Tahta 7x6 yerine 8x8 matris olarak kabul edilir. 8. sütun yeni satırları ve 2 ekstra satır sıfırları içerir, bu nedenle çözümü engellemezler. Aslında yardım ediyorlar - En sağdaki sütundan hareket ederken, bir sınır kontrolü görevi gören yeni satır sütununa çarpıyorsunuz.

wbir pozisyonu kazanma veya engelleme fırsatı olup olmadığını kontrol eder. qkontrol edilecek hücre olmalı. 4 yönde döngü için özyineleme kullanır (9,8,7 ile başlar, sonra birkaç kez 1). hem ileri hem de ileri yönde
Cbaşlayarak aynı karakter dizisini kontrol eder . Her iki dizinin toplamını döndürür (başlangıç ​​konumunu saymaz), bu nedenle 3 döndürürse, 4'lük bir satır vardır.qd

char B[99],q;
C(i,d){
    return B[d*i+++q]-B[q]?d>0?C(1,-d):0:1+C(i,d);
}
w(x){
    return x&&C(1,x>6?x:1)>2|w(x-1);
}
t(l,c,r,v){
    for(;c--;)B[q=c]&32&B[c+8]-32?r=w(9,B[c]=l)?v=c:v||r*t(79,l,0,1)?r:c,B[c]=32:0;
    return r;
}
main(){
    putchar(48+t(88,16+read(0,B+16,48),0,0)%8);
}

5

Python 2.x - 5945915575657 523459458433 bayt

Bu şimdiye kadar elde ettiğim en iyisi. Sanırım C'yi yenmek zor. Müthiş bir meydan okuma, söylemeliyim.

r=range
f=[]
exec'f+=list(raw_input());'*6
def n(p):
 o,b,a,k=[],1,'O',lambda q:any([o[i:i+4]==list(q)*4for o in(f[x-x%7:],f[x%7::7])for i in r(3)]+[all(q==f[7*(y+u*i)+z+i]for i in r(4))for u,z,v,c in((1,0,3,4),(-1,3,6,3))for y in r(z,v)for z in r(c)])
 for x in r(42):
    if x>34<a>f[x]or x<35and f[x+7]>'0'>f[x]:f[x]=p;z=k(p)*b;o=z*[x]+o+[x]*(a==p or n(a)[1]);b-=z;f[x]=' '
 return o[0]%7,b
a,b,c,d=n('X')+n('O')
print(a,(c,a)[d])[b]

İf satırı (satır 7) bir sekmenin girintisine sahiptir. SE sekmeleri sevmez.


2
Bunları düzeltmek için çok fazla zaman harcıyorum. Ayrıca, 458 bayt sürümü, örneğin # 4 gibi düzgün çalışmadı. 25 bayt alıp götürür. Sihirli.
seequ
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.