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; }
// 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; }
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])); } }