vector<Pos> Board::GetMovableCanditates(Pos pos) { vector<Pos> candidates; switch(stage[pos.y][pos.x]) { case HG: case CG: case Hs: case Cs: candidates = MoveGung(pos); break; case HC: case CC: candidates = MoveCha(pos); break; case HM: case CM: candidates = MoveMa(pos); break; case HS: case CS: candidates = MoveSang(pos); break; case HP: case CP: candidates = MovePo(pos); break; case HJ: case CJ: candidates = MoveJol(pos); break; default: throw; } // Remove redundancy vector<Pos> results; for (int i = 0; i < candidates.size(); i++) { bool isUnique = true; Pos candidate = candidates[i]; for (int s = 0; s < i - 1; s++) { if (candidate.x == candidates[s].x && candidate.y == candidates[s].y) { isUnique = false; break; } } if (isUnique) results.push_back(candidate); } return results; }
/** * 能否走子 */ BOOL CUpGradeGameLogic::CanMoveQiZi(int fromi, int fromj, int toi, int toj, int qi[][9],bool check) { ::CopyMemory(m_iQiZi,qi,sizeof(m_iQiZi)); if ( (toi == fromi && toj == fromj) || (toi < 0 || toj < 0) || (toi > 9 || toj > 8) || (fromi < 0 || fromj < 0) || (fromi > 9 || fromj > 8) ) { return FALSE; } int qizi = m_iQiZi[fromi][fromj]; if (qizi == XQ_QIZI_NONE) return FALSE; int flag; if (qizi > 0) flag = XQ_FLAG_RED; else if (qizi < 0) flag = XQ_FLAG_BLACK; else return FALSE; if (flag * m_iQiZi[toi][toj] > 0) return FALSE; BOOL ret = FALSE; if (qizi == XQ_RED_JU || qizi == XQ_BLACK_JU) { ret = MoveZhu(fromj,fromi,toj,toi); goto retu; } if (qizi == XQ_RED_MA || qizi == XQ_BLACK_MA) { ret = MoveMa(fromj,fromi,toj,toi); goto retu; } if (qizi == XQ_RED_PAO || qizi == XQ_BLACK_PAO) { ret = MovePao(fromj,fromi,toj,toi,flag); goto retu; } if (qizi == XQ_RED_JIANG || qizi == XQ_BLACK_JIANG) { ret = MoveShuai(fromj,fromi,toj,toi); goto retu; } if (qizi == XQ_RED_SHI || qizi == XQ_BLACK_SHI) { ret = MoveShi(fromj,fromi,toj,toi); goto retu; } if (qizi == XQ_RED_XIANG || qizi == XQ_BLACK_XIANG) { ret = MoveXiang(fromj,fromi,toj,toi); goto retu; } if (qizi == XQ_RED_BIN || qizi == XQ_BLACK_BIN) { ret = MoveBin(fromj,fromi,toj,toi); goto retu; } retu: // if (qizi == XQ_RED_JIANG || qizi == XQ_BLACK_JIANG) // { // TCHAR sz[200]; // wsprintf(sz,"qizi=%d,ret=%d",qizi,ret); // WriteStr(sz,3,3); // } if (!ret) return FALSE; if(check) return true; // if(CheckOtherJiangJun(fromi,fromj,flag,m_iQiZi)) // return 0; ////AfxMessageBox("MoveShi"); /* m_iQiZi[toi][toj] = qizi; m_iQiZi[fromi][fromj] = XQ_QIZI_NONE; ::CopyMemory(qi,m_iQiZi,sizeof(m_iQiZi)); */ return TRUE; }