Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- open System
- type Suit =
- | Hearts
- | Diamonds
- | Clubs
- | Spades
- type Rank =
- | Two | Three | Four | Five
- | Six | Seven | Eight
- | Nine | Ten | Jack
- | Queen | King | Ace
- type Card = Card of (Rank*Suit)
- type CardPile = CardPile of Card list
- type Trump = Trump of Suit
- let newDeck = [ (Rank.Two, Suit.Spades); (Rank.Three, Suit.Spades); (Rank.Four, Suit.Spades); (Rank.Five, Suit.Spades);
- (Rank.Six, Suit.Spades); (Rank.Seven, Suit.Spades); (Rank.Eight, Suit.Spades); (Rank.Nine, Suit.Spades);
- (Rank.Ten, Suit.Spades); (Rank.Jack, Suit.Spades); (Rank.Queen, Suit.Spades); (Rank.King, Suit.Spades);
- (Rank.Ace, Suit.Spades);
- (Rank.Two, Suit.Hearts); (Rank.Three, Suit.Hearts); (Rank.Four, Suit.Hearts); (Rank.Five, Suit.Hearts);
- (Rank.Six, Suit.Hearts); (Rank.Seven, Suit.Hearts); (Rank.Eight, Suit.Hearts); (Rank.Nine, Suit.Hearts);
- (Rank.Ten, Suit.Hearts); (Rank.Jack, Suit.Hearts); (Rank.Queen, Suit.Hearts); (Rank.King, Suit.Hearts);
- (Rank.Ace, Suit.Hearts);
- (Rank.Two, Suit.Clubs); (Rank.Three, Suit.Clubs); (Rank.Four, Suit.Clubs); (Rank.Five, Suit.Clubs);
- (Rank.Six, Suit.Clubs); (Rank.Seven, Suit.Clubs); (Rank.Eight, Suit.Clubs); (Rank.Nine, Suit.Clubs);
- (Rank.Ten, Suit.Clubs); (Rank.Jack, Suit.Clubs); (Rank.Queen, Suit.Clubs); (Rank.King, Suit.Clubs);
- (Rank.Ace, Suit.Clubs);
- (Rank.Two, Suit.Spades); (Rank.Three, Suit.Spades); (Rank.Four, Suit.Spades); (Rank.Five, Suit.Spades);
- (Rank.Six, Suit.Spades); (Rank.Seven, Suit.Spades); (Rank.Eight, Suit.Spades); (Rank.Nine, Suit.Spades);
- (Rank.Ten, Suit.Spades); (Rank.Jack, Suit.Spades); (Rank.Queen, Suit.Spades); (Rank.King, Suit.Spades);
- (Rank.Ace, Suit.Spades);
- ]
- let shuffle2 deck =
- let random = new System.Random()
- deck |> List.sortBy (fun card -> random.Next())
- let findRandomItem lst (rng : Random) =
- List.nth lst (rng.Next(List.length lst))
- let CreateDeck =
- let pile = CardPile (shuffle2 [for i in 0 .. newDeck.Length-1 -> Card (newDeck.Item(i))] )
- pile
- let SelectTrump =
- let random = new Random()
- let list = [Suit.Hearts;Suit.Clubs;Suit.Diamonds;Suit.Spades]
- let trump = Trump (findRandomItem list random)
- trump
- let everyNth n seq =
- seq |> List.mapi (fun i el -> el, i)
- |> List.filter (fun (el, i) -> i % n = n - 1)
- |> List.map fst
- let DealCardsForPlayer1 (CardPile mainDeck) =
- let list = CardPile (everyNth 2 mainDeck)
- list
- let DealCardsForPlayer2 (CardPile mainDeck) =
- let list1 = (everyNth 2 mainDeck.Tail)
- let list2 = CardPile (mainDeck.Item(0)::list1)
- list2
- let HigherCard (Card p1) (Card p2) =
- if p1>p2 then
- true,false //P1 WINS
- elif p2 > p1 then
- false,true //P2 WINS
- else
- false,false //DRAW
- let Won (Card p1) (Card p2) (Trump trump) =
- let (p1Rank,p1Suit) = p1
- let (p2Rank,p2Suit) = p2
- if p1Suit.Equals(trump) then
- if p2Suit.Equals(trump) then
- HigherCard (Card p1) (Card p2)
- else
- true,false
- elif p2Suit.Equals(trump) then
- false,true
- else
- HigherCard (Card p1) (Card p2)
- let Fight (CardPile p1) (CardPile p2) (trump:Trump) =
- let (p1Wins,p2Wins) = Won p1.Head p2.Head trump
- if p1Wins then 2,0
- elif p2Wins then 0,2
- else 1,1
- let PrintScore (score:int*int) =
- let (a,b) = score
- printfn "Player1 score : %A" a
- printfn "Player2 score : %A" b
- if a>b then
- printfn "PLAYER1 WINS"
- elif a<b then
- printfn "PLAYER2 WINS"
- else
- printfn "GAME DRAW"
- let rec PlayGame (CardPile p1) (CardPile p2) (Trump trump) mainScore =
- if p1.Length.Equals(0) then
- PrintScore mainScore
- else
- let (Player1Score,Player2Score) = Fight (CardPile p1) (CardPile p2) (Trump trump)
- let (a,b) = mainScore
- let score = (a + Player1Score, b + Player2Score)
- PlayGame (CardPile p1.Tail) (CardPile p2.Tail) (Trump trump) score
- let getTrumpName (Trump trump) =
- trump
- let StartGame() =
- printfn "STARTING GAME"
- let deck = CreateDeck
- printfn "Deck has been created and shuffled"
- let trump = SelectTrump
- printfn "Trump has been selected : %A" (getTrumpName trump)
- let p1deck = deck|>DealCardsForPlayer1
- printfn "Player 1 deck has been created"
- let p2deck = deck|>DealCardsForPlayer2
- printfn "Player 2 deck has been created"
- printfn "PLAYING GAME"
- let StartingScore = (0,0)
- PlayGame p1deck p2deck trump StartingScore
- printfn "GAME OVER"
- StartGame()
- Console.ReadKey() |> ignore
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement