Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- package heraldofanguish;
- import java.util.Arrays.*;
- import java.util.Random;
- public class HeraldOfAnguish {
- public static void main(String[] args) {
- Deck deck=new Deck();
- //CardType 1 is an Underground Sea (fetchable with Renegade Map)
- //CardType 2 is a Cogworker's Puzzleknot or Servo Schematic
- //CardType 3 is an Herald of Anguish
- //CardType 4 is an Ornithopter
- //CardType 5 is a Merchant's Dockhand
- //CardType 6 is a Terrarion
- //CardType 7 is a Renegade Map
- //CardType 8 is an other card
- //CardType 9 is a Reverse Engineer
- //CardType 10 is a Heart of Kiran
- //CardType 11 is a Aethersphere Harvester
- //CardType 12 is not used
- deck.SetDeck(22,7,4,5,3,2,2,11,2,1,1,0);
- int NumberOfIterations=50000000;
- int StartingCards=7;
- Deck remainingdeck=new Deck();
- int NumberOfTurn2Heralds=0;
- int NumberOfTurn3Heralds=0;
- int NumberOfTurn4Heralds=0;
- int NumberOfFail=0;
- int NumberOfRelevantGames=0;
- for (int IterationCounter=1; IterationCounter<=NumberOfIterations; IterationCounter++){
- OpeningHand openinghand=GiveOpeningHandAfterMulls(deck, StartingCards);
- remainingdeck.SetDeck(deck.NumberOfCardType1-openinghand.NumberOfCardType1,deck.NumberOfCardType2-openinghand.NumberOfCardType2,deck.NumberOfCardType3-openinghand.NumberOfCardType3,deck.NumberOfCardType4-openinghand.NumberOfCardType4,deck.NumberOfCardType5-openinghand.NumberOfCardType5,deck.NumberOfCardType6-openinghand.NumberOfCardType6,deck.NumberOfCardType7-openinghand.NumberOfCardType7,deck.NumberOfCardType8-openinghand.NumberOfCardType8,deck.NumberOfCardType9-openinghand.NumberOfCardType9,deck.NumberOfCardType10-openinghand.NumberOfCardType10,deck.NumberOfCardType11-openinghand.NumberOfCardType11,deck.NumberOfCardType12-openinghand.NumberOfCardType12);
- int Outcome=SimulateGame(remainingdeck,openinghand);
- if (Outcome==4) {NumberOfTurn4Heralds++; NumberOfRelevantGames++;}
- if (Outcome==3) {NumberOfTurn3Heralds++; NumberOfRelevantGames++;}
- if (Outcome==2) {NumberOfTurn2Heralds++; NumberOfRelevantGames++;}
- if (Outcome==1) {NumberOfFail++; NumberOfRelevantGames++;}
- }
- System.out.println("Probability of turn 2 Herald:"+Math.round(NumberOfTurn2Heralds/(NumberOfRelevantGames+0.0)*10000)/100.0);
- System.out.println("Probability of turn 3 Herald:"+Math.round(NumberOfTurn3Heralds/(NumberOfRelevantGames+0.0)*10000)/100.0);
- System.out.println("Probability of turn 4 Herald:"+Math.round(NumberOfTurn4Heralds/(NumberOfRelevantGames+0.0)*10000)/100.0);
- System.out.println("Probability of not enough artifacts:"+Math.round(NumberOfFail/(NumberOfRelevantGames+0.0)*10000)/100.0);
- }//end of main
- static OpeningHand GiveOpeningHandAfterMulls (Deck deck, int StartingCards) {
- Deck remainingdeck=new Deck();
- OpeningHand openinghand=new OpeningHand();
- int TypeOfCardDrawn;
- boolean KeepHand=false;
- for (int OpeningHandSize=7; OpeningHandSize>=1; OpeningHandSize--){
- if (KeepHand==false){
- int NrLands=0;
- //Note: I view Springleaf Drum and Chrome Mox as lands as well here
- openinghand.SetHand(0,0,0,0,0,0,0,0,0,0,0,0);
- remainingdeck.SetDeck(deck.NumberOfCardType1,deck.NumberOfCardType2,deck.NumberOfCardType3,deck.NumberOfCardType4,deck.NumberOfCardType5,deck.NumberOfCardType6,deck.NumberOfCardType7,deck.NumberOfCardType8,deck.NumberOfCardType9,deck.NumberOfCardType10,deck.NumberOfCardType11,deck.NumberOfCardType12);
- for (int CardsDrawn=0; CardsDrawn<OpeningHandSize; CardsDrawn++){
- TypeOfCardDrawn=remainingdeck.DrawCard();
- if (TypeOfCardDrawn==1) {openinghand.NumberOfCardType1++; NrLands++;}
- if (TypeOfCardDrawn==2) {openinghand.NumberOfCardType2++; }
- if (TypeOfCardDrawn==3) {openinghand.NumberOfCardType3++; }
- if (TypeOfCardDrawn==4) {openinghand.NumberOfCardType4++; }
- if (TypeOfCardDrawn==5) {openinghand.NumberOfCardType5++; }
- if (TypeOfCardDrawn==6) {openinghand.NumberOfCardType6++;}
- if (TypeOfCardDrawn==7) {openinghand.NumberOfCardType7++; NrLands++;}
- if (TypeOfCardDrawn==8) {openinghand.NumberOfCardType8++;}
- if (TypeOfCardDrawn==9) {openinghand.NumberOfCardType9++;}
- if (TypeOfCardDrawn==10) {openinghand.NumberOfCardType10++;}
- if (TypeOfCardDrawn==11) {openinghand.NumberOfCardType11++;}
- if (TypeOfCardDrawn==12) {openinghand.NumberOfCardType12++;}
- }
- if (NrLands>=2 && NrLands<=5) {KeepHand=true;}
- }
- }
- return openinghand;
- }//end of GiveOpeningHandAfterMulls
- static int SimulateGame(Deck remainingdeck, OpeningHand openinghand) {
- int TypeOfCardDrawn;
- //CardType 1 is an Underground Sea (fetchable with Renegade Map)
- //CardType 2 is a Cogworker's Puzzleknot or Servo Schematic
- //CardType 3 is an Herald of Anguish
- //CardType 4 is an Ornithopter
- //CardType 5 is a Merchant's Dockhand
- //CardType 6 is a Terrarion
- //CardType 7 is a Renegade Map
- //CardType 8 is an other card
- //CardType 9 is a Reverse Engineer
- //CardType 10 is a Heart of Kiran
- //CardType 11 is a Aethersphere Harvester
- //CardType 12 is not used
- int LandInHand=openinghand.NumberOfCardType1;
- int PuzzleknotInHand=openinghand.NumberOfCardType2;
- int HeraldInHand=openinghand.NumberOfCardType3;
- int OrnithopterInHand=openinghand.NumberOfCardType4;
- int OneDropInHand=openinghand.NumberOfCardType5;
- int TerrarionInHand=openinghand.NumberOfCardType6;
- int RenegadeMapInHand=openinghand.NumberOfCardType7;
- int OtherInHand=openinghand.NumberOfCardType8;
- int ReverseEngineerInHand=openinghand.NumberOfCardType9;
- int HeartOfKiranInHand=openinghand.NumberOfCardType10;
- int AethersphereHarvesterInHand=openinghand.NumberOfCardType11;
- int LandInPlay=0;
- int TotalArtifactInPlay=0;
- int TerrarionInPlay=0;
- int RenegadeMapInPlay=0;
- int TotalTapForHerald=0;
- int Outcome=0;
- int ManaAvailable=0;
- int ArtifactsTapped=0;
- boolean LandPlayed;
- boolean HeraldPlayed=false;
- boolean PlayedReverseEngineerTurn4AndCouldntHavePlayedHeraldBeforeWithEnoughArtifacts=false;
- boolean DebugMode=false;
- for (int Turn=1; Turn<=4; Turn++){
- if (HeraldPlayed==false){
- LandPlayed=false;
- //We are always on the draw
- TypeOfCardDrawn=remainingdeck.DrawCard();
- if (TypeOfCardDrawn==1) {LandInHand++;}
- if (TypeOfCardDrawn==2) {PuzzleknotInHand++;}
- if (TypeOfCardDrawn==3) {HeraldInHand++;}
- if (TypeOfCardDrawn==4) {OrnithopterInHand++;}
- if (TypeOfCardDrawn==5) {OneDropInHand++;}
- if (TypeOfCardDrawn==6) {TerrarionInHand++;}
- if (TypeOfCardDrawn==7) {RenegadeMapInHand++;}
- if (TypeOfCardDrawn==8) {OtherInHand++;}
- if (TypeOfCardDrawn==9) {ReverseEngineerInHand++;}
- if (TypeOfCardDrawn==10) {HeartOfKiranInHand++;}
- if (TypeOfCardDrawn==11) {AethersphereHarvesterInHand++;}
- if(DebugMode) {
- System.out.print("Begin turn "+Turn+": hand is "+LandInHand+" land, "+PuzzleknotInHand+" Puzzleknot, "+HeraldInHand+" Heralds, "+OrnithopterInHand+" Ornithopters, "+OneDropInHand+" One-Drops, "+TerrarionInHand+" Terrarions, "+RenegadeMapInHand+" Renegade Map, "+OtherInHand+" Other, "+ReverseEngineerInHand+" Reverse Engineer, "+HeartOfKiranInHand+" Heart, "+AethersphereHarvesterInHand+" Aethersphere.");
- System.out.print(" Board is "+LandInPlay+" lands, "+TotalArtifactInPlay+" artifacts, of which "+ TerrarionInPlay+" Terrarion and "+RenegadeMapInPlay+" Renegade Map.");
- }
- //1. If we can play an Ornithopter, we do so
- TotalArtifactInPlay=TotalArtifactInPlay+OrnithopterInHand;
- OrnithopterInHand=0;
- //2. If we can play a land, we do so.
- if (LandInHand>=1) {
- LandInHand--;
- LandInPlay++;
- LandPlayed=true;
- }
- //2a. If we can play a Herald, we do so.
- TotalTapForHerald=LandInPlay+TotalArtifactInPlay;
- if (TotalTapForHerald>=7 && HeraldInHand>=1) {
- HeraldPlayed=true;
- Outcome=Turn;
- }
- //3. If we haven't played a land yet, we try to use Renegade Map and/or Terrarion
- if (LandPlayed==false && RenegadeMapInPlay>=1) {
- RenegadeMapInPlay--;
- TotalArtifactInPlay--;
- remainingdeck.NumberOfCardType1--;
- LandInHand++;
- LandInHand--;
- LandInPlay++;
- LandPlayed=true;
- if(DebugMode) {System.out.print("Crack Map. ");}
- }
- if (LandPlayed==false && TerrarionInPlay>=1 && LandInPlay>=2) {
- TerrarionInPlay--;
- TotalArtifactInPlay--;
- TypeOfCardDrawn=remainingdeck.DrawCard();
- if(DebugMode) {System.out.print("Crack Terrarion for");}
- if (TypeOfCardDrawn==1) {LandInHand++; if(DebugMode){System.out.print(" land.");}}
- if (TypeOfCardDrawn==2) {PuzzleknotInHand++; if(DebugMode){System.out.print(" Puzz.");}}
- if (TypeOfCardDrawn==3) {HeraldInHand++; if(DebugMode){System.out.print(" Herald.");}}
- if (TypeOfCardDrawn==4) {OrnithopterInHand++; if(DebugMode){System.out.print(" for 0/2.");}}
- if (TypeOfCardDrawn==5) {OneDropInHand++; if(DebugMode){System.out.print(" one-drop.");}}
- if (TypeOfCardDrawn==6) {TerrarionInHand++; if(DebugMode){System.out.print(" Terr.");}}
- if (TypeOfCardDrawn==7) {RenegadeMapInHand++; if(DebugMode){System.out.print(" RenMap.");}}
- if (TypeOfCardDrawn==8) {OtherInHand++; if(DebugMode){System.out.print(" other.");}}
- if (TypeOfCardDrawn==9) {ReverseEngineerInHand++; if(DebugMode){System.out.print(" RevEng.");}}
- if (TypeOfCardDrawn==10) {HeartOfKiranInHand++; if(DebugMode){System.out.print(" Heart.");}}
- if (TypeOfCardDrawn==11) {AethersphereHarvesterInHand++; if(DebugMode){System.out.print(" Aethersphere.");}}
- if (LandInHand>=1) {
- LandInHand--;
- LandInPlay++;
- LandPlayed=true;
- }
- }
- //3a. If we can play a Herald, we do so.
- TotalTapForHerald=LandInPlay+TotalArtifactInPlay;
- if (TotalTapForHerald>=7 && HeraldInHand>=1) {
- HeraldPlayed=true;
- Outcome=Turn;
- }
- //4. We cast artifacts that don't enter tapped
- ManaAvailable=LandInPlay;
- if (ManaAvailable>=2 && PuzzleknotInHand>=1) {
- ManaAvailable=ManaAvailable-2;
- PuzzleknotInHand--;
- TotalArtifactInPlay=TotalArtifactInPlay+2;
- }
- if (ManaAvailable>=1 && OneDropInHand>=1) {
- int CastableOneDrops=Math.min(ManaAvailable,OneDropInHand);
- ManaAvailable=ManaAvailable-CastableOneDrops;
- OneDropInHand=OneDropInHand-CastableOneDrops;
- TotalArtifactInPlay=TotalArtifactInPlay+CastableOneDrops;
- }
- if (ManaAvailable>=2 && HeartOfKiranInHand>=1) {
- ManaAvailable=ManaAvailable-2;
- HeartOfKiranInHand--;
- TotalArtifactInPlay++;
- }
- if (ManaAvailable>=3 && AethersphereHarvesterInHand>=1) {
- ManaAvailable=ManaAvailable-3;
- AethersphereHarvesterInHand--;
- TotalArtifactInPlay++;
- }
- //5. We cast ReverseEngineer if possible
- ArtifactsTapped=0;
- if (ManaAvailable>=2 && ReverseEngineerInHand>=1 && TotalArtifactInPlay+ManaAvailable>=5) {
- if (TotalArtifactInPlay>=3){
- ManaAvailable=ManaAvailable-2;
- ArtifactsTapped=3;
- }
- if (TotalArtifactInPlay==2){
- ManaAvailable=ManaAvailable-3;
- ArtifactsTapped=2;
- }
- ReverseEngineerInHand--;
- if (Turn==4) {PlayedReverseEngineerTurn4AndCouldntHavePlayedHeraldBeforeWithEnoughArtifacts=true;}
- if (Turn==4 && TotalTapForHerald<7 && HeraldInHand>=1) {PlayedReverseEngineerTurn4AndCouldntHavePlayedHeraldBeforeWithEnoughArtifacts=false;}
- if(DebugMode) {System.out.print("RevEng into");}
- for (int CardsDrawn=1; CardsDrawn<=3; CardsDrawn++){
- TypeOfCardDrawn=remainingdeck.DrawCard();
- if (TypeOfCardDrawn==1) {LandInHand++; if(DebugMode){System.out.print(" land.");}}
- if (TypeOfCardDrawn==2) {PuzzleknotInHand++; if(DebugMode){System.out.print(" Puzz.");}}
- if (TypeOfCardDrawn==3) {HeraldInHand++; if(DebugMode){System.out.print(" Herald.");}}
- if (TypeOfCardDrawn==4) {OrnithopterInHand++; if(DebugMode){System.out.print(" for 0/2.");}}
- if (TypeOfCardDrawn==5) {OneDropInHand++; if(DebugMode){System.out.print(" one-drop.");}}
- if (TypeOfCardDrawn==6) {TerrarionInHand++; if(DebugMode){System.out.print(" Terr.");}}
- if (TypeOfCardDrawn==7) {RenegadeMapInHand++; if(DebugMode){System.out.print(" RenMap.");}}
- if (TypeOfCardDrawn==8) {OtherInHand++; if(DebugMode){System.out.print(" other.");}}
- if (TypeOfCardDrawn==9) {ReverseEngineerInHand++; if(DebugMode){System.out.print(" RevEng.");}}
- }
- }
- //5a. If we can play a land or Ornithopter, we do so.
- if (LandInHand>=1 && LandPlayed==false) {
- LandInHand--;
- LandInPlay++;
- ManaAvailable++;
- LandPlayed=true;
- }
- TotalArtifactInPlay=TotalArtifactInPlay+OrnithopterInHand;
- OrnithopterInHand=0;
- //5b. If we can play a Herald, we do so.
- TotalTapForHerald=ManaAvailable+TotalArtifactInPlay-ArtifactsTapped;
- if (TotalTapForHerald>=7 && HeraldInHand>=1) {
- HeraldPlayed=true;
- Outcome=Turn;
- }
- //6. We cast Terrarion or Renegade map
- if (ManaAvailable>=1 && RenegadeMapInHand>=1) {
- ManaAvailable=ManaAvailable-1;
- RenegadeMapInHand--;
- TotalArtifactInPlay++;
- RenegadeMapInPlay++;
- }
- if (ManaAvailable>=1 && TerrarionInHand>=1) {
- ManaAvailable=ManaAvailable-1;
- TerrarionInHand--;
- TotalArtifactInPlay++;
- TerrarionInPlay++;
- }
- if(DebugMode) { System.out.println();}
- }//end of not HeraldPlayed check
- }//end of the for-loop over the turns
- if (HeraldPlayed==false && HeraldInHand>=1 && LandInPlay>=4 && PlayedReverseEngineerTurn4AndCouldntHavePlayedHeraldBeforeWithEnoughArtifacts==false) {Outcome=1;}
- if(DebugMode){
- System.out.println("====Outcome: "+Outcome);
- System.out.println();
- }
- return Outcome;
- }//end of SimulateGame
- }
- class OpeningHand {
- int NumberOfCardType1;
- int NumberOfCardType2;
- int NumberOfCardType3;
- int NumberOfCardType4;
- int NumberOfCardType5;
- int NumberOfCardType6;
- int NumberOfCardType7;
- int NumberOfCardType8;
- int NumberOfCardType9;
- int NumberOfCardType10;
- int NumberOfCardType11;
- int NumberOfCardType12;
- //I really should've used arrays here, lol
- int NrOfCards(){
- return NumberOfCardType1+NumberOfCardType2+NumberOfCardType3+NumberOfCardType4+NumberOfCardType5+NumberOfCardType6+NumberOfCardType7+NumberOfCardType8+NumberOfCardType9+NumberOfCardType10+NumberOfCardType11+NumberOfCardType12;
- }
- void SetHand (int Nr1, int Nr2, int Nr3, int Nr4, int Nr5, int Nr6, int Nr7, int Nr8, int Nr9, int Nr10, int Nr11, int Nr12) {
- NumberOfCardType1=Nr1;
- NumberOfCardType2=Nr2;
- NumberOfCardType3=Nr3;
- NumberOfCardType4=Nr4;
- NumberOfCardType5=Nr5;
- NumberOfCardType6=Nr6;
- NumberOfCardType7=Nr7;
- NumberOfCardType8=Nr8;
- NumberOfCardType9=Nr9;
- NumberOfCardType10=Nr10;
- NumberOfCardType11=Nr11;
- NumberOfCardType11=Nr12;
- }
- }//end of OpeningHand
- class Deck {
- int NumberOfCardType1;
- int NumberOfCardType2;
- int NumberOfCardType3;
- int NumberOfCardType4;
- int NumberOfCardType5;
- int NumberOfCardType6;
- int NumberOfCardType7;
- int NumberOfCardType8;
- int NumberOfCardType9;
- int NumberOfCardType10;
- int NumberOfCardType11;
- int NumberOfCardType12;
- //I really should've used arrays here, lol
- void SetDeck (int Nr1, int Nr2, int Nr3, int Nr4, int Nr5, int Nr6, int Nr7, int Nr8, int Nr9, int Nr10, int Nr11, int Nr12) {
- NumberOfCardType1=Nr1;
- NumberOfCardType2=Nr2;
- NumberOfCardType3=Nr3;
- NumberOfCardType4=Nr4;
- NumberOfCardType5=Nr5;
- NumberOfCardType6=Nr6;
- NumberOfCardType7=Nr7;
- NumberOfCardType8=Nr8;
- NumberOfCardType9=Nr9;
- NumberOfCardType10=Nr10;
- NumberOfCardType11=Nr11;
- NumberOfCardType12=Nr12;
- }
- int NrOfCards(){
- return NumberOfCardType1+NumberOfCardType2+NumberOfCardType3+NumberOfCardType4+NumberOfCardType5+NumberOfCardType6+NumberOfCardType7+NumberOfCardType8+NumberOfCardType9+NumberOfCardType10+NumberOfCardType11+NumberOfCardType12;
- }
- int DrawCard (){
- Random generator = new Random();
- int CardType=0;
- int RandomIntegerBetweenOneAndDeckSize=generator.nextInt( this.NrOfCards() )+1;
- int OneCutoff=NumberOfCardType1;
- int TwoCutoff=OneCutoff+NumberOfCardType2;
- int ThreeCutoff=TwoCutoff+NumberOfCardType3;
- int FourCutoff=ThreeCutoff+NumberOfCardType4;
- int FiveCutoff=FourCutoff+NumberOfCardType5;
- int SixCutoff=FiveCutoff+NumberOfCardType6;
- int SevenCutoff=SixCutoff+NumberOfCardType7;
- int EightCutoff=SevenCutoff+NumberOfCardType8;
- int NineCutoff=EightCutoff+NumberOfCardType9;
- int TenCutoff=NineCutoff+NumberOfCardType10;
- int ElevenCutoff=TenCutoff+NumberOfCardType11;
- int TwelveCutoff=ElevenCutoff+NumberOfCardType12;
- if (RandomIntegerBetweenOneAndDeckSize<=OneCutoff) {CardType=1; this.NumberOfCardType1--;}
- if (RandomIntegerBetweenOneAndDeckSize>OneCutoff && RandomIntegerBetweenOneAndDeckSize<=TwoCutoff) {CardType=2; this.NumberOfCardType2--;}
- if (RandomIntegerBetweenOneAndDeckSize>TwoCutoff && RandomIntegerBetweenOneAndDeckSize<=ThreeCutoff) {CardType=3; this.NumberOfCardType3--;}
- if (RandomIntegerBetweenOneAndDeckSize>ThreeCutoff && RandomIntegerBetweenOneAndDeckSize<=FourCutoff) {CardType=4; this.NumberOfCardType4--;}
- if (RandomIntegerBetweenOneAndDeckSize>FourCutoff && RandomIntegerBetweenOneAndDeckSize<=FiveCutoff) {CardType=5; this.NumberOfCardType5--;}
- if (RandomIntegerBetweenOneAndDeckSize>FiveCutoff && RandomIntegerBetweenOneAndDeckSize<=SixCutoff) {CardType=6; this.NumberOfCardType6--;}
- if (RandomIntegerBetweenOneAndDeckSize>SixCutoff && RandomIntegerBetweenOneAndDeckSize<=SevenCutoff) {CardType=7; this.NumberOfCardType7--;}
- if (RandomIntegerBetweenOneAndDeckSize>SevenCutoff && RandomIntegerBetweenOneAndDeckSize<=EightCutoff) {CardType=8; this.NumberOfCardType8--;}
- if (RandomIntegerBetweenOneAndDeckSize>EightCutoff && RandomIntegerBetweenOneAndDeckSize<=NineCutoff) {CardType=9; this.NumberOfCardType9--;}
- if (RandomIntegerBetweenOneAndDeckSize>NineCutoff && RandomIntegerBetweenOneAndDeckSize<=TenCutoff) {CardType=10; this.NumberOfCardType10--;}
- if (RandomIntegerBetweenOneAndDeckSize>TenCutoff && RandomIntegerBetweenOneAndDeckSize<=ElevenCutoff) {CardType=11; this.NumberOfCardType11--;}
- if (RandomIntegerBetweenOneAndDeckSize>ElevenCutoff && RandomIntegerBetweenOneAndDeckSize<=TwelveCutoff) {CardType=12; this.NumberOfCardType12--;}
- return CardType;
- }
- }//end of Deck
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement