コード例 #1
0
ファイル: fish.cpp プロジェクト: vegetable68/hw-2012
bool fish::attack(int x,int y){
    if (x <= 0 || y <= 0 || x > N || y > M) return 0;
    if (x == posx && y == posy) return 0;
    if (attacked || Map[x][y] == EMPTY || hp[ID] <= 0 || Strength == 0) {attacked = 1; return 0;}
    if (!in_range(posx, posy, x, y, 1)) {attacked = 1; return 0;}
    if (Map[x][y] > 0){
		hp[ Map[x][y] ] -= Strength;
        emit Attacked(ID, Map[x][y]);
      //  std::cout<<ID<<" "<<Map[x][y]<<std::endl;
		if (hp[ Map[x][y] ] <= 0){
			Exp += max(1, Lev[ Map[x][y] ] / 2);
			update_lev(ID);	
			kill(x, y);
            if (Lev[Map[x][y]] > Lev[ID]) Score += 2 * (Lev[Map[x][y]] - Lev[ID]);
		}
	}else{
      //  std::cout<<ID<<std::endl;
		hp[ID] = min(MaxHP, hp[ID] + (2, MaxHP / 10));	
		Exp ++;
        emit Ate(ID, Map[x][y] * FOOD);
        Map[x][y] = EMPTY;
		update_lev(ID);
	}
	attacked = 1;
}
コード例 #2
0
// Pour voir si le killer move est toujours valide avant de le jouer.
bool ValideMove(int ply, int wtm, TMove& move)
{
  // Verifier si la case de depart contient la bonne piece.
  if ( move.Piece < 1 || move.Piece > 6 )
    return false;
  if ( move.Capture < 0 || move.Capture > 5 )
    return false;


  if ( wtm ) {
    if ( cb.board[move.From] != move.Piece )
      return false;
  }
  else {
    if ( cb.board[move.From] != -move.Piece )
      return false;
  }

  // Verifier les coups un peu special.
  switch( move.Piece ) {
    case 0:
      return false;
    case roi:
      // Verifier le roque du roi seulement.
      if ( abs( int(move.To - move.From) ) == 2 ) {
        if ( wtm ) {
          // Roque du roi.
          if ( move.To == G1 ) {
            if ( !(cb.Roque & ROQUEROIBLANC) &&
                 (cb.vide & 0x6000000000000000LL) == 0x6000000000000000LL &&
                 !Attacked(E1, !wtm) &&
                 !Attacked(F1, !wtm) &&
                 !Attacked(G1, !wtm) )
              return true;
            else
              return false;
          }
          else {
            // Roque cote dame.
            if ( !(cb.Roque & ROQUEDAMEBLANC) &&
                 (cb.vide & 0x0E00000000000000LL) == 0x0E00000000000000LL &&
                 !Attacked(E1, !wtm) &&
                 !Attacked(D1, !wtm) &&
                 !Attacked(C1, !wtm) )
              return true;
            else
              return false;
          }
        }
        else {
          if ( move.To == G8 ) {
            // Roque cote roi.
            if ( !(cb.Roque & ROQUEROINOIR) &&
                 (cb.vide & 0x60 ) == 0x60 &&
                 !Attacked(E8, !wtm) &&
                 !Attacked(F8, !wtm) &&
                 !Attacked(G8, !wtm) )
              return true;
            else
              return false;
          }
          else {
            if ( !(cb.Roque & ROQUEDAMENOIR) &&
                 (cb.vide & 0x0E) == 0x0E &&
                 !Attacked(E8, !wtm) &&
                 !Attacked(D8, !wtm) &&
                 !Attacked(C8, !wtm))
              return true;
            else
              return false;
          }
        }
      }
      break;
    case pion:
        // Verifier le pion qui avance et le enpassant. La capture est
        // verifier avec les autre pieces normales.
        // Le pion qui avance d'une case.
        if ( wtm ) {
          if ( move.To - move.From == -8 ) {
            if ( move.Capture == 0 && cb.board[move.To] == 0 )
              return true;
            else
              return false;
          }
          else if ( move.To - move.From == -16 ) {
            if ( move.Capture == 0 && cb.board[move.To+8] == 0 &&
                 cb.board[move.To] == 0 )
              return true;
            else
              return false;
          }
        }
        else {
          if ( move.To - move.From == 8 ) {
            if ( move.Capture == 0 && cb.board[move.To] == 0 )
              return true;
            else
              return false;
          }
          else if ( abs( int(move.To - move.From) ) == 16 ) {
            if ( move.Capture == 0 && cb.board[move.To-8] == 0 &&
                 cb.board[move.To] == 0 )
              return true;
            else
              return false;
          }
        }
        
        if ( move.EnPassant ) {
          return false;
          if ( wtm ) {
            if ( (unsigned)cb.EnPassantN[ply] == move.To &&
                 move.Capture == pion )
              return true;
            else
              return false;
          }
          else {
            if ( (unsigned)cb.EnPassantB[ply] == move.To &&
                 move.Capture == pion )
              return true;
            else
              return false;
          }
        }
      return false;
  }

  if ( wtm ) {
    if ( -move.Capture == cb.board[move.To] &&
         (AttaqueDe(move.To, wtm) & mask[move.From]) )
      return true;
  }
  else {
    if (move.Capture == cb.board[move.To] &&
         (AttaqueDe(move.To, wtm ) & mask[move.From]))
      return true;
  }

  return false;
}
コード例 #3
0
ファイル: movegen.c プロジェクト: hyattpd/Bucephalus
void GenerateMoves(Listnode *ml, Position *pos)
{

int i, j, x, y, direc, cancastle;
unsigned char side = pos->side, xside;
SQUARE board[12][12];

if(side == WHITE)  {
  xside = BLACK;  direc = 1;  }
else {
  xside = WHITE;  direc = -1;  }

ClearMoves(ml);
for(i = 0; i < MAXLEGAL; i++) {
  ml->moves[i].oldep = pos->epstatus;
  ml->moves[i].oldcastle = pos->castle;  }

memcpy(&(board[0][0]), &(pos->board[0][0]), sizeof(SQUARE) * 144);

for(i = 2; i < 10; i++)  {
  for(j = 2; j < 10; j++)  {
    if(board[i][j] != 0 && (board[i][j] & side))  {
      if(board[i][j] & KNIGHT)  {
        x = -1; y = -2;
	if((board[i+x][j+y] != OFFBOARD) && (!(board[i+x][j+y] & side))) {
          if(board[i+x][j+y] & xside)  AddMove(ml, i, j, i+x, j+y, CAPTURE);
          else AddMove(ml, i, j, i+x, j+y, NORMAL);
        }
        x = -1; y = 2;
        if((board[i+x][j+y] != OFFBOARD) && (!(board[i+x][j+y] & side))) {
          if(board[i+x][j+y] & xside)  AddMove(ml, i, j, i+x, j+y, CAPTURE);
          else AddMove(ml, i, j, i+x, j+y, NORMAL);
        }
        x = 1; y = -2;
	if((board[i+x][j+y] != OFFBOARD) && (!(board[i+x][j+y] & side))) {
          if(board[i+x][j+y] & xside)  AddMove(ml, i, j, i+x, j+y, CAPTURE);
          else AddMove(ml, i, j, i+x, j+y, NORMAL);
        }
      	x = 1; y = 2;
	if((board[i+x][j+y] != OFFBOARD) && (!(board[i+x][j+y] & side))) {
          if(board[i+x][j+y] & xside)  AddMove(ml, i, j, i+x, j+y, CAPTURE);
          else AddMove(ml, i, j, i+x, j+y, NORMAL);
        }
       	x = -2; y = -1;
	if((board[i+x][j+y] != OFFBOARD) && (!(board[i+x][j+y] & side))) {
          if(board[i+x][j+y] & xside)  AddMove(ml, i, j, i+x, j+y, CAPTURE);
          else AddMove(ml, i, j, i+x, j+y, NORMAL);
        }
        x = -2; y = 1;
	if((board[i+x][j+y] != OFFBOARD) && (!(board[i+x][j+y] & side))) {
          if(board[i+x][j+y] & xside)  AddMove(ml, i, j, i+x, j+y, CAPTURE);
          else AddMove(ml, i, j, i+x, j+y, NORMAL);
        }
        x = 2; y = -1;
	if((board[i+x][j+y] != OFFBOARD) && (!(board[i+x][j+y] & side))) {
          if(board[i+x][j+y] & xside)  AddMove(ml, i, j, i+x, j+y, CAPTURE);
          else AddMove(ml, i, j, i+x, j+y, NORMAL);
        }
        x = 2; y = 1;
	if((board[i+x][j+y] != OFFBOARD) && (!(board[i+x][j+y] & side))) {
          if(board[i+x][j+y] & xside)  AddMove(ml, i, j, i+x, j+y, CAPTURE);
          else AddMove(ml, i, j, i+x, j+y, NORMAL);
        }
      }
      if((board[i][j] & BISHOP) || (board[i][j] & QUEEN))  {
        for(x = 1; (board[i-x][j-x] != OFFBOARD) && (!(board[i-x][j-x] & side)); x++)
          if(board[i-x][j-x] & xside)  {  
            AddMove(ml, i, j, i-x, j-x, CAPTURE);
            break;  }
	  else AddMove(ml, i, j, i-x, j-x, NORMAL);
        for(x = 1; (board[i-x][j+x] != OFFBOARD) && (!(board[i-x][j+x] & side)); x++)
          if(board[i-x][j+x] & xside)  {  
            AddMove(ml, i, j, i-x, j+x, CAPTURE);
            break;  }
	  else AddMove(ml, i, j, i-x, j+x, NORMAL);
        for(x = 1; (board[i+x][j-x] != OFFBOARD) && (!(board[i+x][j-x] & side)); x++)
          if(board[i+x][j-x] & xside)  {  
            AddMove(ml, i, j, i+x, j-x, CAPTURE);
            break;  }
	  else AddMove(ml, i, j, i+x, j-x, NORMAL);
        for(x = 1; (board[i+x][j+x] != OFFBOARD) && (!(board[i+x][j+x] & side)); x++)
          if(board[i+x][j+x] & xside)  {  
            AddMove(ml, i, j, i+x, j+x, CAPTURE);
            break;  }
	  else AddMove(ml, i, j, i+x, j+x, NORMAL);
        }
      if((board[i][j] & ROOK) || (board[i][j] & QUEEN))  {
        for(x = 1; (board[i-x][j] != OFFBOARD) && (!(board[i-x][j] & side)); x++)
          if(board[i-x][j] & xside) {
            AddMove(ml, i, j, i-x, j, CAPTURE);
            break;  }
          else AddMove(ml, i, j, i-x, j, NORMAL);
        for(x = 1; (board[i+x][j] != OFFBOARD) && (!(board[i+x][j] & side)); x++)
          if(board[i+x][j] & xside) {
            AddMove(ml, i, j, i+x, j, CAPTURE);
            break;  }
          else AddMove(ml, i, j, i+x, j, NORMAL);
        for(x = 1; (board[i][j-x] != OFFBOARD) && (!(board[i][j-x] & side)); x++)
          if(board[i][j-x] & xside) {
            AddMove(ml, i, j, i, j-x, CAPTURE);
            break;  }
          else AddMove(ml, i, j, i, j-x, NORMAL);
        for(x = 1; (board[i][j+x] != OFFBOARD) && (!(board[i][j+x] & side)); x++)
          if(board[i][j+x] & xside) {
            AddMove(ml, i, j, i, j+x, CAPTURE);
            break;  }
          else AddMove(ml, i, j, i, j+x, NORMAL);
        }
      if(board[i][j] & KING)  {
        for(x = -1; x <= 1; x++)
          for(y = -1; y <= 1; y++)  {
            if(x == 0 && y == 0) continue;
            if((board[i+x][j+y] != OFFBOARD) && (!(board[i+x][j+y] & side))) {
              if(board[i+x][j+y] & xside)  AddMove(ml, i, j, i+x, j+y, CAPTURE);
              else AddMove(ml, i, j, i+x, j+y, NORMAL);
            }
          }
        }
      if(board[i][j] & PAWN)  {
        if(board[i][j+direc] == 0) {
          if((direc == -1 && j == 3) || (direc == 1 && j == 8))
            AddMove(ml, i, j, i, j+direc, PROMOTE);
          else AddMove(ml, i, j, i, j+direc, NORMAL);
        }
        if((direc == -1 && j == 8) || (direc == 1 && j == 3))
          if(board[i][j+direc+direc] == 0 && board[i][j+direc] == 0) 
            AddMove(ml, i, j, i, j+direc+direc, TWOMOVE);
        if((board[i-1][j+direc] != OFFBOARD) && (board[i-1][j+direc] & xside)) {
          if((direc == -1 && j == 3) || (direc == 1 && j == 8))
            AddMove(ml, i, j, i-1, j+direc, PROMCAP);
          else AddMove(ml, i, j, i-1, j+direc, CAPTURE);      
        }
        if((board[i+1][j+direc] != OFFBOARD) && (board[i+1][j+direc] & xside)) {
          if((direc == -1 && j == 3) || (direc == 1 && j == 8))
            AddMove(ml, i, j, i+1, j+direc, PROMCAP);
          else AddMove(ml, i, j, i+1, j+direc, CAPTURE); 
        }
        /* there is at least one ep square */  
        if(pos->epstatus > 0 && direc == 1) {
          if(j == 6 && IsEpSquare(i-1, 6, pos->epstatus) == 1 && board[i-1][j+direc] == 0)
            AddMove(ml, i, j, i-1, j+direc, ENPASSANT);
          if(j == 6 && IsEpSquare(i+1, 6, pos->epstatus) == 1 && board[i+1][j+direc] == 0)
            AddMove(ml, i, j, i+1, j+direc, ENPASSANT);
        }

        if(pos->epstatus > 0 && direc == -1)  {
          if(j == 5 && IsEpSquare(i-1, 5, pos->epstatus) == 1 && board[i-1][j+direc] == 0)
            AddMove(ml, i, j, i-1, j+direc, ENPASSANT);
          if(j == 5 && IsEpSquare(i+1, 5, pos->epstatus) == 1 && board[i+1][j+direc] == 0)
            AddMove(ml, i, j, i+1, j+direc, ENPASSANT);   
        }
      }
    }
  }
}

if((pos->castle & WKC) && side == WHITE)  {
  cancastle = 1;
  for(i = KFILE; i <= 8; i++) 
    if(Attacked(pos, i, 2, xside) == 1) cancastle = 0;
  for(i = Minval(7, KFILE); i <= 8; i++)
    if(i != KFILE && i != KRFILE && board[i][2] != 0) cancastle = 0;
 if(cancastle == 1)
    AddMove(ml, KFILE, 2, 8, 2, KSCASTLE);  }
if((pos->castle & BKC) && side == BLACK)  {
  cancastle = 1;
  for(i = KFILE; i <= 8; i++) 
    if(Attacked(pos, i, 9, xside) == 1) cancastle = 0;
  for(i = Minval(7, KFILE); i <= 8; i++)
    if(i != KFILE && i != KRFILE && board[i][9] != 0) cancastle = 0;
 if(cancastle == 1)
    AddMove(ml, KFILE, 9, 8, 9, KSCASTLE);  }
if((pos->castle & WQC) && side == WHITE)  {
  cancastle = 1;
  for(i = Minval(4, KFILE); i <= Maxval(4, KFILE); i++) 
    if(Attacked(pos, i, 2, xside) == 1) cancastle = 0;
  for(i = Minval(QRFILE + 1, 4); i <= Maxval(5, KFILE); i++)
    if(i != KFILE && i != QRFILE && board[i][2] != 0) cancastle = 0;
 if(cancastle == 1)
    AddMove(ml, KFILE, 2, 4, 2, QSCASTLE);  }
if((pos->castle & BQC) && side == BLACK)  {
  cancastle = 1;
  for(i = Minval(4, KFILE); i <= Maxval(4, KFILE); i++) 
    if(Attacked(pos, i, 9, xside) == 1) cancastle = 0;
  for(i = Minval(QRFILE + 1, 4); i <= Maxval(5, KFILE); i++)
    if(i != KFILE && i != QRFILE && board[i][9] != 0) cancastle = 0;
 if(cancastle == 1)
    AddMove(ml, KFILE, 9, 4, 9, QSCASTLE);  }

for(i = 0; ml->moves[i].mtype != EMPTY; i++)  {
  MakeMove(pos, &(ml->moves[i]));
  if(IsCheck(pos, side) == 1)  {
    UnmakeMove(pos, &(ml->moves[i]));
    ml->moves[i].mtype = EMPTY;
    ml->num--;  }
  else UnmakeMove(pos, &(ml->moves[i]));
  }

}