Blackjack

Gewoon: het is blackjack

Info:

Gemaakt met: Unity
Codeertaal: C#
Mijn rol: programmeur
Tijdspan: 1 week

Link naar het project

Samenvatting van de regels

De basis regel is dat je zo dicht mogelijk bij 21 moet komen zonder er over heen te komen. Je krijgt bijvoorbeeld 5 en 7, dan heb je 12. Als je dan op hit klikt, dan krijg je een kaart er bij. Stel je krijgt bijvoorbeeld een 8 dan heb je 20. Dan klik je op stick. De computer kijkt of hij meer punten dan jou kan krijgen. In dit voorbeeld moet de computer meer dan 20 punten krijgen om te winnen. Heeft de computer 21 punten? Dan wint de computer. Komt de computer boven de 21 punten? Dan verliest de computer. Je mag nooit meer dan 21 punten hebben. De game is ook op telefoon beschikbaar.

Code

Blackjack controller

Dit is de gamecontroller voor blackjack. De controller deelt de kaarten uit aan de speler en aan de dealer.
Als de speler op de knop stick klikt dan gaan de controller kijken of de dealer nog een kaart kan pakken. Als dat kan geeft hij de dealer nog een kaart. Als dat niet kan dan kijkt de card stack hoeveel de dealer aan punten heeft. Als dat meer is dan 21 dan wint de speler maar als dat niet zo is kijkt hij wie er meer punten heeft en die wint dan. Zijn de punten aantal gelijk aan elkaar dan krijg je je inzet terug.
Als de speler op de knop hit klikt dan krijgt hij er nog een kaart bij als hij meer dan 21 punten krijgt dan verliest de speler.

C#
using UnityEngine;
using System.Collections;
using System.Collections.Generic;
using UnityEngine.UI;
using TMPro;
using System;
using UnityEngine.SceneManagement;

public class BlackJackGameController : MonoBehaviour
{
    int dealersFirstCard = -1;

    public CardStack player;
    public CardStack dealer;
    public CardStack deck;

    public Button hitButton;
    public Button stickButton;
    public Button playAgainButton;

    public Text winnerText;
    private uint pot = 0;
    private uint selectpot = 0;

    public TMP_Text selectpotText;
    public List<GameObject> buttons = new List<GameObject>();
    private Chips Chips;


    private void Start()
    {
        Chips = FindObjectOfType<Chips>();
        hitButton.interactable = false;
        stickButton.interactable = false;
    }

    public void Hit()
    {
        player.Push(deck.Pop());
        if (player.HandValue() > 21)
        {
            hitButton.interactable = false;
            stickButton.interactable = false;
            StartCoroutine(DealersTurn());
        }
    }

    public void Stick()
    {
        hitButton.interactable = false;
        stickButton.interactable = false;
        StartCoroutine(DealersTurn());
    }

    public void PlayAgain()
    {
        playAgainButton.interactable = false;

        player.GetComponent<CardStackView>().Clear();
        dealer.GetComponent<CardStackView>().Clear();
        deck.GetComponent<CardStackView>().Clear();
        deck.CreateDeck();

        winnerText.text = "";

        hitButton.interactable = false;
        stickButton.interactable = false;

        dealersFirstCard = -1;

        for (int i = 0; i < buttons.Count; i++)
        {
            buttons[i].SetActive(true);
        }
        selectpot = 0;
        pot = 0;

    }

    private void StartGame()
    {
        for (int i = 0; i < 2; i++)
        {
            player.Push(deck.Pop());
            HitDealer();
        }
    }

    private void HitDealer()
    {
        int card = deck.Pop();

        if (dealersFirstCard < 0)
        {
            dealersFirstCard = card;
        }

        dealer.Push(card);
        if (dealer.CardCount >= 2)
        {
            CardStackView view = dealer.GetComponent<CardStackView>();
            view.Toggle(card, true);
        }
    }

    private IEnumerator DealersTurn()
    {
        hitButton.interactable = false;
        stickButton.interactable = false;

        CardStackView view = dealer.GetComponent<CardStackView>();
        view.Toggle(dealersFirstCard, true);
        view.ShowCards();
        yield return new WaitForSeconds(1f);

        while (dealer.HandValue() < 17)
        {
            HitDealer();
            yield return new WaitForSeconds(1f);
        }

        if (dealer.HandValue() == (player.HandValue()))
        {
            winnerText.text = "draw";
            int vOut = Convert.ToInt32(pot);
            Chips.scoreChangePlus(vOut);
        }
        else if (player.HandValue() > 21 || (dealer.HandValue() > player.HandValue() && dealer.HandValue() <= 21))
        {
            winnerText.text = "Sorry-- you lose";
        }
        else if (dealer.HandValue() > 21 || (player.HandValue() <= 21 && player.HandValue() > dealer.HandValue()))
        {
            winnerText.text = "Winner, winner! Chicken dinner";
            uint winnerpot;
            winnerpot = pot;
            pot += winnerpot;
            int vOut = Convert.ToInt32(pot);
            Chips.scoreChangePlus(vOut);
        }
        else
        {
            winnerText.text = "The house wins!";
        }

        yield return new WaitForSeconds(1f);
        playAgainButton.interactable = true;
    }

    public void Add()
    {
        selectpot += 10;
    }

    public void subtract()
    {
        selectpot -= 10;
    }

    public void select()
    {

        if (selectpot != 0)
        {
            if (selectpot <= Chips.chips)
            {
                pot = selectpot;
                hitButton.interactable = true;
                stickButton.interactable = true;
                for (int i = 0; i < buttons.Count; i++)
                {
                    buttons[i].SetActive(false);
                }
                StartGame();
                Bet();
            }
        }
    }

    private void Update()
    {
        selectpotText.text = selectpot.ToString();
    }

    private void Bet()
    {
        int vOut = Convert.ToInt32(pot);
        Chips.scoreChangeMin(vOut);
    }
}

C#
using UnityEngine;
using System.Collections;
using System.Collections.Generic;

public class CardStack : MonoBehaviour
{
    private List<int> cards;

    public bool isGameDeck;

    public bool HasCards
    {
        get { return cards != null && cards.Count > 0; }
    }

    public event CardEventHandler CardRemoved;
    public event CardEventHandler CardAdded;

    public int CardCount
    {
        get
        {
            if (cards == null)
            {
                return 0;
            }
            else
            {
                return cards.Count;
            }
        }
    }

    public IEnumerable<int> GetCards()
    {
        foreach (int i in cards)
        {
            yield return i;
        }
    }

    public bool HasCard(int cardId)
    {
        return cards.FindIndex(i => i == cardId) >= 0;
    }

    public bool HasCardOld(int cardId)
    {
        foreach (int i in cards)
        {
            if (i == cardId) return true;
        }

        return false;
    }

    public int Pop()
    {
        int temp = cards[0];
        cards.RemoveAt(0);

        if (CardRemoved != null)
        {
            CardRemoved(this, new CardEventArgs(temp));
        }

        return temp;
    }

    public void Push(int card)
    {
        cards.Add(card);

        if (CardAdded != null)
        {
            CardAdded(this, new CardEventArgs(card));
        }
    }

    public int HandValue()
    {
        int total = 0;
        int aces = 0;

        foreach (int card in GetCards())
        {
            int cardRank = card % 13;

            if (cardRank <= 8)
            {
                cardRank += 2;
                total = total + cardRank;
            }
            else if (cardRank > 8 && cardRank < 12)
            {
                cardRank = 10;
                total = total + cardRank;
            }
            else
            {
                aces++;
            }
        }

        for (int i = 0; i < aces; i++)
        {
            if (total + 11 <= 21)
            {
                total = total + 11;
            }
            else
            {
                total = total + 1;
            }
        }

        return total;
    }

    public void CreateDeck()
    {
        cards.Clear();

        for (int i = 0; i < 52; i++)
        {
            cards.Add(i);
        }

        int n = cards.Count;
        while (n > 1)
        {
            n--;
            int k = Random.Range(0, n + 1);
            int temp = cards[k];
            cards[k] = cards[n];
            cards[n] = temp;
        }
    }

    public void Reset()
    {
        cards.Clear();
    }

    private void Awake() 
    {
        cards = new List<int>();
        if (isGameDeck)
        {
            CreateDeck();
        }
	}
}

Card stack

De card stack kijk hoeveel punten de speler of de dealer heeft. Dit gebuurt in de methode “HandValue” Deze methode berekent de totale waarde van de kaarten in de stapel, rekening houdend met de regels van een typisch kaartspel. Azen kunnen worden beschouwd als 1 of 11, afhankelijk van wat gunstiger is voor de totale waarde van de hand.
Dit script maakt ook de kaartstapel waar je mee speelt.

Speel hier BlackJack