Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- package lupineprototypetraditionalaffinity;
- import java.util.Arrays.*;
- import java.util.Random;
- public class LupinePrototypeTraditionalAffinity {
- public static void main(String[] args) {
- Deck deck=new Deck();
- //CardType 1 is a Darksteel Citadel
- //CardType 2 is a Glimmervoid or basic Mountain
- //CardType 3 is an Inkmoth Nexus or Blinkmoth Nexus
- //CardType 4 is a Chrome Mox
- //CardType 5 is a Springleaf Drum
- //CardType 6 is a Memnite or Ornithopter
- //CardType 7 is a one-drop creature
- //CardType 8 is a two-drop apart from Lupine Prototype
- //CardType 9 is a Lupine Prototype (instead of Steel overseer)
- //CardType 10 is an Etched Champion
- //CardType 11 is a Galvanic Blast
- //CardType 12 is not used
- deck.SetDeck(4,5,8,4,4,7,8,8,4,4,4,0);
- double Probability=Probability=ProbabilityForRandomHand(deck,7,10000000);
- System.out.println("Probability:"+Math.round(Probability*10000)/100.0);
- }//end of main
- public static double ProbabilityForRandomHand(Deck deck, int StartingCards, int NumberOfIterations){
- Deck remainingdeck=new Deck();
- int NumberOfAttackingLupineOnTurn=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==2) {NumberOfAttackingLupineOnTurn++; NumberOfRelevantGames++;}
- if (Outcome==1) {NumberOfRelevantGames++;}
- }
- return NumberOfAttackingLupineOnTurn/(NumberOfRelevantGames+0.0);
- }
- 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++; NrLands++;}
- if (TypeOfCardDrawn==3) {openinghand.NumberOfCardType3++; NrLands++;}
- if (TypeOfCardDrawn==4) {openinghand.NumberOfCardType4++; NrLands++;}
- if (TypeOfCardDrawn==5) {openinghand.NumberOfCardType5++; NrLands++;}
- if (TypeOfCardDrawn==6) {openinghand.NumberOfCardType6++;}
- if (TypeOfCardDrawn==7) {openinghand.NumberOfCardType7++;}
- 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;
- int CitadelInHand=openinghand.NumberOfCardType1;
- int GlimmervoidInHand=openinghand.NumberOfCardType2;
- int NexusInHand=openinghand.NumberOfCardType3;
- int MoxInHand=openinghand.NumberOfCardType4;
- int DrumInHand=openinghand.NumberOfCardType5;
- int MemniteInHand=openinghand.NumberOfCardType6;
- int OneDropInHand=openinghand.NumberOfCardType7;
- int TwoDropInHand=openinghand.NumberOfCardType8;
- int LupineInHand=openinghand.NumberOfCardType9;
- int EtchedInHand=openinghand.NumberOfCardType10;
- int BlastInHand=openinghand.NumberOfCardType11;
- int CitadelInPlay=0;
- int GlimmervoidInPlay=0;
- int NexusInPlay=0;
- int MoxInPlay=0;
- int DrumInPlay=0;
- int MemniteInPlay=0;
- int OneDropInPlay=0;
- int TwoDropInPlay=0;
- int LupineInPlay=0;
- int EtchedInPlay=0;
- int AffinityForArtifacts;
- int Metalcraft;
- int TappedMox;
- int TappedDrum;
- int TappedCreature;
- int CreaturesInPlay;
- boolean LandPlayed;
- for (int Turn=1; Turn<=5; Turn++){
- TappedMox=0;
- TappedDrum=0;
- TappedCreature=0;
- LandPlayed=false;
- if (Turn>1) {
- TypeOfCardDrawn=remainingdeck.DrawCard();
- if (TypeOfCardDrawn==1) {CitadelInHand++;}
- if (TypeOfCardDrawn==2) {GlimmervoidInHand++;}
- if (TypeOfCardDrawn==3) {NexusInHand++;}
- if (TypeOfCardDrawn==4) {MoxInHand++;}
- if (TypeOfCardDrawn==5) {DrumInHand++;}
- if (TypeOfCardDrawn==6) {MemniteInHand++;}
- if (TypeOfCardDrawn==7) {OneDropInHand++;}
- if (TypeOfCardDrawn==8) {TwoDropInHand++;}
- if (TypeOfCardDrawn==9) {LupineInHand++;}
- if (TypeOfCardDrawn==10) {EtchedInHand++;}
- if (TypeOfCardDrawn==11) {BlastInHand++;}
- }
- //System.out.println("Start Turn "+Turn+" hand: "+CitadelInHand+"Cit "+GlimmervoidInHand+"Gli "+NexusInHand+"Nex "+MoxInHand+"Mox "+DrumInHand+"Dru "+MemniteInHand+"Mem "+OneDropInHand+"One "+TwoDropInHand+"Two "+LupineInHand+"Lup "+FrogmiteInHand+"Fro "+EnforcerInHand+"Enf"+".");
- //System.out.println("Start Turn "+Turn+" Play: "+CitadelInPlay+"Cit "+GlimmervoidInPlay+"Gli "+NexusInPlay+"Nex "+MoxInPlay+"Mox "+DrumInPlay+"Dru "+MemniteInPlay+"Mem "+OneDropInPlay+"One "+TwoDropInPlay+"Two "+LupineInPlay+"Lup "+FrogmiteInPlay+"Fro "+EnforcerInPlay+"Enf"+".");
- //1. If we can play a land, we do so.
- if (CitadelInHand>=1) {
- CitadelInHand--;
- CitadelInPlay++;
- LandPlayed=true;
- }
- if (GlimmervoidInHand>=1 && LandPlayed==false) {
- GlimmervoidInHand--;
- GlimmervoidInPlay++;
- LandPlayed=true;
- }
- if (NexusInHand>=1 && LandPlayed==false) {
- NexusInHand--;
- NexusInPlay++;
- LandPlayed=true;
- }
- //2. Dump all Memnites and Ornithopters, and a first Chrome Mox
- MemniteInPlay=MemniteInPlay+MemniteInHand;
- MemniteInHand=0;
- if (MoxInHand>=1 && MoxInPlay==0) {
- MoxInHand--;
- MoxInPlay=1;
- }
- //3. Tap all lands for mana.
- int ManaAvailable=CitadelInPlay+GlimmervoidInPlay+NexusInPlay;
- //4. Now, iterating over Moxen and Drums max 4 times realistically, we attempt to play some stuff
- for (int AttemptNumber=1; AttemptNumber<=4; AttemptNumber++){
- Metalcraft=CitadelInPlay+MoxInPlay+DrumInPlay+MemniteInPlay+OneDropInPlay+LupineInPlay+TwoDropInPlay+EtchedInPlay;
- if (Metalcraft>=3 && MoxInPlay==1 && TappedMox==0){
- TappedMox=1;
- ManaAvailable++;
- ManaAvailable=ManaAvailable+MoxInHand;
- MoxInHand=0;
- }
- CreaturesInPlay=MemniteInPlay+OneDropInPlay+LupineInPlay+TwoDropInPlay+EtchedInPlay;
- int TappableDrums=Math.min(DrumInPlay-TappedDrum, CreaturesInPlay-TappedCreature);
- ManaAvailable=ManaAvailable+TappableDrums;
- TappedDrum=TappableDrums;
- TappedCreature=TappableDrums;
- //Attempt to cast Drums
- int CastableDrum=Math.min(DrumInHand, ManaAvailable);
- DrumInPlay=DrumInPlay+CastableDrum;
- DrumInHand=DrumInHand-CastableDrum;
- ManaAvailable=ManaAvailable-CastableDrum;
- //Attempt to cast Etched Champ
- int CastableEtched=Math.min(EtchedInHand, ManaAvailable/3);
- EtchedInPlay=EtchedInPlay+CastableEtched;
- EtchedInHand=EtchedInHand-CastableEtched;
- ManaAvailable=ManaAvailable-CastableEtched*3;
- // Attempt to cast Lupine
- int CastableLupine=Math.min(LupineInHand, ManaAvailable/2);
- LupineInPlay=LupineInPlay+CastableLupine;
- LupineInHand=LupineInHand-CastableLupine;
- ManaAvailable=ManaAvailable-CastableLupine*2;
- //6. Attempt to cast other 2-drops
- int CastableTwoDrop=Math.min(TwoDropInHand, ManaAvailable/2);
- TwoDropInPlay=TwoDropInPlay+CastableTwoDrop;
- TwoDropInHand=TwoDropInHand-CastableTwoDrop;
- ManaAvailable=ManaAvailable-CastableTwoDrop*2;
- //6. Attempt to cast 1-drops
- int CastableOneDrop=Math.min(OneDropInHand, ManaAvailable);
- OneDropInPlay=OneDropInPlay+CastableOneDrop;
- OneDropInHand=OneDropInHand-CastableOneDrop;
- ManaAvailable=ManaAvailable-CastableOneDrop;
- }
- //7. Cast Blasts
- int CastableBlasts=Math.min(Math.min(BlastInHand, ManaAvailable),MoxInPlay+DrumInPlay+GlimmervoidInPlay);
- BlastInHand=BlastInHand-CastableBlasts;
- }//end of the for-loop over the turns
- int NumberOfCardsInHand=CitadelInHand+GlimmervoidInHand+NexusInHand+MoxInHand+DrumInHand+MemniteInHand+OneDropInHand+TwoDropInHand+LupineInHand+EtchedInHand+BlastInHand;
- int Outcome=0;
- if (NumberOfCardsInHand==0 && LupineInPlay>=1) {Outcome=2;}
- if (NumberOfCardsInHand>0 && LupineInPlay>=1) {Outcome=1;}
- 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