void solve(int q[N], int col, int board[N][N]) { static int count = 0; if (col == N) { printf("Sol:%d \n", ++count); count++; print(board, q); // reset board zero(board); } else { int i = 0; for (i = 0; i < N; i++) { q[col] = i; if (attacked(q, col)) { solve(q, col + 1, board); } } } }
int in_checkmate(B b) { // Make a transposition table (maybe permanent?) if(!b->pieces[KING + 6 * b->side_to_move]) return 1; // Deals with // pins etc. Bitboard attackers; if(!(attackers = attacked(bit_scan_forwards(b->pieces[KING + 6 * b->side_to_move]), b->side_to_move, b))) return 0; Move *moves = malloc(sizeof(Move) * 8); int move_no = king_move_gen(b, b->side_to_move, moves); int i; for(i = 0; i < move_no; i++) { take_move(moves[i], b); if(!attacked(get_to(moves[i]), !b->side_to_move, b)) { // Because // we made an extra move, the side counter will be in the wrong // position untake_move(moves[i], b); free(moves); return 0; } untake_move(moves[i], b); } free(moves); if(!(attackers & (attackers - 1))) { // Only one attacker int pos = bit_scan_forwards(attackers); if(attacked(pos, !b->side_to_move, b)) { // printf("%s", sqs[pos]); return 0; } else { Bitboard k = b->pieces[KING + 6 * b->side_to_move]; int piece = b->superbp[bit_scan_forwards(attackers)]; switch(piece) { Bitboard s, j; case PAWN: return 1; break; case KNIGHT: return 1; break; case BISHOP: if(get_ray_attacks(b, NW, pos, bit_scan_forwards) & b->pieces[KING + 6 * b->side_to_move]) { // Iterate through each bit, see if the square is attacked s = get_ray_attacks(b, NW, pos, bit_scan_forwards); } else if (get_ray_attacks(b, NE, pos, bit_scan_forwards) & b->pieces[KING + 6 * b->side_to_move]) { s = get_ray_attacks(b, NE, pos, bit_scan_forwards); } else if(get_ray_attacks(b, SE, pos, bit_scan_backwards) & b->pieces[KING + 6 * b->side_to_move]) { s = get_ray_attacks(b, SE, pos, bit_scan_backwards); } else if(get_ray_attacks(b, SW, pos, bit_scan_backwards) & b->pieces[KING + 6 * b->side_to_move]) { s = get_ray_attacks(b, SW, pos, bit_scan_backwards); } while(s) #define T if((j = attacked(pop_lsb(&s), !b->side_to_move, b) & \ ~(k | k << 8 | k >> 8 | ((k & ~file[0]) << 7) |\ ((k & ~file[0]) >> 9) | ((k & ~file[7]) << 9) |\ ((k & ~file[7]) >> 7) | (k << 1 & ~file[0]) |\ (k >> 1 & ~file[7])))){\ return 0;\ printf("foo");\ } T return 1; break; case ROOK: if(get_ray_attacks(b, N, pos, bit_scan_forwards) & b->pieces[KING + 6 * b->side_to_move]) { // Iterate through each bit, see if the square is attacked s = get_ray_attacks(b, N, pos, bit_scan_forwards); } else if (get_ray_attacks(b, E, pos, bit_scan_forwards) & b->pieces[KING + 6 * b->side_to_move]) { s = get_ray_attacks(b, E, pos, bit_scan_forwards); } else if(get_ray_attacks(b, S,pos, bit_scan_backwards) & b->pieces[KING + 6 * b->side_to_move]) { s = get_ray_attacks(b, S, pos, bit_scan_backwards); } else if(get_ray_attacks(b, W, pos, bit_scan_backwards) & b->pieces[KING + 6 * b->side_to_move]) { s = get_ray_attacks(b, W, pos, bit_scan_backwards); } while(s) T return 1; break; case QUEEN: if(get_ray_attacks(b, NW, pos, bit_scan_forwards) & b->pieces[KING + 6 * b->side_to_move]) { s = get_ray_attacks(b, NW, pos, bit_scan_forwards); } else if (get_ray_attacks(b, NE, pos, bit_scan_forwards) & b->pieces[KING + 6 * b->side_to_move]) { s = get_ray_attacks(b, NE, pos, bit_scan_forwards); } else if(get_ray_attacks(b, SE, pos, bit_scan_backwards) & b->pieces[KING + 6 * b->side_to_move]) { s = get_ray_attacks(b, SE, pos, bit_scan_backwards); } else if(get_ray_attacks(b, SW, pos, bit_scan_backwards) & b->pieces[KING + 6 * b->side_to_move]) { s = get_ray_attacks(b, SW, pos, bit_scan_backwards); } else if(get_ray_attacks(b, N, pos, bit_scan_forwards) & b->pieces[KING + 6 * b->side_to_move]) { s = get_ray_attacks(b, N, pos, bit_scan_forwards); } else if (get_ray_attacks(b, E, pos, bit_scan_forwards) & b->pieces[KING + 6 * b->side_to_move]) { s = get_ray_attacks(b, E, pos, bit_scan_forwards); } else if(get_ray_attacks(b, S, pos, bit_scan_backwards) & b->pieces[KING + 6 * b->side_to_move]) { s = get_ray_attacks(b, S, pos, bit_scan_backwards); } else if(get_ray_attacks(b, W, pos, bit_scan_backwards) & b->pieces[KING + 6 * b->side_to_move]) { s = get_ray_attacks(b, W, pos, bit_scan_backwards); } while(s) T return 1; break; case KING: return 1; break; default: break; } } }
void Cell::mouseDoubleClickEvent(QGraphicsSceneMouseEvent *event) { if (event->button() == Qt::LeftButton){ emit attacked(this->data(DATA_KEY).toInt()); } }
void Role::decipher(QString command) { QStringList arg=command.split(';'); QStringList cardIDList; int targetID,targetArea; int sourceID,sourceArea; int cardID; int howMany; int hitRate; int i; int team,gem,crystal; Card*card; Player*player; Team *red=dataInterface->getRedTeam(); Team *blue=dataInterface->getBlueTeam(); QList<Card*> cards; QString msg; QString flag; QString cardName; QList<Player*>playerList=dataInterface->getPlayerList(); ShowArea* showArea=gui->getShowArea(); switch (arg[0].toInt()) { //回合开始 case 3: targetID=arg[1].toInt(); gui->logAppend("-----------------------------------"); gui->logAppend(playerList[targetID]->getName()+tr("回合开始")); playerArea->setCurrentPlayerID(targetID); if(targetID!=myID) { isMyTurn=0; gui->setEnable(0); } else{ isMyTurn=true; onceUsed=false; start=false; usedAttack=usedMagic=usedSpecial=false; } break; //应战询问 case 5: hitRate=arg[1].toInt(); cardID=arg[2].toInt(); targetID=arg[3].toInt(); sourceID=arg[4].toInt(); card=dataInterface->getCard(cardID); if(targetID!=myID) { gui->setEnable(0); } else { gui->setEnable(1); msg=playerList[sourceID]->getName()+tr("对")+tr("你")+tr("使用了")+card->getName(); if (hitRate==2) return; if(hitRate==1) msg+=tr(",该攻击无法应战"); sourcePlayerID=sourceID; gui->reset(); tipArea->setMsg(msg); attacked(card->getElement(),hitRate); } break; //弃牌询问 case 7: targetID=arg[1].toInt(); howMany=arg[2].toInt(); flag=arg[3]; msg=playerList[targetID]->getName()+tr("需要弃")+arg[2]+tr("张手牌"); if(flag=="y") gui->logAppend(msg+tr("(明弃)")); else gui->logAppend(msg+tr("(暗弃)")); if(targetID!=myID) { gui->setEnable(0); } else { gui->setEnable(1); gui->reset(); drop(howMany); tipArea->setMsg(tr("你需要弃")+arg[2]+tr("张手牌")); } break; //摸牌 case 9: targetID=arg[1].toInt(); howMany=arg[2].toInt(); gui->logAppend(playerList[targetID]->getName()+tr("摸取")+arg[2]+tr("张手牌")); if(targetID==myID) { cardIDList=arg[3].split(','); for(i=0;i<howMany;i++) { cardID=cardIDList[i].toInt(); card=dataInterface->getCard(cardID); dataInterface->addHandCard(card); } } break; //牌堆重洗 case 10: gui->logAppend(tr("牌堆已重洗")); break; //士气改变 case 11: team=arg[1].toInt(); howMany=arg[2].toInt(); if(team) { red->setMorale(howMany); teamArea->update(); } else { blue->setMorale(howMany); teamArea->update(); } break; //游戏结束 case 12: team=arg[1].toInt(); msg=tr("游戏结束,"); if(team) msg+=tr("红队获胜"); else msg+=tr("蓝队获胜"); gui->logAppend(msg); tipArea->setMsg(msg); break; //弃牌公告 case 13: targetID=arg[1].toInt(); howMany=arg[2].toInt(); flag=arg[3]; msg=playerList[targetID]->getName()+tr("丢弃了")+arg[2]+tr("张手牌"); if(flag=="y") { cardIDList=arg[4].split(','); msg+=":"; cards.clear(); for(i=0;i<howMany;i++) { cardID=cardIDList[i].toInt(); card=dataInterface->getCard(cardID); msg+=card->getName()+"-"+card->getProperty()+" "; cards<<card; dataInterface->removeHandCard(card); } showArea->showCards(cards); } gui->logAppend(msg); break; //命中公告 case 14: flag=arg[1]; targetID=arg[3].toInt(); sourceID=arg[4].toInt(); if(flag=="1") msg=playerList[sourceID]->getName()+tr("未命中")+playerList[targetID]->getName(); else msg=playerList[sourceID]->getName()+tr("命中")+playerList[targetID]->getName(); gui->logAppend(msg); break; //星石改变 case 15: team=arg[1].toInt(); gem=arg[2].toInt(); crystal=arg[3].toInt(); if(team) { red->setGem(gem); red->setCrystal(crystal); teamArea->update(); } else { blue->setGem(gem); blue->setCrystal(crystal); teamArea->update(); } break; //星杯改变 case 17: team=arg[1].toInt(); howMany=arg[2].toInt(); if(team) { red->setGrail(howMany); teamArea->update(); } else { blue->setGrail(howMany); teamArea->update(); } break; //能量改变 case 18: targetID=arg[1].toInt(); gem=arg[2].toInt(); crystal=arg[3].toInt(); player=playerList.at(targetID); player->setGem(gem); player->setCrystal(crystal); playerArea->update(); break; //移牌通告 case 19: howMany=arg[1].toInt(); cardIDList=arg[2].split(","); sourceID=arg[3].toInt(); sourceArea=arg[4].toInt(); targetID=arg[5].toInt(); targetArea=arg[6].toInt(); if(sourceID!=-1) { switch(sourceArea) { case 4: player=playerList.at(sourceID); player->changeHandCardNum(-howMany); break; case 5: cardID=cardIDList[0].toInt(); card=dataInterface->getCard(cardID); playerList[sourceID]->removeStatus(card); break; } } if(targetID!=-1) { switch(targetArea) { case 4: player=playerList.at(targetID); player->changeHandCardNum(howMany); break; case 5: cardID=cardIDList[0].toInt(); card=dataInterface->getCard(cardID); cardName=card->getName(); if(cardName==tr("中毒")) playerList[targetID]->addStatus(0,card); if(cardName==tr("虚弱")) playerList[targetID]->addStatus(1,card); if(cardName==tr("圣盾")||card->getSpecialityList().contains(tr("天使之墙"))) playerList[targetID]->addStatus(2,card); if(card->getType()=="attack"&&card->getProperty()=="幻") playerList[targetID]->addStatus(3,card); break; } } playerArea->update(); break; //物伤通告 case 20: targetID=arg[1].toInt(); sourceID=arg[3].toInt(); gui->logAppend(playerList[sourceID]->getName()+tr("对")+playerList[targetID]->getName()+tr("造成了")+arg[2]+tr("点攻击伤害")); break; //法术通告 case 21: targetID=arg[1].toInt(); sourceID=arg[3].toInt(); gui->logAppend(playerList[sourceID]->getName()+tr("对")+playerList[targetID]->getName()+tr("使用的")+arg[4]+tr("造成了")+arg[2]+tr("点法术伤害")); break; //虚弱询问 case 22: targetID=arg[1].toInt(); gui->logAppend(tr("等待")+playerList[targetID]->getName()+tr("虚弱响应")); if(targetID!=myID) { gui->setEnable(0); } else { gui->setEnable(1); gui->reset(); state=7; decisionArea->enable(0); decisionArea->enable(1); tipArea->setMsg(tr("你被虚弱了,选是跳过行动阶段,选否摸")+arg[2]+tr("张牌")); } break; //虚弱结果 case 24: targetID=arg[1].toInt(); if(arg[2]=="0") gui->logAppend(playerList[targetID]->getName()+tr("选择跳过行动阶段")); else gui->logAppend(playerList[targetID]->getName()+tr("选择摸")+arg[3]+tr("张牌挣脱")); break; //圣盾移除通告 case 25: targetID=arg[1].toInt(); gui->logAppend(playerList[targetID]->getName()+tr("的圣盾被移除")); break; //魔弹询问 case 26: int nextID; targetID=arg[1].toInt(); sourceID=arg[2].toInt(); howMany=arg[3].toInt(); nextID=arg[4].toInt(); gui->logAppend(playerList[sourceID]->getName()+tr("对")+playerList[targetID]->getName()+tr("使用了魔弹,目前伤害为:")+arg[3]+tr("点")); if(targetID!=myID) { gui->setEnable(0); } else { gui->setEnable(1); msg=playerList[sourceID]->getName()+tr("对")+tr("你")+tr("使用了魔弹,目前伤害为:")+arg[3]+tr("点"); gui->reset(); tipArea->setMsg(msg); moDaned(nextID); } break; //卡牌通告 case 28: cardID=arg[1].toInt(); targetID=arg[2].toInt(); sourceID=arg[3].toInt(); flag=arg[4]; card=dataInterface->getCard(cardID); cardName=card->getName(); if(flag=="1"){ cards.clear(); cards<<card; showArea->showCards(cards); } if(card->getElement()!="light") gui->logAppend(playerList[sourceID]->getName()+tr("对")+playerList[targetID]->getName()+tr("使用了")+cardName); else gui->logAppend(playerList[sourceID]->getName()+tr("使用圣光抵御")); break; //行动阶段 flag 0-所有行动,1-攻击行动,2-法术行动,3-特殊行动,4-攻击或法术行动 case 29: targetID=arg[1].toInt(); flag=arg[2]; if(targetID!=myID) { isMyTurn=0; gui->setEnable(0); actionFlag=-1; } else { gui->setEnable(1); if(flag=="0") normal(); else if(flag=="1") attackAction(); else if(flag=="2") magicAction(); else if(flag=="4") attackOrMagic(); if(arg[3]=="1") decisionArea->enable(3); } break; //无法行动公告 case 31: targetID=arg[1].toInt(); msg=playerList[targetID]->getName()+tr("宣告无法行动"); gui->logAppend(msg); break; //治疗改变 case 32: targetID=arg[1].toInt(); howMany=arg[2].toInt(); playerList[targetID]->setCrossNum(howMany); break; //治疗询问 case 33: targetID=arg[1].toInt(); howMany=arg[2].toInt(); flag=arg[3]; gui->reset(); if(targetID==myID) cure(playerList[myID]->getCrossNum(),howMany,flag.toInt()); break; //技能响应询问 case 35: targetID=arg[1].toInt(); flag=arg[2]; msg=tr("等待")+playerList[targetID]->getName()+flag+tr("响应"); gui->logAppend(msg); gui->reset(); gui->setEnable(0); break; //信息通告 case 38: gui->logAppend(arg[1]); break; //角色形态转换通知 case 39: targetID=arg[1].toInt(); flag=arg[2]; if(flag=="0") { playerList[targetID]->setTap(0); msg=playerList[targetID]->getName()+tr("返回")+arg[3]; } else { playerList[targetID]->setTap(1); msg=playerList[targetID]->getName()+tr("进入")+arg[3]; } playerArea->update(); gui->logAppend(msg); gui->reset(); gui->setEnable(0); break; //手牌上限变更通知 case 40: targetID=arg[1].toInt(); howMany=arg[2].toInt(); playerList[targetID]->setHandCardsMax(howMany); playerArea->update(); break; //获得手牌通告 case 41: targetID=arg[1].toInt(); flag=arg[2]; howMany=arg[3].toInt(); gui->logAppend(playerList[targetID]->getName()+tr("获得")+arg[3]+tr("张手牌")); if(targetID==myID) { cardIDList=arg[4].split(','); for(i=0;i<howMany;i++) { cardID=cardIDList[i].toInt(); card=dataInterface->getCard(cardID); dataInterface->addHandCard(card); } } break; //额外行动询问 case 42: targetID=arg[1].toInt(); gui->logAppend(tr("等待")+playerList[targetID]->getName()+tr("额外行动响应")); if(targetID==myID) { gui->setEnable(1); addtionalAction(); } else gui->setEnable(0); break; //专属变更 case 43: targetID=arg[1].toInt(); msg=arg[2]; playerList.at(targetID)->setSpecial(msg.toInt(),arg[3].toInt()); playerArea->update(); break; //标记变更 case 45: targetID=arg[1].toInt(); flag=arg[2]; howMany=arg[3].toInt(); playerList.at(targetID)->setToken(flag.toInt(),howMany); playerArea->update(); break; //天使祝福 case 750: targetID=arg[1].toInt(); howMany=arg[2].toInt(); msg=tr("等待")+playerList[targetID]->getName()+tr("天使祝福(给牌)响应"); gui->logAppend(msg); if(targetID!=myID) { isMyTurn=0; gui->setEnable(0); } else { gui->setEnable(1); TianShiZhuFu(howMany); } break; //魔爆冲击(弃牌) case 850: targetID=arg[1].toInt(); msg=tr("等待")+playerList[targetID]->getName()+tr("魔爆冲击(弃牌)响应"); gui->logAppend(msg); if(targetID!=myID) { isMyTurn=0; gui->setEnable(0); } else { gui->setEnable(1); MoBaoChongJi(); } break; } }
/*in_check() returns 1 if king of color 'color' is in check, 0 otherwise*/ int in_check(const int color) { assert(Name(color,0)==king); assert(Name((color ^ 1),0)==king); return attacked(Position(color, 0), (color ^ 1)); }
// Returns a one if side to move is in check // Returns a zero if not. int position::in_check() { check = attacked(plist[wtm][KING][1], wtm^1); return check; }
/* Aggiorna la scacchiera e le altre strutture dati eseguendo la mossa La verifica di legalita' viene effettuata quando: -la mossa è una mossa di re -il re è sotto scacco -il re è sotto attacco x-ray */ int makemove(const MOVE m, const unsigned char s) { unsigned char from=0; /*da dove parte il pezzo*/ unsigned char to=0; /*dove copiare il pezzo*/ char was=0; /*cosa era il pezzo?*/ char wh=0; unsigned char del=0; /*dove cancellare*/ assert(Name(WHITE,0)==king); assert(Name(BLACK,0)==king); if (Piece(m.ms.to)==king) return 0; /*copia la chiave hash per l'unmake()*/ BHash(N_moves) = Hash; /*copia la castle_exe per l'unmake()*/ BCste(N_moves) = Cste; /*copia la bitboard per l'unmake()*/ BBitb(N_moves, Side) = Bitboard(Side); /*Controlla che l'arrocco sia legale e sposta la torre */ if (m.ms.flag & (M_OO | M_OOO)) { if (tree.check[Side][Ply]) return 0; switch (m.ms.to) { case C8: if (attacked(C8, WHITE) || attacked(D8, WHITE)) return 0; from = A8; to = D8; Cste |= cas_booo; break; case G8: if (attacked(F8, WHITE) || attacked(G8, WHITE)) return 0; from = H8; to = F8; Cste |= cas_boo; break; case C1: if (attacked(C1, BLACK) || attacked(D1, BLACK)) return 0; from = A1; to = D1; Cste |= cas_wooo; break; case G1: if (attacked(F1, BLACK) || attacked(G1, BLACK)) return 0; from = H1; to = F1; Cste |= cas_woo; break; default: puts("Bad castle request."); assert(0); } /*sposta torre aggiornando la chiave hash*/ UpdateHash(from); Piece(to) = Piece(from); Color(to) = Color(from); Plist(to) = Plist(from); Position((Color(to)), (Plist(to))) = to; Piece(from) = no_piece; Color(from) = EMPTY; Plist(from) = no_list; UpdateHash(to); SetBB(Side, to); DelBB(Side, from); } /*sposta il pezzo*/ from = m.ms.from; to = m.ms.to; was = Piece(from); wh = Plist(from); assert(was>=0); assert(was<=king); assert(Name(Side,0)==king); assert(Name(Xside,0)==king); if (wh>0){ assert(Name(Side,wh)!=king); } /*Se la mossa e' una cattura cancella il pezzo dalla casella di arrivo*/ if (m.ms.flag & M_CAP) { del = to; /*se è una cattura en passant aggiustiamo casella*/ if (m.ms.flag & M_ENP) { if (Side) del += DOWN; else del += UP; } BCapP(N_moves) = Piece(del); BCapPos(N_moves) = Plist(del); BCapC(N_moves) = Xside; BBitb(N_moves, Xside) = Bitboard(Xside); Active(Xside, (Plist(del))) = CAPTURED; Piece(del) = no_piece; Color(del) = EMPTY; Plist(del) = no_list; DelBB(Xside, del); } Piece(to) = Piece(from); if (m.ms.piece!=was)Piece(to)=m.ms.piece; Color(to) = Side; Plist(to) = wh; Position((Side), (wh)) = to; Piece(from) = no_piece; Color(from) = EMPTY; Plist(from) = no_list; SetBB(Side, to); DelBB(Side, from); /*effettuato il minimo indispensabile verifica, se opportuno, la legalità della mossa*/ assert(Name(Side,0)==king); assert(Name(Xside,0)==king); if (wh>0){ assert(Name(Side,wh)!=king); } if ( tree.verify[Ply] || tree.check[Side][Ply] || (m.ms.flag & M_KNG) ||(m.ms.flag & M_ENP)) { if (in_check(Side)) { /*unmake() locale*/ Piece(from) = Piece(to); if (Piece(from)!=was)Piece(from)=was; Color(from) = Side; Plist(from) = wh; Position((Side), (wh)) = from; Piece(to) = no_piece; Color(to) = EMPTY; Plist(to) = no_list; Bitboard(Side) = BBitb(N_moves, Side); if (m.ms.flag & M_CAP) { Piece(del) = BCapP(N_moves); Color(del) = BCapC(N_moves); Plist(del) = BCapPos(N_moves); Active((Xside), (Plist(del))) = FREE; Position((Xside), (Plist(del))) = del; Bitboard(Xside) = BBitb(N_moves, Xside); assert(Name(Side,0)==king); assert(Name(Xside,0)==king); if (Plist(del)>0){ assert(Name(Xside,Plist(del))!=king); } } assert(Name(Side,0)==king); assert(Name(Xside,0)==king); if (wh>0){ assert(Name(Side,wh)!=king); } return 0; } } /*Selectivity*/ if (s && ((!in_check(Xside)) || ((m.ms.flag& M_CAP)==0))) { /*unmake() locale*/ Piece(from) = Piece(to); if (Piece(from)!=was)Piece(from)=was; Color(from) = Side; Plist(from) = wh; Position((Side), (wh)) = from; Piece(to) = no_piece; Color(to) = EMPTY; Plist(to) = no_list; Bitboard(Side) = BBitb(N_moves, Side); if (m.ms.flag & M_CAP) { Piece(del) = BCapP(N_moves); Color(del) = BCapC(N_moves); Plist(del) = BCapPos(N_moves); Active((Xside), (Plist(del))) = FREE; Position((Xside), (Plist(del))) = del; Bitboard(Xside) = BBitb(N_moves, Xside); assert(Name(Side,0)==king); assert(Name(Xside,0)==king); if (Plist(del)>0){ assert(Name(Xside,Plist(del))!=king); } } assert(Name(Side,0)==king); assert(Name(Xside,0)==king); if (wh>0){ assert(Name(Side,wh)!=king); } return 0; } /*back up per l'unmakemove() i dati per la cattura e la hash della posizione sono gia' memorizzati*/ tree.history[N_moves].m.mi = m.mi; tree.history[N_moves].cast.castle_right = Cstr; tree.history[N_moves].enp = Enp; tree.history[N_moves].fifty = tree.fifty; tree.history[N_moves].was = was; tree.history[N_moves].material[Side] = Material(Side); tree.history[N_moves].material[Xside] = Material(Xside); BPBitb(N_moves, Side) = Pbitboard(Side); BPBitb(N_moves, Xside) = Pbitboard(Xside); /*aggiorna diritti arrocco*/ UpdateHashCastle(Cstr); Cstr &= castle_mask[b256to64[from]] & castle_mask[b256to64[to]]; UpdateHashCastle(Cstr); Hash ^= zobrist_enp[b256to64[Enp]]; Enp = 0; tree.fifty++; /*se irreversibile...*/ if (m.ms.flag&(M_PAW | M_CAP)) { tree.fifty = 0; if (m.ms.flag&M_DBP) { if (Side) Enp = to + DOWN; else Enp = to + UP; } if (m.ms.flag&M_PAW) { DelPBB(Side, from); if ((m.ms.flag&M_PRO) == 0) SetPBB(Side, to); } if (m.ms.flag&M_CAP) { tree.history[N_moves].del = del; Hash ^= zobrist[Xside][BCapP(N_moves)][b256to64[del]]; Material(Xside) -= piece_value[BCapP(N_moves)]; Num_piece(Xside, BCapP(N_moves))--; Pbitboard(Xside) &= (~(bit_square[del])); } Material(Side) -= piece_value[was]; Material(Side) += piece_value[m.ms.piece]; Num_piece(Side, was)--; Num_piece(Side, m.ms.piece)++; } Hash ^= zobrist_enp[b256to64[Enp]]; Hash ^= zobrist[Side][was][b256to64[from]]; Hash ^= zobrist[Side][m.ms.piece][b256to64[to]]; Hash ^= zobrist_side; Ply++; N_moves++; Change(Side); Change(Xside); assert(Name(WHITE,0)==king); assert(Name(BLACK,0)==king); return 1; }