Bàn cờ nghệ thuật ASCII


12

Trong thử thách này, bạn phải vẽ bàn cờ bên dưới và cho phép di chuyển được thực hiện.

1. Vẽ

Mỗi hình vuông màu trắng có 5x9 không gian.

Mỗi hình vuông màu đen có 5x9 dấu hai chấm.

Bảng được bao quanh bởi một biên giới của dấu hai chấm.

Các mảnh có 5 ký tự và ngồi ở hàng dưới cùng của hình vuông ở trung tâm.

Những con tốt rộng 4 ký tự. Họ ngồi hơi lệch khỏi trung tâm bên phải, với 3 hình vuông trống bên trái và 2 hình vuông trống bên phải. Họ ngồi một dòng trên dưới cùng của hình vuông.

Sẽ không có khoảng trắng bên ngoài khu vực của bảng, ngoại trừ một dòng mới tùy chọn.

Bàn cờ và quân cờ sẽ được vẽ chính xác như được hiển thị, ngoại trừ:

  1. Bạn có thể thay thế :các ô vuông và viền màu đen cho một biểu tượng khác và bạn có thể thay thế các @ô màu đen cho một biểu tượng khác (nhưng không phải là cùng một biểu tượng được sử dụng cho các ô vuông màu đen.)

  2. Bạn có thể di chuyển những con tốt của một nhân vật sang trái nếu bạn muốn.

.

::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
:         :::::::::         :::www:::   _+_   :::::::::         ::::::::::
:  |_|_|  :: _,,:::   (/)   :::)@(:::   )@(   :::(/):::   _,,   ::|_|_|:::
:   |@|   ::"- \~::   |@|   :::|@|:::   |@|   :::|@|:::  "- \~  :::|@|::::
:   |@|   :::|@|:::   |@|   :::|@|:::   |@|   :::|@|:::   |@|   :::|@|::::
:  /@@@\  ::/@@@\::  /@@@\  ::/@@@\::  /@@@\  ::/@@@\::  /@@@\  ::/@@@\:::
::::::::::         :::::::::         :::::::::         :::::::::         :
:::::():::    ()   ::::():::    ()   ::::():::    ()   ::::():::    ()   :
:::::)(:::    )(   ::::)(:::    )(   ::::)(:::    )(   ::::)(:::    )(   :
::::/@@\::   /@@\  :::/@@\::   /@@\  :::/@@\::   /@@\  :::/@@\::   /@@\  :
::::::::::         :::::::::         :::::::::         :::::::::         :
:         :::::::::         :::::::::         :::::::::         ::::::::::
:         :::::::::         :::::::::         :::::::::         ::::::::::
:         :::::::::         :::::::::         :::::::::         ::::::::::
:         :::::::::         :::::::::         :::::::::         ::::::::::
:         :::::::::         :::::::::         :::::::::         ::::::::::
::::::::::         :::::::::         :::::::::         :::::::::         :
::::::::::         :::::::::         :::::::::         :::::::::         :
::::::::::         :::::::::         :::::::::         :::::::::         :
::::::::::         :::::::::         :::::::::         :::::::::         :
::::::::::         :::::::::         :::::::::         :::::::::         :
:         :::::::::         :::::::::         :::::::::         ::::::::::
:         :::::::::         :::::::::         :::::::::         ::::::::::
:         :::::::::         :::::::::         :::::::::         ::::::::::
:         :::::::::         :::::::::         :::::::::         ::::::::::
:         :::::::::         :::::::::         :::::::::         ::::::::::
::::::::::         :::::::::         :::::::::         :::::::::         :
::::::::::         :::::::::         :::::::::         :::::::::         :
::::::::::         :::::::::         :::::::::         :::::::::         :
::::::::::         :::::::::         :::::::::         :::::::::         :
::::::::::         :::::::::         :::::::::         :::::::::         :
:         :::::::::         :::::::::         :::::::::         ::::::::::
:    ()   ::::():::    ()   ::::():::    ()   ::::():::    ()   ::::()::::
:    )(   ::::)(:::    )(   ::::)(:::    )(   ::::)(:::    )(   ::::)(::::
:   /__\  :::/__\::   /__\  :::/__\::   /__\  :::/__\::   /__\  :::/__\:::
:         :::::::::         :::::::::         :::::::::         ::::::::::
::::::::::         :::::::::   www   :::_+_:::         :::::::::         :
:::|_|_|::   _,,   :::(/):::   ) (   :::) (:::   (/)   :::_,,:::  |_|_|  :
::::| |:::  "- \~  :::| |:::   | |   :::| |:::   | |   ::"- \~::   | |   :
::::| |:::   | |   :::| |:::   | |   :::| |:::   | |   :::| |:::   | |   :
:::/___\::  /___\  ::/___\::  /___\  ::/___\::  /___\  ::/___\::  /___\  :
::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::

2. Di chuyển

Các cột được gắn nhãn AH từ trái sang phải và 1 đến 8 từ dưới lên trên. Người dùng sẽ có thể nhập một di chuyển theo hình thức sau:

<start column><start row><space><destination column><destination row>

Ví dụ, B1 C3có nghĩa là di chuyển hiệp sĩ đến quảng trường trước mặt cầm đồ của giám mục (giả sử trò chơi vừa mới bắt đầu).

Ngoài ra, hệ thống ICCF có thể được sử dụng, trong đó các cột được gắn nhãn từ 1 đến 8 thay vì từ A đến H. Vì vậy, việc di chuyển hiệp sĩ được đề cập ở trên trở thành 21 33.

Hình ảnh ( nguồn ) sau đây làm rõ cả hai hệ thống:

nhập mô tả hình ảnh ở đây

Việc di chuyển sẽ được thực hiện và bảng mới được hiển thị. Bất kỳ sự bắt giữ nào cũng sẽ xảy ra với người đánh cờ đang di chuyển người đánh cờ trên quảng trường đích khỏi bàn cờ.

Không cần phải kiểm tra một nước cờ hợp pháp, vì điều đó đã được đề cập trong các thử thách khác: Chương trình cờ nhỏ nhấtTrọng tài cờ nhỏ nhất Nếu người dùng cố gắng di chuyển từ một ô vuông trống, chương trình hoặc chức năng của bạn sẽ bỏ qua việc di chuyển. Nếu người dùng cố gắng chụp một mảnh thân thiện, bạn có thể bỏ qua việc di chuyển hoặc cho phép bắt giữ mảnh cố định.

Không cần phải hỗ trợ en passant hoặc castling.

Bạn có thể cho rằng đầu vào sẽ được hình thành tốt, tức là luôn ở định dạng được mô tả ở trên. Thư sẽ luôn ở trong cùng một trường hợp, bạn có thể quyết định đó là trường hợp nào.

3. Ghi điểm và tiền thưởng

Đây là mã golf. Mã ngắn nhất sẽ thắng.

-10% tiền thưởng nếu chương trình hoặc chức năng của bạn cho phép quảng cáo. Người dùng nhập đầu vào thứ ba, lần này là một trong các chữ cái sau: QBR N. Điều này chỉ được phép nếu việc di chuyển kết thúc bằng một con tốt ở hàng cuối cùng. Con tốt được trao đổi cho các mảnh được đặt tên. QBRN.

-10% tiền thưởng nếu chương trình hoặc chức năng của bạn thực hiện một động tác "hoàn tác" đặc biệt để đảo ngược các bước di chuyển (lùi xa khi bắt đầu trò chơi nếu được yêu cầu.) Rõ ràng là người chơi nghiệp dư có thể thực hiện các động tác bất hợp pháp và họ có thể muốn để hoàn tác chúng. Bạn có thể xác định đầu vào mà người dùng phải cung cấp cho lần di chuyển "hoàn tác" này (nó phải luôn giống nhau.) Hành vi không được xác định nếu người dùng cố gắng hoàn tác sau khi bắt đầu trò chơi.

Tổng tiền thưởng, tức là nếu bạn đi cho cả hai phần thưởng bạn nhận được -20%.


Lúc đầu, bạn nói "nhập di chuyển" và đối với tôi nó có nghĩa là "chỉ 1 di chuyển". Sau đó là phần thưởng cho việc hoàn tác "ngay từ đầu": vì vậy đó là một loạt các động tác hoàn chỉnh, không chỉ một ... vui lòng làm rõ
edc65

@ edc65 đó là một loạt các động thái hoàn chỉnh. Xem dòng đầu tiên "cho phép di chuyển được thực hiện." Một điều tôi không chỉ định là điều kiện thoát cho vòng lặp. Nó có thể là một ý tưởng để dừng lại khi một trong những vị vua bị bắt, nhưng câu trả lời hiện có có một vòng lặp vô hạn, có thể chấp nhận được theo thông số như được viết, vì vậy tôi sẽ bỏ nó.
Cấp sông St

Định dạng của hai hiệp sĩ trên hình vuông màu đen không khớp. Cái nào đúng?
JWT

@JWT wow, không ai để ý trước đây! Ở giai đoạn này tôi sẽ phải chấp nhận cả hai. Tôi thấy bạn đã đánh golf câu trả lời của bạn nhiều hơn một chút. Trước khi tôi kiểm tra câu trả lời của bạn và thay đổi sự chấp nhận, bạn đã hoàn thành chưa?
Cấp sông St

@ steveverril Tôi đã hoàn thành, vâng.
JWT

Câu trả lời:


4

Octave, 776 688 byte

688:

  • các hàm được đưa vào vòng lặp chính (cả hai chỉ được sử dụng một lần),
  • sử dụng ký hiệu tế bào {'foo','bar'}{i}thay cho hơi dài['foo';'bar'](i,:)

Vẫn không có phần thưởng nào được thực hiện.


Sử dụng hệ thống ICCF.

Có thể không có khoảng trắng hàng đầu trong mô tả di chuyển và trường nguồn và đích phải được phân tách bằng một khoảng trắng duy nhất, do đó 42 44, chính xác, trong khi 42 4442 44không.

R=@repmat;s=[t='BFJbRJFB';R(('@    A')',1,8);t+1]';while 1q=' ';c=R(':',42,74);m=R([m=R(q,5,9) l=m+26;l m],4,4);c(2:41,2:73)=m;for i=1:8 for j=1:8 f=s(i,j);z=@(c)bitand(+f,c);if z(64)b=z(1)+1;W={') (',')@('}{b};U=43-5*j;Z=9*i-2;T=Z-2:Z;Q=Z-3:Z+1;if z(2)c(U+3,Q)={'/___\','/@@@\'}{b};a=c(U+2,T)={'| |','|@|'}{b};if z(4)c(U+1,Q)='"- \~';c(U,Z-3:Z)=' _,,';else c(U+1,T)=a;if z(8)c(U,T)='(/)';elseif z(16)||z(32)c(U,T)=W;c(U-1,T)={'_+_','www'}{1+z(32)/32};else c(U,Q)='|_|_|';end
end
else c(U+2,Z-2:Z+1)={'/__\','/@@\'}{b};c(U:U+1,Z-1:Z)=['()';')('];end;end;end;end;c
m=input(q,'s')-'0';x=m(1);y=m(2);X=m(4);Y=m(5);if s(x,y)~=q&&(s(X,Y)==q||mod(s(x,y)-s(X,Y),2))s(X,Y)=s(x,y);s(x,y)=q;end
end

Một số phiên bản không linh hoạt:

# draw an empty chessboard
function n=cb
R=@repmat;
n=R(':',42,74);
m=R([m=R(' ',5,9) m+26;m+26 m],4,4);
n(2:41,2:73)=m;
end

# function n=put(n,f,c,r) :
#
# put a chessman f on column c and row r of chessboard n,
# returning new chessboard
# chessman is described by single character defined following way
# (please excuse naming bits by value rather than position):
# bit valued  127 -     unused
# bit valued  64  -     0 = field empty, 64 = field occupied.
# bits valued 32,16,8 - 0 = rook, 8 = bishop, 16 = king, 32 = queen
# bit valued  4 -       0 = not knight 4 = knight (only checked if "other piece" bit is set)
# bit valued  2 -       0 = pawn       2 = other piece
# bit valued  1 -       0 = white      1 = black

# this gives the following chars:

# pawns   - 64      (+1)  => @ , A
# knights - 64+4+2  (+1)  => F , G
# rooks   - 64+2    (+1)  => B , C
# bishops - 64+8+2  (+1)  => J , K
# kings   - 64+16+2 (+1)  => R , S
# queens  - 64+32+2 (+1) =>  b , a
# empty space - any character with bit valued 64 unset (space char does)

function n=put(n,f,c,r)
z=@(n)bitand(f-0,n);
if z(64)
    b=z(1);
    W=') ()@('(1+3*b:3+3*b);
    R=5*r;C=9*c;
    if z(2)
            n(46-R,C-5:C-1)='/___\/@@@\'(1+5*b:5+5*b);
            a=n(45-R,C-4:C-2)='| ||@|'(1+3*b:3+3*b);
            if z(4) # knight
                    n(44-R,C-5:C-1)='"- \~';
                    n(43-R,C-5:C-2)=' _,,';
            else
                    n(44-R,C-4:C-2)=a;
                    if z(8) # bishop
                            n(43-R,C-4:C-2)='(/)';
                    elseif z(16) # king
                            n(43-R,C-4:C-2)=W;
                            n(42-R,C-4:C-2)='_+_';
                    elseif z(32) # queen
                            n(43-R,C-4:C-2)=W;
                            n(42-R,C-4:C-2)='www';
                    else  # rook
                            n(43-R,C-5:C-1)='|_|_|';
                    end
            end
    else
            n(45-R,C-4:C-1)='/  \/@@\'(1+4*b:4+4*b);
            n(43-R:44-R,C-3:C-2)=['()';')('];
    end
end
end

# here we can easily define the chessboard.
s=['BFJbRJFB';repmat(('@    A')',1,8);'CGKcSKGC']';
c=cb;for i=1:8 for j=1:8 c=put(c,s(i,j),i,j);end;end
c

# We scan five characters. They must be positions in ICCF without leading spaces separated by single space.
while m=input('','s')-'0'
x=m(1)
y=m(2)
X=m(4)
Y=m(5)
# if the move is not allowed (capture piece of the same color or the start field is blank,
# do nothing
if s(x,y)==' ' || (s(X,Y) ~=' ' && mod(s(x,y)-s(X,Y),2)==0) continue; end;
# make the move
s(X,Y)=s(x,y);
s(x,y)=' ';
# redraw the board
c=cb;for i=1:8 for j=1:8 c=put(c,s(i,j),i,j);
end end
c
end

Tôi đã chạy nó trên ideone.com và hiển thị bảng nhưng không thể chấp nhận bất kỳ đầu vào nào. Nó hoạt động rất tốt tại guidespoint.com/codingground.htmlm (ngoại trừ bạn có vua và nữ hoàng đảo ngược - bất kỳ người chơi cờ dày dạn nào cũng sẽ nói với bạn rằng điều đó tạo nên sự khác biệt.) Tôi sẽ cho bạn thêm +1 vì không cho phép bắt một trận giao hữu và một phần nữa cho lời giải thích đàng hoàng, nếu tôi có thể.
Cấp sông St

@steveverrill Thật vậy, vị trí vua và hoàng hậu đã bị đảo ngược, cảm ơn vì đã chỉ ra điều này. Bây giờ nó đã được sửa.
pawel.boczarski

5

Hồng ngọc 715 696 693 683 byte

Đây là một giải pháp khá lộn xộn nhưng tôi không đủ kiên nhẫn để làm sạch nó hơn nữa vào lúc này.

Không có tiền thưởng được thực hiện.

Sử dụng hệ thống ICCF.

a,b,c=->f,x,y,p{p.map{|ln|ln.gsub(/\d/){|z|f*(z.to_i)}.tr('AB',x+y)}},Array.new(64){|i|((i%56<8?[4,2,3,5,6,3,2,4][i%56]:(i-8)%40<8?1:0)<<2)+(i<16?2:0)},':'*74
loop{puts c
b.each_slice(8).with_index{|r,y|d,*e=r.map.with_index{|v,x|a[*([[' '],[':']][(x+y)%2]+[[' ','_'],['@','@']][v&2==2?1:0]+[('9@9@9@9@9;9@4()3@4)(3@3/BB\2@9;9@3_,,3@2"- \~2@3|A|3@2/BBB\2;9@3(/)3@3|A|3@3|A|3@2/BBB\2;9@2|_|_|2@3|A|3@3|A|3@2/BBB\2;3www3@3)A(3@3|A|3@3|A|3@2/BBB\2;3_+_3@3)A(3@3|A|3@3|A|3@2/BBB\2'.split(';').map{|s|s.split '@'})[v>>2]])]}
d.zip(*e).each{|r|puts ":#{r.join}:"}}
puts c
gets.scan(/(.)(.) (.)(.)/){|f,g,h,i|j,k=63+(f.to_i)-(g.to_i)*8,63+(h.to_i)-(i.to_i)*8
b[k],b[j]=b[j]>0?b[j]: b[k],0}}

Tuyệt vời, dường như làm việc hoàn hảo!
Cấp sông St

@LevelRiverSt Có vẻ như câu trả lời này ngắn hơn câu trả lời hiện được chấp nhận.
Erik the Outgolfer

3

Python, 1136 890 753 byte

Xin lỗi vì câu trả lời một phần nhưng tôi là người mới và tôi thực sự thích thử thách này. Tôi biết nó có thể thực sự dài dòng nhưng đây là bản nháp thô của tôi:

y=':'*9
z=' '*9
b='::/___\::'
c=':::|@|:::'
d=':::)@(:::'

ps = {'r': [y,'::|*|*|::', c, c,b],'n': [y,':::,,::::', '::"- \~::', c,b],'b': [y,':::(/):::',c,c,b],'k': [':::www:::',d,c,c,b],'q': [':::*+*:::',d,c,c,b],'p': [y, '::::():::','::::)(:::',':::/__\::',y]}

def cell(p,c):
  if p == '!':
    return ([z]*5,[y]*5)[c]
  s = []
  for l in ps[p.lower()]:
    l = (l.replace('@', ' '), l.replace('_', '@'))[p.islower()]
    l = (l.replace(':', ' '), l)[c].replace('*', '_')
    s.append(l)
  return s


b = {8:'rnbkqbnr',7:'p'*8,2:'P'*8}
b[1] = b[8].upper()
for i in range(3,7):
  b[i] = '!'*8

o=[y*8]
c=0
for r in b:
  l=['']*5
  for p in b[r]:
    cc=cell(p,c)
    for i in range(0,5):
      l[i]+=cc[i]
    c=not c
  o.extend(l)
  c=not c
o.append(o[0])
for l in o:
  print ':'+l+':'

Cảm ơn câu trả lời. Tùy chỉnh của chúng tôi là bao gồm một dòng tiêu đề trên các câu trả lời, với ngôn ngữ và số byte. Ngôn ngữ này là gì? Nó trông giống như con trăn nhưng tôi không thể chạy nó trên ideone.com
Level River St

1
Xóa tất cả các khoảng trống xung quanh =và nếu một forhoặc ifchỉ có một dòng bên trong nó, tất cả có thể đi trên cùng một dòng. Hãy xem Mẹo chơi gôn trong Python .
mbomb007
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.