示例#1
0
void SceneGame::CheckRecv(float)
{
	if (Net::isRecvComplete())
	{
		int len;
		char* data = Net::RecvData(len);
		unschedule(schedule_selector(SceneGame::CheckRecv));
		
		// 悔棋
		if (data[0] == 3)
		{
			doRegret2();
			// 继续接收
			Net::RecvStart();
			schedule(schedule_selector(SceneGame::CheckRecv));
		}
		// 选棋
		else if (data[0] == 1)
		{
			_selectid = data[1];
			_selectSprite->setPosition(_s[_selectid]->fromPlate());
			_selectSprite->setVisible(true);

			// 继续接收
			Net::RecvStart();
			schedule(schedule_selector(SceneGame::CheckRecv));
		}
		else if (data[0] == 2)
		{
			// 接受移动信息
			Stone* s = _s[data[1]];
			int row = 9 - data[2];
			int col = 8 - data[3];
			int killid = Common::getStoneFromRowCol(row, col, _s);

			// 记录走棋信息
			recordStep(_selectid, killid, _s[_selectid]->_row, _s[_selectid]->_col, row, col);

			// 移动棋子
			s->_row = row;
			s->_col = col;
			s->setPosition(s->fromPlate());

			// 杀死棋子
			if (killid != -1)
			{
				Stone* ks = _s[killid];
				ks->_dead = true;
				ks->setVisible(false);
			}

			// 更新数据
			_selectid = -1;
			_selectSprite->setVisible(false);
			_bRedTurn = !_bRedTurn;
		}
	}
}
示例#2
0
void SceneGame::MoveStone(CCTouch* touch)
{
	int row, col;
	bool bClick = Common::Screen2Plate(touch->getLocation(), row, col);
	if (!bClick)
	{
		return;
	}

	// 相同棋子更换选择
	int clickid = Common::getStoneFromRowCol(row, col, _s);
	if (clickid != -1)
	{
		if (Common::isSameColor(clickid, _selectid, _s))
		{
			_selectid = clickid;
			CCPoint pt = Common::Plate2Screen(row, col);
			_selectSprite->setPosition(pt);
			_selectSprite->setVisible(true);

			return;
		}
	}

	// 判断棋子是否可以移动
	canMove *move = canMove::createMove(this, _selectid, row, col, clickid);
	if (!move->move())
	{
		return;
	}
	CC_SAFE_DELETE(move);

	// 记录走棋信息
	recordStep(_selectid, clickid, _s[_selectid]->_row, _s[_selectid]->_col, row, col);

	// 杀掉棋子
	if (clickid != -1)
	{
		_s[clickid]->setVisible(false);
		_s[clickid]->_dead = true;
	}

	// 移动棋子
	_s[_selectid]->_row = row;
	_s[_selectid]->_col = col;
	_s[_selectid]->setPosition(Common::Plate2Screen(row, col));

	// 更新数据
	_selectid = -1;
	_selectSprite->setVisible(false);
	_bRedTurn = !_bRedTurn;

	
	// 发送移动棋子报文
	Step* step = *_steps.rbegin();
	char buf[4];
	buf[0] = 2;
	buf[1] = step->moveid;
	buf[2] = step->rowTo;
	buf[3] = step->colTo;
	Net::Send(buf, 4);

	// 接收信息
	Net::RecvStart();
	schedule(schedule_selector(SceneGame::CheckRecv));
}
示例#3
0
void SceneGame::MoveChess(Touch* touch)
{

#if 0
	Vec2 ptClicked = touch->getLocation();
	int row, col;

	bool bClick = Screen2Plate(ptClicked, row, col);

	if (!bClick)
	{
		return;
	}

	int clickid = getChessFromRowCol(row, col);

	if (clickid != -1)
	{
		if (isSameColor(clickid, _selectid))
		{
			_selectid = clickid;
			Vec2 pt = Plate2Screen(row, col);
			_selectSprite->setPosition(pt);
			//_selectSprite->setVisible(true);
			_selectSprite->setOpacity(255);
			return;
		}
		/*else
		{
			_c->at(clickid)->setVisible(false);
			_c->at(clickid)->_dead = true;
		}*/

	}

	if (!canMove(_selectid, row, col, clickid))
	{
		return;
	}

	recordStep(_selectid, clickid, _c->at(_selectid)->_row, _c->at(_selectid)->_col, row, col);

	if (clickid != -1)
	{
		_c->at(clickid)->setVisible(false);
		_c->at(clickid)->_dead = true;
	}



	_c->at(_selectid)->_row = row;
	_c->at(_selectid)->_col = col;
	//_c->at(_selectid)->setPosition(Plate2Screen(row, col));

	_c->at(_selectid)->setZOrder(100);
	MoveTo* moveto = MoveTo::create(1.0f, Plate2Screen(row, col));
	CallFuncN* callfuncN = CallFuncN::create(CC_CALLBACK_1(SceneGame::AfterMove,this, (void*)(intptr_t)clickid));
	_c->at(_selectid)->runAction(CCSequence::createWithTwoActions(moveto, callfuncN));

	FadeOut* fadeout = FadeOut::create(1.0f);
	MoveTo* SelectMoveto = MoveTo::create(1.0f, _c->at(_selectid)->fromPlate());
	Spawn* spawn = Spawn::createWithTwoActions(fadeout, SelectMoveto);
	_selectSprite->runAction(spawn);

	_selectid = -1;
	//_selectSprite->setVisible(false);
	_bRedTurn = !_bRedTurn;
	/*
	if (!_bRedTurn)
	{		
		//单步智能
		Step* step = AI::getStep(this);

		Chess* moveChess = _c->at(step->moveid);
		moveChess->_row = step->rowTo;
		moveChess->_col = step->colTo;
		_bRedTurn = !_bRedTurn;
		moveChess->setPosition(moveChess->fromPlate());

		if (step->killid != -1)
		{
			Chess* killChess = _c->at(step->killid);
			killChess->_dead = true;
			killChess->setVisible(false);
		}
		_steps->push_back(step);
		//多步智能
		// scheduleOnce(schedule_selector(SceneGame::computerMove), 0.01f);

		//网络对战

	}
*/

	Step* step = *_steps->rbegin();
	char buf[4];
	buf[0] = 2;
	buf[1] = step->moveid;
	buf[2] = step->rowTo;
	buf[3] = step->colTo;
	NetBattle::Send(buf, 4);


	NetBattle::RecvStart();
	schedule(schedule_selector(SceneGame::CheckRecv));
#endif


	Vec2 ptClicked = touch->getLocation();
	int row, col;
	bool bClick = Screen2Plate(ptClicked, row, col);
	
	if (!bClick)
	{
		return;
	}


	int clickid = getChessFromRowCol(row, col);
	// 如果点击位置没有象棋,那么点击也无效
	if (clickid != -1)
	{
		// 如果后一次点击的棋子和前一次相同,那么换选择
		if (isSameColor(clickid, _selectid))
		{
			_selectid = clickid;
			// 显示该棋子被选中的效果
			Vec2 pt = Plate2Screen(row, col);
			_selectSprite->setPosition(pt);
			//_selectSprite->setVisible(true);

			_selectSprite->setOpacity(255);
			// 换选择之后,这次点击处理就结束了
			return;
		}
	}

	// 判断棋子是否可以移动
	if (!canMove(_selectid, row, col, clickid))
	{
		return;
	}

	// 可以移动
	// 记录移动信息
	recordStep(_selectid, clickid, _c->at(_selectid)->_row, _c->at(_selectid)->_col, row, col);

	// 走棋相关
	if (clickid != -1)
	{
		// 杀掉
		//_s[clickid]->setVisible(false);
		_c->at(clickid)->_dead = true;
	}

	_c->at(_selectid)->_row = row;
	_c->at(_selectid)->_col = col;

	//	_s[_selectid]->setPosition(Plate2Screen(row, col));
	_c->at(_selectid)->setZOrder(100);
	MoveTo* moveto = MoveTo::create(1.0f, Plate2Screen(row, col));
	CallFuncN* callfuncN = CallFuncN::create(CC_CALLBACK_1(SceneGame::AfterMove, this,(void*)(intptr_t)clickid));
	_c->at(_selectid)->runAction(Sequence::createWithTwoActions(moveto, callfuncN));

	FadeOut* fadeout = FadeOut::create(1.0f);
	MoveTo* SelectMoveto = MoveTo::create(1.0f, _c->at(_selectid)->fromPlate());
	Spawn* spawn = CCSpawn::createWithTwoActions(fadeout, SelectMoveto);
	_selectSprite->runAction(spawn);

	_selectid = -1;
	//_selectSprite->setVisible(false);
	_bRedTurn = !_bRedTurn;


	// 发送移动棋子报文
	Step* step = *_steps->rbegin();
	char buf[4];
	buf[0] = 2;
	buf[1] = step->moveid;
	buf[2] = step->rowTo;
	buf[3] = step->colTo;
	NetBattle::Send(buf, 4);

	// 接收信息
	NetBattle::RecvStart();
	schedule(schedule_selector(SceneGame::CheckRecv));

}
示例#4
0
void SceneGame::CheckRecv(float)
{
	if (NetBattle::isRecvComplete())
	{
		unschedule(schedule_selector(SceneGame::CheckRecv));

		int len;
		char* data = NetBattle::RecvData(len);

		if (data[0] == 4)
		{
			_bRedSide = !_bRedSide;

			restartInit();
		}
		else if (data[0] == 3)
		{
			doRegret2();
		
			NetBattle::RecvStart();
			schedule(schedule_selector(SceneGame::CheckRecv));
		}
		else if (data[0] == 1)
		{
			
			_selectid = data[1];
			_selectSprite->setPosition(_c->at(_selectid)->fromPlate());
			_selectSprite->setVisible(true);

		
			NetBattle::RecvStart();
			schedule(schedule_selector(SceneGame::CheckRecv));
		}
		else if (data[0] == 2)
		{
			
			Chess* s = _c->at(data[1]);
			int row = 9 - data[2];
			int col = 8 - data[3];
			int killid = getChessFromRowCol(row, col);

			recordStep(_selectid, killid, _c->at(_selectid)->_row, _c->at(_selectid)->_col, row, col);

			
			s->_row = row;
			s->_col = col;
			//s->setPosition(s->fromPlate());

			MoveTo* moveto = MoveTo::create(1.0f, s->fromPlate());
			//    CCCallFuncN* callfuncN = CCCallFuncN::create(this, callfuncN_selector(SceneGame::setChessZOrder));
			CallFuncN* callfuncN = CallFuncN::create(CC_CALLBACK_1(SceneGame::AfterMove,this,(void*)(intptr_t)killid));

			s->runAction(Sequence::createWithTwoActions(moveto, callfuncN));

			FadeOut* fadeout = FadeOut::create(1.0f);
			MoveTo* SelectMoveto = MoveTo::create(1.0f, s->fromPlate());
			Spawn* spawn = Spawn::createWithTwoActions(fadeout, SelectMoveto);
			_selectSprite->runAction(spawn);

			if (killid != -1)
			{
				Chess* ks = _c->at(killid);
				ks->_dead = true;
				ks->setVisible(false);
			}

			_selectid = -1;
			_selectSprite->setVisible(false);
			_bRedTurn = !_bRedTurn;
		}
	}
}
示例#5
0
void GameStartLayer::moveStone(CCTouch *touch)
{
	CCPoint ptClicked = touch->getLocation();
	int row, col;
	bool bClick = Screen2Plate(ptClicked, row, col);
	//! 点击在棋子间的空隙点击无效
	if (!bClick)
	{
		return;
	}

	int clickid = getStoneFromRowCol(row, col);
	if (clickid != -1)
	{
		//! 如果颜色相同,更换选中棋子
		if (isSameColor(clickid, _selectid))
		{
			_selectid = clickid;
			CCPoint pt = Plate2Screen(row, col);
			_selectedSprite->setPosition(pt);
			_selectedSprite->setVisible(true);

			return;
		}
		//else
		//{
		//	//! kill
		//	_s[clickid]->setVisible(false);
		//	_s[clickid]->_dead = true;
		//}
	}

	//! 判断是否可以移动棋子
	if (!canMove(_selectid, row, col, clickid))
	{
		return;
	}
	recordStep(_selectid, clickid, _s[_selectid]->_proper._row, _s[_selectid]->_proper._col, row, col);
	//! kill
	if (clickid != -1)
	{
		// 杀掉
		_s[clickid]->setVisible(false);
		_s[clickid]->_dead = true;
	}

	//! 移动棋子
	_s[_selectid]->_proper._row = row;
	_s[_selectid]->_proper._col = col;
	_s[_selectid]->setPosition(Plate2Screen(row, col));

	//! 重置属性
	_selectid = -1;
	//_selectedSprite->setVisible(false);
	_selectedSprite->setPosition(Plate2Screen(row, col));
	_bRedTurn = !_bRedTurn;



	//! 智能移动
	if (!_bRedTurn)
	{
		//CCDelayTime *delay = CCDelayTime::create(0.01f);
		//CCCallFunc *ai = CCCallFunc::create(this, callfunc_selector(GameStartLayer::computerMove));
		//CCSequence *seq = CCSequence::create(delay, ai, nullptr);
		//this->runAction(seq);
		scheduleOnce(schedule_selector(GameStartLayer::computerMove), 0.01f);
	}
}