Ruben_Barbosa Posted April 22, 2009 at 08:27 AM Report #258142 Posted April 22, 2009 at 08:27 AM Ora Viva pessoal, O meu problema é o seguinte não sei como criar o movimento das peças do tabuleiro de Xadrez 😛 . tenho noção que vou ter as colunas de 1 a 8 e as linhas de A a G mas agora fazer isso mexer nao sei 🙂 . Se alguem poder dar uma ajuda agradecia 😛 Aqui segue o meu codigo #include <stdio.h> #include <stdlib.h> #include <conio2.h> #define ROWS 8 #define COLS 8 void Menu_principal(); void desenhar_op(); void back_menu(); int tabuleiro (); void nome_jogador(); void initBoard(); void showBoard(); typedef char ChessBoardType[ROWS][COLS]; int main() { Menu_principal(); } /** * Função para Criar MEnu Principal */ void Menu_principal() { char opcao; textbackground(BLUE); textcolor(WHITE); clrscr(); desenhar_op(); opcao = getch(); switch(opcao) { case 'J': case 'j': nome_jogador(); ChessBoardType board; initBoard(board); showBoard(board); case 'O': case 'o': case 'S': case 's': exit; break; default : printf("\n\n Opção Invalida.\n\n Deseja Voltar ao menu Inicial (S/N)"); back_menu(); } } /** * Função que Desenha opções de jogo */ void desenhar_op() { gotoxy(28,5); printf("Bem Vindo ao Jogo de Xadrez\n\n\n\n\n"); textcolor(WHITE); gotoxy(26,10); printf("- - - Opcoes de Jogo - - -"); gotoxy(32,14); printf("[J]- player vs player"); gotoxy(32,16); printf("[O]- opcoes do jogo"); gotoxy(32,18); printf("[s]- Sair do jogo "); } /** * Função de Voltar ao menu inicial */ void back_menu() { char op; op = getch(); switch(op) { case 'S': case 's': clrscr(); system("PAUSE"); Menu_principal(); break; case 'N': case 'n': exit; break; default: printf("\n Opção invalida. O Programa vai encerrar!\n\n"); exit; break; } } /** * Função Que cria peças do Tabuleiro */ void initBoard(ChessBoardType cb) { int col; char ch; for(col=0; col<COLS; col++) { if (col==0 || col==7) { ch='t'; } else if (col==1 || col==6) { ch='c'; } else if (col==2 || col==5) { ch='b'; } else if (col==3) { ch='d'; } else { ch='r'; } cb[0][col] = ch; cb[1][col] = 'p'; cb[2][col] = cb[3][col] = cb[4][col] = cb[5][col] = ' '; cb[6][col] = 'P'; cb[7][col] = ch - 32; // Maiusculas } } /** * Função Que mostra o Tabuleiro */ void showBoard(ChessBoardType cb) { int row, col; printf(" +---+---+---+---+---+---+---+---+\n"); for(row=0; row<ROWS; row++) { printf(" | "); for(col=0; col<COLS; col++) { printf("%c | ", cb[row][col]); } printf("\n +---+---+---+---+---+---+---+---+\n"); } } /** * Função de Criar o Nome dos Jogadores */ void nome_jogador() { char P1[25]; char P2[25]; clrscr(); printf("\n Introduza o Nome do Primeiro jogador.\n"); gotoxy(2,4); gets(P1); printf("\n Introduza o Nome do Segundo jogador.\n"); gotoxy(2,8); gets(P2); clrscr(); }
Ferreira Posted April 22, 2009 at 09:39 AM Report #258175 Posted April 22, 2009 at 09:39 AM Sem mostrares o que já tens feito é difícil. http://twitter.com/ferreira
Ruben_Barbosa Posted April 22, 2009 at 10:07 AM Author Report #258185 Posted April 22, 2009 at 10:07 AM já esta 😛 no primeiro comentário xD
pedrosorio Posted April 22, 2009 at 10:23 AM Report #258189 Posted April 22, 2009 at 10:23 AM Definir um tipo especial para uma matriz de caracteres n faz mto sentido, mas tu é que sabes. Para já, o teu tipo tabuleiro está incompleto porque se tens uma matriz de caracteres e chamas 'p' a todos os peões, como é que distingues os brancos dos pretos? (O que faz sentido é usares maiúsculas tal como fizeste para as outras peças). Depois tens que decidir como é que vais fazer os movimentos. Se receberes comandos em notação "normal" tipo "e4", "Bc4", etc. vais ter que os interpretar para descobrir qual a peça que está a mover-se etc. e isso pode dar algum trabalho, para perceber que movimento é e se é válido. Uma alternativa mais simples é receber a posição inicial da peça e a posição final tipo "e2-e4", depois envias isso para uma função que verifica se o movimento é válido, i.e. se a peça na posição e2 é do jogador que está a fazer o movimento e se respeita as regras do jogo (movimento correcto para a peça, o rei não fica em cheque, etc.) Se for, limitas-te a apagar a posição e2 e a colocar a peça que lá estava na posição e4, et voilà. Não respondo a dúvidas por mensagem.
Ruben_Barbosa Posted April 22, 2009 at 10:53 AM Author Report #258199 Posted April 22, 2009 at 10:53 AM Mas eu tenho Umas Maisculas e outras minusculas. Deves ter visto mal. Quanto a parte das movimentações das peças tenho que ver ? porque não sei mesmo. MAs o que disseste tá correcto sem duvida tambem so me vai custar fazer para a 1 pk dps é so alterar umas coisitas xD
pedrosorio Posted April 22, 2009 at 11:42 AM Report #258212 Posted April 22, 2009 at 11:42 AM cb[0][col] = ch; cb[1][col] = 'p'; cb[2][col] = cb[3][col] = cb[4][col] = cb[5][col] = ' '; cb[6][col] = 'P'; cb[7][col] = ch - 32; // Maiusculas Tens razões, olhei de relance e não reparei que era um P maiúsculo. A movimentação das peças é mesmo o que te disse, garantir que a peça é do jogador e que aquela peça pode fazer aquele movimento. Não respondo a dúvidas por mensagem.
Ruben_Barbosa Posted May 4, 2009 at 04:14 PM Author Report #261264 Posted May 4, 2009 at 04:14 PM #include <stdio.h> #include <stdlib.h> #include <conio2.h> char da_lincol[2],para_lincol[2]; void imprime(char tab[8][8],int mat_tabuleiro[8][8]); int tamanho_errado(); int coluna_errada(); int linha_errada(); int sem_peca_erro(); int peca_adversario(); int sem_movimento(); int teste_mov_peao(int mat_tabuleiro[8][8],int l,int l1, int c, int c1); int teste_mov_torre(int l,int l1, int c, int c1); int teste_mov_rainha(int l,int l1, int c, int c1); int teste_mov_rei(int mat_tabuleiro[8][8],int l,int l1, int c, int c1); int teste_mov_cavalo(int l,int l1, int c, int c1); int teste_mov_bispo(int l,int l1, int c, int c1); int main(int argc, char *argv[]) { /* formatar matriz com as peças */ /* BRANCAS : 1-rei, 2-rainha, 3-bispo, 4-cavalo, 5-torre, 6-peao*/ /* PRETAS : 7-rei, 8-rainha, 9-bispo, 10-cavalo, 11-torre, 12-peao*/ /* segurança do tabuleiro int mat_tabuleiro [8][8]={{5,4,3,2,1,3,4,5},{6,6,6,6,6,6,6,6},{0,0,0,0,0,0,0,0},{0,0,0,0,0,0,0,0},{0,0,0,0,0,0,0,0},{0,0,0,0,0,0,0,0},{12,12,12,12,12,12,12,12},{11,10,9,7,8,9,10,11}}; */ char* nome_peca[] = {" ","Peao","Torre","Cavalo","Bispo","Rainha","Rei"}; int teste; /* Variavel para testes de verdade */ int z,l,c,l1,c1; /* variaveis provisorias de e para linha e coluna */ int i,i1; int mat_tabuleiro [8][8]={{5,4,3,2,1,3,4,5},{0,0,0,0,0,0,0,0},{0,0,0,0,0,0,0,0},{0,3,0,2,0,9,0,9},{0,0,0,0,0,0,0,0},{0,0,0,0,0,0,0,0},{12,12,12,12,12,12,12,12},{11,10,9,7,8,9,10,11}}; char tab[8][8]={{'T','C','B','D','R','B','C','T'},{'P','P','P','P','P','P','P','P'}}; /* armazena nome da peca */ int brc_prt; /*valores lógicos para pedra branca (1) ou preta(0)*/ /* Fazer jogada DE */ for(z=0;z<10000;z++) { teste=1; do { /* JOGAR DE */ system("CLS"); printf("Linha e coluna de onde quer mover :"); scanf("%s",da_lincol); if(strlen(da_lincol)!=2)/* testa o comprimento da variavel*/ teste= tamanho_errado; /*Chama função de tamanho errado */ else teste=0; /* converte letras em numeros e testa validade das colunas*/ if (teste==0) { switch(da_lincol[1]) { case 'a':da_lincol[1]='1';break; case 'A':da_lincol[1]='1';break; case 'b':da_lincol[1]='2';break; case 'B':da_lincol[1]='2';break; case 'c':da_lincol[1]='3';break; case 'C':da_lincol[1]='3';break; case 'd':da_lincol[1]='4';break; case 'D':da_lincol[1]='4';break; case 'e':da_lincol[1]='5';break; case 'E':da_lincol[1]='5';break; case 'f':da_lincol[1]='6';break; case 'F':da_lincol[1]='6';break; case 'g':da_lincol[1]='7';break; case 'G':da_lincol[1]='7';break; case 'h':da_lincol[1]='8';break; case 'H':da_lincol[1]='8';break; default: teste = coluna_errada; /*Chama função de coluna errada */ } } /* Teste ás linhas, tem de ser entre 1 e 8 */ if (teste==0) { /* if (da_lincol[0]!='1'&&da_lincol[0]!='2'&&da_lincol[0]!='3'&&da_lincol[0]!='4'&&da_lincol[0]!='5'&&da_lincol[0]!='6'&&da_lincol[0]!='7'&&da_lincol[0]!='8') */ if(da_lincol[0]<'1'||da_lincol[0]>'8') { teste=linha_errada; /* Chama função de coordenada errada pois a linha não tem um valor valido*/ } } /*testa se existe peca na casa pretendida */ if (teste==0) { l=da_lincol[0]-49;c=da_lincol[1]-49; /* Coloca a matriz da jogada nas variaveis lc */ if (mat_tabuleiro[l][c]==0) /* Nao existe pedra na casa selecionada */ teste=sem_peca_erro; } /* variavel brc_prt=1 peca branca brc_prt=0 peca preta */ if (teste==0) { if (mat_tabuleiro[l][c]<7) brc_prt=1; else brc_prt=0; /*testa se a peca é do jogador*/ if (brc_prt==0) teste=peca_adversario; } } while (teste==1); system("PAUSE"); /*_______________________________________________________________________________________*/ /* Fazer jogada PARA */ teste=1; do { /* JOGAR DE */ system("CLS"); printf("Linha e coluna para onde quer mover :"); scanf("%s",para_lincol); if(strlen(para_lincol)!=2) /* testa o comprimento da variavel*/ teste=tamanho_errado; /*Chama função de tamanho errado */ else teste=0; /* converte letras em numeros e testa validade das colunas*/ if (teste==0) { switch(para_lincol[1]) { case 'a':para_lincol[1]='1'; break; case 'A':para_lincol[1]='1'; break; case 'b':para_lincol[1]='2'; break; case 'B':para_lincol[1]='2'; break; case 'c':para_lincol[1]='3'; break; case 'C':para_lincol[1]='3'; break; case 'd':para_lincol[1]='4'; break; case 'D':para_lincol[1]='4'; break; case 'e':para_lincol[1]='5'; break; case 'E':para_lincol[1]='5'; break; case 'f':para_lincol[1]='6'; break; case 'F':para_lincol[1]='6'; break; case 'g':para_lincol[1]='7'; break; case 'G':para_lincol[1]='7'; break; case 'h':para_lincol[1]='8'; break; case 'H':para_lincol[1]='8'; break; default: teste=coluna_errada; /*Chama função de coluna errada */ } } /* Teste ás linhas, tem de ser entre 1 e 8 */ if (teste==0) { if (para_lincol[0]!='1'&¶_lincol[0]!='2'&¶_lincol[0]!='3'&¶_lincol[0]!='4'&¶_lincol[0]!='5'&¶_lincol[0]!='6'&¶_lincol[0]!='7'&¶_lincol[0]!='8') teste=linha_errada; /* Chama função de coordenada errada pois a linha não tem um valor valido*/ } l1=para_lincol[0]-49;c1=para_lincol[1]-49; /* Coloca a matriz da jogada nas variaveis lc */ if (l==l1&&c==c1) teste=sem_movimento; /* Chama função de erro pois não houve um movimento da peca*/ /*testa se a jogada e valida para o rei */ if (teste==0) { switch (mat_tabuleiro[l][c]) { case 1:teste=teste_mov_rei(mat_tabuleiro,l,l1,c,c1); break; case 2:teste=teste_mov_rainha(l,l1,c,c1); break; case 3:teste=teste_mov_bispo(l,l1,c,c1); break; case 4:teste=teste_mov_cavalo(l,l1,c,c1); break; case 5:teste=teste_mov_torre(l,l1,c,c1); break; case 6:teste=teste_mov_peao(mat_tabuleiro,l,l1,c,c1); break; } } } while (teste==1); mat_tabuleiro[l1][c1]=mat_tabuleiro[l][c]; mat_tabuleiro[l][c]=0; imprime(tab,mat_tabuleiro); } } /* FIM DA MAIN()*/ /*_______________________________________________________________________________________________*/ /* Funcao que devolve um aviso de erro de tamanho */ int tamanho_errado() { int i; system("CLS"); printf("So pode introduzir DOIS CARACTERES!!!\a\n\n"); system("PAUSE"); return 1; } /* Funcao que devolve um aviso de erro de coluna*/ int coluna_errada() { int i; system("CLS"); printf("A COLUNA tem de estar entre A-H !!!\a\n\n"); system("PAUSE"); return 1; } /* Funcao que devolve um aviso de erro de linha*/ int linha_errada() { int i; system("CLS"); printf("A LINHA tem de estar entre 1-8 !!!\a\n\n"); system("PAUSE"); return 1; } /* Funcao que devolve um aviso de erro de peca vazia */ int sem_peca_erro() { int i; system("CLS"); printf("Nessa posicao nao existe peca para jogar !!!\a\n\n"); system("PAUSE"); return 1; } /* Funcao que nega jogo com pecas do adversario*/ int peca_adversario() { int i; system("CLS"); printf("So pode jogar com as suas pecas !!!\a\n\n"); system("PAUSE"); return 1; } /* Funcao que nega jogo para a propria casa*/ int sem_movimento() { int i; system("CLS"); printf("Nao movimentou a peca !!!\a\n\n"); system("PAUSE"); return 1; } /* Funcao de teste ao movimeto do rei */ int teste_mov_rei(int mat_tabuleiro[8][8],int l,int l1, int c, int c1) { /* testa se o movimento e valido e se e para casa vazia*/ if(l1==l+1&&c==c1&&mat_tabuleiro[l1][c1]==0||l1==l+1&&c1==c-1&&mat_tabuleiro[l1][c1]==0||l1==l&&c1==c-1&&mat_tabuleiro[l1][c1]==0||l1==l-1&&c1==c-1&&mat_tabuleiro[l1][c1]==0||l1==l-1&&c1==c&&mat_tabuleiro[l1][c1]==0||l1==l-1&&c1==c+1&&mat_tabuleiro[l1][c1]==0||l1==l&&c1==c+1&&mat_tabuleiro[l1][c1]==0||l1==l+1&&c1==c+1&&mat_tabuleiro[l1][c1]==0) return 0; /*testa se o movimento e valido e se captura peca */ if(l1==l+1&&c==c1&&mat_tabuleiro[l1][c1]>6) { return 0; } if(l1==l+1&&c1==c-1&&mat_tabuleiro[l1][c1]>6) { return 0; } if(l1==l&&c1==c-1&&mat_tabuleiro[l1][c1]>6) { return 0; } if(l1==l-1&&c1==c-1&&mat_tabuleiro[l1][c1]>6) { return 0; } if(l1==l-1&&c1==c&&mat_tabuleiro[l1][c1]>6) { return 0; } if(l1==l-1&&c1==c+1&&mat_tabuleiro[l1][c1]>6) { return 0; } if(l1==l&&c1==c+1&&mat_tabuleiro[l1][c1]>6) { return 0; } if(l1==l+1&&c1==c+1&&mat_tabuleiro[l1][c1]>6) { return 0; } system("CLS"); printf("Essa jogada nao e valida para o rei !!!\a\n\n"); system("PAUSE"); return 1; } /* Funcao de teste ao movimeto da rainha */ int teste_mov_rainha(int l,int l1, int c, int c1) { int i,i1; /* testa na horizontal */ for (i=0;i<8;i++) { if (l1==l&&c1==i) return 0; } /* testa na vertical */ for (i=0;i<8;i++) { if (l1==i && c1==c) return 0; } /*teste na diagona para a direita + */ i1=c+1; for(i=l+1;i<8;i++) { if(i1==8) break; if(l1==i&&c1==i1) return 0; i1=i1+1; } /*teste na diagonal para a direita - */ i1=c-1; for(i=l-1;i>-1;i=i-1) { if(i1==-1) break; if(l1==i &&c1==i1) return 0; i1=i1-1; } /*teste na diagona para a esquerda + */ i1=c-1; for(i=l+1;i<8;i++) { if(i1==-1) break; if(l1==i&&c1==i1) return 0; i1=i1-1; } /*teste na diagonaL para a esquerda - */ i1=c+1; for(i=l-1;i>-1;i=i-1) { if(i1==8) break; if(l1==i&&c1==i1) return 0; i1=i1+1; } /* jogada inválida */ system("CLS"); printf("Esse movimento nao e válido para a rainha !!!\a\n\n"); system("PAUSE"); return 1; } /* Funcao de teste ao movimeto do bispo */ int teste_mov_bispo(int l,int l1, int c, int c1) { int i,i1; /*teste na diagona para a direita + */ i1=c+1; for(i=l+1;i<8;i++) { if(i1==8) break; if(l1==i&&c1==i1) return 0; i1=i1+1; } /*teste na diagona para a direita - */ i1=c-1; for(i=l-1;i>-1;i=i-1) { if(i1==-1) break; if(l1==i &&c1==i1) return 0; i1=i1-1; } /*teste na diagona para a esquerda + */ i1=c-1; for(i=l+1;i<8;i++) { if(i1==-1) break; if(l1==i&&c1==i1) return 0; i1=i1-1; } /*teste na diagona para a esquerda - */ i1=c+1; for(i=l-1;i>-1;i=i-1) { if(i1==8) break; if(l1==i&&c1==i1) return 0; i1=i1+1; } /* jogada inválida */ system("CLS"); return 1; } /* Funcao de teste ao movimeto do cavalo */ int teste_mov_cavalo(int l,int l1, int c, int c1) { if(c1==c+2&&l1==l+1||c1==c+2&&l1==l-1||c1==c-2&&l1==l+1||c1==c-2&&l1==l-1||l1==l+2&&c1==c+1||l1==l+2&&c1==c-1||l1==l-2&&c1==c+1||l1==l-2&&c1==c-1) return 0; /* Faz o teste e retorna 0=valido*/ else { system("CLS"); printf("Essa jogada nao e valida para o Cavalo !!!\a\n\n"); system("PAUSE"); return 1; } } /* Funcao de teste ao movimeto da torre */ int teste_mov_torre(int l,int l1, int c, int c1) { int i,i1; /* testa na horizontal */ for (i=0;i<8;i++) { if (l1==l&&c1==i) return 0; } /* testa na vertical */ for (i=0;i<8;i++) { if (l1==i && c1==c) return 0; } /* jogada inválida */ system("CLS"); printf("Esse movimento nao e válido para a torre !!!\a\n\n"); system("PAUSE"); return 1; } /* Funcao de teste ao movimeto do peao */ int teste_mov_peao(int mat_tabuleiro[8][8],int l,int l1, int c, int c1) { int i,i1; /* testa na vertical */ if(mat_tabuleiro[l+1][c+1]>6&&l1==l+1&&c1==c+1) /*capturou na diagonal direita*/ { return 0; } if(mat_tabuleiro[l+1][c-1]>6&&l1==l+1&&c1==c-1) /*capturou na diagonal esquerda*/ { return 0; } if(mat_tabuleiro[l+1][c+1]<7&&mat_tabuleiro[l+1][c-1]<7&&l1==l+1&&c==c1&&mat_tabuleiro[l1][c1]==0) /* jogou validamente uma casa para a frente*/ { return 0; } if(l=1&&mat_tabuleiro[l+1][c+1]<7&&mat_tabuleiro[l+1][c-1]<7&&l1==l+2&&c==c1&&mat_tabuleiro[l1][c1]==0) /* jogou validamente duas casas para a frente*/ { return 0; } { } /* jogada inválida */ system("CLS"); printf("Esse movimento nao e valido para o Peao !!!\a\n\n"); system("PAUSE"); return 1; } /* Funcao de impressao do tabuleiro*/ void imprime(char tab[8][8],int mat_tabuleiro[8][8]) { int lin,col; int s=8; for(lin=0;lin<8;lin++) { printf(" %d ",s--); for (col=0;col<8;col++) { if( mat_tabuleiro[lin][col]==1) tab[lin][col]='R'; if( mat_tabuleiro[lin][col]==2) tab[lin][col]='D'; if( mat_tabuleiro[lin][col]==3) tab[lin][col]='B'; if( mat_tabuleiro[lin][col]==4) tab[lin][col]='C'; if( mat_tabuleiro[lin][col]==5) tab[lin][col]='T'; if( mat_tabuleiro[lin][col]==6) tab[lin][col]='6'; if( mat_tabuleiro[lin][col]==0) tab[lin][col]=' '; printf("|_%c_",tab[lin][col]); } printf("|"); printf("\n\n"); } printf(" A B C D E F G H"); printf("\n\n"); system("PAUSE"); return 0; } Esta o meu codigo de xadrez ta quase completo , tipo complica mas nao faz movimentações nem aparece o tabuleiro. Ja ando as voltas e nada 😉
Recommended Posts
Create an account or sign in to comment
You need to be a member in order to leave a comment
Create an account
Sign up for a new account in our community. It's easy!
Register a new accountSign in
Already have an account? Sign in here.
Sign In Now