Exemple #1
0
bool Board::canMoveBing(int moveid, int, int row, int col)
{
    GetRowCol(row1, col1, moveid);
    int r = relation(row1, col1, row, col);
    // 首先判断兵只能走一步
    if (r != 1 && r != 10) {
        return false;
    }

    if (isBottomSide(moveid)) { // 下面一方的棋子
        if (row > row1) { // 如果目标行大于原始行,相当于并在后退
            return false;
        }
        if (row1 >= 5 && row == row1) { // 还没有过河就想横着走
            return false;
        }
    }
    else { // 上面一方的棋子
        if (row1 > row) { // 如果目标行小于原始行,相当于兵在后退
            return false;
        }
        if (row <= 4 && row == row1) { // 还没有过河就想横着走
            return false;
        }
    }
    return true;
}
Exemple #2
0
bool Board::canMoveXiang(int moveid, int, int row, int col)
{
    GetRowCol(row1, col1, moveid);
    int r = relation(row1, col1, row, col);
    if (r != 22) { // 象走田,所以r应该等于22
        return false;
    }

    // 看象眼有没有棋子
    int rEye = (row + row1) / 2;
    int cEye = (col + col1) / 2;
    if (getStoneId(rEye, cEye) != -1) {
        return false;
    }

    // 判断是否在棋盘的下方
    if (isBottomSide(moveid)) {
        if (row < 4) {
            return false;
        }
    }
    else {
        if (row > 5) {
            return false;
        }
    }

    return true;
}
Exemple #3
0
/// Get the overall rect of the given item
bool InstanceCtrl::GetItemRect( VisualCoord item, wxRect& rect, bool view_relative )
{
	if (item.groupIndex < GetCount())
	{
		int row, col;
		if (!GetRowCol(item, row, col))
			return false;
		GroupVisual & gv = m_groups[item.groupIndex];
		
		wxSize bsz = GetWindowBorderSize();
		int x = col * (m_itemWidth + m_spacing) + m_spacing + bsz.GetWidth() / 2;
		int y = gv.y_position + gv.row_ys[row] + m_spacing;
		
		if (view_relative)
		{
			int startX, startY;
			int xppu, yppu;
			GetScrollPixelsPerUnit(& xppu, & yppu);
			GetViewStart(& startX, & startY);
			x = x - startX * xppu;
			y = y - startY * yppu;
		}
		
		rect.x = x;
		rect.y = y;
		rect.width = m_itemWidth;
		rect.height = GetItemHeight(item);
		return true;
	}
	return false;
}
Exemple #4
0
bool Board::canMoveShi(int moveid, int, int row, int col)
{

    // 移动步长一个格子对角线
    GetRowCol(row1, col1, moveid);
    int r = relation(row1, col1, row, col);
    if (r != 11) {
        return false;
    }

    if (col < 3 || col > 5) {
        return false;
    }

    if (isBottomSide(moveid)) {
        if (row < 7) {
            return false;
        }
    }
    else {
        if (row > 2) {
            return false;
        }
    }

    return true;
}
Exemple #5
0
bool Board::canMoveJiang(int moveid, int killid, int row, int col)
{
    // 可直接吃对方将
    if (killid != -1 && _s[killid]._type == Stone::JIANG)
    {
        return canMoveChe(moveid, killid, row, col);
    }

    GetRowCol(row1, col1, moveid);
    int r = relation(row1, col1, row, col);
    if (r != 1 || r != 10) {
        return false;
    }

    if (col < 3 || col > 5) {
        return false;
    }

    if (isBottomSide(moveid)) {
        if (row < 7) {
            return false;
        }
    }
    else {
        if (row > 2) {
            return false;
        }
    }

    return true;
}
Exemple #6
0
void InstanceCtrl::SetIntendedColumn ( VisualCoord coord )
{
	int row, col;
	if( GetRowCol(coord, row, col) )
		m_intended_column = col;
	else
		m_intended_column = 0;
}
Exemple #7
0
bool Board::canMoveChe(int moveid, int, int row, int col)
{
    GetRowCol(row1, col1, moveid);
    int ret = getStoneCountAtLine(row1, col1, row, col);
    if (ret == 0) { // 在一行,并且中间没有棋子
        return true;
    }

    return false;
}
Exemple #8
0
void Board::saveStep(int moveid, int killid, int row, int col, QVector<Step*>& steps)
{
    GetRowCol(row1, col1, moveid);
    Step* step = new Step;
    step->_colFrom = col1;
    step->_colTo = col;
    step->_rowFrom = row1;
    step->_rowTo = row;
    step->_moveid = moveid;
    step->_killid = killid;

    steps.append(step);
}
Exemple #9
0
// Selects the object or child.
wxAccStatus GridAx::Select(int childId, wxAccSelectionFlags selectFlags)
{
    int row;
    int col;

    if (GetRowCol(childId, row, col)) {

        if (selectFlags & wxACC_SEL_TAKESELECTION) {
            mGrid->SetGridCursor(row, col);
        }

        mGrid->SelectBlock(row, col, row, col, selectFlags & wxACC_SEL_ADDSELECTION);
    }

    return wxACC_OK;
}
Exemple #10
0
bool Board::canMovePao(int moveid, int killid, int row, int col)
{
    GetRowCol(row1, col1, moveid);
    int ret = getStoneCountAtLine(row, col, row1, col1);
    if (killid != -1) { // 如果炮要吃对方的棋子
        if (ret == 1) { // 中间有一个棋子,可以走
            return true;
        }
    }
    else { // 如果炮不吃棋子
        if (ret == 0) { // 中间没有棋子,可以走
            return true;
        }
    }

    return false;
}
Exemple #11
0
// Returns the rectangle for this object (id = 0) or a child element (id > 0).
// rect is in screen coordinates.
wxAccStatus GridAx::GetLocation(wxRect & rect, int elementId)
{
    wxRect r;
    int row;
    int col;

    if (GetRowCol(elementId, row, col)) {
        rect = mGrid->CellToRect(row, col);
        rect.SetPosition(mGrid->GetGridWindow()->ClientToScreen(rect.GetPosition()));
    }
    else {
        rect = mGrid->GetRect();
        rect.SetPosition(mGrid->GetParent()->ClientToScreen(rect.GetPosition()));
    }

    return wxACC_OK;
}
Exemple #12
0
// Gets the name of the specified object.
wxAccStatus GridAx::GetName(int childId, wxString *name)
{
   int row;
   int col;

   if (GetRowCol(childId, row, col)) {
      wxString n = mGrid->GetColLabelValue(col);
      wxString v = mGrid->GetCellValue(row, col);
      if (v.IsEmpty()) {
         v = _("Empty");
      }

      // Hack to provide a more intelligible response
      TimeEditor *d =
         (TimeEditor *)mGrid->GetDefaultEditorForType(GRID_VALUE_TIME);
      TimeEditor *c =
         (TimeEditor *)mGrid->GetCellEditor(row, col);

      if (c && d && c == d) {
         double value;
         v.ToDouble(&value);

         TimeTextCtrl tt(mGrid,
                         wxID_ANY,
                         wxT(""),
                         value,
                         c->GetRate(),
                         wxPoint(10000, 10000),  // create offscreen
                         wxDefaultSize,
                         true);
         tt.SetFormatString(tt.GetBuiltinFormat(c->GetFormat()));
         v = tt.GetTimeString();
      }

      if (c)
         c->DecRef();
      if (d)
         d->DecRef();

      *name = n + wxT(" ") + v;
   }

   return wxACC_OK;
}
Exemple #13
0
// Gets the name of the specified object.
wxAccStatus GridAx::GetName(int childId, wxString *name)
{
   int row;
   int col;

   if (GetRowCol(childId, row, col)) {
      wxString n = mGrid->GetColLabelValue(col);
      wxString v = mGrid->GetCellValue(row, col);
      if (v.IsEmpty()) {
         v = _("Empty");
      }

      // Hack to provide a more intelligible response
      NumericEditor *dt =
         static_cast<NumericEditor *>(mGrid->GetDefaultEditorForType(GRID_VALUE_TIME));
      NumericEditor *df =
         static_cast<NumericEditor *>(mGrid->GetDefaultEditorForType(GRID_VALUE_FREQUENCY));
      NumericEditor *c =
         static_cast<NumericEditor *>(mGrid->GetCellEditor(row, col));

      if (c && dt && df && ( c == dt || c == df)) {        
         double value;
         v.ToDouble(&value);
         NumericConverter converter(c == dt ? NumericConverter::TIME : NumericConverter::FREQUENCY,
                        c->GetFormat(),
                        value,
                        c->GetRate() );

         v = converter.GetString();
      }

      if (c)
         c->DecRef();
      if (dt)
         dt->DecRef();
      if (df)
         df->DecRef();

      *name = n + wxT(" ") + v;
   }

   return wxACC_OK;
}
Exemple #14
0
int ods_formula_node::EvaluateCELL(IODSCellEvaluator* poEvaluator)
{
    CPLAssert( eNodeType == SNT_OPERATION );
    CPLAssert( eOp == ODS_CELL );

    CPLAssert(nSubExprCount == 1);
    CPLAssert(papoSubExpr[0]->eNodeType == SNT_CONSTANT );
    CPLAssert(papoSubExpr[0]->field_type == ODS_FIELD_TYPE_STRING );

    if (poEvaluator == NULL)
    {
        CPLError(CE_Failure, CPLE_AppDefined, "No cell evaluator provided");
        return FALSE;
    }

    int nRow = 0,nCol = 0;
    if (!GetRowCol(papoSubExpr[0]->string_value, nRow, nCol))
        return FALSE;

    std::vector<ods_formula_node> aoOutValues;
    if (poEvaluator->EvaluateRange(nRow, nCol, nRow, nCol, aoOutValues) &&
        aoOutValues.size() == 1)
    {
        if (aoOutValues[0].eNodeType == SNT_CONSTANT)
        {
            FreeSubExpr();

            eNodeType = aoOutValues[0].eNodeType;
            field_type = aoOutValues[0].field_type;
            int_value = aoOutValues[0].int_value;
            float_value = aoOutValues[0].float_value;
            string_value = aoOutValues[0].string_value ? CPLStrdup(aoOutValues[0].string_value) : NULL;

            return TRUE;
        }
    }

    return FALSE;
}
Exemple #15
0
// Returns a state constant.
wxAccStatus GridAx::GetState(int childId, long *state)
{
    int flag = wxACC_STATE_SYSTEM_FOCUSABLE |
               wxACC_STATE_SYSTEM_SELECTABLE;
    int col;
    int row;

    if (!GetRowCol(childId, row, col)) {
        *state = 0;
        return wxACC_FAIL;
    }

#if defined(__WXMSW__)
    flag |= wxACC_STATE_SYSTEM_FOCUSED |
            wxACC_STATE_SYSTEM_SELECTED;

    if (mGrid->IsReadOnly(row, col)) {
        flag = wxACC_STATE_SYSTEM_UNAVAILABLE;
    }
#endif

#if defined(__WXMAC__)
    if (mGrid->IsInSelection(row, col)) {
        flag |= wxACC_STATE_SYSTEM_SELECTED;
    }

    if (mGrid->GetGridCursorRow() == row && mGrid->GetGridCursorCol() == col) {
        flag |= wxACC_STATE_SYSTEM_FOCUSED;
    }

    if (mGrid->IsReadOnly(row, col)) {
        flag |= wxACC_STATE_SYSTEM_UNAVAILABLE;
    }
#endif

    *state = flag;

    return wxACC_OK;
}
Exemple #16
0
bool Board::canMoveMa(int moveid, int, int row, int col)
{
    GetRowCol(row1, col1, moveid);
    int r = relation(row1, col1, row, col);
    // 首先判断马要走马字
    if (r != 12 && r != 21) {
        return false;
    }

    // 判断有没有蹩马腿的情况
    if (r == 12) { // 列相差等于2
        if (getStoneId(row1, (col + col1) / 2) != -1) {
            return false;
        }
    }
    else { // 行相差等于2
        if (getStoneId((row + row1) / 2, col1) != -1) {
            return false;
        }
    }
    return true;
}
Exemple #17
0
//FIXME: doing this for every single change seems like a waste :/
// Also, pure fail :D
void InstanceCtrl::ReloadAll()
{
	// nuke all... lol
	m_groups.Clear();
	
	int totalitems = m_instList->size();
	
	/// sort items into groups
	std::map<InstanceGroup *, InstanceItemArray> sorter;
	for (int i = 0; i < totalitems ; i++)
	{
		auto inst = m_instList->operator[](i);
		InstanceGroup *group =  m_instList->GetInstanceGroup(inst);

		if (sorter.count(group))
		{
			auto & list = sorter[group];
			list.Add(InstanceVisual(inst, i));
		}
		else
		{
			InstanceItemArray arr;
			arr.Add(InstanceVisual(inst, i));
			sorter[group] = arr;
		}
	}
	
	m_itemIndexes.resize(totalitems);

	// sort items in each group
	auto iter = sorter.begin();
	while (iter != sorter.end())
	{
		InstanceGroup* group = (*iter).first;
		
		GroupVisual grpv(group);
		grpv.items = (*iter).second;

		switch (settings->GetInstSortMode())
		{
		case Sort_Name:
			grpv.items.Sort(NameSort);
			break;

		case Sort_LastLaunch:
			grpv.items.Sort(LastLaunchSort);
			break;
		}

		m_groups.Add(grpv);
		iter++;
	}
	
	// sort the groups and construct a mapping from IDs to indexes
	m_groups.Sort(NameSort);
	for(int i = 0; i < m_groups.size(); i++)
	{
		GroupVisual & grp = m_groups[i];
		grp.SetIndex(i);
		for(int j = 0; j < grp.items.size(); j++)
		{
			InstanceVisual & iv = grp.items[j];
			int ID = iv.GetID();
			m_itemIndexes[ID] = VisualCoord(i,j);
		}
	}
	
	int selectedIdx = m_instList->GetSelectedIndex();
	if(selectedIdx == -1)
	{
		if(m_focusItem == m_selectedItem)
			m_focusItem.makeVoid();
		m_selectedItem.makeVoid();
	}
	else
	{
		VisualCoord selectedIndex = m_itemIndexes[selectedIdx];
		if(m_focusItem == m_selectedItem)
			m_focusItem = selectedIndex;
		m_selectedItem = selectedIndex;
	}
	
	// Disable group headers in single column mode. Groups are still there, but their existence is hidden.
	if (GetWindowStyle() & wxINST_SINGLE_COLUMN)
	{
		for (int i = 0; i < m_groups.size(); i++)
		{
			m_groups[i].no_header = true;
			m_groups[i].always_show = true;
		}
	}
	
	// everything got changed (probably not, but we can't know that). Redo all of the layout stuff.
	ReflowAll();
	SetupScrollbars();
	Refresh();
	
	// and reset the intended navigation column
	int row, col;
	GetRowCol(m_selectedItem, row, col);
	m_intended_column = col;
}
Exemple #18
0
int ods_formula_node::EvaluateListArgOp(IODSCellEvaluator* poEvaluator)
{
    CPLAssert( eNodeType == SNT_OPERATION );
    CPLAssert( eOp >= ODS_SUM && eOp <= ODS_COUNTA );

    CPLAssert(nSubExprCount == 1);
    CPLAssert(papoSubExpr[0]->eNodeType == SNT_OPERATION );
    CPLAssert(papoSubExpr[0]->eOp == ODS_LIST );

    std::vector<double> adfVal;
    int i;

    int nCount = 0, nCountA = 0;

    for(i=0;i<papoSubExpr[0]->nSubExprCount;i++)
    {
        if (papoSubExpr[0]->papoSubExpr[i]->eNodeType == SNT_OPERATION &&
            papoSubExpr[0]->papoSubExpr[i]->eOp == ODS_CELL_RANGE)
        {
            CPLAssert (papoSubExpr[0]->papoSubExpr[i]->nSubExprCount == 2);
            CPLAssert (papoSubExpr[0]->papoSubExpr[i]->papoSubExpr[0]->eNodeType == SNT_CONSTANT);
            CPLAssert (papoSubExpr[0]->papoSubExpr[i]->papoSubExpr[0]->field_type == ODS_FIELD_TYPE_STRING);
            CPLAssert (papoSubExpr[0]->papoSubExpr[i]->papoSubExpr[1]->eNodeType == SNT_CONSTANT);
            CPLAssert (papoSubExpr[0]->papoSubExpr[i]->papoSubExpr[1]->field_type == ODS_FIELD_TYPE_STRING);

            if (poEvaluator == NULL)
            {
                CPLError(CE_Failure, CPLE_AppDefined, "No cell evaluator provided");
                return FALSE;
            }

            const char* psz1 = papoSubExpr[0]->papoSubExpr[i]->papoSubExpr[0]->string_value;
            const char* psz2 = papoSubExpr[0]->papoSubExpr[i]->papoSubExpr[1]->string_value;
            int nRow1 = 0,nCol1 = 0;
            if (!GetRowCol(psz1, nRow1, nCol1))
                return FALSE;
            int nRow2 = 0,nCol2 = 0;
            if (!GetRowCol(psz2, nRow2, nCol2))
                return FALSE;

            std::vector<ods_formula_node> aoOutValues;
            if (poEvaluator->EvaluateRange(nRow1, nCol1, nRow2, nCol2, aoOutValues))
            {
                for(size_t j = 0; j < aoOutValues.size(); j++)
                {
                    if (aoOutValues[j].eNodeType == SNT_CONSTANT)
                    {
                        if (aoOutValues[j].field_type == ODS_FIELD_TYPE_INTEGER)
                        {
                            adfVal.push_back(aoOutValues[j].int_value);
                            nCount ++;
                            nCountA ++;
                        }
                        else if (aoOutValues[j].field_type == ODS_FIELD_TYPE_FLOAT)
                        {
                            adfVal.push_back(aoOutValues[j].float_value);
                            nCount ++;
                            nCountA ++;
                        }
                        else if (aoOutValues[j].field_type == ODS_FIELD_TYPE_STRING)
                        {
                            nCountA ++;
                        }
                    }
                }
            }
        }
        else
        {
            if (!(papoSubExpr[0]->papoSubExpr[i]->Evaluate(poEvaluator)))
                return FALSE;

            CPLAssert (papoSubExpr[0]->papoSubExpr[i]->eNodeType == SNT_CONSTANT );
            if (papoSubExpr[0]->papoSubExpr[i]->field_type == ODS_FIELD_TYPE_INTEGER)
            {
                adfVal.push_back(papoSubExpr[0]->papoSubExpr[i]->int_value);
                nCount ++;
                nCountA ++;
            }
            else if (papoSubExpr[0]->papoSubExpr[i]->field_type == ODS_FIELD_TYPE_FLOAT)
            {
                adfVal.push_back(papoSubExpr[0]->papoSubExpr[i]->float_value);
                nCount ++;
                nCountA ++;
            }
            else if (eOp == ODS_COUNT || eOp == ODS_COUNTA)
            {
                if (papoSubExpr[0]->papoSubExpr[i]->field_type == ODS_FIELD_TYPE_STRING)
                    nCountA ++;
            }
            else
            {

                CPLError(CE_Failure, CPLE_NotSupported,
                         "Bad argument type for %s", ODSGetOperatorName(eOp));
                return FALSE;
            }
        }
    }

    if (eOp == ODS_COUNT)
    {
        eNodeType = SNT_CONSTANT;
        field_type = ODS_FIELD_TYPE_INTEGER;
        int_value = nCount;

        FreeSubExpr();
        return TRUE;
    }

    if (eOp == ODS_COUNTA)
    {
        eNodeType = SNT_CONSTANT;
        field_type = ODS_FIELD_TYPE_INTEGER;
        int_value = nCountA;

        FreeSubExpr();
        return TRUE;
    }

    double dfVal = 0;

    switch(eOp)
    {
        case ODS_SUM:
        {
            for(i=0;i<(int)adfVal.size();i++)
            {
                dfVal += adfVal[i];
            }
            break;
        }

        case ODS_AVERAGE:
        {
            for(i=0;i<(int)adfVal.size();i++)
            {
                dfVal += adfVal[i];
            }
            dfVal /= adfVal.size();
            break;
        }

        case ODS_MIN:
        {
            dfVal = (adfVal.size() == 0) ? 0 :adfVal[0];
            for(i=1;i<(int)adfVal.size();i++)
            {
                if (adfVal[i] < dfVal) dfVal = adfVal[i];
            }
            break;
        }

        case ODS_MAX:
        {
            dfVal = (adfVal.size() == 0) ? 0 :adfVal[0];
            for(i=1;i<(int)adfVal.size();i++)
            {
                if (adfVal[i] > dfVal) dfVal = adfVal[i];
            }
            break;
        }

        default:
            break;
    }

    eNodeType = SNT_CONSTANT;
    field_type = ODS_FIELD_TYPE_FLOAT;
    float_value = dfVal;

    FreeSubExpr();

    return TRUE;
}