elhacker.net cabecera Bienvenido(a), Visitante. Por favor Ingresar o Registrarse
¿Perdiste tu email de activación?.

 

 


Tema destacado: Trabajando con las ramas de git (tercera parte)


+  Foro de elhacker.net
|-+  Programación
| |-+  Programación General
| | |-+  .NET (C#, VB.NET, ASP) (Moderador: kub0x)
| | | |-+  necesito ayuda para terminar un juego de ajedrez
0 Usuarios y 1 Visitante están viendo este tema.
Páginas: [1] Ir Abajo Respuesta Imprimir
Autor Tema: necesito ayuda para terminar un juego de ajedrez  (Leído 3,443 veces)
xXedilXx

Desconectado Desconectado

Mensajes: 1


Ver Perfil
necesito ayuda para terminar un juego de ajedrez
« en: 22 Diciembre 2009, 14:31 pm »

me podrian ayudar a validar los movimientos de todas las piezas de ajedrez me falta eso para terminar el juego lo estoy haciendo en vb .net les agradeceria su ayuda.

desde ya muchas gracias..


En línea

MCKSys Argentina
Moderador Global
***
Desconectado Desconectado

Mensajes: 5.518


Diviértete crackeando, que para eso estamos!


Ver Perfil
Re: necesito ayuda para terminar un juego de ajedrez
« Respuesta #1 en: 22 Diciembre 2009, 17:32 pm »

Hola!

Pues esto está en C, pero podrías sacar la "idea" de la función:
Código:
TChessBoard::VerifyMove(TMove Move)
{
// The purpose is to determine whether the move is legal or not
// by verifying correct movement of the piece and whether the
// resulting position leaves the mover in check.
int i, Piece, diff;
int From, To;
int Checked;
TMoveList List;
From=Move.From;
To=Move.To;
if (From/10<1 || From/10>8 || From%10<1 || From%10>8) return 299;
if (To/10<1 || To/10>8 || To%10<1 || To%10>8) return 300;
Piece=Square[From];
if (From==To) return 301;
if (Piece<EMPTY && Square[MOVER]==BLACK) return 302;
if (Piece>EMPTY && Square[MOVER]==WHITE) return 303;
if (Piece==EMPTY) return 304;
if (Square[MOVER]==WHITE && Square[To]<EMPTY) return 305;
if (Square[MOVER]==BLACK && Square[To]>EMPTY) return 306;
switch(Piece)
{
  case WK : if ((abs(GetX(To)-GetX(From))>1 || abs(GetY(To)-GetY(From))>1) && !(From==51 && (To==71 || To==31))) return 1;
if (From==51 && To==71)
{
  if (Square[61]!=EMPTY || Square[71]!=EMPTY) return 13;
  if (Square[WROOK8MOVED]==TRUE) return 3;
  if (Square[WKINGMOVED]==TRUE) return 4;
  if (IsCheck()) return 22;
  Square[61]=WK; Square[51]=EMPTY;
  if (IsCheck()) {
Square[51]=WK; Square[61]=EMPTY;
return 21;
  }
  Square[51]=WK; Square[61]=EMPTY;
}
if (From==51 && To==31)
{
  if (Square[41]!=EMPTY || Square[31]!=EMPTY || Square[21]!=EMPTY) return 13;
  if (Square[WROOK1MOVED]==TRUE) return 3;
  if (Square[WKINGMOVED]==TRUE) return 4;
  if (IsCheck()) return 22;
  Square[41]=WK; Square[51]=EMPTY;
  if (IsCheck()) {
Square[51]=WK; Square[41]=EMPTY;
return 21;
  }
  Square[51]=WK; Square[41]=EMPTY;
}
break;
  case BK : if ((abs(GetX(To)-GetX(From))>1 || abs(GetY(To)-GetY(From))>1) && !(From==58 && (To==78 || To==38))) return 1;
if (From==58 && To==78)
{
  if (Square[68]!=EMPTY || Square[78]!=EMPTY) return 13;
  if (Square[BROOK8MOVED]==TRUE) return 3;
  if (Square[BKINGMOVED]==TRUE) return 4;
  if (IsCheck()) return 22;
  Square[68]=BK; Square[58]=EMPTY;
  if (IsCheck()) {
Square[58]=BK; Square[68]=EMPTY;
return 21;
  }
  Square[58]=BK; Square[68]=EMPTY;
}
if (From==58 && To==38)
{
  if (Square[48]!=EMPTY || Square[38]!=EMPTY || Square[28]!=EMPTY) return 13;
  if (Square[BROOK1MOVED]==TRUE) return 3;
  if (Square[BKINGMOVED]==TRUE) return 4;
  if (IsCheck()) return 22;
  Square[48]=BK; Square[58]=EMPTY;
  if (IsCheck()) {
Square[58]=BK; Square[48]=EMPTY;
return 21;
  }
  Square[58]=BK; Square[48]=EMPTY;
}
break;
  case WR : if (GetX(From)!=GetX(To) && GetY(From)!=GetY(To)) return 6;
if (GetX(From)==GetX(To)) {
  if (GetY(To)>GetY(From)) {
  for (i=From+1; i<=To; i++) if (Square[i]<10) return 14; else if (Square[i]>100 && i!=To) return 14;
  } else {
  for (i=From-1; i>=To; i--) if (Square[i]<10) return 14; else if (Square[i]>100 && i!=To) return 14;
  }
} else {
  if (GetX(To)>GetX(From)) {
  for (i=From+10; i<=To; i+=10) if (Square[i]<10) return 14; else if (Square[i]>100 && i!=To) return 14;
  } else {
  for (i=From-10; i>=To; i-=10) if (Square[i]<10) return 14; else if (Square[i]>100 && i!=To) return 14;
  }
}
break;
  case BR : if (GetX(From)!=GetX(To) && GetY(From)!=GetY(To)) return 6;
if (GetX(From)==GetX(To)) {
  if (GetY(To)>GetY(From)) {
  for (i=From+1; i<=To; i++) if (Square[i]>100) return 14; else if (Square[i]<10 && i!=To) return 14;
  } else {
  for (i=From-1; i>=To; i--) if (Square[i]>100) return 14; else if (Square[i]<10 && i!=To) return 14;
  }
} else {
  if (GetX(To)>GetX(From)) {
  for (i=From+10; i<=To; i+=10) if (Square[i]>100) return 14; else if (Square[i]<10 && i!=To) return 14;
  } else {
  for (i=From-10; i>=To; i-=10) if (Square[i]>100) return 14; else if (Square[i]<10 && i!=To) return 14;
  }
}
break;
  case WQ : if (!
  (
(From>To && (From-To)%9==0 && GetY(To)>GetY(From)) ||
(From>To && (From-To)%11==0 && GetY(From)>GetY(To)) ||
(To>From && (To-From)%11==0 && GetY(To)>GetY(From)) ||
(To>From && (To-From)%9==0 && GetY(From)>GetY(To)) ||
(GetX(From)==GetX(To)) ||
(GetY(From)==GetY(To))
  )
  ) return 7;
if (GetX(From)==GetX(To) && To>From) for (i=From+1; i<=To; i++) if (Square[i]<10 || (Square[i]>100 && i!=To)) return 20;
if (GetX(From)==GetX(To) && From>To) for (i=From-1; i>=To; i--) if (Square[i]<10 || (Square[i]>100 && i!=To)) return 20;
if (GetY(From)==GetY(To) && To>From) for (i=From+10; i<=To; i+=10) if (Square[i]<10 || (Square[i]>100 && i!=To)) return 20;
if (GetY(From)==GetY(To) && From>To) for (i=From-10; i>=To; i-=10) if (Square[i]<10 || (Square[i]>100 && i!=To)) return 20;
if (From>To && (From-To)%11==0) for (i=From-11; i>=To; i-=11) if (Square[i]<10 || (Square[i]>100 && i!=To)) return 20;
if (To>From && (To-From)%11==0) for (i=From+11; i<=To; i+=11) if (Square[i]<10 || (Square[i]>100 && i!=To)) return 20;
if (From>To && (From-To)%9==0) for (i=From-9; i>=To; i-=9) if (Square[i]<10 || (Square[i]>100 && i!=To)) return 20;
if (To>From && (To-From)%9==0) for (i=From+9; i<=To; i+=9) if (Square[i]<10 || (Square[i]>100 && i!=To)) return 20;
break;
  case BQ : if (!
  (
(From>To && (From-To)%9==0 && GetY(To)>GetY(From)) ||
(From>To && (From-To)%11==0 && GetY(From)>GetY(To)) ||
(To>From && (To-From)%11==0 && GetY(To)>GetY(From)) ||
(To>From && (To-From)%9==0 && GetY(From)>GetY(To)) ||
(GetX(From)==GetX(To)) ||
(GetY(From)==GetY(To))
  )
  ) return 7;
if (GetX(From)==GetX(To) && To>From) for (i=From+1; i<=To; i++) if (Square[i]>100 || (Square[i]<10 && i!=To)) return 20;
if (GetX(From)==GetX(To) && From>To) for (i=From-1; i>=To; i--) if (Square[i]>100 || (Square[i]<10 && i!=To)) return 20;
if (GetY(From)==GetY(To) && To>From) for (i=From+10; i<=To; i+=10) if (Square[i]>100 || (Square[i]<10 && i!=To)) return 20;
if (GetY(From)==GetY(To) && From>To) for (i=From-10; i>=To; i-=10) if (Square[i]>100 || (Square[i]<10 && i!=To)) return 20;
if (From>To && (From-To)%11==0) for (i=From-11; i>=To; i-=11) if (Square[i]>100 || (Square[i]<10 && i!=To)) return 20;
if (To>From && (To-From)%11==0) for (i=From+11; i<=To; i+=11) if (Square[i]>100 || (Square[i]<10 && i!=To)) return 20;
if (From>To && (From-To)%9==0) for (i=From-9; i>=To; i-=9) if (Square[i]>100 || (Square[i]<10 && i!=To)) return 20;
if (To>From && (To-From)%9==0) for (i=From+9; i<=To; i+=9) if (Square[i]>100 || (Square[i]<10 && i!=To)) return 20;
break;
  case WP : if (GetY(From)>GetY(To)) return 16; // moving backwards?
// attempting capture?
if (Square[To]>100)
  if (To-From!=11 && From-To!=9) return 9; else break;
// attempting 2 squares?
if (GetY(To)-GetY(From)==2 && (GetX(To)==GetX(From))) {
if (GetY(From)!=2) return 10; // not on correct rank
else if (Square[From+1]!=EMPTY) return 17; // attempted jump
else break;
}
// attempting to move diagonally (if for capture, would not get this far)
if (GetX(From)!=GetX(To)) {
if (To-From==11 || From-To==9) { // No enemy, en-passant perhaps?
if (GetX(To)==Square[ENPAWN] && GetY(To)==6) break;
else return 18;
} else
return 8;
} else {  // must now be going straight forward, no capturing and no 2-square attempt
if (GetY(To)-GetY(From)>1) return 8; else
if (Square[To]>100) return 11; else // can't capture like this
break;
}
  case BP : if (GetY(From)<GetY(To)) return 16;  // moving backwards?
// attempting capture?
if (Square[To]<10)
  if (From-To!=11 && To-From!=9) return 9; else break;
// attempting 2 squares?
if (GetY(From)-GetY(To)==2 && (GetX(To)==GetX(From))) {
if (GetY(From)!=7) return 10; // not on correct rank
else if (Square[From-1]!=EMPTY) return 17; // attempted jump
else break;
}
// attempting to move diagonally (if for capture, would not get this far)
if (GetX(From)!=GetX(To)) {
if (From-To==11 || To-From==9) { // No enemy, en-passant perhaps?
if (GetX(To)==Square[ENPAWN] && GetY(To)==3) break;
else return 18;
} else
return 8;
} else {  // must now be going straight forward, no capturing and no 2-square attempt
if (GetY(From)-GetY(To)>1) return 8; else
if (Square[To]<10) return 11; else // can't capture like this
break;
}
  case WB : if ((To>From) && GetY(To)>GetY(From)) { // North-East
  if (abs(From-To)%11!=0) return 12;
  for (i=From+11; i<=To; i+=11) if (Square[i]<10) return 15; else if (Square[i]>100 && i!=To) return 15;
} else
if ((To>From) && GetY(To)<GetY(From)) { // South-East
  if (abs(From-To)%9!=0) return 12;
  for (i=From+9; i<=To; i+=9) if (Square[i]<10) return 15; else if (Square[i]>100 && i!=To) return 15;
} else
if ((To<From) && GetY(To)>GetY(From)) { // North-West
  if (abs(From-To)%9!=0) return 12;
  for (i=From-9; i>=To; i-=9) if (Square[i]<10) return 15; else if (Square[i]>100 && i!=To) return 15;
} else
if ((To<From) && GetY(To)<GetY(From)) { // South-West
  if (abs(From-To)%11!=0) return 12;
  for (i=From-11; i>=To; i-=11) if (Square[i]<10) return 15; else if (Square[i]>100 && i!=To) return 15;
} else return 12;
break;
  case BB : if ((To>From) && GetY(To)>GetY(From)) { // North-East
  if (abs(From-To)%11!=0) return 12;
  for (i=From+11; i<=To; i+=11) if (Square[i]>100) return 15; else if (Square[i]<10 && i!=To) return 15;
} else
if ((To>From) && GetY(To)<GetY(From)) { // South-East
  if (abs(From-To)%9!=0) return 12;
  for (i=From+9; i<=To; i+=9) if (Square[i]>100) return 15; else if (Square[i]<10 && i!=To) return 15;
} else
if ((To<From) && GetY(To)>GetY(From)) { // North-West
  if (abs(From-To)%9!=0) return 12;
  for (i=From-9; i>=To; i-=9) if (Square[i]>100) return 15; else if (Square[i]<10 && i!=To) return 15;
} else
if ((To<From) && GetY(To)<GetY(From)) { // South-West
  if (abs(From-To)%11!=0) return 12;
  for (i=From-11; i>=To; i-=11) if (Square[i]>100) return 15; else if (Square[i]<10 && i!=To) return 15;
} else return 12;
break;
  case WN : diff=abs(From-To);
if (diff!=12 && diff!=8 && diff!=21 && diff!=19) return 5;
break;
  case BN : diff=abs(From-To);
if (diff!=12 && diff!=8 && diff!=21 && diff!=19) return 5;
break;
}
// Is the mover in check once this move is made?
check_for_check:
// BackUpBoard(BACKUP);
memcpy(BackUpSquare, Square, sizeof(int)*89);
MakeMove(Move, FALSE);
if (Square[MOVER]==WHITE) Square[MOVER]=BLACK; else Square[MOVER]=WHITE; // Want to see check from point of view on non-Square[MOVER]
Checked=IsCheck();
memcpy(Square, BackUpSquare, sizeof(int)*89);
// BackUpBoard(RESTORE);
if (Checked) return 2;
else return 0;
} // end of TChessBoard::VerifyMove(TMove)

Código fuente del juego completo:
Código:
http://www.redhotpawn.com/rival/download/downloader.php?file=rival-source-1.8.28.zip

Saludos!



En línea

MCKSys Argentina

"Si piensas que algo está bien sólo porque todo el mundo lo cree, no estás pensando."

seba123neo


Desconectado Desconectado

Mensajes: 3.621



Ver Perfil WWW
Re: necesito ayuda para terminar un juego de ajedrez
« Respuesta #2 en: 23 Diciembre 2009, 00:15 am »

busca en PSC hay un monton de "motorcitos" de ajedrez y algunos basicos como para empezar, hay algunos que ni siquiera tienen motor sino que validan los movimientos de las piezas, eso te va a servir para empezar, esto es visual basic 6 te lo muevo a .NET.

PD:los ejemplos que te dije de PSC estan en visual basic 6, pero proba buscar en .NET seguro hay alguno.
En línea

Skeletron


Desconectado Desconectado

Mensajes: 1.731


A long way to go


Ver Perfil WWW
Re: necesito ayuda para terminar un juego de ajedrez
« Respuesta #3 en: 23 Diciembre 2009, 15:22 pm »

NO debe ser dificil, pero si tendrias que organizarte bien..

Crea una matriz de [ x ] [ y ]

Y valida la posicion anterior, con la final.

Si la piesa movida es CABALLO, y estaba en [2][3], y el movimiento final queda en: [x+2][y+1] o [x+2][y-1] o [x+1][y+2] o [x+1][y-2].. etc... ACEPTAR el movimiento, sino, avisar de movimiento invalido.
En línea

Páginas: [1] Ir Arriba Respuesta Imprimir 

Ir a:  

Mensajes similares
Asunto Iniciado por Respuestas Vistas Último mensaje
Juego de ajedrez en batch online
Scripting
WaAYa HaCK 1 3,448 Último mensaje 13 Mayo 2011, 16:17 pm
por D4RIO
Ayuda PC para juegos como el Ajedrez
Hardware
Senior++ 3 3,260 Último mensaje 20 Junio 2012, 14:19 pm
por Aprendiz-Oscuro
necesito ayuda para un juego...
Programación Visual Basic
marrison 3 2,225 Último mensaje 27 Junio 2013, 22:00 pm
por engel lex
ayuda para terminar el codigo
Programación C/C++
Riskettos 2 2,373 Último mensaje 8 Noviembre 2017, 05:53 am
por CalgaryCorpus
Necesito ayuda para terminar mi programa
Programación C/C++
bmillar 0 1,269 Último mensaje 4 Agosto 2018, 22:00 pm
por bmillar
WAP2 - Aviso Legal - Powered by SMF 1.1.21 | SMF © 2006-2008, Simple Machines