// DAR LOS POSIBLES MOVIMIENTOS DEL CABALLO, TORRE O ALFIL
#include <ncurses.h>
#include <stdio.h>
// PROTOTIPOS DE FUNCION
void Movimientos(int, int, char);
char* Letra(int);
char* Fila(int);
char *Pieza(char);
// FUNCIONES ___________________
int esposibleelmovimiento1(int letra, int numero){
if((numero-1)<=0)
return 0;
if((letra+2)>=8)
return 0;
return 1;
}
int esposibleelmovimiento2(int letra, int numero){
if((numero-1)<=0)
return 0;
if((letra-2)<0)
return 0;
return 1;
}
int esposibleelmovimiento3(int letra, int numero){
if((numero-1)<=1)
return 0;
if((letra-2)<=1)
return 0;
return 1;
}
int esposibleelmovimiento4(int letra, int numero){
if((numero-2)<=1)
return 0;
if((letra+1)>=8)
return 0;
return 1;
}
int esposibleelmovimiento5(int letra, int numero){
if((numero-1)<=1)
return 0;
if((letra+2)>=8)
return 0;
return 1;
}
int esposibleelmovimiento6(int letra, int numero){
if((numero+1)>=8)
return 0;
if((letra+2)>=8)
return 0;
return 1;
}
int esposibleelmovimiento7(int letra, int numero){
if((numero+2)>=8)
return 0;
if((letra+1)>=8)
return 0;
return 1;
}
int esposibleelmovimiento8(int letra, int numero){
if((numero+1)>=8)
return 0;
if((letra-2)<=1)
return 0;
return 1;
}
char *Letra(int columna)
{
switch (columna)
{
case 1: return "A"; break; case 2: return "B"; break; case 3: return "C"; break; case 4: return "D"; break;
case 5: return "E"; break; case 6: return "F"; break; case 7: return "G"; break; case 8: return "H"; break;
}
return "1"; // cualquier cosa ... No importa ya que nunca va a llegar aqui ______________
}
char *Fila(int fila)
{
switch (fila)
{
case 1: return "8"; break; case 2: return "7"; break; case 3: return "6"; break; case 4: return "5"; break;
case 5: return "4"; break; case 6: return "3"; break; case 7: return "2"; break; case 8: return "1"; break;
}
return "1"; // cualquier cosa ... No importa ya que nunca va a llegar aqui ________________
}
char *Pieza(char Pieza)
{
switch (Pieza)
{
case 'a': return "EL ALFIL "; break;
case 't': return "LA TORRE "; break;
case 'c': return "EL CABALLO "; break;
}
return "NADA";
}
void Movimientos(int letra, int numero, char Pieza)
{
//x,y es l posicion actual el caballo de ajedrez
//el tablero tiene dimensiones x desde A(izquierda) hasta H(derecha) y altura 1(arriba) hasta 8(abajo)
int i=0,j=0, r=0;
int numero1,numero2,numero3,numero4,numero5,numero6,numero7,numero8;
int letra1,letra2,letra3,letra4,letra5,letra6,letra7,letra8;
numero1=numero2=numero3=numero4=numero5=numero6=numero7=numero8=0;
letra1=letra2=letra3=letra4=letra5=letra6=letra7=letra8=0;
for (i=0; i<=16; i++) mvprintw(25+i, 120, " ");
switch (Pieza)
{
case 'c': // MOVIMIENTOS DEL CABALLO
if(esposibleelmovimiento1(letra,numero)) { letra1=letra+2; numero1=numero-1; }
if(esposibleelmovimiento2(letra,numero)) { letra2=letra-2; numero2=numero-1; }
if(esposibleelmovimiento3(letra,numero)) { letra3=letra-1; numero3=numero-2; }
if(esposibleelmovimiento4(letra,numero)) { letra4=letra-2; numero4=numero+1; }
if(esposibleelmovimiento5(letra,numero)) { letra5=letra-1; numero5=numero+2; }
if(esposibleelmovimiento6(letra,numero)) { letra6=letra+1; numero6=numero+2; }
if(esposibleelmovimiento7(letra,numero)) { letra7=letra+2; numero7=numero+1; }
if(esposibleelmovimiento8(letra,numero))
{
letra8=letra+1; numero8=numero-2;
if(letra1!=0) mvprintw(25,120,"se puede mover a: %s, %s\n",Letra(letra1),Fila(numero1));
if(letra2) mvprintw(26,120,"se puede mover a: %s,%s\n",Letra(letra2),Fila(numero2));
if(letra3) mvprintw(27,120,"se puede mover a: %s,%s\n",Letra(letra3),Fila(numero3));
if(letra4) mvprintw(28,120,"se puede mover a: %s,%s\n",Letra(letra4),Fila(numero4));
if(letra5) mvprintw(29,120,"se puede mover a: %s,%s\n",Letra(letra5),Fila(numero5));
if(letra6) mvprintw(30,120,"se puede mover a: %s,%s\n",Letra(letra6),Fila(numero6));
if(letra7) mvprintw(31,120,"se puede mover a: %s,%s\n",Letra(letra7),Fila(numero7));
if(letra8) mvprintw(32,120,"se puede mover a: %s,%s\n",Letra(letra8),Fila(numero8));
}
break;
case 't': // MOVIMIENTOS DE LA TORRE
for (i=1;i<=8;i++) { mvprintw(24+i, 120, "Se puede mover a: %s, %s\n", Letra(letra), Fila(i)); }
for (j=1;j<=8;j++) { mvprintw(24+i+j, 120, "Se puede mover a: %s, %s\n", Letra(j), Fila(numero)); }
break;
case 'a': // MOVIMIENTOS DEL ALFIL
i = letra; j = numero; r=0;
while (i >= 1 && j <= 8) { mvprintw(25+r, 120, "se puede mover a: %s, %s\n", Letra(i), Fila(j)); r++; i--; j++; } // ARRIBA IZQUIERDA
i = letra; j = numero;
while (i <= 8 && j <= 8) { mvprintw(25+r, 120, "se puede mover a: %s, %s\n", Letra(i), Fila(j)); r++; i++; j++; } // ARRIBA DERECHA
i = letra; j = numero;
while (i >= 1 && j >= 1) { mvprintw(25+r, 120, "se puede mover a: %s, %s\n", Letra(i), Fila(j)); r++; i--; j--; } // ABAJO IZQUIERDA
i = letra; j = numero;
while (i <= 8 && j >= 1) { mvprintw(25+r, 120, "se puede mover a: %s, %s\n", Letra(i), Fila(j)); r++; i++; j--; } // ABAJO DERECHA
break;
}
}
main()
{
int col=72,row=32,x=15,y,fila=1,columna=1;
initscr();
start_color();
init_pair(1,COLOR_RED, COLOR_BLACK);
init_pair(2,COLOR_YELLOW,COLOR_BLACK);
move(11, 1);
//empiezo pruebas de color
/*attron(COLOR_PAIR(7));
for (int h=11; h<42; h+=8){
for (int i=h; i<h+3; i++){
for (int j=11; j<90; j++) {
if (j==20||j==40||j==60||j==80){
j+=10;
continue; }
mvaddch(i,j,' ');
}
}
}
for (int h=15; h<42; h+=8){
for (int i=h; i<h+3; i++){
for (int j=21; j<90; j++) {
if (j==30||j==50||j==70){
j+=10;
continue;
}
mvaddch(i,j,' ');
}
}
}
attroff(COLOR_PAIR(7));
//termina pc
*/
for(x=15; x<=88; x+=9){
move(5,x);
vline(ACS_VLINE,row);}
for(y=4; y<=38; y+=4){
move(y,15);
hline(ACS_HLINE, col);}
//cruces y esquinas
move(8,24); addch(ACS_PLUS); move(12,24); addch(ACS_PLUS); move(16,24); addch(ACS_PLUS); move(20,24); addch(ACS_PLUS);
move(24,24); addch(ACS_PLUS); move(28,24); addch(ACS_PLUS); move(32,24); addch(ACS_PLUS);
move(8,33); addch(ACS_PLUS); move(12,33); addch(ACS_PLUS); move(16,33); addch(ACS_PLUS); move(20,33); addch(ACS_PLUS);
move(24,33); addch(ACS_PLUS); move(28,33); addch(ACS_PLUS); move(32,33); addch(ACS_PLUS);
move(8,42); addch(ACS_PLUS); move(12,42); addch(ACS_PLUS); move(16,42); addch(ACS_PLUS); move(20,42); addch(ACS_PLUS);
move(24,42); addch(ACS_PLUS); move(28,42); addch(ACS_PLUS); move(32,42); addch(ACS_PLUS);
move(8,51); addch(ACS_PLUS); move(12,51); addch(ACS_PLUS); move(16,51); addch(ACS_PLUS); move(20,51); addch(ACS_PLUS);
move(24,51); addch(ACS_PLUS); move(28,51); addch(ACS_PLUS); move(32,51); addch(ACS_PLUS);
move(8,60); addch(ACS_PLUS); move(12,60); addch(ACS_PLUS); move(16,60); addch(ACS_PLUS); move(20,60); addch(ACS_PLUS);
move(24,60); addch(ACS_PLUS); move(28,60); addch(ACS_PLUS); move(32,60); addch(ACS_PLUS);
move(8,69); addch(ACS_PLUS); move(12,69); addch(ACS_PLUS); move(16,69); addch(ACS_PLUS); move(20,69); addch(ACS_PLUS);
move(24,69); addch(ACS_PLUS); move(28,69); addch(ACS_PLUS); move(32,69); addch(ACS_PLUS);
move(8,78); addch(ACS_PLUS); move(12,78); addch(ACS_PLUS); move(16,78); addch(ACS_PLUS); move(20,78); addch(ACS_PLUS);
move(24,78); addch(ACS_PLUS); move(28,78); addch(ACS_PLUS); move(32,78); addch(ACS_PLUS);
move(4,24); addch(ACS_TTEE); move(4,33); addch(ACS_TTEE); move(4,42); addch(ACS_TTEE); move(4,51); addch(ACS_TTEE);
move(4,60); addch(ACS_TTEE); move(4,69); addch(ACS_TTEE); move(4,78); addch(ACS_TTEE);
move(36,24); addch(ACS_BTEE); move(36,33); addch(ACS_BTEE); move(36,42); addch(ACS_BTEE); move(36,51); addch(ACS_BTEE);
move(36,60); addch(ACS_BTEE); move(36,69); addch(ACS_BTEE); move(36,78); addch(ACS_BTEE);
move(8,87); addch(ACS_RTEE); move(12,87); addch(ACS_RTEE); move(16,87); addch(ACS_RTEE); move(20,87); addch(ACS_RTEE);
move(24,87); addch(ACS_RTEE); move(28,87); addch(ACS_RTEE); move(32,87); addch(ACS_RTEE);
move(8,15); addch(ACS_LTEE); move(12,15); addch(ACS_LTEE); move(16,15); addch(ACS_LTEE); move(20,15); addch(ACS_LTEE);
move(24,15); addch(ACS_LTEE); move(28,15); addch(ACS_LTEE); move(32,15); addch(ACS_LTEE);
move(36,15); addch(ACS_LLCORNER); move(36,87); addch (ACS_LRCORNER); move(4,15); addch(ACS_ULCORNER); move(4,87); addch (ACS_URCORNER);
//aqui termina las cruces y esquinas
attron(COLOR_PAIR(2));
mvprintw(3,19,"A"); mvprintw(37,19,"A"); mvprintw(3,28,"B"); mvprintw(37,28,"B"); mvprintw(3,37,"C"); mvprintw(37,37,"C"); mvprintw(3,46,"D"); mvprintw(37,46,"D");
mvprintw(3,55,"E"); mvprintw(37,55,"E"); mvprintw(3,64,"F"); mvprintw(37,64,"F"); mvprintw(3,73,"G"); mvprintw(37,73,"G"); mvprintw(3,82,"H"); mvprintw(37,82,"H");
mvprintw(6,13,"1"); mvprintw(6,89,"1"); mvprintw(10,13,"2"); mvprintw(10,89,"2"); mvprintw(14,13,"3"); mvprintw(14,89,"3"); mvprintw(18,13,"4"); mvprintw(18,89,"4");
mvprintw(22,13,"5"); mvprintw(22,89,"5"); mvprintw(26,13,"6"); mvprintw(26,89,"6"); mvprintw(30,13,"7"); mvprintw(30,89,"7"); mvprintw(34,13,"8"); mvprintw(34,89,"8");
attroff(COLOR_PAIR(2));
mvprintw(14,98,"Presiona esc para salir, y posterior otra tecla");
int key,direcc,fin=0,mv=34, mx=19; char seleccion;
keypad(stdscr, true);
move(16,98);printw("Pulsa: [a]lfil, [c]aballo, [t]orre ");
char car='x';
while(fin==0)
{
key=getch();
direcc=0;
if(key==27) { break; return 1; }
if(key==KEY_RIGHT) { columna++; direcc=1; mx+=9; }
if(key==KEY_LEFT) { columna--; direcc=2; mx-=9; }
if(key==KEY_DOWN) { fila--; direcc=3; mv+=4; }
if(key==KEY_UP) { fila++; direcc=4; mv-=4; }
if(key=='a'||key=='t'||key=='c') car=key;
if(mx<88) { mvprintw(mv,mx,"%c",car); } else mvprintw(mv,mx=82,"%c",car);
if(mx>18) { mvprintw(mv,mx,"X");} else mvprintw(mv,mx=19,"%c",car);
if(mv>4) { mvprintw(mv,mx,"%c",car); } else mvprintw(mv=6,mx,"%c",car);
if(mv<38) { mvprintw(mv,mx,"%c",car);} else mvprintw(mv=34,mx,"%c",car);
mvprintw(mv+4,mx," ",direcc);
mvprintw(mv-4,mx," ",direcc);
mvprintw(mv,mx+9," ",direcc);
mvprintw(mv,mx-9," ",direcc);
//por aqui para los numeros
if(fila<8) { } else fila=8;
if(columna<9) { } else columna=8;
if(columna>1) { } else columna=1;
if (fila>1) { } else fila=1;
mvprintw(21, 98, "POSICION: [ %s %s ]", Letra(columna), Fila(fila));
mvprintw(23, 100, "Posibles movimientos de %s", Pieza(car));
mvprintw(24, 100, "===========================================");
Movimientos(columna, fila, car); // (LETRA, NUMERO, PIEZA)
}
refresh();
getch();
endwin();
}