Trật tự và hỗn loạn và Codegolf


10

Order and Chaos là một biến thể của Tic-Tac-Toe được chơi trên bảng 6x6. Tuy nhiên, điều làm cho trò chơi trở nên độc đáo là cả hai người chơi có thể đặt X hoặc O! Mỗi lượt (bắt đầu bằng Đơn hàng), người chơi đặt X hoặc O vào bất kỳ ô vuông nào không có người.
Chiến thắng rất đơn giản. Đặt hàng thắng nếu có 5 X hoặc Os (theo chiều dọc, chiều ngang hoặc đường chéo) liên tiếp trên bảng. Chaos thắng nếu bảng được lấp đầy và không có chuỗi 5 X hoặc Os trên bảng. Công việc của bạn? Chà, vì đây là Lập trình Câu đố và Code Golf, bạn sẽ lập trình trò chơi và đánh gôn.

Các quy tắc

  • Bạn phải chấp nhận đầu vào dưới dạng x y t, ở đâu xylà tọa độ và tlà loại gạch ( Xhoặc O). Các tọa độ bắt đầu bằng 0 0ở góc trên bên trái và tăng lên 5 5(góc dưới bên phải).
  • Bạn phải chấp nhận qthoát và in INVALIDnếu người dùng nhập tọa độ, ô không hợp lệ, bất kỳ đầu vào nào không ở dạng x y thoặc cố gắng đặt ô ở nơi đã có. (Ngoại lệ duy nhất là q, vì điều này thoát khỏi chương trình.)
  • Nếu Order thắng, bạn sẽ xuất P1 WINS. Nếu Chaos thắng, bạn sẽ xuất ra P2 WINS.
  • Đặt hàng phải đi trước.
  • Một không gian trống được đại diện bởi ..
  • Gạch là XO(chữ hoa). Bạn không phải chấp nhận chữ thường, nhưng chữ hoa là bắt buộc.
  • Hội đồng quản trị của bạn chỉ phải bao gồm .XO.
  • Bạn đang thực sự mô phỏng cả hai người chơi đang chơi trò chơi, không được đưa ra một bảng và kiểm tra xem ai thắng. Nó chấp nhận di chuyển làm đầu vào, sau đó in bảng, chấp nhận di chuyển khác, và cứ thế, cho đến khi một người chơi thắng.

Bảng khởi đầu trông như thế này:

......
...... 
......
......
......
...... 

Và sau đầu vào (Thứ tự) của người chơi đầu tiên 1 2 X, nó sẽ trông như thế này:

......
...... 
.X....
......
......
......  

Tương tự như vậy, khi người chơi tiếp theo (Chaos) nhập vào 3 3 O, nó sẽ trông như thế này:

......
...... 
.X....
...O..
......
......  

Và điều này tiếp tục cho đến khi một người chơi chiến thắng.

Như mọi khi, các lỗ hổng tiêu chuẩn mang lại niềm vui cho mọi thứ đều bị cấm.

Người chiến thắng là người có mã ngắn nhất vào ngày 15 tháng 6, 00:00 UTC (khoảng một tháng kể từ khi thử thách này được đăng.)


Điều gì xảy ra nếu một người chơi gõ vào một vị trí đã được thực hiện?
Loovjo

@Loovjo Nó trả lại INVALID. Tôi đã chỉnh sửa nó ngay bây giờ, cảm ơn.
ASCIIThenANSI

1
Có nên thoát trò chơi sau khi phát hiện 5 ô liên tiếp không?
Kyle Kanos

1
Có thể tôi đã bỏ qua nó nhưng nó có phải in bảng lên màn hình hay chỉ kiểm tra trạng thái của bảng và xuất ra người chơi nào thắng?
Kodos Johnson

@Andrew Tôi thực sự có nghĩa là để mô phỏng trò chơi. Bạn chấp nhận đầu vào của từng người chơi, mỗi lượt một lượt, sau đó kiểm tra xem người chơi có thắng được mỗi lượt không. Là mô tả không rõ ràng?
ASCIIThenANSI

Câu trả lời:


1

PHP, 316

Đây là đệ trình của tôi. Nó phải được thực thi bởi php trong dòng lệnh.

Lưu ý rằng mã này tạo ra các thông báo vì một số phím tắt tôi đã thực hiện. Hãy cho tôi biết nếu điều này là ok. Tôi có thể sửa nó bằng cách thêm một vài ký tự. Tôi đã kiểm tra trang này và câu trả lời hàng đầu nói rằng giả sử rằng báo cáo lỗi bị tắt nếu không có đề cập nào về nó.

<?for(;$i++<6;)$b.='......|';while(($a=trim(fgets(STDIN)))!='q'){preg_match('/^([0-5]) ([0-5]) ([XO])$/',$a,$d)&($b[$c=$d[2]*7+$d[1]]=='.')?$b[$c]=$d[3]:print"INVALID\n";echo str_replace("|","\n",$b); foreach([0,5,6,7]as$e)preg_match('/(X|O)(.{'.$e.'}\1){4}/',$b)-1?:die("P1 Wins");strstr($b,'.')?'':die("P2 Wins");}

Và đây là phiên bản chưa được đánh gôn của mã:

<?php
error_reporting(E_ALL & ~E_NOTICE);

for(;$i++<6;)$b.='......|';
while(($a=trim(fgets(STDIN)))!='q'){

    #Validate and assign 
    preg_match('/^([0-5]) ([0-5]) ([XO])$/',$a,$d)&($b[$c=$d[2]*7+$d[1]]=='.')?$b[$c]=$d[3]:print"INVALID\n";

    #Output
    echo str_replace("|","\n",$b); 

    #Check if Order wins
    foreach([0,5,6,7]as$e) {
        preg_match('/(X|O)(.{'.$e.'}\1){4}/',$b)-1?:die("P1 Wins");
    }

    #Check if Chaos wins
    strstr($b,'.')?'':die("P2 Wins");
}

Có, thông báo là OK.
ASCIIThenANSI

4

JavaScript, 360

Chỉnh sửa trò chơi tương tác đã sửa đổi, nên chạy ngay cả trong MSIE

Theo yêu cầu, trò chơi dựa trên văn bản, nhập qua cửa sổ bật lên, đầu ra trong bảng điều khiển (để có phông chữ đơn cách).

Thoát khỏi trò chơi với 'q' hoặc nhấp vào 'hủy' tại dấu nhắc.

Không sử dụng các tính năng ES5, nó sẽ chạy trên bất kỳ trình duyệt kiểm duyệt nào (nơi bạn có thể có bảng điều khiển JS)

b='\n......'.repeat(6).split('');
for(h=t=0;!h&t<36;)
{
  i=prompt();
  if(i=='q')i=null;
  i=i.match(/([0-5]) ([0-5]) ([XO])/);
  m='INVALID';
  if(b[p=i?i[2]*7-~i[1]:0]=='.')
  {
    ++t;
    b[p]=i[3];
    m=b.join('');
    for(x=z='',c=0;c++<6;)
      for(x+='_',z+='_',r=0;r<6;r++)
        x+=b[c+r*7],z+=b[c<4?c-1+r*8:c+1+r*6];
    h=(/X{5}|O{5}/.test(b.join('')+x+z))
  }
  console.log(m);
}
console.log("P"+(2-h)+" WINS")

Bây giờ, một số phiên bản tương tác và đồ họa thú vị hơn , hãy chạy đoạn trích để chơi.


Phiên bản có thể nhấp tốt đẹp! (Gợi ý nhỏ: bạn có thể sử dụng nhấp chuột phải / trái thay vì các nút radio.)
xebtl 17/05/2015

@xebtl Tôi sẽ dùng thử
edc65 17/05/2015

1

Java, 565 ký tự D:

public class M{public static void main(String[]r){int[]p=new int[36];int u=0;for(;;){String l=new java.util.Scanner(System.in).nextLine();if(l == "q")break;int a=l.charAt(0)-'0'+(l.charAt(2)-'0')*6,i=p[a]==0?1:0;if(i>0)p[a]=l.charAt(4);u+=i;r(i==0?"INVALID\n":"");if(u==36){r("P2 WINS");break;}for(int x=0;x<6;x++)for(int y=0;y<6;y++)for(int d=0;d<3;d++)try{int e=1,c=p[x+y*6],z=x,h=y;if(c=='X'||c=='Y'){for(;e<6;e++){if(d%2==0)z++;if(d>0)h++;if(p[z+h*6]!=c)break;}if(e==5){r("P1 WINS");return;}}}catch(Exception e){}}}static void r(Object o){System.out.print(o);}}

Đây có lẽ là môn đánh gôn dài nhất từ ​​trước đến nay. Tôi thực sự không giỏi trong việc này.


1

Tháng mười, 453

format plus 'XO.'
disp(F=zeros(6))
r=@()fread(0,1);R=@()r()-47;q=@(m)printf(m)&&quit;e=@()q("INVALID");l=@(n)n<1||n>6&&e();s=@()r()==32||e();w="P1 WINS";f=@(v)abs(sum(v))==22.5&&q(w);g=@(m)any(abs(sum(m))==22.5)&&q(w);d=@diag;while 1
i=R();i==66&&quit;l(i);s();l(j=R());s();F(j,i)&&e();abs(v=R()-36.5)==4.5||e();F(j,i)=v;disp(F)
r();f(d(F,-1));f(d(F,0)(2:6));f(d(F,0)(1:5));f(d(F,1));g(F(1:5,:));g(F(2:6,:));g(F(:,1:5)');g(F(:,2:6)');F&&q("P2 WINS");end

Việc thực hiện khá đơn giản, chỉ có một trò lừa thực sự duy nhất để sử dụng format plusđể chăm sóc việc in ấn. Đây là một phiên bản nhận xét:

format plus 'XO.'               # this is where the magic happens

## initialize and print empty board
disp(F=zeros(6))

## shortcuts
r=@()fread(0,1);
R=@()r()-47;
q=@(m)printf(m)&&quit;
e=@()q("INVALID");
l=@(n)n<1||n>6&&e();
s=@()r()==32||e();
w="P1 WINS";
f=@(v)abs(sum(v))==22.5&&q(w);
g=@(m)any(abs(sum(m))==22.5)&&q(w);
d=@diag;

while 1
  i=R();                        # read index 1
  i==66&&quit;                  # ‘q’?
  l(i);                         # check bounds
  s();                          # read and check space
  l(j=R());                     # read and check index 2
  s();                          # read and check space
  F(j,i)&&e();                  # square already filled?
  abs(v=R()-36.5)==4.5||e();    # valid mark?
  F(j,i)=v;                     # assigndisp(F)                       # and print board
  r();                          # read off newline

  ## check diagonals
  f(d(F,-1));
  f(d(F,0)(2:6));
  f(d(F,0)(1:5));
  f(d(F,1));

  ## check rows
  g(F(1:5,:));
  g(F(2:6,:));

  ## check columns
  g(F(:,1:5)');
  g(F(:,2:6)');

  ## check chaos
  F&&q("P2 WINS");
end

Do yêu cầu kiểm tra cú pháp đầu vào và tính hợp lệ, mã sử dụng fread()để đọc từng ký tự một.

Tôi đã chăm sóc để xuất bảng và tin nhắn một cách gọn gàng. Nếu một số đầu ra bổ sung được chấp nhận, tôi có thể tắt một vài byte. Ví dụ: sử dụng in tự động (không disp(F)), bảng sẽ được hiển thị dưới dạng

F =

......
......
......
......
......
......

Ngoài ra, tôi giải thích rằng mỗi di chuyển được đưa ra trên một dòng riêng biệt.


Tương tác mẫu (công -qtắc chỉ để chặn tiêu đề của Octave):

$ octave -q order_chaos.m 
......
......
......
......
......
......
3 3 X
......
......
......
...X..
......
......
2 3 O
......
......
......
..OX..
......
......
3 3 O
INVALID

Di chuyển không hợp lệ khiến chương trình thoát ra (không chắc đó là dự định).


Chỉ để đảm bảo (vì đã có một số nhầm lẫn trước đó), điều này nhận đầu vào từ cả hai người chơi và thực sự mô phỏng trò chơi, thay vì chỉ kiểm tra xem một bảng đã cho có chiến thắng không?
ASCIIThenANSI

@ASCIIThenANSI Chỉ vậy thôi. Nó hy vọng mỗi lần di chuyển của biểu mẫu x y ttrên một dòng riêng biệt (và không có đầu vào nào khác).
xebtl

Và nó in bảng sau mỗi đầu vào?
ASCIIThenANSI

@ASCIIThenANSI Có, xem câu trả lời được chỉnh sửa.
xebtl
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.