Inspirado neste artigo recente, que conta a história de um programador francês que escreveu um programa de xadrez de 487 bytes para dois jogadores (humano versus humano) na Assembléia, imaginei como poderiam ser pequenos programas de xadrez em outros idiomas.
Detalhes
- O programa deve aceitar apenas jogadas de xadrez legais.
- A declaração de cheque / xeque-mate não é necessária (apenas desejável), embora a primeira regra se aplique em casos de cheque.
- De acordo com o artigo, o roque não é uma implementação necessária.
- Além disso, você não precisa implementar en passant.
- No entanto, você deve permitir a promoção de peões ao atingir o oitavo posto (você pode optar por simplesmente forçar a conversão a rainha).
- Depende de você como a placa é exibida - terminal ASCII, GUI, etc.
- Você deve exibir de quem é a vez.
As regras do xadrez podem ser encontradas aqui - ignore as regras específicas do torneio (por exemplo, tempo, toque) e lembre-se de que castling e en passant não são implementações necessárias.
a1 h8
mover uma torre na diagonal para o canto oposto, pulando sobre os peõesRespostas:
C,
650600Para reduzir o código para inicializar o quadro, o visor exibe Branco (maiúsculas) da esquerda para a direita e Preto (minúsculas) da direita para a esquerda. A entrada é na forma de dois números decimais de 2 dígitos (posição inicial e posição final), fornecendo o arquivo (0-7) e a classificação (0-7). Para um pouco de código extra (subtrair 11 de cada entrada), a entrada pode ser feita para estar em conformidade com http://en.wikipedia.org/wiki/ICCF_numeric_notation (dígitos 1-8)
Aqui está um exemplo de captura de tela em que Black acaba de avançar seu peão da torre. White tenta vários movimentos ilegais com sua rainha, antes de finalmente capturar o peão. Os indicadores de mudança de direção são
a
para preto eA
branco.Uma característica interessante da minha validação é o uso do quadrado da distância euclidiana. Para o cavaleiro, isso é sempre 1 ^ 2 + 2 ^ 2 = 5, mas eu também o uso para o rei e o peão.
O teste para verificação é feito fazendo backup do tabuleiro, executando os movimentos dos jogadores e verificando todos os 64 movimentos possíveis do oponente.
O programa deve ser finalizado com Ctrl-C. Não consigo pensar em uma maneira mais graciosa de fazê-lo, além de fazer uma jogada especial para encerrar o programa. Na verdade, um jogo de xadrez termina quando um jogador é incapaz de se mover no seu turno (xeque-mate ou impasse) e isso exige muitos testes que não são exigidos pelas especificações.
Código comentado
fonte
s,f
precisa ser inicializado? Espaços em quadrados vazios são ótimos.s
era uma transição de um estágio anterior. Eu o removi agora.e=y*y+x*x=f-s-u*y=f/u-s/u;
.=
parecer a única interpretação. Em relação ae=y*y+x*(x=..
um pouco de cautela com a ordem de execução, já que recebi a resposta errada de um argumento modificado em umaprintf
declaração, mas neste caso, parece funcionar bem no GCC / Cygwin. Vou esperar por mais alterações antes de incluí-lo no código. Uma coisa ainda está faltando é uma verificação para números fora do intervalo 0..77 (o que eu não vejo como requerido pela especificação, mas de qualquer maneira ..)t^=32
parat^=w
ea[95],b[95]
paraa[z],b[z]
. O código é surpreendentemente legível. Provavelmente por causa dos comentários detalhados!Python 3,
11661071993 bytesEu só percebi que precisava impedir os reis de passarem para o cheque depois de terminar de outra forma, mas aqui está minha submissão
Para jogar, digite quatro números delimitados por espaço, os 2 primeiros sendo as coordenadas da peça que você deseja mover e os 2 sendo o local para onde você deseja mover.
fonte
a=o*8;j=[list(s) for s in ["RNBKQBNR","P"*8,a,a,a,a,"p"*8,"rnbkqbnr"]]
.spilt()
padrões para a divisão de espaços em branco, assim você pode usarinput().split()
em vez deinput().split(" ")
2and
,1or
, etc.)False
pode ser0!=0
.False
pode ser apenas0
-not 0
deve funcionar bem ...Desculpe o atraso.
O programa é chamado ChesSkelet. Atualmente, ele usa 352 bytes para código e dados. Está escrito no Z80 Assembly, e particularmente no ZX Xpectrum.
Se você não deseja compilá-lo e carregá-lo em um emulador, pode jogar on-line no site ChesSkelet ( http://chesskelet.x10host.com ).
O programa é bastante simples, um grande loop em que: - alternativamente (1) o branco insere seu movimento ou (2) o preto executa sua micro AI para se mover. - placa é atualizada na tela. novamente, há um guia enorme que descreve o programa e as técnicas no site.
fonte
> <> , 1467 bytes
Bem, isso não bate o recorde de 487 bytes…
Experimente no playground de peixes ! (Ele usa alguns bugs nesse intérprete, então não posso prometer que funcione em qualquer outro lugar. Você provavelmente desejará executá-lo na velocidade máxima - pode levar mais de um minuto para fazer uma jogada.)
Quando você executa o código, ele será impresso
Letras maiúsculas representam branco, minúsculas representam preto. Você pode então dar a sua jogada como entrada no formulário
[a-h][1-8][a-h][1-8]
, por exemploe2e4
, significando "mover a peçae2
parae4
". O programa imprimirá, por exemplo,A principal forma de memória em> <> é a pilha; no entanto, isso não é muito prático para armazenar um tabuleiro de xadrez. Em vez disso, usei a capacidade de modificação automática de> <> para armazenar o tabuleiro de xadrez como parte do próprio código-fonte, acessando-o com
g
ep
.A maior parte do código é verificar se sua mudança é legal. Há várias coisas para verificar aqui:
Se alguma dessas perguntas tiver a resposta errada, o programa lançará um erro e será interrompido; caso contrário, ele edita o tabuleiro de xadrez em seu código-fonte, imprime-o novamente e aguarda o próximo movimento.
Para os movimentos do rei e do cavaleiro, peguei emprestado o truque de Level River St para verificar a distância quadrada euclidiana: para um rei, é menos que 3 e, para um cavaleiro, é exatamente 5.
fonte