玩Connect 4!


20

编写一个程序玩Connect 4游戏。您将获得棋盘的状态作为输入,并且必须决定将棋子放置在哪一列中,以连续获取4个(水平,垂直或对角线)或阻止对手进行相同的操作。

棋盘是一个6x7的阵列,其中每个单元格可以为空(''),包含您的棋子('X')或对手的棋子('O')。示例板:

O      
XX    X
XOX  OO
XOO OXO
OXXOXXO
XOXOXOX

您可能希望在第3列(第0-6列,从左开始编号)中对角线获胜。所以你输出:

3

您的代码必须输出列号,并且必须满足以下条件:

  1. 您不能在已经有6个乐段的列中演奏。
  2. 如果至少有一个获胜的举动,则必须打其中之一。
  3. 如果您可以阻止对手继续前进,则必须这样做。

请注意,最佳比赛不是必需的,仅当您获得即时胜利或阻止对手的即时胜利。如果您的对手有不止一种获胜方式,则无需阻止他们。

在标准输入上为您提供了木板,并且必须在标准输出上打印要在其中播放的列号。保证该板的格式正确(无孔,至少可以移动),并且任一方都没有赢球。

最短的代码胜出。

例子1

      X
      O
      X
      O
 OOO  X
 XXX  O

您必须打0列或4列才能获胜。

例子2

      X
X     X
O     O
XOX  XO
XXO XOX
XXO XXO

您必须打第3列才能阻止对手的即时获胜。

例子3

X      
XO     
OX    O
XO   XX
XXO OOO
OOO XXO

您无法获胜或阻止对手获胜,因此您可以打任何1-6列(0满)。

例子4

X      
O      
X      
OOO    
XOX    
OXOX   

您无法在第3列中进行游戏,因为它会让您的对手立即获胜。您可以在1-2或4-6列中玩。

Answers:


9

C,234 286 256个字符

已修复,通过在尝试每一个举动之后检查对手的获胜举动来正确解决问题。

此代码对输入文件格式非常敏感-每行必须包含7个字符+换行符。
该板被视为8x8矩阵,而不是7x6。第8列包含换行符,另外2行包含零,因此它们不会干扰解决方案。它们实际上有帮助-当从最右边的列向右移动时,您命中了换行列,这是边界检查。

w检查一个位置以赢得或阻止的机会。q应该是要检查的单元格。它使用递归遍历4个方向(从9,8,7开始,然后多次1)。
C检查从q方向d前后来回的相同字符序列。它返回两个序列的总和(不计算起始位置),因此,如果返回3,则一行为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);
}

5

Python 2.x- 594591576557523459459433433字节

这是我到目前为止所取得的最好成绩。我想很难击败C。我不得不说。

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]

if行(第7行)具有一个制表符的缩进。SE不喜欢标签。


2
我花了太多时间来完善这些。另外,458字节版本无法正常运行,例如#4。拿走25个字节就可以了。魔法。
seequ 2014年
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.