コード例 #1
0
ファイル: Grid.cpp プロジェクト: LPPOINT/Checkers
std::vector<Checker*> Grid::GetAllChecker(Checker::CheckerColor clr)
{
	std::vector<Checker*> c;
	for(int i = 0; i < _cells.size(); i++)
	{
		if(GetChecker(_cells[i]))
			if(GetChecker(_cells[i])->GetColor()==clr)
			    c.push_back(GetChecker(_cells[i]));
	}
	return c;
}
コード例 #2
0
ファイル: Grid.cpp プロジェクト: LPPOINT/Checkers
void Grid::SelectCheker(Checker::CheckerColor clr)
{
	Checker* checker;
	for(int i = 0; i < _cells.size(); i++)
	{
		if(checker = GetChecker(_cells[i]))
		{
			if(checker->GetColor()==clr)
			{
				checker->GetCell()->AddComponent(new CheckerFlushCellComponent);
			}
			else if(checker->GetColor()!=clr)
			{
				checker->GetCell()->EraseComponent(new CheckerFlushCellComponent);
			}
		}
		else _cells[i]->EraseComponent(new CheckerFlushCellComponent);
	}
}
コード例 #3
0
ファイル: Grid.cpp プロジェクト: LPPOINT/Checkers
bool Grid::UpdateCell(GameCell* cell, Checker::CheckerColor clr)
{

	for(int i = 0; i < _specCells.size(); i++)
	{
	if(_specCells[i].first)
	  {
		if(cell&&_specCells[i].first->Equals(cell))
		{
			if(_selectedChecker)
			{
				
			   bool val = _selectedChecker->CreateMove(_specCells[i].second)._sucsessful;
			   _selectedChecker = nullptr;
			  for(int i = 0; i < _specCells.size(); i++)
			  {
				  if(_specCells[i].first)
				  {
				    if(GetChecker(_specCells[i].first))
			        {
					   // _specCells[i].first->EraseComponent(new CheckerFlushCellComponent);
				    }
				     else   _specCells[i].first->EraseComponent(new MoveCellComponent); 
				    }
			  }
			  _specCells.clear();
			  return val;
			}
		}
	  }
	}

	Checker* checker;

	if((checker = GetChecker(cell)))
	{
		if(checker->GetColor()==clr)
		{
			for(int i = 0; i < _specCells.size(); i++)
			{
				if(_specCells[i].first) 
				{
					_specCells[i].first->EraseComponent(new MoveCellComponent);
					Checker* hasChecker;
					if((hasChecker = GetChecker(_specCells[i].first))&&hasChecker->GetColor()==clr)
						_specCells[i].first->AddComponent(new CheckerFlushCellComponent);
				}
			}
		  _specCells.clear();
		  _specCells = checker->GetSteps();
		  for(int i = 0; i < _specCells.size(); i++)
		  {
			  if(_specCells[i].first)
				 if(!GetChecker(_specCells[i].first)) _specCells[i].first->AddComponent(new MoveCellComponent);
		  }
		  _selectedChecker = checker;
		}
	}

	return false;

}
コード例 #4
0
ファイル: GameMouse.c プロジェクト: Xeeynamo/NineMensMorris
boolean MouseHandler(Game *game, unsigned int mousePressed, int x, int y)
{
	MSGERROR err;
	COORD coord;
	int i, j;
	int distance;
	int boardsize;
	int checker;
	CheckerState state; 
	int playerID;
	PlayerList *plist;
	Player *player;

	if (!game) return 0;
	switch(game->gamestate)
	{
	case GAME_NEWGAME:
		ERRCALL(GetPlayerList(&game->board, &plist));
		
		GetBoardSize(&game->board, &boardsize);
		distance = (BOARDGAME_MAXWIDTH-BOARDGAME_MINWIDTH)/boardsize/2;
		x += BOARDGAME_CHECKERSIZE/2;
		y += BOARDGAME_CHECKERSIZE/2;

		for(i=0; i<boardsize; i++)
		{
			for(j=0; j<8; j++)
			{
				GetCheckersBoardCoord(&coord, j, BOARDGAME_MAXWIDTH-i*distance*2);
				if (CheckMouseCollision(x, y, BOARDGAME_POSX+i*distance+coord.X, BOARDGAME_POSY+i*distance+coord.Y, 20, 20))
				{
					ERRCALL(GetCurrentPlayerID(&game->board, &playerID));
					ERRCALL(GetPlayerList(&game->board, &plist));
					ERRCALL(GetPlayer(plist, playerID, &player));
					if (game->deleteState == 1)
					{
						ERRCALL(DeleteChecker(&game->board, i, j, &playerID, &state));
						switch(state)
						{
						case CHECKERSTATE_SUCCESS:
							game->deleteState = 0;
							ERRCALL(GetCheckerCount(&game->board, playerID, &checker));
							if (checker < 3)
							{
								game->infomessage = 150;
								game->dieplayerevent = 0;
								game->diedplayer = playerID;
								ERRCALL(KickPlayer(plist, playerID));
								ERRCALL(CheckVictory(&game->board, &state));
								if (state == CHECKERSTATE_VICTORY)
								{
									MessageBox(game->hWnd, "Congratulazioni, hai vinto!", "Vittoria", MB_ICONINFORMATION);
									Victory(game);
									return 0;
								}
							}
							NextRoundHandler(game);
							break;
						}
					}
					else if (player->tableCheckersCount > 0) // Se il numero di pedine fuori il campo è maggiore di 0, allora le sposta nel campo da gioco
					{
						ERRCALL(PutChecker(&game->board, i, j, playerID, &state)); // Imposta una pedina
						switch(state)
						{
						case CHECKERSTATE_ALREADYUSED:
							break;
						case CHECKERSTATE_SUCCESS:
							NextRoundHandler(game);
							break;
						case CHECKERSTATE_TRIS:
							game->deleteState = 1;
							break;
						}
					}
					else // altrimenti muove le pedine già esistenti
					{
						ERRCALL(GetChecker(&game->board, i, j, &checker));
						if (checker != CHECKER_EMPTY) // E' stato selezionato un nodo già occupato
						{
							if (checker == playerID) // Controlla se la pedina selezionata in quel punto appartiene al giocatore che deve prendere la pedina
							{
								game->isCheckerSelected = 1; // Ora che la pedina è stata selezionata, ci si prepara per il movimento
								game->gameMoveCheckerIndex = i;		// Coordinate della pedina selezionata
								game->gameMoveCheckerPosition = j;	// Coordinate della pedina selezionata
							}
						}
					}
					return 1;
				}
			}
		}
		break;
	}
	return 0;
}