Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- package delvernewmullrule;
- import java.util.Random;
- public class DelverNewMullRule {
- public static void main(String[] args) {
- int NrSims=10000000;
- //CardType1=Delver
- //CardType2=Spell
- //CardType3=Fetchland
- //CardType4=OtherLand
- //CardType5=OtherCard
- int NrGamesWithDelver=0;
- int NrGamesWithImmediateFlippedDelver=0;
- //System.out.println(NrGamesWithImmediateFlippedDelver);
- //System.out.println(NrGamesWithDelver);
- boolean NewMullRuleActive=false;
- int Mull=0;
- for (int i=1; i<=NrSims; i++){
- //System.out.println();
- //System.out.println("-----NrSim "+NrSims+" -----");
- int Outcome=Simulate(NewMullRuleActive);
- if (Outcome==1) {NrGamesWithDelver++;}
- if (Outcome==2) {NrGamesWithDelver++; NrGamesWithImmediateFlippedDelver++;}
- }
- System.out.println("P[Flip Delver Immediately]= "+(NrGamesWithImmediateFlippedDelver+0.0)/NrGamesWithDelver);
- }
- static int Simulate(boolean NewMullRule) {
- int TypeOfCardDrawn;
- Deck deck=new Deck();
- int Outcome=0;
- int OpeningHandSize=8;
- boolean KeepHand=false;
- int TypeOfCardScried=0;
- int NrFetchLands=0;
- int NrOtherLands=0;
- int NrDelvers=0;
- Random generator = new Random();
- do {
- OpeningHandSize--;
- //So for the first iteration, OpeningHandSize will be 7
- for (int i=OpeningHandSize; i>=1; i--){
- deck.SetDeck(4, 29, 8, 9, 10, 0);
- NrFetchLands=0;
- NrOtherLands=0;
- NrDelvers=0;
- for (int j=1; j<=OpeningHandSize; j++){
- TypeOfCardDrawn=deck.DrawCard();
- if (TypeOfCardDrawn==1) {NrDelvers++;}
- if (TypeOfCardDrawn==3) {NrFetchLands++;}
- if (TypeOfCardDrawn==4) {NrOtherLands++;}
- }
- }
- //System.out.println("OpeningHandSize "+OpeningHandSize);
- //We mull a hand if it has no lands. If the hand has >=1 lands, we mull it in 15% of the games to indicate weak opening hands.
- double RandomMull=generator.nextDouble();
- if (NrFetchLands+NrOtherLands>=1) {KeepHand=true;}
- if (RandomMull<=0.15) {KeepHand=false;}
- if (OpeningHandSize==1) {KeepHand=true;}
- } while (KeepHand==false);
- boolean CardOnTopFixedSpell=false;
- if (NewMullRule && OpeningHandSize<=6) {
- //We now scry the top card by actually drawing it and and setting it aside.
- TypeOfCardScried=deck.DrawCard();
- if (TypeOfCardScried==2) {CardOnTopFixedSpell=true;}
- //Why use arrays when you can use copy-paste, right? #Kappa
- }
- if (NrOtherLands+NrFetchLands>0 && NrDelvers>0) {
- if (NrOtherLands==0) {
- //We have to shuffle to fetch
- //System.out.println("We're in business!");
- deck.NrCardType4--;
- //If applicable, we put the card scried back into the deck
- if (TypeOfCardScried>0) {
- if (TypeOfCardScried==1) {deck.NrCardType1++;}
- if (TypeOfCardScried==2) {deck.NrCardType2++;}
- if (TypeOfCardScried==3) {deck.NrCardType3++;}
- if (TypeOfCardScried==4) {deck.NrCardType4++;}
- if (TypeOfCardScried==5) {deck.NrCardType5++;}
- if (TypeOfCardScried==6) {deck.NrCardType6++;}
- }
- CardOnTopFixedSpell=false;
- }
- if (CardOnTopFixedSpell) {Outcome=2;}
- if (!CardOnTopFixedSpell) {
- TypeOfCardDrawn=deck.DrawCard();
- if (TypeOfCardDrawn==2) {Outcome=2;}
- else {Outcome=1;}
- }
- }
- else {Outcome=0;}
- //Outcome 0=No Delver or land in opening hand
- //Outcome 1=Turn 1 Delver, no flip
- //Outcome 2=Turn 1 Delver, flip
- return Outcome;
- }
- static class Deck {
- int NrCardType1;
- int NrCardType2;
- int NrCardType3;
- int NrCardType4;
- int NrCardType5;
- int NrCardType6;
- void PrintDeckBrief () {
- if(NrCardType1<10) {System.out.print("0");}
- System.out.print(NrCardType1+" ");
- if(NrCardType2<10) {System.out.print("0");}
- System.out.print(NrCardType2+" ");
- if(NrCardType3<10) {System.out.print("0");}
- System.out.print(NrCardType3+" ");
- if(NrCardType4<10) {System.out.print("0");}
- System.out.print(NrCardType4+" ");
- if(NrCardType5<10) {System.out.print("0");}
- System.out.print(NrCardType5+" ");
- if(NrCardType6<10) {System.out.print("0");}
- System.out.print(NrCardType6);
- System.out.print(" ");
- }
- void SetDeck (int Nr1, int Nr2, int Nr3, int Nr4, int Nr5, int Nr6) {
- NrCardType1=Nr1;
- NrCardType2=Nr2;
- NrCardType3=Nr3;
- NrCardType4=Nr4;
- NrCardType5=Nr5;
- NrCardType6=Nr6;
- }
- int NrOfCards(){
- return NrCardType1+NrCardType2+NrCardType3+NrCardType4+NrCardType5+NrCardType6;
- }
- int DrawCard (){
- Random generator = new Random();
- int RandomIntegerBetweenOneAndDeckSize=generator.nextInt( this.NrOfCards() )+1;
- int CardType=0;
- int OneCutoff=NrCardType1;
- int TwoCutoff=OneCutoff+NrCardType2;
- int ThreeCutoff=TwoCutoff+NrCardType3;
- int FourCutoff=ThreeCutoff+NrCardType4;
- int FiveCutoff=FourCutoff+NrCardType5;
- int SixCutoff=FiveCutoff+NrCardType6;
- if (RandomIntegerBetweenOneAndDeckSize<=OneCutoff) {CardType=1; this.NrCardType1--;}
- if (RandomIntegerBetweenOneAndDeckSize>OneCutoff && RandomIntegerBetweenOneAndDeckSize<=TwoCutoff) {CardType=2; this.NrCardType2--;}
- if (RandomIntegerBetweenOneAndDeckSize>TwoCutoff && RandomIntegerBetweenOneAndDeckSize<=ThreeCutoff) {CardType=3; this.NrCardType3--;}
- if (RandomIntegerBetweenOneAndDeckSize>ThreeCutoff && RandomIntegerBetweenOneAndDeckSize<=FourCutoff) {CardType=4; this.NrCardType4--;}
- if (RandomIntegerBetweenOneAndDeckSize>FourCutoff && RandomIntegerBetweenOneAndDeckSize<=FiveCutoff) {CardType=5; this.NrCardType5--;}
- if (RandomIntegerBetweenOneAndDeckSize>FiveCutoff) {CardType=6; this.NrCardType6--;}
- return CardType;
- }
- }
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement