Jogue o Connect 4!

20

Escreva um programa para jogar o jogo Connect 4 . Você recebe o estado do tabuleiro como entrada e deve decidir em qual coluna colocar sua peça para obter 4 seguidas (horizontal, vertical ou diagonal) ou impedir que seu oponente faça o mesmo.

O tabuleiro é uma matriz de 6x7, onde cada célula pode estar vazia (''), conter sua peça ('X') ou a peça do seu oponente ('O'). Um quadro de exemplo:

O      
XX    X
XOX  OO
XOO OXO
OXXOXXO
XOXOXOX

Você gostaria de jogar na coluna 3 (as colunas são de 0 a 6, numeradas da esquerda) para a vitória na diagonal. Então você produz:

3

Seu código deve gerar um número de coluna e deve atender aos seguintes critérios:

  1. Você não pode jogar em uma coluna que já possui 6 peças.
  2. Se houver pelo menos uma jogada vencedora, você deve jogar uma delas.
  3. Se você pode impedir que seu oponente vença na próxima jogada, você deve fazê-lo.

Observe que o jogo ideal não é necessário, apenas que você ganha imediatamente ou impede a vitória imediata do seu oponente. Se seu oponente tiver mais de uma maneira de vencer, você não precisará bloquear nenhuma delas.

Você recebe a placa na entrada padrão e deve imprimir um número de coluna na qual deseja reproduzir na saída padrão. É garantido que o conselho seja bem formado (sem buracos, pelo menos um movimento possível) e que ainda não tenha ganho para nenhum dos jogadores.

O menor código vence.

Exemplo 1

      X
      O
      X
      O
 OOO  X
 XXX  O

Você deve jogar a coluna 0 ou 4 para a vitória.

Exemplo 2

      X
X     X
O     O
XOX  XO
XXO XOX
XXO XXO

Você deve jogar a coluna 3 para bloquear a vitória imediata do seu oponente.

Exemplo 3

X      
XO     
OX    O
XO   XX
XXO OOO
OOO XXO

Você não pode vencer ou impedir que seu oponente vença, portanto, você pode jogar qualquer coluna de 1 a 6 (0 está cheio).

Exemplo 4

X      
O      
X      
OOO    
XOX    
OXOX   

Você não pode jogar na coluna 3, pois isso permite que seu oponente ganhe imediatamente. Você pode jogar nas colunas 1-2 ou 4-6.

Keith Randall
fonte

Respostas:

9

C, 234 286 256 caracteres

Corrigido para resolver o problema corretamente, verificando se os movimentos vencedores do oponente se seguiram a cada movimento tentado.

Esse código é muito sensível ao formato do arquivo de entrada - cada linha deve conter 7 caracteres + nova linha.
A placa é tratada como uma matriz 8x8, em vez de 7x6. A oitava coluna contém as novas linhas e as duas linhas extras contêm zeros, para que não interfiram na solução. Eles realmente ajudam - Ao passar para a direita da coluna mais à direita, você acessa a coluna de nova linha, que serve como verificação de limite.

wverifica uma posição em busca de uma oportunidade de ganhar ou bloquear. qdeve ser a célula para verificar. Ele usa a reursão para percorrer 4 direções (começa com 9,8,7 e depois várias vezes 1).
Cverifica se há uma sequência de caracteres idênticos começando qna direção d, tanto para frente quanto para trás. Ele retorna a soma de ambas as seqüências (sem contar a posição inicial); portanto, se retornar 3, haverá uma linha de 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
fonte
5

Python 2.x - 594 591 576 557 523 459 458 433 bytes

Este é o melhor que consegui até agora. Eu acho que é difícil vencer C. Desafio incrível, eu tenho que dizer.

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]

A linha if (linha 7) tem recuo de uma guia. SE não gosta de guias.

seequ
fonte
2
Passo muito tempo refinando-os. Além disso, a versão de 458 bytes não funcionou corretamente, por exemplo, no 4. Tire 25 bytes de distância e ele faz. Magia.
seequ