Chơi kết nối 4!


20

Viết chương trình chơi trò chơi Connect 4 . Bạn được đưa ra trạng thái của bảng làm đầu vào và bạn phải quyết định cột nào sẽ đặt mảnh của bạn để có được 4 liên tiếp (theo chiều ngang, chiều dọc hoặc đường chéo) hoặc chặn đối thủ của bạn làm điều tương tự.

Bảng là một mảng 6x7, trong đó mỗi ô có thể trống (''), chứa mảnh của bạn ('X') hoặc mảnh của đối thủ ('O'). Một bảng ví dụ:

O      
XX    X
XOX  OO
XOO OXO
OXXOXXO
XOXOXOX

Bạn sẽ muốn chơi trong cột 3 (các cột là 0-6, được đánh số từ bên trái) để giành chiến thắng theo đường chéo. Vì vậy, bạn xuất:

3

Mã của bạn phải xuất ra một số cột và nó phải đáp ứng các tiêu chí sau:

  1. Bạn không thể chơi trong một cột đã có 6 phần trong đó.
  2. Nếu có ít nhất một nước cờ chiến thắng, bạn phải chơi một trong số chúng.
  3. Nếu bạn có thể ngăn đối thủ của mình giành chiến thắng trong lần di chuyển tiếp theo của anh ta, bạn phải làm như vậy.

Lưu ý rằng chơi tối ưu là không cần thiết, chỉ cần bạn giành chiến thắng ngay lập tức hoặc ngăn chặn chiến thắng ngay lập tức của đối thủ. Nếu đối thủ của bạn có nhiều hơn một cách để giành chiến thắng, bạn không cần phải chặn bất kỳ ai trong số họ.

Bạn được cấp bảng trên đầu vào tiêu chuẩn và phải in số cột mà bạn muốn phát trên đầu ra tiêu chuẩn. Bảng được đảm bảo có hình dạng tốt (không có lỗ, ít nhất một lần di chuyển có thể) và chưa có chiến thắng cho một trong hai người chơi.

Mã ngắn nhất sẽ thắng.

ví dụ 1

      X
      O
      X
      O
 OOO  X
 XXX  O

Bạn phải chơi cột 0 hoặc 4 để giành chiến thắng.

Ví dụ 2

      X
X     X
O     O
XOX  XO
XXO XOX
XXO XXO

Bạn phải chơi cột 3 để chặn chiến thắng ngay lập tức của đối thủ.

Ví dụ 3

X      
XO     
OX    O
XO   XX
XXO OOO
OOO XXO

Bạn không thể thắng hoặc ngăn đối thủ của mình chiến thắng, vì vậy bạn có thể chơi bất kỳ cột 1-6 nào (0 đã đầy).

Ví dụ 4

X      
O      
X      
OOO    
XOX    
OXOX   

Bạn không thể chơi trong cột 3, vì nó cho phép đối thủ của bạn giành chiến thắng ngay lập tức. Bạn có thể chơi trong các cột 1-2 hoặc 4-6.

Câu trả lời:


9

C, 234 286 256 ký tự

Đã sửa để giải quyết chính xác vấn đề, bằng cách kiểm tra các bước di chuyển của đối thủ sau mỗi lần di chuyển.

Mã này rất nhạy cảm với định dạng tệp đầu vào - mỗi dòng phải liên kết 7 ký tự + dòng mới.
Bảng được coi là ma trận 8x8, thay vì 7x6. Cột thứ 8 chứa các dòng mới và 2 hàng bổ sung chứa các số không, vì vậy chúng không can thiệp vào giải pháp. Chúng thực sự có ích - Khi di chuyển ngay từ cột ngoài cùng bên phải, bạn nhấn vào cột dòng mới, đóng vai trò kiểm tra ranh giới.

wkiểm tra một vị trí để có cơ hội giành chiến thắng hoặc chặn. qnên là tế bào để kiểm tra xung quanh. Nó sử dụng reursion để lặp qua 4 hướng (bắt đầu bằng 9,8,7, sau đó vài lần 1).
Ckiểm tra một chuỗi các ký tự giống hệt nhau bắt đầu qtheo hướng d, cả qua lại. Nó trả về tổng của cả hai chuỗi (không tính vị trí bắt đầu), vì vậy nếu nó trả về 3, có một hàng 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 - 594 591 576 557 523 459 458 433 byte

Đây là điều tốt nhất tôi đạt được cho đến nay. Tôi đoán thật khó để đánh bại C. Thử thách tuyệt vời, tôi phải nói.

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]

Dòng if (dòng 7) có thụt vào một tab. SE không thích các tab.


2
Tôi dành quá nhiều thời gian để tinh chỉnh những thứ này. Ngoài ra, phiên bản 458 byte không hoạt động chính xác, ví dụ # 4. Lấy 25 byte đi và nó làm. Ma thuật.
xem
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.