Tablero de ajedrez ASCII Art

12

En este desafío, debes dibujar el tablero de ajedrez a continuación y permitir que se realicen movimientos.

1. Dibujo

Cada cuadrado blanco tiene 5x9 espacios.

Cada cuadrado negro tiene 5x9 colones.

El tablero está rodeado por un borde de dos puntos.

Las piezas tienen 5 caracteres de ancho y se ubican en la fila inferior del cuadrado en el centro.

Los peones tienen 4 caracteres de ancho. Se sientan ligeramente descentrados a la derecha, con 3 cuadrados en blanco a la izquierda y 2 cuadrados en blanco a la derecha. Se sientan una línea sobre la parte inferior del cuadrado.

No habrá espacios en blanco fuera del área del tablero, con la excepción de una nueva línea final opcional.

El tablero y las piezas de ajedrez se dibujarán exactamente como se muestra, excepto que:

  1. Puede sustituir el símbolo :en los cuadrados y bordes negros por un símbolo diferente, y puede sustituir el @símbolo diferente en las piezas negras (pero no el mismo que se usa para los cuadrados negros).

  2. Puedes mover los peones un personaje a la izquierda si lo deseas.

.

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

2. Moviéndose

Las columnas están etiquetadas AH de izquierda a derecha y de 1 a 8 de abajo hacia arriba. El usuario podrá ingresar un movimiento de la siguiente forma:

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

Por ejemplo, B1 C3significa mover al caballero a la casilla frente al peón del alfil (suponiendo que el juego acaba de comenzar).

Alternativamente, se puede utilizar el sistema ICCF, en el que las columnas están etiquetadas de 1 a 8 en lugar de A a H. Entonces, el movimiento de caballero mencionado anteriormente se convierte 21 33.

La siguiente imagen ( fuente ) aclara ambos sistemas:

ingrese la descripción de la imagen aquí

El movimiento se ejecutará y se mostrará el nuevo tablero. Cualquier captura resultante ocurrirá con el ajedrecista en movimiento retirando al ajedrecista en la casilla de destino del tablero.

No hay necesidad de verificar un movimiento de ajedrez legal, ya que se ha cubierto en otros desafíos: el programa de ajedrez más pequeño y el árbitro de ajedrez más pequeño Si el usuario intenta moverse desde un cuadrado vacío, su programa o función debe ignorar el movimiento. Si el usuario intenta capturar una pieza amiga, puede ignorar el movimiento o permitir que se capture la pieza estacionaria.

No hay necesidad de soportar en passant o castling.

Puede suponer que la entrada estará bien formada, es decir, siempre en el formato descrito anteriormente. Las letras siempre estarán en el mismo caso, usted puede decidir qué caso es ese.

3. Puntuación y bonificaciones

Este es el código de golf. El código más corto gana.

-10% de bonificación si su programa o función permite la promoción. El usuario ingresa una tercera entrada, esta vez una de las siguientes letras: QBR N. Esto solo debe permitirse si el movimiento termina con un peón en la última fila. El peón se cambia por la pieza nombrada. QBRN.

-10% de bonificación si su programa o función implementa un movimiento especial de "deshacer" para revertir los movimientos (hasta el comienzo del juego si es necesario). Obviamente, es posible que los jugadores aficionados realicen movimientos ilegales, y pueden desear para deshacerlos. Puede definir la entrada que el usuario debe dar para este movimiento de "deshacer" (siempre debe ser el mismo). El comportamiento no está definido si el usuario intenta deshacer más allá del comienzo del juego.

Suma de bonificaciones, es decir, si opta por ambas bonificaciones obtendrá -20%.

Level River St
fuente
Al principio dices "ingresa un movimiento", y para mí significa "solo 1 movimiento". Luego está la bonificación para deshacer "hasta el principio": por lo que es una serie completa de movimientos, no solo uno ... por favor aclare
edc65
@ edc65 es una serie completa de movimientos. Vea la primera línea "permitir que se realicen movimientos". Lo único que no especifiqué es la condición de salida para el bucle. Podría haber sido una idea detenerse cuando uno de los reyes es capturado, pero la respuesta existente tiene un bucle infinito, que es aceptable según la especificación tal como está escrita, así que lo dejaré.
Level River St
El formato de los dos caballeros en cuadrados negros no coincide. ¿Cual es correcta?
JWT
@JWT wow, nadie se dio cuenta antes! En esta etapa tendré que aceptar ambos. Veo que has respondido un poco más a tu respuesta. Antes de probar su respuesta y cambiar la aceptación, ¿ha terminado?
Level River St
@ steveverril he terminado, sí.
JWT

Respuestas:

4

Octava, 776 688 bytes

688:

  • funciones integradas en el bucle principal (ambas se usaron solo una vez),
  • notación celular usada {'foo','bar'}{i}en lugar de un poco más larga['foo';'bar'](i,:)

Todavía ninguno de los bonos implementados.


Utiliza el sistema ICCF.

Puede que no haya espacios iniciales en la descripción del movimiento y el campo de origen y destino deben estar separados por un espacio en blanco, por lo que 42 44es correcto, mientras que 42 44y 42 44no lo están.

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

Versión un tanto sin golf:

# 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
pawel.boczarski
fuente
Ejecuté esto en ideone.com y pude mostrar el tablero, pero no pude aceptar ninguna entrada. Funciona muy bien en tutorialspoint.com/codingground.htm (excepto que hayas invertido el rey y la reina, cualquier jugador experimentado de ajedrez te dirá que hace la diferencia). Te daría un +1 adicional por no permitir la captura de un amigo. pieza, y una más para la explicación decente, si pudiera.
Level River St
@steveverrill De hecho, las posiciones de rey y reina se invirtieron, gracias por señalar esto. Ya está arreglado.
pawel.boczarski
5

Rubí, 715 696 693 683 bytes

Esta es una solución bastante desordenada, pero no tengo la paciencia para limpiarla más en este momento.

Ninguno de los bonos hechos.

Utiliza el sistema 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}}
JWT
fuente
Excelente, parece funcionar perfectamente!
Level River St
@LevelRiverSt Parece que esta respuesta es más corta que la actualmente aceptada.
Erik the Outgolfer
3

Python, 1136 890 753 bytes

Disculpas por la respuesta parcial, pero soy un novato y realmente disfruté este desafío. Sé que probablemente sea realmente detallado, pero aquí está mi borrador:

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+':'
terrible usuario
fuente
Gracias por la respuesta. Es nuestra costumbre incluir una línea de título en las respuestas, con el idioma y el recuento de bytes. ¿Qué lenguaje es este? Parece python pero no puedo ejecutarlo en ideone.com
Level River St
1
Elimine todos los espacios alrededor =, y si un foro un ifsolo tiene una línea dentro, todo puede ir en la misma línea. Eche un vistazo a Consejos para jugar golf en Python .
mbomb007