File indexing completed on 2024-12-08 03:47:29
0001 // kate: space-indent on; indent-width 2; replace-tabs on; 0002 /** This file is part of KsirK. 0003 Copyright (C) 2006-2007 Gael de Chalendar <kleag@free.fr> 0004 0005 This file was initialy part of XFrisk 0006 Copyright (C) 1995 and later Jean-Claude Colson and Others <who@nowhere.org> 0007 0008 KsirK is free software; you can redistribute it and/or 0009 modify it under the terms of the GNU General Public 0010 License as published by the Free Software Foundation, either version 2 0011 of the License, or (at your option) any later version. 0012 0013 This program is distributed in the hope that it will be useful, 0014 but WITHOUT ANY WARRANTY; without even the implied warranty of 0015 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU 0016 General Public License for more details. 0017 0018 You should have received a copy of the GNU General Public License 0019 along with this program; if not, write to the Free Software 0020 Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 0021 02110-1301, USA 0022 */ 0023 0024 #ifndef KSIRK_GAMELOGIC_AICOLSONPLAYER_H 0025 #define KSIRK_GAMELOGIC_AICOLSONPLAYER_H 0026 0027 #include "aiplayer.h" 0028 0029 #include <map> 0030 0031 #define MAX_CARDS 10 0032 0033 namespace Ksirk 0034 { 0035 0036 namespace GameLogic 0037 { 0038 class Player; 0039 class Continent; 0040 class GameAutomaton; 0041 0042 /** 0043 * The AIColsonPlayer class is an AI player ported from the risk clone XFrisk, 0044 * this program being programed in C. I have just made it work, adapting some 0045 * data structures, but it remains a lot of work to port it to a plain object 0046 * oriented class and also to make it work with the goals (at least). 0047 * @author Jean-Claude Colson (original C version) 0048 * @author Gaƫl de Chalendar (aka Kleag) (C++ version for KsirK) 0049 */ 0050 class AIColsonPlayer : public AIPlayer 0051 { 0052 public: 0053 /** 0054 * Constructor with simple initializations 0055 */ 0056 explicit AIColsonPlayer( 0057 const QString & nomPlayer, unsigned int nbArmies, 0058 Nationality * myNation, PlayersArray& players, ONU* world, 0059 GameAutomaton* game ); 0060 0061 /** Default destructor. */ 0062 ~AIColsonPlayer() override; 0063 0064 0065 QString author() override {return "Jean-Claude COLSON";} 0066 0067 /** 0068 * Returns a pair of countries where the attacker have enough armies to 0069 * attack and the defender is a ennemy neighbour of the attacker. 0070 */ 0071 QPair< const Country*, const Country* > chooseBelligerant() override; 0072 0073 /** 0074 * Chooses the next action. In the current basic setting, chooses at random 0075 * between the three possibilities. For each, chooses randomly the 0076 * parameters.If the randomly chosen parameters end by an impossible 0077 * action, continue with next player. 0078 */ 0079 void chooseAttackMoveArmiesOrNextPlayer() override; 0080 0081 /** 0082 * Chooses a country to receive a new army in dotation 0083 */ 0084 Country* chooseReceivingCountry() override; 0085 0086 /** 0087 * makes all what is necessary to prepare and start the moving of armies 0088 */ 0089 bool moveArmiesAction() override; 0090 0091 /** 0092 * computes the next continent to try to conquer or defend 0093 */ 0094 const Continent* computeChoiceOfContinent(void); 0095 0096 /** 0097 * Called once when all players are created/loaded/joined and when the 0098 * game can start. Allows to initialize AIs with public data about other 0099 * players. 0100 */ 0101 void finalize() override; 0102 0103 /** 0104 * chooses to continue invasion with a certain amount of armies or to stop it 0105 */ 0106 void chooseInvasionAction() override; 0107 0108 private: 0109 0110 struct PlaceData 0111 { 0112 Country* dest; 0113 uint nb; 0114 }; 0115 0116 0117 0118 Player* RISK_GetOwnerOfCountry(int i); 0119 Continent* RISK_GetContinentOfCountry(int i); 0120 int RISK_GetNumArmiesOfCountry(int i); 0121 int RISK_GetNumArmiesOfPlayer(Player* player); 0122 /** 0123 * Returns the position in the countries list of the ith adjacent country of 0124 * country iCountry 0125 */ 0126 int RISK_GetAdjCountryOfCountry(int iCountry, int i); 0127 int RISK_GetNumCountriesOfPlayer(const Player* player); 0128 bool GAME_IsEnemyAdjacent(int i); 0129 int FindEnemyAdjacent(int iCountry, int distance); 0130 int GAME_FindEnemyAdjacent(int country); 0131 0132 0133 0134 // void COLSON_Play(void *pData, int iCommand, void *pArgs); 0135 0136 /* The species */ 0137 // DefineSpecies( 0138 // COLSON_Play, 0139 // "Ordinateur", 0140 // AUTHOR, 0141 // "0.01", 0142 // "Machine violente." 0143 // ) 0144 0145 int getTotalArmiesOfPlayer(const Player* player); 0146 0147 bool isContinentOfMission(const Player* player, const Continent* continent); 0148 0149 bool isEnemyPlayer(const Player* player); 0150 0151 bool isFriendPlayer(const Player* player); 0152 0153 int getNumEnemy(); 0154 0155 bool isStrongerPlayer(const Player* player); 0156 0157 bool isSmallerPlayer(const Player* player); 0158 0159 bool isContinentOfPlayer(const Continent* continent, const Player* player); 0160 0161 const Continent* GetContinentToFortify(int *attack); 0162 0163 const Continent* getContinentToConquier(int *attack); 0164 0165 int NbEnemyAdjacent(Country* iCountry); 0166 0167 int NbToEqualEnemyAdjacent(Country* iCountry); 0168 0169 int NbToAverageEnemyAdjacent(Country* iCountry); 0170 0171 bool ComputerAttack(int destCountry, bool die, int dif); 0172 0173 bool Fortify(); 0174 0175 bool Place(); 0176 0177 bool AttackEnemy(); 0178 0179 bool Attack(); 0180 0181 void HowManyArmiesToMove(int *nb); 0182 0183 bool Move(); 0184 0185 int AI_Place(int iCountry, int iNumArmies); 0186 int AI_Move(int iSrcCountry, int iDstCountry, int iNumArmies); 0187 0188 // void ExchangeCards(const Player* player); 0189 0190 std::map<const Player*, int> m_numTurn; 0191 std::map<const Player*, int> m_isEnemyPlayer; 0192 int m_levelEnemy; 0193 0194 /** false while finalize has not been called */ 0195 bool m_initialized; 0196 0197 int Attack_SrcCountry; 0198 int Attack_DestCountry; 0199 0200 PlaceData* m_placeData; 0201 0202 /** 0203 * (country,dist)->country : used to find a nearest enemy and to avoid 0204 * useless recursions 0205 */ 0206 std::map<pair<int,int>,int> m_enemyAdjacent; 0207 }; 0208 0209 } // closing namespace GameLogic 0210 0211 } // closing namespace Ksirk 0212 0213 #endif