Spielen Sie Connect 4!

20

Schreiben Sie ein Programm, um Connect 4 zu spielen . Sie erhalten den Status der Tafel als Eingabe und müssen entscheiden, in welche Spalte Sie Ihre Figur legen möchten, um entweder 4 in einer Reihe (horizontal, vertikal oder diagonal) zu erhalten oder Ihren Gegner daran zu hindern, dasselbe zu tun.

Das Board ist ein 6x7-Array, in dem jede Zelle leer sein kann (''), dein Teil ('X') oder das Teil deines Gegners ('O') enthalten kann. Eine Beispieltafel:

O      
XX    X
XOX  OO
XOO OXO
OXXOXXO
XOXOXOX

Sie möchten in Spalte 3 (Spalten 0-6, von links nummeriert) um den diagonalen Gewinn spielen. Sie geben also Folgendes aus:

3

Ihr Code muss eine Spaltennummer ausgeben und die folgenden Kriterien erfüllen:

  1. Sie können nicht in einer Spalte spielen, die bereits 6 Teile enthält.
  2. Wenn es mindestens einen Gewinnzug gibt, müssen Sie einen davon spielen.
  3. Wenn Sie verhindern können, dass Ihr Gegner bei seinem nächsten Zug gewinnt, müssen Sie dies tun.

Beachten Sie, dass ein optimales Spiel nicht erforderlich ist, nur, dass Sie sofort gewinnen oder den sofortigen Gewinn Ihres Gegners verhindern. Wenn Ihr Gegner mehr als eine Möglichkeit zum Gewinnen hat, müssen Sie keine davon blockieren.

Sie erhalten das Board als Standardeingabe und müssen eine Spaltennummer drucken, in der Sie auf der Standardausgabe spielen möchten. Das Board ist garantiert gut geformt (keine Löcher, mindestens ein möglicher Zug) und hat für keinen Spieler bereits einen Gewinn.

Kürzester Code gewinnt.

Beispiel 1

      X
      O
      X
      O
 OOO  X
 XXX  O

Sie müssen entweder Spalte 0 oder 4 spielen, um zu gewinnen.

Beispiel 2

      X
X     X
O     O
XOX  XO
XXO XOX
XXO XXO

Sie müssen Spalte 3 spielen, um den sofortigen Gewinn Ihres Gegners zu blockieren.

Beispiel 3

X      
XO     
OX    O
XO   XX
XXO OOO
OOO XXO

Sie können Ihren Gegner nicht am Gewinnen hindern oder gewinnen, also können Sie jede Spalte 1-6 spielen (0 ist voll).

Beispiel 4

X      
O      
X      
OOO    
XOX    
OXOX   

Sie können nicht in Spalte 3 spielen, da dies Ihren Gegner sofort gewinnen lässt. Sie können in den Spalten 1-2 oder 4-6 spielen.

Keith Randall
quelle

Antworten:

9

C 234 286 256 Zeichen

Das Problem wurde behoben, indem nach jedem versuchten Zug geprüft wurde, ob ein Gegner gewinnt.

Dieser Code reagiert sehr empfindlich auf das Eingabedateiformat. Jede Zeile muss aus 7 Zeichen und einer neuen Zeile bestehen.
Das Board wird als 8x8-Matrix anstatt als 7x6-Matrix behandelt. Die achte Spalte enthält die Zeilenumbrüche, und die zwei zusätzlichen Zeilen enthalten Nullen, damit sie die Lösung nicht beeinträchtigen. Sie helfen tatsächlich - Wenn Sie von der rechten Spalte ganz nach rechts gehen, drücken Sie die Newline-Spalte, die als Grenzüberprüfung dient.

wÜberprüft eine Position auf eine Chance zu gewinnen oder zu blocken. qsollte die Zelle sein, um zu überprüfen. Es verwendet eine Rekursion, um 4 Richtungen zu durchlaufen (beginnt mit 9,8,7, dann mehrmals mit 1).
CÜberprüft, ob eine Abfolge identischer Zeichen vorliegt, beginnend qin der Richtung d, sowohl vorwärts als auch rückwärts. Es gibt die Summe beider Sequenzen zurück (ohne die Startposition). Wenn also 3 zurückgegeben wird, gibt es eine Reihe von 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
quelle
5

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

Dies ist das Beste, was ich bisher erreicht habe. Ich denke, es ist schwer, C zu schlagen. Eine großartige Herausforderung, muss ich sagen.

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]

Die if-Zeile (Zeile 7) hat einen Tabulatoreinzug. SE mag keine Tabs.

seequ
quelle
2
Ich verbringe viel zu viel Zeit damit, diese zu verfeinern. Außerdem funktionierte die 458-Byte-Version in Beispiel 4 nicht richtig. Nehmen Sie 25 Bytes weg und es tut. Zauber.
Siehe auch