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; }
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); } }
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; }
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; }