advancedaiplayer.cpp
来自「Source code (C++) of the Amoebax game fo」· C++ 代码 · 共 142 行
CPP
142 行
//// Cross-platform free Puyo-Puyo clone.// Copyright (C) 2007 Emma's software//// This program is free software; you can redistribute it and/or modify// it under the terms of the GNU General Public License as published by// the Free Software Foundation; either version 2 of the License, or// (at your option) any later version.//// This program is distributed in the hope that it will be useful,// but WITHOUT ANY WARRANTY; without even the implied warranty of// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the// GNU General Public License for more details.//// You should have received a copy of the GNU General Public License// along with this program; if not, write to the Free Software// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA//#if defined (HAVE_CONFIG_H)#include <config.h>#endif // HAVE_CONFIG_H#include <cmath>#include <limits>#include "AdvancedAIPlayer.h"#include "GridStatus.h"using namespace Amoebax;/// The average time the player waits between moves, in ms.static const uint32_t k_TimeToWaitForNextMove = 175;/// The max. number of milliseconds to add/subtract to the average.static const uint32_t k_TimeDeviation = 30;////// \brief Default constructor.////// \param side The grid's side the player is controlling.///AdvancedAIPlayer::AdvancedAIPlayer (IPlayer::PlayerSide side): AIPlayer (side, k_TimeToWaitForNextMove, k_TimeDeviation){}int32_tAdvancedAIPlayer::computeScore (const GridStatus::PositionResult &result) const{ int32_t score = 0; // If the third columns gets too high, it's a very bad move. if ( result.heightThirdColumn >= Grid::k_VisibleHeight - 2) { score = -10000; } else { score -= 10 * (result.heightMean); score -= 5 * (result.heightMax); // For each step chain that we make, we get the double of points, // so its a good idea :-) std::vector<uint16_t>::const_iterator currentStepChain = result.stepChains.begin (); for (uint8_t numStepChains = 0 ; currentStepChain != result.stepChains.end () ; ++currentStepChain, ++numStepChains ) { score += (20 * (*currentStepChain)) / 1;//static_cast<int32_t>(std::pow (2.0f, numStepChains)); } // It's a good idea to have as many amoebas together as possible. score += 10 * result.groupsAmoebasNumber; // And to remove as many ghost amoebas as possible. score += 15 * result.ghostAmoebasRemoved; // Get the number of ghost amoebas that are going to fall. uint8_t numGhostAmoebas = 0; const std::vector<Amoeba *> &ghostAmoebas = getGrid ()->getWaitingGhostAmoebas (); for ( std::vector<Amoeba *>::const_iterator currentGhost = ghostAmoebas.begin () ; currentGhost != ghostAmoebas.end () ; ++currentGhost ) { Amoeba *ghost = *currentGhost; numGhostAmoebas += uint8_t (ghost->getState ()); } // The further the pair, the less important it becomes. switch ( getWhichPairToCheck () ) { case CheckingFollowingFallingPair: // Now, if we have "a lot of ghost" the following pair is not // important to us. if ( numGhostAmoebas >= 6 ) { score = 0; } else { score = static_cast<int32_t> (score * 0.20); } break; case CheckingNextFallingPair: if ( numGhostAmoebas >= 6 ) { score = static_cast<int32_t> (score * 0.40); } else { score = static_cast<int32_t> (score * 0.60); } break; default: // Nothing to do. break; } } return score;}boolAdvancedAIPlayer::shouldCheckFollowingFallingPair (void) const{ return true;}boolAdvancedAIPlayer::shouldCheckNextFallingPair (void) const{ return true;}boolAdvancedAIPlayer::shouldThePairFall (void) const{ return true;}boolAdvancedAIPlayer::shouldSatelliteBeVisible (void) const{ return false;}
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?