Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <iostream>
- #include <cstdio>
- #include <stdio.h>
- #include <math.h>
- #include <windows.h>
- using namespace std;
- class Charabom
- {
- public:
- int Atk;
- int Def;
- int SpecAtk;
- int SpecDef;
- int Level;
- int MaxHP;
- int CurrHP;
- double Modifier;
- Charabom (int,int,int,int,double);
- };
- Charabom::Charabom (int a, int b, int c, int d, double e)
- {
- Atk = a;
- Def = b;
- SpecAtk = c;
- SpecDef = d;
- Modifier = e;
- Level = (a + b + c + d)/4;
- MaxHP = Level*3;
- CurrHP = MaxHP;
- }
- class Player
- {
- public:
- int StratArray[3];
- int TurnMove[3];
- int EndFlag;
- Player();
- /////////////////////
- void NextComb (void)
- {
- StratArray[0]++;
- if(StratArray[0]>5)
- {
- StratArray[0]=0;
- StratArray[1]++;
- if(StratArray[1]>5)
- {
- StratArray[1]=0;
- StratArray[2]++;
- if(StratArray[2]>5)
- {
- EndFlag = 1;
- StratArray[0]=0;
- StratArray[1]=0;
- StratArray[2]=0;
- }
- }
- }
- }
- /////////////////////
- void TurnTranslate (int i)
- {
- if(StratArray[i]==0)
- {
- TurnMove[0]=0;
- TurnMove[1]=1;
- TurnMove[2]=2;
- }
- else if(StratArray[i]==1)
- {
- TurnMove[0]=0;
- TurnMove[1]=2;
- TurnMove[2]=1;
- }
- else if(StratArray[i]==2)
- {
- TurnMove[0]=1;
- TurnMove[1]=0;
- TurnMove[2]=2;
- }
- else if(StratArray[i]==3)
- {
- TurnMove[0]=1;
- TurnMove[1]=2;
- TurnMove[2]=0;
- }
- else if(StratArray[i]==4)
- {
- TurnMove[0]=2;
- TurnMove[1]=0;
- TurnMove[2]=1;
- }
- else //StratArray = 5
- {
- TurnMove[0]=2;
- TurnMove[1]=1;
- TurnMove[2]=0;
- }
- }
- };
- Player::Player()
- {
- StratArray[0]=0;
- StratArray[1]=0;
- StratArray[2]=0;
- EndFlag = 0;
- }
- class FightData
- {
- public:
- int CurrTurn; //1-3
- int CurrRound; //1-3
- int HumanAtkHigh;
- int HumanAtkLow;
- int HumanSpecHigh;
- int HumanSpecLow;
- int CPUAtkHigh;
- int CPUAtkLow;
- int CPUSpecHigh;
- int CPUSpecLow;
- int FightEnd;
- int FightWins;
- int FightLosses;
- int BestWins;
- int BestLosses;
- int BestRound1;
- int BestRound2;
- int ValidComb;
- FightData();
- };
- FightData::FightData()
- {
- CurrTurn=0;
- CurrRound=0;
- HumanAtkHigh=0;
- HumanAtkLow=0;
- HumanSpecHigh=0;
- HumanSpecLow=0;
- CPUAtkHigh=0;
- CPUAtkLow=0;
- CPUSpecHigh=0;
- CPUSpecLow=0;
- FightEnd=0;
- FightWins=0;
- FightLosses=0;
- BestWins=0;
- BestLosses=0;
- BestRound1=0;
- BestRound2=0;
- ValidComb=0;
- }
- ////////////////////////////////////////////////////////////
- ////////////////////////////////////////////////////////////
- int NegZero(int Value)
- {
- if(Value<0)
- {
- Value = 0;
- }
- return Value;
- }
- void CalculateFightData(Charabom &MyCharabom, Charabom &CPUCharabom, FightData &Fight)
- {
- Fight.HumanAtkHigh = MyCharabom.Atk;
- Fight.HumanAtkLow = MyCharabom.Atk - CPUCharabom.Def;
- Fight.HumanAtkLow = NegZero(Fight.HumanAtkLow);
- Fight.HumanSpecHigh = int (MyCharabom.Modifier*MyCharabom.SpecAtk); ///This probably doesn't work right for different elements.
- Fight.HumanSpecLow = int (MyCharabom.Modifier*MyCharabom.SpecAtk*0.5); ///This probably doesn't work right for different elements.
- Fight.CPUAtkHigh = CPUCharabom.Atk;
- Fight.CPUAtkLow = CPUCharabom.Atk - MyCharabom.Def;
- Fight.CPUAtkLow = NegZero(Fight.CPUAtkLow);
- Fight.CPUSpecHigh = int (CPUCharabom.SpecAtk*0.5); //This probably doesn't work right for different elements.
- Fight.CPUSpecLow = int (CPUCharabom.SpecAtk*0); //This probably doesn't work right for different elements.
- //printf("FightData %d, %d, %d, %d, ",Fight.HumanAtkHigh,Fight.HumanAtkLow,Fight.HumanSpecHigh,Fight.HumanSpecLow);
- //printf("%d, %d, %d, %d \n",Fight.CPUAtkHigh,Fight.CPUAtkLow,Fight.CPUSpecHigh,Fight.CPUSpecLow);
- }
- void CharabomRestat(Charabom &MyCharabom, int a, int b, int c, int d)
- {
- MyCharabom.Atk = a;
- MyCharabom.Def = b;
- MyCharabom.SpecAtk = c;
- MyCharabom.SpecDef = d;
- MyCharabom.Level = (a + b + c + d)/4;
- MyCharabom.MaxHP = MyCharabom.Level*3;
- MyCharabom.CurrHP = MyCharabom.MaxHP;
- }
- void ReplenishFight(Charabom &MyCharabom, Charabom &CPUCharabom, FightData &Fight)
- {
- Fight.CurrTurn=0;
- Fight.CurrRound=0;
- Fight.FightEnd=0;
- MyCharabom.CurrHP = MyCharabom.MaxHP;
- CPUCharabom.CurrHP = CPUCharabom.MaxHP;
- }
- void DumpCPU(FightData &Fight, Player &Human)
- {
- //printf("Fight.FightWins %d out of 216\n",Fight.FightWins);
- //printf("Fight.FightLosses %d\n",Fight.FightLosses);
- //Sleep(50);
- if(Fight.FightWins>Fight.BestWins)
- {
- Fight.BestWins = Fight.FightWins;
- Fight.BestLosses = Fight.FightLosses;
- Fight.BestRound1 = Human.StratArray[0];
- Fight.BestRound2 = Human.StratArray[1];
- }
- }
- void TurnSimulate(Player &Human, Charabom &MyCharabom, Player &CPU, Charabom &CPUCharabom, FightData &Fight)
- {
- //printf("Turn %d\n",Fight.CurrTurn);
- //We're assuming for this fight that the opponent always goes first, so if I'm dead by the end of the turn he wins anyway.
- if (Human.TurnMove[Fight.CurrTurn] == 0) //Is attacking
- {
- if(CPU.TurnMove[Fight.CurrTurn] == 1) //Is Defending
- {
- CPUCharabom.CurrHP = CPUCharabom.CurrHP - Fight.HumanAtkLow;
- //printf("Dealt %d CPU HAS %d\n", Fight.HumanAtkLow,CPUCharabom.CurrHP);
- }
- else
- {
- CPUCharabom.CurrHP = CPUCharabom.CurrHP - Fight.HumanAtkHigh;
- //printf("Dealt %d CPU HAS %d\n", Fight.HumanAtkHigh,CPUCharabom.CurrHP);
- }
- }
- //////
- if (CPU.TurnMove[Fight.CurrTurn] == 0) //Is attacking
- {
- if(Human.TurnMove[Fight.CurrTurn] == 1) //Is Defending
- {
- MyCharabom.CurrHP = MyCharabom.CurrHP - Fight.CPUAtkLow;
- //printf("Received %d \n", Fight.CPUAtkLow);
- }
- else
- {
- MyCharabom.CurrHP = MyCharabom.CurrHP - Fight.CPUAtkHigh;
- //printf("Received %d \n", Fight.CPUAtkHigh);
- }
- }
- /////
- if (Human.TurnMove[Fight.CurrTurn] == 2) //Is Spec Atking
- {
- if(CPU.TurnMove[Fight.CurrTurn] == 1) //Is Defending
- {
- CPUCharabom.CurrHP = CPUCharabom.CurrHP - Fight.HumanSpecLow;
- //printf("Dealt %d CPU HAS %d\n", Fight.HumanSpecLow,CPUCharabom.CurrHP);
- }
- else
- {
- CPUCharabom.CurrHP = CPUCharabom.CurrHP - Fight.HumanSpecHigh;
- //printf("Dealt %d CPU HAS %d\n", Fight.HumanSpecHigh,CPUCharabom.CurrHP);
- }
- }
- /////
- if (CPU.TurnMove[Fight.CurrTurn] == 2) //Is Spec Atking
- {
- if(Human.TurnMove[Fight.CurrTurn] == 1) //Is Defending
- {
- MyCharabom.CurrHP = MyCharabom.CurrHP - Fight.CPUSpecLow;
- //printf("Received %d \n", Fight.CPUSpecLow);
- }
- else
- {
- MyCharabom.CurrHP = MyCharabom.CurrHP - Fight.CPUSpecHigh;
- //printf("Received %d \n", Fight.CPUSpecHigh);
- }
- }
- /////
- if(CPUCharabom.CurrHP<0 || MyCharabom.CurrHP<0)
- {
- Fight.FightEnd = 1;
- }
- }
- void RoundSimulate(Player &Human, Charabom &MyCharabom, Player &CPU, Charabom &CPUCharabom, FightData &Fight)
- {
- //printf("ROUND: %d\n",Fight.CurrRound);
- while(Fight.CurrTurn<3&&Fight.FightEnd==0)
- {
- TurnSimulate(Human, MyCharabom, CPU, CPUCharabom, Fight);
- Fight.CurrTurn++;
- }
- }
- void ValidComb(Player &Human, Player &CPU, FightData &Fight)
- {
- if(Human.StratArray[0]==Human.StratArray[1]||Human.StratArray[0]==Human.StratArray[2]||Human.StratArray[1]==Human.StratArray[2])
- {
- Fight.ValidComb = 0;
- }
- else if(CPU.StratArray[0]==CPU.StratArray[1]||CPU.StratArray[0]==CPU.StratArray[2]||CPU.StratArray[1]==CPU.StratArray[2])
- {
- Fight.ValidComb = 0;
- }
- else
- {
- Fight.ValidComb = 1;
- }
- }
- void BattleSimulate(Player &Human, Charabom &MyCharabom, Player &CPU, Charabom &CPUCharabom, FightData &Fight)
- {
- //A battle has 3 rounds and a round has 3 turns.
- //////One human strategy vs all opponent strategies/////////////////////////////////////////////////////
- while(Human.EndFlag==0)
- {
- while(CPU.EndFlag==0)
- {
- //////One fight instance//////////////////////////////////////////////////////////////
- ReplenishFight(MyCharabom,CPUCharabom,Fight); //Resets round number, turn number, FightEnd, and HPs
- //printf("Fight.CurrRound = 0 %d \n",Fight.CurrRound);
- //printf("MyHP %d, CPUHP %d, CurRound %d \n",MyCharabom.CurrHP,CPUCharabom.CurrHP,Fight.CurrRound);
- while( (MyCharabom.CurrHP>0) && (CPUCharabom.CurrHP>0) && (Fight.CurrRound <3) && (Fight.FightEnd==0))
- {
- //One Round////
- Human.TurnTranslate(Fight.CurrRound);
- //printf("Human Turns %d,%d,%d \n",Human.TurnMove[0],Human.TurnMove[1],Human.TurnMove[2]);
- CPU.TurnTranslate(Fight.CurrRound);
- //printf("CPU Turns %d,%d,%d \n",CPU.TurnMove[0],CPU.TurnMove[1],CPU.TurnMove[2]);
- RoundSimulate(Human, MyCharabom, CPU, CPUCharabom, Fight);
- //Sleep(100);
- Fight.CurrRound++;
- Fight.CurrTurn = 0;
- ///////////////
- }
- ValidComb(Human, CPU, Fight); //1,1,2 is not a valid fight set, we simulated it but we won't add it to the results.
- ///////////////////////////////////////////////////////////////////////////////////////
- if((MyCharabom.CurrHP>0)&&(Fight.ValidComb==1))
- {
- Fight.FightWins += 1;
- //printf("%d %d I win \n",MyCharabom.CurrHP,CPUCharabom.CurrHP);
- //printf("NEW FIGHT");
- //Sleep(100);
- }
- else if((MyCharabom.CurrHP<=0)&&(Fight.ValidComb==1))
- {
- Fight.FightLosses += 1;
- //printf("%d %d I lose \n",MyCharabom.CurrHP,CPUCharabom.CurrHP);
- //printf("NEW FIGHT");
- //Sleep(100);
- }
- CPU.NextComb(); //Next Comb of rounds
- //printf("NEW ROUND CPU NextComb %d,%d,%d \n",CPU.StratArray[0],CPU.StratArray[1],CPU.StratArray[2]);
- if(CPU.EndFlag==1)
- {
- DumpCPU(Fight,Human);
- Fight.FightWins = 0;
- Fight.FightLosses = 0;
- //Sleep(100);
- }
- }
- CPU.EndFlag = 0;
- //////////////////////////////////////////////////////////////////////////////////////////////////////////
- Human.NextComb();
- //printf("NEW ROUND Human NextComb %d,%d,%d \n",Human.StratArray[0],Human.StratArray[1],Human.StratArray[2]);
- }
- Human.EndFlag=0;
- }
- int main ()
- {
- int i = 16;
- int j = 17;
- int k = 18;
- int l = 17;
- Player Kirkq;
- Player CPU;
- //Charabom Andlar (16,17,18,17,2); //Atk,Def,SpecAtk,SpecDef,Modifier
- Charabom Andlar (16,17,18,17,2); //Atk,Def,SpecAtk,SpecDef,Modifier
- Charabom Pteradon (40,30,10,20,0.5);
- FightData Fight;
- //Lots of lower ways to get XX.
- //Pretty much need level 16 to get XX.
- //Level 17 and 19 Atk and 19 Spec or 18 and 20 will get 68. //Let's try to route this?
- //Really need 19 Special
- //22 18 = 56
- //19,19 = 68
- //18,20 = 68
- ///17,20 = 64
- //16,20 = 64
- //17,21 = 68
- //13,21 = 64
- //16,22 = 68
- //12,22 = 64
- //15,23 = 68
- //Pretty much need level 21 to get XXX.
- //64-68 is about as good as it gets.
- //His 1:57 does Lv19: 15,19,24,19
- //His 1:56 does Lv19: 18,19,23,19
- for(i=12;i<25;i++){
- for(j=18;j<19;j++){
- for(k=12;k<25;k++){
- for(l=18;l<19;l++){
- CharabomRestat(Andlar,i,j,k,l);
- Sleep(10);
- CalculateFightData(Andlar,Pteradon,Fight);
- BattleSimulate(Kirkq,Andlar,CPU,Pteradon,Fight);
- printf("Stats: Lv: %d , %d,%d,%d,%d BestWins: %d, Strat %d %d\n",Andlar.Level,Andlar.Atk,Andlar.Def,Andlar.SpecAtk,Andlar.SpecDef,Fight.BestWins,Fight.BestRound1,Fight.BestRound2);
- Fight.BestWins = 0;
- Fight.BestLosses = 0;
- Fight.BestRound1 = 0;
- Fight.BestRound2 = 0;
- }
- }
- }
- }
- cout << "To close type something and hit enter: ";
- cin >> i;
- return 0;
- }
Advertisement
Add Comment
Please, Sign In to add comment