AJEDREZ.c



// 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();


}