Jogo dos dezesseis quadrados

Vamos montar o quebra-cabeça dos dezesseis quadrados, onde tentamos colocar 15 peças (com números de 1 a 15) cada um em seu devido lugar.
Coloque 16 SpeedButtons no Form num quadrado (4X4), conforme a figura abaixo, renomeando-os (no Object Inspector) para SB com o número equivalente.
Ou seja,
SpeedButton1->Name=SB1;
SpeedButton2->Name=SB2;
SpeedButton3->Name=SB3;
SpeedButton4->Name=SB4;
e assim sucessivamente.


[image]

Nota: Os botões devem ser colocados no Form exatamente como na figura, uma vez que a movimentação de peças dar-se-á baseada nessa configuração.
Atente para o detalhe de que o cada botão terá o Caption assinalado (no Object Inspector) com valor equivalente a seu número. Assim,  
SB1 -> Caption = 1;  
SB2 -> Caption = 2;  
SB3->Caption=3;
SB4->Caption=4;
e assim sucessivamente.
Assinale a propriedade Flat de todos os botões para true.
Assinale a Propriedade GroupIndex (no Object Inspector) de todos os SpeedButtons para 1. Dessa forma estaremos relacionando-os forçando apenas um a permanecer pressionado (Down). Os outros permanecerão elevados (Down = false).
Vamos alterar o cursor que aparecerá sobre os botões. Assinale, no Object Inspector, as propriedades Cursor de todos os botões para crHandPoint.
Apenas os botões SB16, SB15 e SB12 terão a propriedade Enabled assinalada para true; Todos os demais botões (SB1, SB2, SB3, SB4, SB5, SB6, SB7, SB8, SB9, SB10, SB11, SB13 e SB14) serão setados, inicialmente, para false.
A propriedade Color deve ser marcada para clBlue.

Passemos à codificação.
Em Unit1.cpp, declare uma variável inteira global, inicializando-a com 16:
int i = 16;
Essa variável servirá para identificar qual botão estava Down, possibilitando a correta substituição de Caption entre os botões envolvidos em cada ação (evento OnClick).
Vamos entender a lógica do programa. O botão em estado Down significa que não há nenhuma peça do quebra-cabeças nessa posição. Significa, também, que qualquer peça (botão) do quebra-cabeça cincunvizinha a essa posição poderá ocupar este local (alterando-se-lhe a propriedade Down). Então precisamos ativar (Enabled = true) os botões que podem ser movimentados e desativar (Enabled = false) todos os demais (que não podem ser movidos).
Nota: Embora no jogo tenhamos essa impressão de movimento, na verdade não é o botão quem se move. Apenas ativamos e desativamos uma seqüência de botões, alterando o seu estado e transferindo o Caption que estava num botão para outro, tornando desnecessária a tarefa de implementar uma ação real de movimento entre as peças (botões).
Quando um botão receber um evento OnClick, assumirá o estado Down. Concomitantemente transferirá o seu Caption (que sempre será provisório até que o botão esteja em sua posição definitiva) para o botão que subiu (estava Down mas elevou-se). Para verificar o valor do Caption a ser assumido, usamos a variável i (que sempre guardará esse valor atualizado) dentro de um comando switch() ... case.
Então a lógica do programa consiste, basicamente, em transferir Captions, ativando e desativando botões!
Para finalizar, colocamos um menu Arquivo com duas Opções: Novo (reinicia a partida) e Sair (fecha o programa).

VMS Desenvolvimentos

Diversas Dicas, Apostilas, Arquivos Fontes, Tutoriais, Vídeo Aula, Download de Arquivos Relacionado a Programação em C++ Builder.

Voltar ao Site