Пример #1
0
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;
}
Пример #2
0
/**
 * 能否走子
 */
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;
}