Zagraj w Connect 4!

20

Napisz program do gry w Connect 4 . Podajesz stan planszy jako dane wejściowe i musisz zdecydować, w której kolumnie umieścić swój pionek, aby uzyskać 4 z rzędu (poziomo, pionowo lub po przekątnej) lub zablokować przeciwnikowi wykonanie tego samego.

Plansza to tablica 6x7, w której każda komórka może być pusta („”), zawierać twój pionek („X”) lub pionek przeciwnika („O”). Przykładowa tablica:

O      
XX    X
XOX  OO
XOO OXO
OXXOXXO
XOXOXOX

Chcesz zagrać w kolumnie 3 (kolumny to 0-6, ponumerowane od lewej), aby wygrać po przekątnej. Więc wyprowadzasz:

3

Twój kod musi wyświetlać numer kolumny i musi spełniać następujące kryteria:

  1. Nie możesz grać w kolumnie, która ma już 6 elementów.
  2. Jeśli jest co najmniej jeden wygrywający ruch, musisz zagrać w jeden z nich.
  3. Jeśli możesz uniemożliwić przeciwnikowi wygraną w następnym ruchu, musisz to zrobić.

Pamiętaj, że optymalna gra nie jest konieczna, tylko że odniosłeś natychmiastową wygraną lub zapobiegłeś natychmiastowej wygranej przeciwnika. Jeśli twój przeciwnik ma więcej niż jeden sposób na wygraną, nie musisz blokować żadnego z nich.

Otrzymujesz płytkę na standardowym wejściu i musisz wydrukować numer kolumny, w której chcesz grać na standardowym wyjściu. Plansza gwarantuje, że jest dobrze uformowana (bez dziur, co najmniej jeden możliwy ruch) i nie ma już wygranej dla żadnego z graczy.

Najkrótszy kod wygrywa.

Przykład 1

      X
      O
      X
      O
 OOO  X
 XXX  O

Aby wygrać, musisz zagrać w kolumnę 0 lub 4.

Przykład 2

      X
X     X
O     O
XOX  XO
XXO XOX
XXO XXO

Musisz zagrać w kolumnę 3, aby zablokować natychmiastową wygraną przeciwnika.

Przykład 3

X      
XO     
OX    O
XO   XX
XXO OOO
OOO XXO

Nie możesz wygrać ani zatrzymać zwycięstwa przeciwnika, możesz więc zagrać dowolną kolumnę 1-6 (0 jest pełna).

Przykład 4

X      
O      
X      
OOO    
XOX    
OXOX   

Nie możesz grać w kolumnie 3, ponieważ pozwala to przeciwnikowi od razu wygrać. Możesz grać w kolumnach 1-2 lub 4-6.

Keith Randall
źródło

Odpowiedzi:

9

C, 234 286 256 znaków

Naprawiono prawidłowe rozwiązywanie problemu poprzez sprawdzanie zwycięskich ruchów przeciwnika po każdym podejściu.

Ten kod jest bardzo wrażliwy na format pliku wejściowego - każda linia musi zawierać 7 znaków + nowy wiersz.
Płyta jest traktowana jako matryca 8x8, a nie 7x6. 8. kolumna zawiera znaki nowego wiersza, a 2 dodatkowe wiersze zawierają zera, więc nie przeszkadzają w rozwiązaniu. W rzeczywistości pomagają - przechodząc od prawej kolumny do prawej, trafiasz do kolumny nowej linii, która służy jako kontrola granicy.

wsprawdza jedną pozycję pod kątem możliwości wygrania lub zablokowania. qpowinna być komórką do sprawdzenia. Używa rekurencji, aby przejść przez 4 kierunki (zaczyna się od 9,8,7, a następnie kilka razy 1).
Csprawdza sekwencję identycznych znaków, zaczynając od qkierunku d, w przód iw tył. Zwraca sumę obu sekwencji (nie licząc pozycji początkowej), więc jeśli zwróci 3, to będzie rząd 4.

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);
}
ugoren
źródło
5

Python 2.x - 594 591 576 557 523 459 458 433 bajtów

To najlepsze, co do tej pory osiągnąłem. Myślę, że ciężko jest pokonać C. Niesamowite wyzwanie, muszę powiedzieć.

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]

Linia if (linia 7) ma wcięcie jednej zakładki. SE nie lubi kart.

patrz
źródło
2
Spędzam zdecydowanie za dużo czasu na ich udoskonalaniu. Ponadto wersja 458 bajtów nie działała poprawnie na przykład # 4. Zabierz 25 bajtów i to zrobi. Magia.
patrz