Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- package playfirst;
- import java.util.Arrays.*;
- import java.util.Random;
- public class PlayFirst {
- public static void main(String[] args) {
- Deck deck1=new Deck();
- Deck deck2=new Deck();
- OpeningHand openinghand1;
- OpeningHand openinghand2;
- int NumberOfSimulations=100000000;
- int WinningPlayer;
- int PlayFirstWins=0;
- int DrawFirstWins=0;
- for (int SimulationCounter=1; SimulationCounter<=NumberOfSimulations; SimulationCounter++){
- if (SimulationCounter%1000000==0){System.out.println("Just did simulation number "+SimulationCounter);}
- deck1.SetDeck(44,16);
- deck2.SetDeck(44,16);
- openinghand1=GiveOpeningHandAfterMulls(deck1);
- openinghand2=GiveOpeningHandAfterMulls(deck2);
- WinningPlayer=DetermineWinner(deck1, openinghand1, deck2, openinghand2);
- if (WinningPlayer==1){PlayFirstWins++;}
- if (WinningPlayer==2){DrawFirstWins++;}
- }
- System.out.println("----------------");
- System.out.print("The number of times that the deck on the play won:"+PlayFirstWins);
- System.out.print("The number of times that the deck on the draw won:"+DrawFirstWins);
- }//end of main
- static OpeningHand GiveOpeningHandAfterMulls (Deck deck) {
- Deck remainingdeck=new Deck();
- OpeningHand openinghand=new OpeningHand();
- int TypeOfCardDrawn;
- boolean KeepHand=false;
- for (int OpeningHandSize=7; OpeningHandSize>=1; OpeningHandSize--){
- if (KeepHand==false){
- openinghand.ResetHand();
- remainingdeck.SetDeck(deck.NumberOfBolts,deck.NumberOfLands);
- for (int CardsDrawn=0; CardsDrawn<OpeningHandSize; CardsDrawn++){
- TypeOfCardDrawn=remainingdeck.DrawCard();
- if (TypeOfCardDrawn==4) {openinghand.NumberOfBolts++;}
- if (TypeOfCardDrawn==5) {openinghand.NumberOfLands++;}
- }
- if (OpeningHandSize>=4 && openinghand.NumberOfLands>=1 && openinghand.NumberOfLands<=3) {KeepHand=true;}
- if (OpeningHandSize<=3) {KeepHand=true;}
- }
- }
- deck.SetDeck(deck.NumberOfBolts-openinghand.NumberOfBolts, deck.NumberOfLands-openinghand.NumberOfLands);
- return openinghand;
- }//end of GiveOpeningHandAfterMulls
- static int DetermineWinner(Deck remainingdeck1, OpeningHand openinghand1, Deck remainingdeck2, OpeningHand openinghand2) {
- //Deck 1 is going to play first
- int BoltDamage=3;
- int Turn=0;
- int Winner=0;
- int CastableBolts;
- int TypeOfCardDrawn=0;
- int Player1Life=20;
- int Player2Life=20;
- int Player1LandsInPlay=0;
- int Player2LandsInPlay=0;
- int Player1BoltsInHand=openinghand1.NumberOfBolts;
- int Player1LandsInHand=openinghand1.NumberOfLands;
- int Player2BoltsInHand=openinghand2.NumberOfBolts;
- int Player2LandsInHand=openinghand2.NumberOfLands;
- do {
- Turn++;
- //Player 1's turn
- // System.out.println("====================");
- // System.out.println("Turn: "+Turn);
- // System.out.println("====================");
- // System.out.println("Player 1 has "+Player1BoltsInHand+" Bolts and "+Player1LandsInHand+" lands in hand, at "+Player1Life+" life and "+Player1LandsInPlay+" lands in play. His deck has "+remainingdeck1.NumberOfBolts+" Bolts and "+remainingdeck1.NumberOfLands+" lands.");
- // System.out.println("Player 2 has "+Player2BoltsInHand+" Bolts and "+Player2LandsInHand+" lands in hand, at "+Player2Life+" life and "+Player2LandsInPlay+" lands in play. His deck has "+remainingdeck2.NumberOfBolts+" Bolts and "+remainingdeck2.NumberOfLands+" lands.");
- if (Turn>1) {
- TypeOfCardDrawn=remainingdeck1.DrawCard();
- if (TypeOfCardDrawn==4) {Player1BoltsInHand++;}
- if (TypeOfCardDrawn==5) {Player1LandsInHand++;}
- }
- if (Player1LandsInHand>=1) {Player1LandsInPlay++; Player1LandsInHand--;}
- CastableBolts=Math.min(Player1BoltsInHand, Player1LandsInPlay);
- Player2Life=Player2Life-CastableBolts*BoltDamage;
- Player1BoltsInHand=Player1BoltsInHand-CastableBolts;
- if (Player2Life<=0 && Winner==0) {Winner=1;}
- // System.out.print("Player 1 draws ");
- // if (TypeOfCardDrawn==4){System.out.print("a Bolt");}
- // if (TypeOfCardDrawn==5){System.out.print("a land");}
- // if (Turn==1){System.out.print("nothing");}
- // System.out.println(" and casts "+CastableBolts+" Bolts, bringing Player 2 to "+Player2Life+" life.");
- //Player 2's turn
- TypeOfCardDrawn=remainingdeck2.DrawCard();
- if (TypeOfCardDrawn==4) {Player2BoltsInHand++;}
- if (TypeOfCardDrawn==5) {Player2LandsInHand++;}
- if (Player2LandsInHand>=1) {Player2LandsInPlay++; Player2LandsInHand--;}
- CastableBolts=Math.min(Player2BoltsInHand, Player2LandsInPlay);
- Player1Life=Player1Life-CastableBolts*BoltDamage;
- Player2BoltsInHand=Player2BoltsInHand-CastableBolts;
- if (Player1Life<=0 && Winner==0) {Winner=2;}
- // System.out.print("Player 2 draws a ");
- // if (TypeOfCardDrawn==4){System.out.print("Bolt");}
- // if (TypeOfCardDrawn==5){System.out.print("land");}
- // System.out.println(" and casts "+CastableBolts+" Bolts, bringing Player 1 to "+Player1Life+" life.");
- } while (Winner==0);
- //System.out.println("THE WINNER WAS PLAYER "+Winner+"!!!");
- return Winner;
- }//end of DetermineWinner
- }//end of OptimalAggroGoldfishDeck
- class OpeningHand {
- int NumberOfBolts;
- int NumberOfLands;
- void ResetHand(){
- NumberOfBolts=0;
- NumberOfLands=0;
- }
- void SetHand (int NrBolts, int NrLands) {
- NumberOfBolts=NrBolts;
- NumberOfLands=NrLands;
- }
- }//end of OpeningHand
- class Deck {
- int NumberOfBolts;
- int NumberOfLands;
- void SetDeck (int NrBolts, int NrLands) {
- NumberOfBolts=NrBolts;
- NumberOfLands=NrLands;
- }
- int NrOfCards(){
- return NumberOfBolts+NumberOfLands;
- }
- int DrawCard (){
- Random generator = new Random();
- int RandomIntegerBetweenOneAndDeckSize=generator.nextInt( this.NrOfCards() )+1;
- int CardType=0;
- int BoltCutoff=NumberOfBolts;
- int LandCutoff=BoltCutoff+NumberOfLands;
- if (RandomIntegerBetweenOneAndDeckSize<=BoltCutoff) {CardType=4; this.NumberOfBolts--;}
- if (RandomIntegerBetweenOneAndDeckSize>BoltCutoff && RandomIntegerBetweenOneAndDeckSize<=LandCutoff) {CardType=5; this.NumberOfLands--;}
- return CardType;
- }
- }//end of Deck
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement