mayara santos / Mbed OS Damas

Dependencies:   Terminal

Embed: (wiki syntax)

« Back to documentation index

Show/hide line numbers main.cpp Source File

main.cpp

00001 
00002 #define MINLINHA 1
00003 #define MAXLINHA 8
00004 #define MINCOLUNA 1
00005 #define MAXCOLUNA 8
00006 #define PEDRA_NORMAL_JOGADOR1 '1'
00007 #define PEDRA_NORMAL_JOGADOR2 '2'
00008 #define PEDRA_DAMA_JOGADOR1 '3'
00009 #define PEDRA_DAMA_JOGADOR2 '4'
00010 #define VAZIO 'S'
00011 #define JOGADA 'J'
00012 #define CAPTURADA 'C'
00013 #define BORDA "                    "
00014 
00015 #define VITORIAS 0
00016 #define EMPATES  1
00017 #define DERROTAS 2
00018 
00019 #define HUMANO1  '1'
00020 #define HUMANO2  '2'
00021 #define MAQUINA1 '3'
00022 #define MAQUINA2 '4'
00023 
00024 #define NOME_HUMANO1  "HUMANO1"
00025 #define NOME_HUMANO2  "HUMANO2"
00026 #define NOME_MAQUINA1 "MAQUINA1"
00027 #define NOME_MAQUINA2 "MAQUINA2"
00028 #define TAM_NOME 30
00029 
00030 #define ASCII_PEDRA_NORMAL 'O'
00031 #define ASCII_PEDRA_DAMA   'D'
00032 
00033 #define ENTER 13
00034 
00035 //#define __PC__ 1
00036 #define __EMBARCADO__ 1
00037 
00038 #ifdef __PC__
00039 #define _CRT_SECURE_NO_WARNINGS
00040 #include <stdio.h>
00041 #include <memory.h>
00042 #include <stdlib.h>
00043 #include <windows.h>
00044 #include <conio.h>
00045 #include <string.h>
00046 #define PRINTF _cprintf
00047 #define SLEEP  sleep
00048 #define FIM_DE_LINHA "\n"
00049 #define GETCHE _getche
00050 
00051 #define ASCII_BLOCK     219
00052 #define ASCII_BORDER_H  205
00053 #define ASCII_BORDER_V  186
00054 #define ASCII_BORDER_TL 201
00055 #define ASCII_BORDER_TR 187
00056 #define ASCII_BORDER_BL 200
00057 #define ASCII_BORDER_BR 188
00058 
00059 HANDLE hConsoleHandle;
00060 CONSOLE_SCREEN_BUFFER_INFO *ConsoleInfo;
00061 
00062 #define BACKGROUND_WHITE (BACKGROUND_GREEN|BACKGROUND_RED|BACKGROUND_BLUE)
00063 #define FOREGROUND_WHITE (FOREGROUND_GREEN|FOREGROUND_RED|FOREGROUND_BLUE)
00064 #define BACKGROUND_BLACK 0
00065 #define FOREGROUND_BLACK 0
00066 
00067 #define COR_FUNDO_BORDA BACKGROUND_BLUE
00068 #define COR_TEXTO_BORDA FOREGROUND_WHITE
00069 
00070 #define COR_FUNDO_CASA_SEM_PEDRA BACKGROUND_WHITE
00071 #define COR_TEXTO_CASA_SEM_PEDRA FOREGROUND_WHITE
00072 
00073 #define COR_FUNDO_CASA_COM_PEDRA BACKGROUND_GREEN
00074 #define COR_TEXTO_CASA_COM_PEDRA_VAZIO FOREGROUND_GREEN
00075 #define COR_TEXTO_CASA_COM_PEDRA_JOGADOR1 FOREGROUND_WHITE
00076 #define COR_TEXTO_CASA_COM_PEDRA_JOGADOR2 FOREGROUND_RED
00077 
00078 #define COR_FUNDO_CASA_COM_PEDRA_CAPTURADA (BACKGROUND_GREEN|BACKGROUND_INTENSITY)
00079 #define COR_TEXTO_CASA_COM_PEDRA_CAPTURADA_VAZIO (BACKGROUND_GREEN|BACKGROUND_INTENSITY)
00080 #define COR_TEXTO_CASA_COM_PEDRA_CAPTURADA_JOGADOR1 (COR_TEXTO_CASA_COM_PEDRA_JOGADOR1|BACKGROUND_INTENSITY)
00081 #define COR_TEXTO_CASA_COM_PEDRA_CAPTURADA_JOGADOR2 (COR_TEXTO_CASA_COM_PEDRA_JOGADOR2|BACKGROUND_INTENSITY)
00082 
00083 #define COR_FUNDO_CASA_COM_PEDRA_JOGADA BACKGROUND_BLACK
00084 #define COR_TEXTO_CASA_COM_PEDRA_JOGADA_VAZIO BACKGROUND_BLACK
00085 #define COR_TEXTO_CASA_COM_PEDRA_JOGADA_JOGADOR1 COR_TEXTO_CASA_COM_PEDRA_JOGADOR1
00086 #define COR_TEXTO_CASA_COM_PEDRA_JOGADA_JOGADOR2 COR_TEXTO_CASA_COM_PEDRA_JOGADOR2
00087 
00088 #define COR_FUNDO_MENSAGEM BACKGROUND_BLACK
00089 #define COR_TEXTO_MENSAGEM FOREGROUND_WHITE
00090 
00091 
00092 #else
00093 #include "mbed.h"
00094 #include "Terminal.h"
00095 
00096 //Serial pc( USBTX, USBRX);
00097 Terminal term(USBTX, USBRX); // tx, rx
00098 //#define PRINTF pc.printf
00099 #define PRINTF term.printf
00100 #define SLEEP  Thread::wait
00101 #define FIM_DE_LINHA "\r\n"
00102 #define GETCHE pega_tecla_echo
00103 
00104 #define ASCII_BLOCK     219
00105 #define ASCII_BORDER_H  205
00106 #define ASCII_BORDER_V  186
00107 #define ASCII_BORDER_TL 201
00108 #define ASCII_BORDER_TR 187
00109 #define ASCII_BORDER_BL 200
00110 #define ASCII_BORDER_BR 188
00111 
00112 #define WHITE 0xFFFFFF
00113 #define WHITE_DIFERENCIADO 0x888888
00114 #define BLACK 0x000000
00115 #define GREEN 0x00FF00
00116 #define GREEN_DIFERENCIADO 0x008800
00117 #define BLUE 0x0000FF
00118 #define BLUE_DIFERENCIADO 0x000088
00119 #define RED 0xFF0000
00120 #define RED_DIFERENCIADO 0x880000
00121 
00122 #define COR_FUNDO_BORDA BLUE
00123 #define COR_TEXTO_BORDA WHITE
00124 
00125 #define COR_FUNDO_CASA_SEM_PEDRA WHITE
00126 #define COR_TEXTO_CASA_SEM_PEDRA WHITE
00127 
00128 #define COR_FUNDO_CASA_COM_PEDRA GREEN
00129 #define COR_TEXTO_CASA_COM_PEDRA_VAZIO GREEN
00130 #define COR_TEXTO_CASA_COM_PEDRA_JOGADOR1 WHITE
00131 #define COR_TEXTO_CASA_COM_PEDRA_JOGADOR2 RED
00132 
00133 #define COR_FUNDO_CASA_COM_PEDRA_CAPTURADA GREEN_DIFERENCIADO
00134 #define COR_TEXTO_CASA_COM_PEDRA_CAPTURADA_VAZIO GREEN_DIFERENCIADO
00135 #define COR_TEXTO_CASA_COM_PEDRA_CAPTURADA_JOGADOR1 WHITE_DIFERENCIADO
00136 #define COR_TEXTO_CASA_COM_PEDRA_CAPTURADA_JOGADOR2 RED_DIFERENCIADO
00137 
00138 #define COR_FUNDO_CASA_COM_PEDRA_JOGADA BLACK
00139 #define COR_TEXTO_CASA_COM_PEDRA_JOGADA_VAZIO BLACK
00140 #define COR_TEXTO_CASA_COM_PEDRA_JOGADA_JOGADOR1 COR_TEXTO_CASA_COM_PEDRA_JOGADOR1
00141 #define COR_TEXTO_CASA_COM_PEDRA_JOGADA_JOGADOR2 COR_TEXTO_CASA_COM_PEDRA_JOGADOR2
00142 
00143 #define COR_FUNDO_MENSAGEM BLACK
00144 #define COR_TEXTO_MENSAGEM WHITE
00145 
00146 
00147 #endif
00148 
00149 char tabuleiro_controle[MAXLINHA][MAXCOLUNA], tabuleiro_jogada[MAXLINHA][MAXCOLUNA];
00150 int jogadas = 0;
00151 int jogada_em_que_ultima_pedra_capturada = 0;
00152 int jogada_em_que_ultima_pedra_nomal_movimentada = 0;
00153 int jogada_empate_lances_especiais = 0;
00154 int placar[4][3];
00155 //int numero_pedras_para_capturar = -1;
00156 
00157 int numero_pedras_capturadas_jogador1 = 0;
00158 int numero_pedras_capturadas_jogador2 = 0;
00159 
00160 int numero_pedras_capturadas_antes_jogador1 = 0;
00161 int numero_pedras_capturadas_antes_jogador2 = 0;
00162 
00163 #ifdef __EMBARCADO__
00164 
00165 char pega_tecla_echo(void) {
00166     char retorno;
00167     
00168     //retorno = pc.getc();
00169     retorno = term.getc();
00170     //pc.putc(retorno);
00171     term.putc(retorno);
00172     return retorno;
00173 }
00174 
00175 #endif
00176 
00177 void SELECIONA_COR(int cor_fundo, int cor_texto) {
00178 
00179 #ifdef __PC__
00180     SetConsoleTextAttribute(hConsoleHandle, cor_fundo | cor_texto);
00181 #else
00182     term.foreground(cor_texto);
00183     term.background(cor_fundo);
00184 #endif
00185 
00186 }
00187 
00188 void LOCATE(int coluna, int linha) {
00189 
00190 #ifdef __PC__
00191     COORD coordScreen;
00192 
00193     coordScreen.X = coluna;
00194     coordScreen.Y = linha;
00195     SetConsoleCursorPosition(hConsoleHandle, coordScreen);
00196 #else
00197     term.locate(coluna, linha);
00198 #endif
00199 
00200 }
00201 
00202 
00203 int lerIteiro(void) {
00204     
00205     char buffer[100+1];
00206     int indice;
00207     char lido;
00208     
00209     memset(buffer, 0, sizeof(buffer));
00210     
00211     for(indice = 0; indice < sizeof(buffer) - 1; ++indice) {
00212         lido = GETCHE();
00213         
00214         if(lido == ENTER) {
00215             break;
00216         } else {
00217             buffer[indice] = lido;
00218         }
00219     }
00220     
00221     return(atoi(buffer));
00222 }
00223 
00224 #ifdef __PC__
00225 
00226 void cls(HANDLE hConsole)
00227 {
00228     COORD coordScreen = { 0, 0 };    /* here's where we'll home the
00229                                      cursor */
00230     BOOL bSuccess;
00231     DWORD cCharsWritten;
00232     CONSOLE_SCREEN_BUFFER_INFO csbi; /* to get buffer info */
00233     DWORD dwConSize;                 /* number of character cells in
00234                                      the current buffer */
00235 
00236                                      /* get the number of character cells in the current buffer */
00237 
00238     SetConsoleTextAttribute(hConsoleHandle, ConsoleInfo->wAttributes);
00239 
00240     bSuccess = GetConsoleScreenBufferInfo(hConsole, &csbi);
00241     dwConSize = csbi.dwSize.X * csbi.dwSize.Y;
00242 
00243     /* fill the entire screen with blanks */
00244 
00245     bSuccess = FillConsoleOutputCharacter(hConsole, (TCHAR) ' ',
00246         dwConSize, coordScreen, &cCharsWritten);
00247 
00248     /* get the current text attribute */
00249 
00250     bSuccess = GetConsoleScreenBufferInfo(hConsole, &csbi);
00251 
00252     /* now set the buffer's attributes accordingly */
00253 
00254     bSuccess = FillConsoleOutputAttribute(hConsole, csbi.wAttributes,
00255         dwConSize, coordScreen, &cCharsWritten);
00256 
00257     /* put the cursor at (0, 0) */
00258 
00259     bSuccess = SetConsoleCursorPosition(hConsole, coordScreen);
00260     return;
00261 }
00262 
00263 void LimparTela(void) {
00264     //system("CLS");
00265     cls(hConsoleHandle);
00266 }
00267 
00268 #else
00269     
00270 void LimparTela(void) {
00271     //PRINTF("\033[2J\033[1;1H");
00272     //PRINTF("\e[1;1H\e[2J");
00273     term.cls();
00274 }
00275 
00276 #endif
00277 
00278 char * retorna_nome_jogador(char opcao1, char *nome) {
00279 
00280     switch (opcao1) {
00281         case HUMANO1:
00282             strcpy(nome, NOME_HUMANO1);
00283             break;
00284         case HUMANO2:
00285             strcpy(nome, NOME_HUMANO2);
00286             break;
00287         case MAQUINA1:
00288             strcpy(nome, NOME_MAQUINA1);
00289             break;
00290         case MAQUINA2:
00291             strcpy(nome, NOME_MAQUINA2);
00292             break;
00293     }
00294 
00295     return nome;
00296 }
00297 
00298 char * retorna_nome_jogador_tipo_jogo(int indice, char opcao1, char *nome) {
00299 
00300     switch(opcao1) {
00301         case '1':
00302             if(indice == 1) {
00303                 strcpy(nome, NOME_HUMANO1);
00304             } else {
00305                 strcpy(nome, NOME_HUMANO2);
00306             }
00307             break;
00308         case '2':
00309             if(indice == 1) {
00310                 strcpy(nome, NOME_HUMANO1);
00311             } else {
00312                 strcpy(nome, NOME_MAQUINA1);
00313             }
00314             break;
00315         case '3':
00316             if(indice == 1) {
00317                 strcpy(nome, NOME_MAQUINA1);
00318             } else {
00319                 strcpy(nome, NOME_MAQUINA2);
00320             }
00321             break;
00322     }
00323     
00324     return nome;
00325 }
00326 
00327 char retorna_jogador(int indice, char opcao1) {
00328     
00329     char jogador;
00330 
00331     switch(opcao1) {
00332         case '1':
00333             if(indice == 1) {
00334                 jogador = HUMANO1;
00335             } else {
00336                 jogador = HUMANO2;
00337             }
00338             break;
00339         case '2':
00340             if(indice == 1) {
00341                 jogador = HUMANO1;
00342             } else {
00343                 jogador = MAQUINA1;
00344             }
00345             break;
00346         case '3':
00347             if(indice == 1) {
00348                 jogador = MAQUINA1;
00349             } else {
00350                 jogador = MAQUINA2;
00351             }
00352             break;
00353     }
00354     
00355     return jogador;
00356 }
00357 
00358 void imprime_placar(void) {
00359     
00360     char nome[TAM_NOME + 1];
00361     int indice, tamanho;
00362 
00363     LimparTela();
00364 
00365     SELECIONA_COR(COR_FUNDO_MENSAGEM, COR_TEXTO_MENSAGEM);
00366     LOCATE(10, 1);
00367     PRINTF("PLACAR%s", FIM_DE_LINHA);
00368     PRINTF("%- *.*s|VITORIAS|EMPATES|DERROTAS%s", TAM_NOME, TAM_NOME, "JOGADOR", FIM_DE_LINHA);
00369     
00370     tamanho = TAM_NOME + 1 + strlen("VITORIAS") + 1 + strlen("EMPATES") + 1 + strlen("DERROTAS");
00371 
00372     for (indice = 0; indice < tamanho; ++indice) {
00373         PRINTF("%c", ASCII_BORDER_H);
00374     }
00375     PRINTF("%s", FIM_DE_LINHA);
00376 
00377 
00378 
00379     SELECIONA_COR(COR_FUNDO_CASA_COM_PEDRA, COR_TEXTO_CASA_COM_PEDRA_JOGADOR1);
00380     PRINTF("%- *.*s|%0*d|%0*d|%0*d%s", 
00381         TAM_NOME, TAM_NOME, retorna_nome_jogador(HUMANO1, nome), 
00382         strlen("VITORIAS"), placar[HUMANO1 - '1'][VITORIAS],
00383         strlen("EMPATES"), placar[HUMANO1 - '1'][EMPATES],
00384         strlen("DERROTAS"), placar[HUMANO1 - '1'][DERROTAS], FIM_DE_LINHA);
00385     SELECIONA_COR(COR_FUNDO_CASA_COM_PEDRA, COR_TEXTO_CASA_COM_PEDRA_JOGADOR2);
00386     PRINTF("%- *.*s|%0*d|%0*d|%0*d%s",
00387         TAM_NOME, TAM_NOME, retorna_nome_jogador(HUMANO2, nome),
00388         strlen("VITORIAS"), placar[HUMANO2 - '1'][VITORIAS],
00389         strlen("EMPATES"), placar[HUMANO2 - '1'][EMPATES],
00390         strlen("DERROTAS"), placar[HUMANO2 - '1'][DERROTAS], FIM_DE_LINHA);
00391 #if 0
00392     SELECIONA_COR(COR_FUNDO_CASA_COM_PEDRA, COR_TEXTO_CASA_COM_PEDRA_JOGADOR1);
00393     PRINTF("%- *.*s|%0*d|%0*d|%0*d%s",
00394         TAM_NOME, TAM_NOME, retorna_nome_jogador(MAQUINA1, nome),
00395         strlen("VITORIAS"), placar[MAQUINA1 - '1'][VITORIAS],
00396         strlen("EMPATES"), placar[MAQUINA1 - '1'][EMPATES],
00397         strlen("DERROTAS"), placar[MAQUINA1 - '1'][DERROTAS], FIM_DE_LINHA);
00398     SELECIONA_COR(COR_FUNDO_CASA_COM_PEDRA, COR_TEXTO_CASA_COM_PEDRA_JOGADOR2);
00399     PRINTF("%- *.*s|%0*d|%0*d|%0*d%s",
00400         TAM_NOME, TAM_NOME, retorna_nome_jogador(MAQUINA2, nome),
00401         strlen("VITORIAS"), placar[MAQUINA2 - '1'][VITORIAS],
00402         strlen("EMPATES"), placar[MAQUINA2 - '1'][EMPATES],
00403         strlen("DERROTAS"), placar[MAQUINA2 - '1'][DERROTAS], FIM_DE_LINHA);
00404 #endif
00405 
00406     SELECIONA_COR(COR_FUNDO_MENSAGEM, COR_TEXTO_MENSAGEM);
00407     PRINTF("%s", FIM_DE_LINHA);
00408     PRINTF("Pressione <Qualquer Tecla>");
00409     GETCHE();
00410 }
00411 
00412 
00413 void ImprimeMenu(char &jogador1, char &jogador2) {
00414     
00415     char opcao1, opcao2;
00416     int indice;
00417     char nome[TAM_NOME + 1];
00418     
00419     do {
00420         LimparTela();
00421         SELECIONA_COR(COR_FUNDO_MENSAGEM, COR_TEXTO_MENSAGEM);
00422         PRINTF("1 - %s  X %s%s", NOME_HUMANO1, NOME_HUMANO2, FIM_DE_LINHA);
00423 #if 0
00424         PRINTF("2 - %s  X %s%s", NOME_HUMANO1, NOME_MAQUINA1, FIM_DE_LINHA);
00425         PRINTF("3 - %s X %s%s",  NOME_MAQUINA1, NOME_MAQUINA2, FIM_DE_LINHA);
00426 #endif
00427         //PRINTF("4 - PLACAR%s", FIM_DE_LINHA);
00428         PRINTF("2 - PLACAR%s", FIM_DE_LINHA);
00429         
00430         opcao1 = GETCHE();
00431         
00432         //if(opcao1 == '4') {
00433         if (opcao1 == '2') {
00434             imprime_placar();
00435         }
00436         
00437     } while( opcao1 < '1'  || opcao1 > '1' );
00438     
00439     do {
00440         indice = 0;
00441         LimparTela();
00442         ++indice;
00443         SELECIONA_COR(COR_FUNDO_MENSAGEM, COR_TEXTO_MENSAGEM);
00444         PRINTF("%d - %s INICIA O JOGO%s", indice, retorna_nome_jogador_tipo_jogo(indice, opcao1, nome), FIM_DE_LINHA);
00445         ++indice;
00446         PRINTF("%d - %s INICIA O JOGO%s", indice, retorna_nome_jogador_tipo_jogo(indice, opcao1, nome), FIM_DE_LINHA);
00447         
00448         opcao2 = GETCHE();
00449     } while( opcao2 < '1'  || opcao2 > '2' );
00450     
00451     if(opcao2 == '1') {
00452         jogador1 = retorna_jogador(1, opcao1);
00453         jogador2 = retorna_jogador(2, opcao1);
00454     } else {
00455         jogador1 = retorna_jogador(2, opcao1);
00456         jogador2 = retorna_jogador(1, opcao1);
00457     }
00458 
00459     LimparTela();
00460     
00461 }
00462 
00463 void InicializarTabuleiro(char jogador_que_inicia, char segundo_jogador) {
00464     
00465     int indice1, indice2;
00466     
00467     memset(tabuleiro_jogada, VAZIO, sizeof(tabuleiro_controle));
00468     
00469     for(indice1 = 0; indice1 < MAXCOLUNA; ++indice1) {
00470         //for(indice2 = 0; indice2 < ((MAXLINHA/2)-1); ++indice2) {
00471         for (indice2 = 0; indice2 < 1; ++indice2) {
00472             if( (indice2 == 0) || (indice2 == 2) ){
00473                 if((indice1%2) == 1) {
00474                     tabuleiro_jogada[indice2][indice1] = segundo_jogador;
00475                 }
00476             } else {
00477                 if((indice1%2) == 0) {
00478                     tabuleiro_jogada[indice2][indice1] = segundo_jogador;
00479                 }
00480             }
00481         }
00482     }
00483     
00484     for(indice1 = 0; indice1 < MAXCOLUNA; ++indice1) {
00485         for(indice2 = (MAXLINHA - 1); indice2 > (MAXLINHA/2); --indice2) {
00486             if(indice2 == 6){
00487                 if((indice1%2) == 1) {
00488                     tabuleiro_jogada[indice2][indice1] = jogador_que_inicia;
00489                 }
00490             } else {
00491                 if((indice1%2) == 0) {
00492                     tabuleiro_jogada[indice2][indice1] = jogador_que_inicia;
00493                 }
00494             }
00495         }
00496     }
00497     
00498     memcpy(tabuleiro_controle, tabuleiro_jogada, sizeof(tabuleiro_jogada));
00499 }
00500 
00501 void ImprimirTabuleiro(char jogador1, char jogador2) {
00502     
00503     char nome1[TAM_NOME + 1];
00504     char nome2[TAM_NOME + 1];
00505     int linha, coluna;
00506 
00507     LimparTela();
00508     SELECIONA_COR(COR_FUNDO_MENSAGEM, COR_TEXTO_MENSAGEM);
00509 
00510     LOCATE(10, 1);
00511     PRINTF("PARTIDA DE DAMAS ");
00512     SELECIONA_COR(COR_FUNDO_MENSAGEM, COR_TEXTO_CASA_COM_PEDRA_JOGADOR1);
00513     PRINTF("%s", retorna_nome_jogador(jogador1, nome1));
00514     SELECIONA_COR(COR_FUNDO_MENSAGEM, COR_TEXTO_MENSAGEM);
00515     PRINTF("(%d) VERSUS ", numero_pedras_capturadas_jogador1);
00516     SELECIONA_COR(COR_FUNDO_MENSAGEM, COR_TEXTO_CASA_COM_PEDRA_JOGADOR2);
00517     PRINTF("%s", retorna_nome_jogador(jogador2, nome2));
00518     SELECIONA_COR(COR_FUNDO_MENSAGEM, COR_TEXTO_MENSAGEM);
00519     PRINTF("(%d) % s", numero_pedras_capturadas_jogador2, FIM_DE_LINHA);
00520 
00521     SELECIONA_COR(COR_FUNDO_MENSAGEM, COR_TEXTO_MENSAGEM);
00522     PRINTF("%s", BORDA);
00523 
00524     SELECIONA_COR(COR_FUNDO_BORDA, COR_TEXTO_BORDA);
00525     PRINTF("  12345678 %s", FIM_DE_LINHA);
00526 
00527     SELECIONA_COR(COR_FUNDO_MENSAGEM, COR_TEXTO_MENSAGEM);
00528     PRINTF("%s", BORDA);
00529 
00530     SELECIONA_COR(COR_FUNDO_BORDA, COR_TEXTO_BORDA);
00531     PRINTF(" %c", ASCII_BORDER_TL);
00532     for (coluna = 0; coluna < MAXCOLUNA; ++coluna) {
00533         PRINTF("%c", ASCII_BORDER_H);
00534     }
00535     PRINTF("%c%s", ASCII_BORDER_TR, FIM_DE_LINHA);
00536 
00537     for (linha = 0; linha < MAXLINHA; ++linha) {
00538 
00539         SELECIONA_COR(COR_FUNDO_MENSAGEM, COR_TEXTO_MENSAGEM);
00540         PRINTF("%s", BORDA);
00541 
00542         SELECIONA_COR(COR_FUNDO_BORDA, COR_TEXTO_BORDA);
00543         PRINTF("%d%c", linha + 1, ASCII_BORDER_V);
00544         if (linha % 2 == 0) {
00545             // Este tipo de linha comeca com um tipo de casa na qual 
00546             //  as pedras nao podem se movimentar
00547             for (coluna = 0; coluna < MAXCOLUNA; ++coluna) {
00548                 if (coluna % 2 == 0) {
00549                     SELECIONA_COR(COR_FUNDO_CASA_SEM_PEDRA, COR_TEXTO_CASA_SEM_PEDRA);
00550                     PRINTF(" ");
00551                 }
00552                 else {
00553                     switch (tabuleiro_jogada[linha][coluna]) {
00554                         case PEDRA_NORMAL_JOGADOR1:
00555                             SELECIONA_COR(COR_FUNDO_CASA_COM_PEDRA, COR_TEXTO_CASA_COM_PEDRA_JOGADOR1);
00556                             PRINTF("%c", ASCII_PEDRA_NORMAL);
00557                             break;
00558                         case PEDRA_NORMAL_JOGADOR2:
00559                             SELECIONA_COR(COR_FUNDO_CASA_COM_PEDRA, COR_TEXTO_CASA_COM_PEDRA_JOGADOR2);
00560                             PRINTF("%c", ASCII_PEDRA_NORMAL);
00561                             break;
00562                         case PEDRA_DAMA_JOGADOR1:
00563                             SELECIONA_COR(COR_FUNDO_CASA_COM_PEDRA, COR_TEXTO_CASA_COM_PEDRA_JOGADOR1);
00564                             PRINTF("%c", ASCII_PEDRA_DAMA);
00565                             break;
00566                         case PEDRA_DAMA_JOGADOR2:
00567                             SELECIONA_COR(COR_FUNDO_CASA_COM_PEDRA, COR_TEXTO_CASA_COM_PEDRA_JOGADOR2);
00568                             PRINTF("%c", ASCII_PEDRA_DAMA);
00569                             break;
00570                         case VAZIO:
00571                             SELECIONA_COR(COR_FUNDO_CASA_COM_PEDRA, COR_TEXTO_CASA_COM_PEDRA_VAZIO);
00572                             PRINTF(" ");
00573                             break;
00574                         case JOGADA:
00575                             SELECIONA_COR(COR_FUNDO_CASA_COM_PEDRA_JOGADA, COR_TEXTO_CASA_COM_PEDRA_JOGADA_VAZIO);
00576                             PRINTF(" ");
00577                             break;
00578                         case CAPTURADA:
00579                             switch (tabuleiro_controle[linha][coluna]) {
00580                                 case PEDRA_NORMAL_JOGADOR1:
00581                                     SELECIONA_COR(COR_FUNDO_CASA_COM_PEDRA_CAPTURADA, COR_TEXTO_CASA_COM_PEDRA_CAPTURADA_JOGADOR1);
00582                                     PRINTF("%c", ASCII_PEDRA_NORMAL);
00583                                     break;
00584                                 case PEDRA_DAMA_JOGADOR1:
00585                                     SELECIONA_COR(COR_FUNDO_CASA_COM_PEDRA_CAPTURADA, COR_TEXTO_CASA_COM_PEDRA_CAPTURADA_JOGADOR1);
00586                                     PRINTF("%c", ASCII_PEDRA_DAMA);
00587                                     break;
00588                                 case PEDRA_NORMAL_JOGADOR2:
00589                                     SELECIONA_COR(COR_FUNDO_CASA_COM_PEDRA_CAPTURADA, COR_TEXTO_CASA_COM_PEDRA_CAPTURADA_JOGADOR2);
00590                                     PRINTF("%c", ASCII_PEDRA_NORMAL);
00591                                     break;
00592                                 case PEDRA_DAMA_JOGADOR2:
00593                                     SELECIONA_COR(COR_FUNDO_CASA_COM_PEDRA_CAPTURADA, COR_TEXTO_CASA_COM_PEDRA_CAPTURADA_JOGADOR2);
00594                                     PRINTF("%c", ASCII_PEDRA_DAMA);
00595                                     break;
00596                             }
00597                             break;
00598                     }
00599                 }
00600             }
00601             SELECIONA_COR(COR_FUNDO_BORDA, COR_TEXTO_BORDA);
00602             PRINTF("%c", ASCII_BORDER_V);
00603             PRINTF("%s", FIM_DE_LINHA);
00604         }
00605         else {
00606             // Este tipo de linha comeca com um tipo de casa na qual 
00607             //  as pedras podem se movimentar
00608             for (coluna = 0; coluna < MAXCOLUNA; ++coluna) {
00609                 if (coluna % 2 == 1) {
00610                     SELECIONA_COR(COR_FUNDO_CASA_SEM_PEDRA, COR_TEXTO_CASA_SEM_PEDRA);
00611                     PRINTF(" ");
00612                 }
00613                 else {
00614                     switch (tabuleiro_jogada[linha][coluna]) {
00615                     case PEDRA_NORMAL_JOGADOR1:
00616                         SELECIONA_COR(COR_FUNDO_CASA_COM_PEDRA, COR_TEXTO_CASA_COM_PEDRA_JOGADOR1);
00617                         PRINTF("%c", ASCII_PEDRA_NORMAL);
00618                         break;
00619                     case PEDRA_NORMAL_JOGADOR2:
00620                         SELECIONA_COR(COR_FUNDO_CASA_COM_PEDRA, COR_TEXTO_CASA_COM_PEDRA_JOGADOR2);
00621                         PRINTF("%c", ASCII_PEDRA_NORMAL);
00622                         break;
00623                     case PEDRA_DAMA_JOGADOR1:
00624                         SELECIONA_COR(COR_FUNDO_CASA_COM_PEDRA, COR_TEXTO_CASA_COM_PEDRA_JOGADOR1);
00625                         PRINTF("%c", ASCII_PEDRA_DAMA);
00626                         break;
00627                     case PEDRA_DAMA_JOGADOR2:
00628                         SELECIONA_COR(COR_FUNDO_CASA_COM_PEDRA, COR_TEXTO_CASA_COM_PEDRA_JOGADOR2);
00629                         PRINTF("%c", ASCII_PEDRA_DAMA);
00630                         break;
00631                     case VAZIO:
00632                         SELECIONA_COR(COR_FUNDO_CASA_COM_PEDRA, COR_TEXTO_CASA_COM_PEDRA_VAZIO);
00633                         PRINTF(" ");
00634                         break;
00635                     case JOGADA:
00636                         SELECIONA_COR(COR_FUNDO_CASA_COM_PEDRA_JOGADA, COR_TEXTO_CASA_COM_PEDRA_JOGADA_VAZIO);
00637                         PRINTF(" ");
00638                         break;
00639                     case CAPTURADA:
00640                         switch (tabuleiro_controle[linha][coluna]) {
00641                         case PEDRA_NORMAL_JOGADOR1:
00642                             SELECIONA_COR(COR_FUNDO_CASA_COM_PEDRA_CAPTURADA, COR_TEXTO_CASA_COM_PEDRA_CAPTURADA_JOGADOR1);
00643                             PRINTF("%c", ASCII_PEDRA_NORMAL);
00644                             break;
00645                         case PEDRA_DAMA_JOGADOR1:
00646                             SELECIONA_COR(COR_FUNDO_CASA_COM_PEDRA_CAPTURADA, COR_TEXTO_CASA_COM_PEDRA_CAPTURADA_JOGADOR1);
00647                             PRINTF("%c", ASCII_PEDRA_DAMA);
00648                             break;
00649                         case PEDRA_NORMAL_JOGADOR2:
00650                             SELECIONA_COR(COR_FUNDO_CASA_COM_PEDRA_CAPTURADA, COR_TEXTO_CASA_COM_PEDRA_CAPTURADA_JOGADOR2);
00651                             PRINTF("%c", ASCII_PEDRA_NORMAL);
00652                             break;
00653                         case PEDRA_DAMA_JOGADOR2:
00654                             SELECIONA_COR(COR_FUNDO_CASA_COM_PEDRA_CAPTURADA, COR_TEXTO_CASA_COM_PEDRA_CAPTURADA_JOGADOR2);
00655                             PRINTF("%c", ASCII_PEDRA_DAMA);
00656                             break;
00657                         }
00658                         break;
00659                     }
00660                 }
00661             }
00662             SELECIONA_COR(COR_FUNDO_BORDA, COR_TEXTO_BORDA);
00663             PRINTF("%c", ASCII_BORDER_V);
00664             PRINTF("%s", FIM_DE_LINHA);
00665         }
00666     }
00667 
00668     SELECIONA_COR(COR_FUNDO_MENSAGEM, COR_TEXTO_MENSAGEM);
00669     PRINTF("%s", BORDA);
00670 
00671     SELECIONA_COR(COR_FUNDO_BORDA, COR_TEXTO_BORDA);
00672     PRINTF(" %c", ASCII_BORDER_BL);
00673     for (coluna = 0; coluna < MAXCOLUNA; ++coluna) {
00674         PRINTF("%c", ASCII_BORDER_H);
00675     }
00676     PRINTF("%c%s", ASCII_BORDER_BR, FIM_DE_LINHA);
00677 }
00678 
00679 // 0 - Movimento simples
00680 // 1 - Movimento com multiplas capturas
00681 int Movimento_Multiplo(void) {
00682 
00683     int linha, coluna;
00684 
00685     return 0;
00686 
00687     for (linha = 0; linha < MAXLINHA; ++linha) {
00688         for (coluna = 0; coluna < MAXCOLUNA; ++coluna) {
00689             if (tabuleiro_jogada[linha][coluna] == JOGADA) {
00690                 // nao pode jogar sem capturar em uma jogada com multiplas capturas
00691                 return 1;
00692             }
00693         }
00694     }
00695     return 0;
00696 }
00697 
00698 // 0 - Movimento de pedra simples nao eh para traz
00699 // 1 - Movimento de pedra simples eh para traz
00700 int Movimento_Para_Traz(int linha_origem, int linha_destino, char jogador1, char jogador_vez) {
00701 
00702     int retorno = 0;
00703 
00704     // O jogador 1 sempre começa o jogo e ele sempre inicia a partir da parte de baixo do tabuleiro
00705     if (jogador_vez == jogador1) {
00706         if ((linha_origem - linha_destino) <= 0) {
00707             retorno = 1;
00708         }
00709     }
00710     else {
00711         if ((linha_destino - linha_origem) <= 0) {
00712             retorno = 1;
00713         }
00714     }
00715 
00716     return retorno;
00717 }
00718 
00719 // retorna numero de pedras que faltam capturar
00720 int Existe_Pedra_Para_Capturar(void) {
00721 
00722     return 0;
00723 #if 0
00724     if ( (numero_pedras_para_capturar == -1) || (numero_pedras_para_capturar == 0) ) {
00725         return 0;
00726     }
00727     return numero_pedras_para_capturar;
00728 #endif
00729 }
00730 
00731 char Posiciona_Pedra(int linha_origem, int coluna_origem, int linha_destino, int coluna_destino, char jogador_vez, char jogador1) {
00732     char retorno;
00733 
00734     // O jogador 1 sempre começa o jogo e ele sempre inicia a partir da parte de baixo do tabuleiro
00735     if (jogador_vez == jogador1) {
00736         //if ( (linha_destino == (MINLINHA - 1)) && ( (numero_pedras_para_capturar == -1) || (numero_pedras_para_capturar == 0)) ) {
00737         if (linha_destino == (MINLINHA - 1)) {
00738             retorno = PEDRA_DAMA_JOGADOR1;
00739         }
00740         else {
00741             retorno = tabuleiro_jogada[linha_origem][coluna_origem];
00742         }
00743     }
00744     else {
00745         //if ((linha_destino == (MAXLINHA - 1)) && ((numero_pedras_para_capturar == -1) || (numero_pedras_para_capturar == 0))) {
00746         if (linha_destino == (MAXLINHA - 1)) {
00747             retorno = PEDRA_DAMA_JOGADOR2;
00748         }
00749         else {
00750             retorno = tabuleiro_jogada[linha_origem][coluna_origem];
00751         }
00752     }
00753 
00754     return retorno;
00755 }
00756 
00757 // 0 - Esta no caminho maximo de captura
00758 // 1 - Nao esta no caminho maximo de captura
00759 int Caminho_Maximo_Captura(int linha_origem, int coluna_origem, int linha_destino, int coluna_destino) {
00760     // @todo fazer funcao
00761     //int retorno = 1;
00762     int retorno = 0;
00763 
00764     return retorno;
00765 }
00766 
00767 void Calcula_Quantidade_Maxima_Capturas(char jogador_vez, char jogador1, char jogador2) {
00768 
00769     // @todo fazer funcao
00770 
00771     return;
00772 
00773     //if (numero_pedras_para_capturar > 0) {
00774     //    return;  // funcao ja foi executada
00775     //}
00776 
00777 }
00778 
00779 void contabiliza_pedra(char jogador_vez, char jogador1, char jogador2) {
00780 
00781     if (jogador_vez == jogador1) {
00782         ++numero_pedras_capturadas_jogador1;
00783     }
00784     else {
00785         ++numero_pedras_capturadas_jogador2;
00786     }
00787 }
00788 
00789 // 0 - Movimento Invalido
00790 // 1 - Movimento Valido
00791 int Movimento_Valido(int &linha_origem, int &coluna_origem, int &linha_destino, int &coluna_destino, char jogador_vez, char jogador1, char jogador2) {
00792 
00793     char pedra_normal = 1;
00794     char pedra_normal_oponente;
00795     char pedra_dama_oponente;
00796     char pedra_normal_jogador;
00797     char pedra_dama_jogador;
00798     int  unidade_linha, unidade_coluna, linha_aux, coluna_aux, pedras_capturadas;
00799     int  linha_pedra_capturada, coluna_pedra_capturada;
00800 
00801     // Valida se existe uma pedra deste jogador no tabuleiro de jogada na posicao de origem.
00802     // O tabuleiro de jogada server para guardar a memoria de uma jogada com multiplas capturas, 
00803     //  por isso que´eh utilizado para validar as jogadas.
00804     if (jogador_vez == jogador1) {
00805         pedra_normal_jogador = PEDRA_NORMAL_JOGADOR1;
00806         pedra_dama_jogador = PEDRA_DAMA_JOGADOR1;
00807         pedra_normal_oponente = PEDRA_NORMAL_JOGADOR2;
00808         pedra_dama_oponente = PEDRA_DAMA_JOGADOR2;
00809         if (tabuleiro_jogada[linha_origem][coluna_origem] == PEDRA_NORMAL_JOGADOR1) {
00810         } else if (tabuleiro_jogada[linha_origem][coluna_origem] == PEDRA_DAMA_JOGADOR1) {
00811             pedra_normal = 0;
00812         } else {
00813             return 0; // pedra nao pertence ao jogador
00814         }
00815     }
00816     else {
00817         pedra_normal_jogador = PEDRA_NORMAL_JOGADOR2;
00818         pedra_dama_jogador = PEDRA_DAMA_JOGADOR2;
00819         pedra_normal_oponente = PEDRA_NORMAL_JOGADOR1;
00820         pedra_dama_oponente = PEDRA_DAMA_JOGADOR1;
00821         if (tabuleiro_jogada[linha_origem][coluna_origem] == PEDRA_NORMAL_JOGADOR2) {
00822         } else if (tabuleiro_jogada[linha_origem][coluna_origem] == PEDRA_DAMA_JOGADOR2) {
00823             pedra_normal = 0;
00824         }
00825         else {
00826             return 0; // pedra nao pertence ao jogador
00827         }
00828     }
00829 
00830     Calcula_Quantidade_Maxima_Capturas(jogador_vez, jogador1, jogador2);
00831 
00832     if (pedra_normal) {
00833         // pedra jogada eh normal
00834         // valida se a coordenada de destino eh valida para uma captura
00835         if ((linha_origem - linha_destino) == 2) { 
00836             if ((coluna_origem - coluna_destino) == 2) {
00837                 if (Caminho_Maximo_Captura(linha_origem, coluna_origem, linha_destino, coluna_destino)) {
00838                     return 0; // Eh obrigatorio executar a jogada que 
00839                               //   captura o maximo de pedras do adversario
00840                 }
00841                 // diagonal para cima e para esquerda 
00842                 if ( (tabuleiro_jogada[linha_destino][coluna_destino] == VAZIO) || 
00843                      (tabuleiro_jogada[linha_destino][coluna_destino] == JOGADA) ) { // a posicao destino deve estar vazia ou foi uma jogada 
00844                     if (tabuleiro_jogada[linha_destino + 1][coluna_destino + 1] == pedra_normal_oponente) {
00845                         // pedra normal do oponente capturada
00846                         tabuleiro_jogada[linha_destino + 1][coluna_destino + 1] = CAPTURADA;
00847                         //--numero_pedras_para_capturar;
00848                         contabiliza_pedra(jogador_vez, jogador1, jogador2);
00849                         jogada_em_que_ultima_pedra_capturada = jogadas + 1;
00850                         tabuleiro_jogada[linha_destino][coluna_destino] = 
00851                             Posiciona_Pedra(linha_origem, coluna_origem, linha_destino, coluna_destino, 
00852                                 jogador_vez, jogador1);
00853                         tabuleiro_jogada[linha_origem][coluna_origem] = JOGADA;
00854                     }
00855                     else if (tabuleiro_jogada[linha_destino + 1][coluna_destino + 1] == pedra_dama_oponente) {
00856                         // pedra dama do oponente capturada
00857                         tabuleiro_jogada[linha_destino + 1][coluna_destino + 1] = CAPTURADA;
00858                         //--numero_pedras_para_capturar;
00859                         contabiliza_pedra(jogador_vez, jogador1, jogador2);
00860                         jogada_em_que_ultima_pedra_capturada = jogadas + 1;
00861                         tabuleiro_jogada[linha_destino][coluna_destino] =
00862                             Posiciona_Pedra(linha_origem, coluna_origem, linha_destino, coluna_destino,
00863                                 jogador_vez, jogador1);
00864                         tabuleiro_jogada[linha_origem][coluna_origem] = JOGADA;
00865                     }
00866                     else {
00867                         // pedra capturada invalida!!
00868                         return 0;
00869                     }
00870                 }
00871                 else {
00872                     return 0;  // casa destino ocupada!!
00873                 }
00874             }
00875             else if ((coluna_destino - coluna_origem) == 2) {
00876                 if (Caminho_Maximo_Captura(linha_origem, coluna_origem, linha_destino, coluna_destino)) {
00877                     return 0; // Eh obrigatorio executar a jogada que 
00878                               //   captura o maximo de pedras do adversario
00879                 }
00880                 // diagonal para cima e para direita
00881                 if ((tabuleiro_jogada[linha_destino][coluna_destino] == VAZIO) ||
00882                     (tabuleiro_jogada[linha_destino][coluna_destino] == JOGADA)) { // a posicao destino deve estar vazia ou foi uma jogada 
00883                     if (tabuleiro_jogada[linha_destino + 1][coluna_destino - 1] == pedra_normal_oponente) {
00884                         // pedra normal do oponente capturada
00885                         tabuleiro_jogada[linha_destino + 1][coluna_destino - 1] = CAPTURADA;
00886                         //--numero_pedras_para_capturar;
00887                         contabiliza_pedra(jogador_vez, jogador1, jogador2);
00888                         jogada_em_que_ultima_pedra_capturada = jogadas + 1;
00889                         tabuleiro_jogada[linha_destino][coluna_destino] =
00890                             Posiciona_Pedra(linha_origem, coluna_origem, linha_destino, coluna_destino,
00891                                 jogador_vez, jogador1);
00892                         tabuleiro_jogada[linha_origem][coluna_origem] = JOGADA;
00893                     }
00894                     else if (tabuleiro_jogada[linha_destino + 1][coluna_destino - 1] == pedra_dama_oponente) {
00895                         // pedra dama do oponente capturada
00896                         tabuleiro_jogada[linha_destino + 1][coluna_destino - 1] = CAPTURADA;
00897                         //--numero_pedras_para_capturar;
00898                         contabiliza_pedra(jogador_vez, jogador1, jogador2);
00899                         jogada_em_que_ultima_pedra_capturada = jogadas + 1;
00900                         tabuleiro_jogada[linha_destino][coluna_destino] =
00901                             Posiciona_Pedra(linha_origem, coluna_origem, linha_destino, coluna_destino,
00902                                 jogador_vez, jogador1);
00903                         tabuleiro_jogada[linha_origem][coluna_origem] = JOGADA;
00904                     }
00905                     else {
00906                         // pedra capturada invalida!!
00907                         return 0;
00908                     }
00909                 }
00910                 else {
00911                     // casa destino ocupada!!
00912                     return 0;
00913                 }
00914             }
00915             else {
00916                 // uma jogada de uma pedra normal apenas pode capturar uma pedra para esquerda ou para direita em diagonal
00917                 return 0;
00918             }
00919         } else if ((linha_destino - linha_origem) == 2) {
00920             if ((coluna_origem - coluna_destino) == 2) {
00921                 if (Caminho_Maximo_Captura(linha_origem, coluna_origem, linha_destino, coluna_destino)) {
00922                     return 0; // Eh obrigatorio executar a jogada que 
00923                               //   captura o maximo de pedras do adversario
00924                 }
00925                 // diagonal para baixo e para esquerda 
00926                 if ((tabuleiro_jogada[linha_destino][coluna_destino] == VAZIO) ||
00927                     (tabuleiro_jogada[linha_destino][coluna_destino] == JOGADA)) { // a posicao destino deve estar vazia ou foi uma jogada 
00928                     if (tabuleiro_jogada[linha_destino - 1][coluna_destino + 1] == pedra_normal_oponente) {
00929                         // pedra normal do oponente capturada
00930                         tabuleiro_jogada[linha_destino - 1][coluna_destino + 1] = CAPTURADA;
00931                         //--numero_pedras_para_capturar;
00932                         contabiliza_pedra(jogador_vez, jogador1, jogador2);
00933                         jogada_em_que_ultima_pedra_capturada = jogadas + 1;
00934                         tabuleiro_jogada[linha_destino][coluna_destino] =
00935                             Posiciona_Pedra(linha_origem, coluna_origem, linha_destino, coluna_destino,
00936                                 jogador_vez, jogador1);
00937                         tabuleiro_jogada[linha_origem][coluna_origem] = JOGADA;
00938                     }
00939                     else if (tabuleiro_jogada[linha_destino - 1][coluna_destino + 1] == pedra_dama_oponente) {
00940                         // pedra dama do oponente capturada
00941                         tabuleiro_jogada[linha_destino - 1][coluna_destino + 1] = CAPTURADA;
00942                         //--numero_pedras_para_capturar;
00943                         contabiliza_pedra(jogador_vez, jogador1, jogador2);
00944                         jogada_em_que_ultima_pedra_capturada = jogadas + 1;
00945                         tabuleiro_jogada[linha_destino][coluna_destino] =
00946                             Posiciona_Pedra(linha_origem, coluna_origem, linha_destino, coluna_destino,
00947                                 jogador_vez, jogador1);
00948                         tabuleiro_jogada[linha_origem][coluna_origem] = JOGADA;
00949                     }
00950                     else {
00951                         // pedra capturada invalida!!
00952                         return 0;
00953                     }
00954                 }
00955                 else {
00956                     // casa destino ocupada!!
00957                     return 0;
00958                 }
00959             }
00960             else if ((coluna_destino - coluna_origem) == 2) {
00961                 if (Caminho_Maximo_Captura(linha_origem, coluna_origem, linha_destino, coluna_destino)) {
00962                     return 0; // Eh obrigatorio executar a jogada que 
00963                               //   captura o maximo de pedras do adversario
00964                 }
00965                 // diagonal para baixo e para direita
00966                 if ((tabuleiro_jogada[linha_destino][coluna_destino] == VAZIO) ||
00967                     (tabuleiro_jogada[linha_destino][coluna_destino] == JOGADA)) { // a posicao destino deve estar vazia ou foi uma jogada 
00968                     if (tabuleiro_jogada[linha_destino - 1][coluna_destino - 1] == pedra_normal_oponente) {
00969                         // pedra normal do oponente capturada
00970                         tabuleiro_jogada[linha_destino - 1][coluna_destino - 1] = CAPTURADA;
00971                         //--numero_pedras_para_capturar;
00972                         contabiliza_pedra(jogador_vez, jogador1, jogador2);
00973                         jogada_em_que_ultima_pedra_capturada = jogadas + 1;
00974                         tabuleiro_jogada[linha_destino][coluna_destino] =
00975                             Posiciona_Pedra(linha_origem, coluna_origem, linha_destino, coluna_destino,
00976                                 jogador_vez, jogador1);
00977                         tabuleiro_jogada[linha_origem][coluna_origem] = JOGADA;
00978                     }
00979                     else if (tabuleiro_jogada[linha_destino - 1][coluna_destino - 1] == pedra_dama_oponente) {
00980                         // pedra dama do oponente capturada
00981                         tabuleiro_jogada[linha_destino - 1][coluna_destino - 1] = CAPTURADA;
00982                         //--numero_pedras_para_capturar;
00983                         contabiliza_pedra(jogador_vez, jogador1, jogador2);
00984                         jogada_em_que_ultima_pedra_capturada = jogadas + 1;
00985                         tabuleiro_jogada[linha_destino][coluna_destino] =
00986                             Posiciona_Pedra(linha_origem, coluna_origem, linha_destino, coluna_destino,
00987                                 jogador_vez, jogador1);
00988                         tabuleiro_jogada[linha_origem][coluna_origem] = JOGADA;
00989                     }
00990                     else {
00991                         // pedra capturada invalida!!
00992                         return 0;
00993                     }
00994                 }
00995                 else {
00996                     // casa destino ocupada!!
00997                     return 0;
00998                 }
00999             }
01000             else {
01001                 // uma jogada de uma pedra normal apenas pode capturar uma pedra para esquerda ou para direita em diagonal
01002                 return 0;
01003             }
01004         }
01005         else if ((linha_origem - linha_destino) == 1) {
01006             if (Movimento_Para_Traz(linha_origem, linha_destino, jogador1, jogador_vez)) {
01007                 return 0; // Uma pedra simples nao pode se movimentar para traz
01008             }
01009             else if (Existe_Pedra_Para_Capturar()) {
01010                 return 0; // Eh obrigatorio capturar uma pedra
01011             }
01012             else if (Movimento_Multiplo()) {
01013                 return 0; // Movimento de multiplas capturas, nao pode fazer um movimento simples apos a captura
01014             }
01015             // pedra fez um movimento, nao esta capturando uma pedra
01016             if ((coluna_origem - coluna_destino) == 1) {
01017                 // diagonal para cima e para esquerda 
01018                 if (tabuleiro_jogada[linha_destino][coluna_destino] == VAZIO) { // a posicao destino deve estar vazia
01019                     tabuleiro_jogada[linha_destino][coluna_destino] =
01020                         Posiciona_Pedra(linha_origem, coluna_origem, linha_destino, coluna_destino,
01021                             jogador_vez, jogador1);;
01022                     jogada_em_que_ultima_pedra_nomal_movimentada = jogadas + 1;
01023                     tabuleiro_jogada[linha_origem][coluna_origem] = VAZIO;
01024                 }
01025                 else {
01026                     return 0;
01027                 }
01028             }
01029             else if ((coluna_destino - coluna_origem) == 1) {
01030                 // diagonal para cima e para direita
01031                 if (tabuleiro_jogada[linha_destino][coluna_destino] == VAZIO) { // a posicao destino deve estar vazia 
01032                     tabuleiro_jogada[linha_destino][coluna_destino] =
01033                         Posiciona_Pedra(linha_origem, coluna_origem, linha_destino, coluna_destino,
01034                             jogador_vez, jogador1);
01035                     jogada_em_que_ultima_pedra_nomal_movimentada = jogadas + 1;
01036                     tabuleiro_jogada[linha_origem][coluna_origem] = VAZIO;
01037                 }
01038                 else {
01039                     // casa destino ocupada!!
01040                     return 0;
01041                 }
01042             }
01043             else {
01044                 // uma jogada de uma pedra normal apenas pode andar uma casa para esquerda ou para direita em diagonal
01045                 return 0;
01046             }
01047         }
01048         else if ((linha_destino - linha_origem) == 1) {
01049             if (Movimento_Para_Traz(linha_origem, linha_destino, jogador1, jogador_vez)) {
01050                 return 0; // Uma pedra simples nao pode se movimentar para traz
01051             }
01052             else if (Existe_Pedra_Para_Capturar()) {
01053                 return 0; // Eh obrigatorio capturar uma pedra
01054             }
01055             else if (Movimento_Multiplo()) {
01056                 return 0; // Movimento de multiplas capturas, nao pode fazer um movimento simples apos a captura
01057             }
01058             if ((coluna_origem - coluna_destino) == 1) {
01059                 // diagonal para baixo e para esquerda 
01060                 if (tabuleiro_jogada[linha_destino][coluna_destino] == VAZIO) { // a posicao destino deve estar vazia 
01061                     tabuleiro_jogada[linha_destino][coluna_destino] =
01062                         Posiciona_Pedra(linha_origem, coluna_origem, linha_destino, coluna_destino,
01063                             jogador_vez, jogador1);
01064                     jogada_em_que_ultima_pedra_nomal_movimentada = jogadas + 1;
01065                     tabuleiro_jogada[linha_origem][coluna_origem] = VAZIO;
01066                 }
01067                 else {
01068                     // casa destino ocupada!!
01069                     return 0;
01070                 }
01071             }
01072             else if ((coluna_destino - coluna_origem) == 1) {
01073                 // diagonal para baixo e para direita
01074                 if (tabuleiro_jogada[linha_destino][coluna_destino] == VAZIO) { // a posicao destino deve estar vazia 
01075                     tabuleiro_jogada[linha_destino][coluna_destino] =
01076                         Posiciona_Pedra(linha_origem, coluna_origem, linha_destino, coluna_destino,
01077                             jogador_vez, jogador1);
01078                     jogada_em_que_ultima_pedra_nomal_movimentada = jogadas + 1;
01079                     tabuleiro_jogada[linha_origem][coluna_origem] = VAZIO;
01080                 }
01081                 else {
01082                     // casa destino ocupada!!
01083                     return 0;
01084                 }
01085             }
01086             else {
01087                 // uma jogada de uma pedra normal apenas pode andar uma casa para esquerda ou para direita em diagonal
01088                 return 0;
01089             }
01090         }
01091         else {
01092             // pedra normal executou um movimento invalido!!
01093             return 0;
01094         }
01095     } else {
01096         
01097         if (tabuleiro_jogada[linha_destino][coluna_destino] != VAZIO) {
01098             return 0; // A dama nao pode movimentar-se para uma casa ocupada
01099         }
01100 
01101         linha_aux = linha_origem;
01102         coluna_aux = coluna_origem;
01103         if (coluna_origem > coluna_destino) {
01104             unidade_coluna = -1;
01105         }
01106         else {
01107             unidade_coluna = 1;
01108         }
01109 
01110         if (linha_origem > linha_destino) {
01111             unidade_linha = -1;
01112         }
01113         else {
01114             unidade_linha = 1;
01115         }
01116 
01117         pedras_capturadas = 0;
01118 
01119         do {
01120             linha_aux += unidade_linha;
01121             coluna_aux += unidade_coluna;
01122 
01123             if ((tabuleiro_jogada[linha_aux][coluna_aux] == pedra_normal_jogador) || 
01124                 (tabuleiro_jogada[linha_aux][coluna_aux] == pedra_dama_jogador)) {
01125                 return 0;  // Dama nao pode pular pedras do mesmo jogador
01126             } else if ((tabuleiro_jogada[linha_aux][coluna_aux] == pedra_normal_oponente) ||
01127                 (tabuleiro_jogada[linha_aux][coluna_aux] == pedra_dama_oponente)) {
01128                 ++pedras_capturadas;  // A dama capturou uma pedra do oponente
01129                 linha_pedra_capturada = linha_aux;
01130                 coluna_pedra_capturada = coluna_aux;
01131             }
01132 
01133             if (pedras_capturadas > 1) {
01134                 return 0; // A dama nao pode capturar mais de uma pedra em um unico movimento
01135             }
01136 
01137         } while (linha_aux != linha_destino);
01138 
01139         if ((pedras_capturadas == 0) && (Existe_Pedra_Para_Capturar() || Movimento_Multiplo())) {
01140             return 0; // Eh obrigatorio a captura
01141         } else if (Caminho_Maximo_Captura(linha_origem, coluna_origem, linha_destino, coluna_destino)) {
01142             return 0; // Eh obrigatorio executar a jogada que 
01143                       //   captura o maximo de pedras do adversario
01144         }
01145 
01146         if (pedras_capturadas == 1) {
01147             contabiliza_pedra(jogador_vez, jogador1, jogador2);
01148             jogada_em_que_ultima_pedra_capturada = jogadas + 1;
01149             tabuleiro_jogada[linha_destino][coluna_destino] =
01150                 Posiciona_Pedra(linha_origem, coluna_origem, linha_destino, coluna_destino,
01151                     jogador_vez, jogador1);
01152             tabuleiro_jogada[linha_origem][coluna_origem] = JOGADA;
01153             tabuleiro_jogada[linha_pedra_capturada][coluna_pedra_capturada] = CAPTURADA;
01154         }
01155         else {
01156             tabuleiro_jogada[linha_destino][coluna_destino] =
01157                 Posiciona_Pedra(linha_origem, coluna_origem, linha_destino, coluna_destino,
01158                     jogador_vez, jogador1);
01159             jogada_em_que_ultima_pedra_nomal_movimentada = jogadas + 1;
01160             tabuleiro_jogada[linha_origem][coluna_origem] = VAZIO;
01161         }
01162     }
01163 
01164     return 1;
01165 }
01166 
01167 // 0 - Faixa invalida
01168 // 1 - Faixa valida
01169 int Faixa_Valida(int linha_origem, int coluna_origem, int linha_destino, int coluna_destino) {
01170     
01171     int retorno = 1;
01172 
01173     // Testa a faixa de valores
01174     if ( (linha_origem < 0) || (linha_origem > (MAXLINHA - 1)) ) {
01175         retorno = 0;
01176     }
01177     else if ((linha_destino < 0) || (linha_destino > (MAXLINHA - 1))) {
01178         retorno = 0;
01179     }
01180     else if ((coluna_origem < 0) || (coluna_origem > (MAXCOLUNA - 1))) {
01181         retorno = 0;
01182     }
01183     else if ((coluna_destino < 0) || (coluna_destino > (MAXCOLUNA - 1))) {
01184         retorno = 0;
01185     }
01186     // Testa se eh uma casa de movimentacao de pedra
01187     else if ( (linha_origem % 2 == 0) && (coluna_origem % 2 == 0) ) {
01188         retorno = 0;
01189     }
01190     else if ((linha_destino % 2 == 0) && (coluna_destino % 2 == 0)) {
01191         retorno = 0;
01192     }
01193     else if ((linha_origem % 2 == 1) && (coluna_origem % 2 == 1)) {
01194         retorno = 0;
01195     }
01196     else if ((linha_destino % 2 == 1) && (coluna_destino % 2 == 1)) {
01197         retorno = 0;
01198     }
01199 
01200     return retorno;
01201 }
01202 
01203 void Entrada(int &linha_origem, int &coluna_origem, int &linha_destino, int &coluna_destino, char jogador_vez, char jogador1, char jogador2){
01204 
01205     char nome[TAM_NOME + 1];
01206     
01207     do {
01208         //LimparTela();
01209         PRINTF("%s", FIM_DE_LINHA);
01210         SELECIONA_COR(COR_FUNDO_MENSAGEM, COR_TEXTO_MENSAGEM);
01211         PRINTF("Jogador %s entre com a coordenada de origem da pedra a ser movida.%s", retorna_nome_jogador(jogador_vez, nome), FIM_DE_LINHA);
01212         PRINTF("Entre com o valor da linha(1-8): ");
01213         linha_origem = lerIteiro() - 1;
01214         PRINTF("%s", FIM_DE_LINHA);
01215         PRINTF("Entre com o valor de coluna(1-8): ");
01216         coluna_origem = lerIteiro() - 1;
01217         PRINTF("%s", FIM_DE_LINHA);
01218 
01219         PRINTF("Jogador %s entre com a coordenada de destino da pedra a ser movida.%s", retorna_nome_jogador(jogador_vez, nome), FIM_DE_LINHA);
01220         PRINTF("Entre com o valor de linha(1-8): ");
01221         linha_destino = lerIteiro() - 1;
01222         PRINTF("%s", FIM_DE_LINHA);
01223         PRINTF("Entre com o valor de coluna(1-8): ");
01224         coluna_destino = lerIteiro() - 1;
01225         PRINTF("%s", FIM_DE_LINHA);
01226 
01227         if (Faixa_Valida(linha_origem, coluna_origem, linha_destino, coluna_destino) && 
01228             Movimento_Valido(linha_origem, coluna_origem, linha_destino, coluna_destino, jogador_vez, jogador1, jogador2)) {
01229             break;
01230         } else {
01231             PRINTF("%s", FIM_DE_LINHA);
01232             PRINTF("Movimento invalido!! Pressione <Qualquer Tecla>");
01233             GETCHE();
01234         }
01235     }   while (1);
01236 }
01237 
01238 void Numero_Oponentes(int &jogador1_pedra_normal, int &jogador1_pedra_dama, 
01239                       int &jogador2_pedra_normal, int &jogador2_pedra_dama) {
01240 
01241     int linha, coluna;
01242 
01243     for (linha = 0; linha < MAXLINHA; ++linha) {
01244         for (coluna = 0; coluna < MAXCOLUNA; ++coluna) {
01245             switch (tabuleiro_jogada[linha][coluna]) {
01246             case PEDRA_NORMAL_JOGADOR1:
01247                 ++jogador1_pedra_normal;
01248                 break;
01249             case PEDRA_DAMA_JOGADOR1:
01250                 ++jogador1_pedra_dama;
01251                 break;
01252             case PEDRA_NORMAL_JOGADOR2:
01253                 ++jogador2_pedra_normal;
01254                 break;
01255             case PEDRA_DAMA_JOGADOR2:
01256                 ++jogador2_pedra_dama;
01257                 break;
01258             }
01259         }
01260     }
01261 }
01262 
01263 // 0 - Existem oponentes
01264 // 1 - Sem oponentes
01265 int Sem_Oponentes(void) {
01266 
01267     int jogador1_pedra_normal = 0, jogador1_pedra_dama = 0, 
01268         jogador2_pedra_normal = 0, jogador2_pedra_dama = 0;
01269 
01270     Numero_Oponentes(jogador1_pedra_normal, jogador1_pedra_dama, 
01271                      jogador2_pedra_normal, jogador2_pedra_dama);
01272 
01273     if ( (jogador1_pedra_normal || jogador1_pedra_dama) && (jogador2_pedra_normal || jogador2_pedra_dama) ) {
01274         return 0;
01275     }
01276     return 1;
01277 }
01278 
01279 // 0 - Sem condicoes especiais
01280 // 1 - Com comdicoes especiais
01281 int Codicoes_Especiais(void) {
01282     // @todo falta terminar as codicoes especiais
01283 
01284     int retorno = 0;
01285 
01286     int jogador1_pedra_normal = 0, jogador1_pedra_dama = 0,
01287         jogador2_pedra_normal = 0, jogador2_pedra_dama = 0;
01288 
01289     Numero_Oponentes(jogador1_pedra_normal, jogador1_pedra_dama,
01290         jogador2_pedra_normal, jogador2_pedra_dama);
01291 
01292     if ((jogador1_pedra_normal == 0) &&
01293         (jogador2_pedra_normal == 0) &&
01294         (jogador1_pedra_dama == 2) &&
01295         (jogador2_pedra_dama == 2)) {
01296         // 2 damas contras 2 damas
01297     }
01298 
01299     return retorno;
01300 }
01301 
01302 // 0 - Sem empate
01303 // 1 - Emapate
01304 int Verifica_Empate(void) {
01305 
01306     // @todo Verificar como iniciar as condicoes especiais
01307 
01308     return 0;
01309 
01310     int retorno = 0;
01311 
01312     if( ((jogadas - jogada_em_que_ultima_pedra_capturada) == 20) ||
01313         ((jogadas - jogada_em_que_ultima_pedra_nomal_movimentada) == 20) ) {
01314         // Apos 20 lances sucessivos de damas, sem captura ou deslocamento de pedra, 
01315         //  a partida eh declarada empatada
01316         retorno = 1;
01317     }
01318     else if ( (jogada_empate_lances_especiais) && 
01319               ((jogadas - jogada_empate_lances_especiais) == 5) && 
01320               Codicoes_Especiais() ) {
01321             retorno = 1;
01322     }
01323 
01324     return retorno;
01325 }
01326 
01327 // 0 - Existe pedra a ser movimentada
01328 // 1 - Nao existe pedra a ser movimentada
01329 int Existe_Pedra_Movimento(int linha_destino, int coluna_destino, char jogador1, char jogador2, char jogador) {
01330 
01331     int retorno = 1;
01332 
01333     if (jogador == jogador1) {
01334         if ((linha_destino - 1 >= 0) &&
01335             (coluna_destino - 1 >= 0) &&
01336             (tabuleiro_jogada[linha_destino - 1][coluna_destino - 1] == VAZIO)) {
01337             retorno = 0;
01338         }
01339         else if ((linha_destino - 1 >= 0) &&
01340             (coluna_destino + 1 < MAXCOLUNA) &&
01341             (tabuleiro_jogada[linha_destino - 1][coluna_destino + 1] == VAZIO)) {
01342             retorno = 0;
01343         }
01344     }
01345     else {
01346         if ((linha_destino + 1 < MAXLINHA) &&
01347             (coluna_destino + 1 < MAXCOLUNA) &&
01348             (tabuleiro_jogada[linha_destino + 1][coluna_destino + 1] == VAZIO)) {
01349             retorno = 0;
01350         }
01351         else if ((linha_destino + 1 < MAXLINHA) &&
01352             (coluna_destino - 1 >= 0) &&
01353             (tabuleiro_jogada[linha_destino + 1][coluna_destino - 1] == VAZIO)) {
01354             retorno = 0;
01355         }
01356     }
01357     return retorno;
01358 }
01359 
01360 // 0 - Existe pedra a ser capturada
01361 // 1 - Nao existe pedra a ser capturada
01362 int Existe_Pedra_Capturar(int linha_destino, int coluna_destino, char jogador1, char jogador2, char jogador) {
01363     
01364     int retorno = 1;
01365     char pedra_nomal, pedra_dama;
01366 
01367     if (jogador == jogador1) {
01368         pedra_nomal = PEDRA_NORMAL_JOGADOR2;
01369         pedra_dama = PEDRA_DAMA_JOGADOR2;
01370     }
01371     else {
01372         pedra_nomal = PEDRA_NORMAL_JOGADOR1;
01373         pedra_dama = PEDRA_DAMA_JOGADOR1;
01374     }
01375 
01376     if ((linha_destino + 2 < MAXLINHA) &&
01377         (coluna_destino + 2 < MAXCOLUNA) &&
01378         ((tabuleiro_jogada[linha_destino + 1][coluna_destino + 1] == pedra_nomal) ||
01379          (tabuleiro_jogada[linha_destino + 1][coluna_destino + 1] == pedra_dama)) && 
01380         (tabuleiro_jogada[linha_destino + 2][coluna_destino + 2] == VAZIO)) {
01381         retorno = 0;
01382     }
01383     else if ((linha_destino + 2 < MAXLINHA) &&
01384                 (coluna_destino - 2 >= 0) &&
01385                 ((tabuleiro_jogada[linha_destino + 1][coluna_destino - 1] == pedra_nomal) ||
01386                  (tabuleiro_jogada[linha_destino + 1][coluna_destino - 1] == pedra_dama)) &&
01387                 (tabuleiro_jogada[linha_destino + 2][coluna_destino - 2] == VAZIO)) {
01388         retorno = 0;
01389     }
01390     else if ((linha_destino - 2 >= 0) &&
01391                 (coluna_destino - 2 >= 0) &&
01392                 ((tabuleiro_jogada[linha_destino - 1][coluna_destino - 1] == pedra_nomal) ||
01393                  (tabuleiro_jogada[linha_destino - 1][coluna_destino - 1] == pedra_dama)) &&
01394                 (tabuleiro_jogada[linha_destino - 2][coluna_destino - 2] == VAZIO)) {
01395         retorno = 0;
01396     }
01397     else if ((linha_destino - 2 >= 0) &&
01398                 (coluna_destino + 2 < MAXCOLUNA) &&
01399                 ((tabuleiro_jogada[linha_destino - 1][coluna_destino + 1] == pedra_nomal) ||
01400                  (tabuleiro_jogada[linha_destino - 1][coluna_destino + 1] == pedra_dama)) &&
01401                 (tabuleiro_jogada[linha_destino - 2][coluna_destino + 2] == VAZIO)) {
01402         retorno = 0;
01403     }
01404 
01405     return retorno;
01406 }
01407 
01408 // 0 - Nao existe jogada para o jogador selecionado
01409 // 1 - Existe jogada para o jogador selecionado
01410 int Existe_Jogada(char jogador1, char jogador2, char jogador) {
01411     int retorno = 0;
01412     int linha, coluna;
01413 
01414 
01415     if (jogador == jogador1) {
01416         for (linha = 0; linha < MAXLINHA; ++linha) {
01417             for (coluna = 0; coluna < MAXCOLUNA; ++coluna) {
01418                 if (tabuleiro_jogada[linha][coluna] == PEDRA_NORMAL_JOGADOR1) {
01419                     if (!Existe_Pedra_Movimento(linha, coluna, jogador1, jogador2, jogador)) {
01420                         return 1;
01421                     }
01422                     else if (!Existe_Pedra_Capturar(linha, coluna, jogador1, jogador2, jogador)) {
01423                         return 1;
01424                     }
01425                 }
01426             }
01427         }
01428     }
01429     else {
01430         for (linha = 0; linha < MAXLINHA; ++linha) {
01431             for (coluna = 0; coluna < MAXCOLUNA; ++coluna) {
01432                 if (tabuleiro_jogada[linha][coluna] == PEDRA_NORMAL_JOGADOR2) {
01433                     if (!Existe_Pedra_Movimento(linha, coluna, jogador1, jogador2, jogador)) {
01434                         return 1;
01435                     }
01436                     else if (!Existe_Pedra_Capturar(linha, coluna, jogador1, jogador2, jogador)) {
01437                         return 1;
01438                     }
01439                 }
01440             }
01441         }
01442     }
01443     return retorno;
01444 }
01445 
01446 int Analisar(int linha_origem, int coluna_origem, int linha_destino, int coluna_destino, 
01447              char &jogador_vez, char jogador1, char jogador2){
01448 
01449     int linha, coluna;
01450     char nome[TAM_NOME + 1];
01451     int retorno = 0;
01452 
01453     ++jogadas;
01454 
01455     // Verifica se existem oponentes
01456     if (Sem_Oponentes()) {
01457         if (jogador_vez == jogador1) {
01458             placar[jogador1 - '1'][VITORIAS] += 1;
01459             placar[jogador2 - '1'][DERROTAS] += 1;
01460         }
01461         else {
01462             placar[jogador2 - '1'][VITORIAS] += 1;
01463             placar[jogador1 - '1'][DERROTAS] += 1;
01464         }
01465         //LimparTela();
01466         PRINTF("%s", FIM_DE_LINHA);
01467         SELECIONA_COR(COR_FUNDO_MENSAGEM, COR_TEXTO_MENSAGEM);
01468         PRINTF("Jogador %s VENCEU!! com %d jogadas.%s", retorna_nome_jogador(jogador_vez, nome), jogadas, FIM_DE_LINHA);
01469         PRINTF("Pressione <Qualquer Tecla>");
01470         GETCHE();
01471         jogadas = 0;
01472         retorno = 1;
01473     }
01474     // Verifica empate
01475     else if (Verifica_Empate()) {
01476         placar[jogador1 - '1'][EMPATES] += 1;
01477         placar[jogador2 - '1'][EMPATES] += 1;
01478         //LimparTela();
01479         PRINTF("%s", FIM_DE_LINHA);
01480         SELECIONA_COR(COR_FUNDO_MENSAGEM, COR_TEXTO_MENSAGEM);
01481         PRINTF("Jogadores %s  e %s EMPATARAM!! apos %d jogadas.%s", retorna_nome_jogador(jogador1, nome),
01482             retorna_nome_jogador(jogador2, nome), jogadas, FIM_DE_LINHA);
01483         PRINTF("Pressione <Qualquer Tecla>");
01484         GETCHE();
01485         jogadas = 0;
01486         retorno = 1;
01487     }
01488     // Verifica mudanca de vez de jogador
01489     else {//if ( (numero_pedras_para_capturar == 0) || (numero_pedras_para_capturar == -1) ) {
01490 
01491         for (linha = 0; linha < MAXLINHA; ++linha) {
01492             for (coluna = 0; coluna < MAXCOLUNA; ++coluna) {
01493                 switch (tabuleiro_jogada[linha][coluna]) {
01494                 case PEDRA_NORMAL_JOGADOR1:
01495                 case PEDRA_DAMA_JOGADOR1:
01496                 case PEDRA_NORMAL_JOGADOR2:
01497                 case PEDRA_DAMA_JOGADOR2:
01498                     break;
01499                 default:
01500                     tabuleiro_jogada[linha][coluna] = VAZIO;
01501                     break;
01502                 }
01503             }
01504         }
01505         memcpy(tabuleiro_controle, tabuleiro_jogada, sizeof(tabuleiro_jogada));
01506 
01507         // @todo falta verificar o caso em que o jogador nao tem casa para jogar
01508         if (jogador_vez == jogador1) {
01509             if (numero_pedras_capturadas_jogador1 > numero_pedras_capturadas_antes_jogador1) {
01510                 if (Existe_Pedra_Capturar(linha_destino, coluna_destino, jogador1, jogador2, jogador1)) {
01511                     jogador_vez = jogador2;
01512                 }
01513             }
01514             else if (Existe_Jogada(jogador1, jogador2, jogador2)) {
01515                 jogador_vez = jogador2;
01516             }
01517         }
01518         else {
01519             if (numero_pedras_capturadas_jogador2 > numero_pedras_capturadas_antes_jogador2) {
01520                 if (Existe_Pedra_Capturar(linha_destino, coluna_destino, jogador1, jogador2, jogador2)) {
01521                     jogador_vez = jogador1;
01522                 }
01523             }
01524             else if (Existe_Jogada(jogador1, jogador2, jogador1)) {
01525                 jogador_vez = jogador1;
01526             }
01527         }
01528         //numero_pedras_para_capturar = -1;
01529 
01530         numero_pedras_capturadas_antes_jogador1 = numero_pedras_capturadas_jogador1;
01531         numero_pedras_capturadas_antes_jogador2 = numero_pedras_capturadas_jogador2;
01532 #if 0
01533         for (linha = 0; linha < MAXLINHA; ++linha) {
01534             for (coluna = 0; coluna < MAXCOLUNA; ++coluna) {
01535                 switch (tabuleiro_jogada[linha][coluna]) {
01536                     case PEDRA_NORMAL_JOGADOR1:
01537                     case PEDRA_DAMA_JOGADOR1:
01538                     case PEDRA_NORMAL_JOGADOR2:
01539                     case PEDRA_DAMA_JOGADOR2:
01540                         break;
01541                     default :
01542                         tabuleiro_jogada[linha][coluna] = VAZIO;
01543                         break;
01544                 }
01545             }
01546         }
01547         memcpy(tabuleiro_controle, tabuleiro_jogada, sizeof(tabuleiro_jogada));
01548 #endif
01549     }
01550     
01551     return(retorno);
01552 } 
01553 
01554 void Jogar(char jogador1, char jogador2) {
01555     
01556     char fim = '0';
01557     char jogador_vez;
01558     int linha_origem, coluna_origem, linha_destino, coluna_destino;
01559     
01560     InicializarTabuleiro(jogador1, jogador2);
01561     
01562     jogador_vez = jogador1;
01563     
01564     do {
01565         ImprimirTabuleiro(jogador1, jogador2);
01566         
01567         Entrada(linha_origem, coluna_origem, linha_destino, coluna_destino,jogador_vez, jogador1, jogador2);
01568         
01569         if(Analisar(linha_origem, coluna_origem, linha_destino, coluna_destino, jogador_vez, jogador1, jogador2)) {
01570             fim = '1';
01571         }
01572     } while(fim != '1');
01573 }
01574 
01575 int main() {
01576     
01577     char jogador1, jogador2;
01578     
01579 #ifdef __PC__
01580 
01581     hConsoleHandle = GetStdHandle(STD_OUTPUT_HANDLE);
01582     ConsoleInfo = new CONSOLE_SCREEN_BUFFER_INFO();
01583     GetConsoleScreenBufferInfo(hConsoleHandle, ConsoleInfo);
01584 
01585 #else
01586 
01587     //pc.baud(115200);
01588     term.baud(115200);
01589     
01590 #endif
01591 
01592     // Zerando o placar
01593     memset(placar, 0, sizeof(placar));
01594     
01595     while(true) {
01596         
01597         ImprimeMenu(jogador1, jogador2);
01598         
01599         Jogar(jogador1, jogador2);
01600     }
01601 }