Преглед изворни кода

player and dealer hands from parent class

master
gtheler пре 5 година
родитељ
комит
7367224e90
5 измењених фајлова са 48 додато и 34 уклоњено
  1. +1
    -0
      Makefile.am
  2. +12
    -0
      src/base.cpp
  3. +25
    -24
      src/base.h
  4. +9
    -9
      src/blackjack.cpp
  5. +1
    -1
      src/cards.cpp

+ 1
- 0
Makefile.am Прегледај датотеку



blackjack_SOURCES = \ blackjack_SOURCES = \
src/main.cpp \ src/main.cpp \
src/base.cpp \
src/blackjack.cpp \ src/blackjack.cpp \
src/cards.cpp \ src/cards.cpp \
src/stdinout.cpp \ src/stdinout.cpp \

+ 12
- 0
src/base.cpp Прегледај датотеку

#include <iostream>
#include "base.h"

void Hand::draw(void) {
for (auto it : cards) {
std::cout << card[it].utf8() << std::endl;
}
return;
}

+ 25
- 24
src/base.h Прегледај датотеку

unsigned int value; unsigned int value;
std::string ascii() { std::string ascii() {
return valueASCII + suitASCII;
return numberASCII + suitASCII;
} }
std::string utf8() { std::string utf8() {
return valueASCII + suitUTF8;
return numberASCII + suitUTF8;
} }
std::string text(); std::string text();
private: private:
std::string valueASCII;
std::string numberASCII;
std::string suitASCII; std::string suitASCII;
std::string suitUTF8; std::string suitUTF8;
std::string suitName; std::string suitName;
// TODO: base + daugthers, para diferenciar entre dealer y player y otros juegos // TODO: base + daugthers, para diferenciar entre dealer y player y otros juegos
class Hand { class Hand {
public: public:
int id = 0;
bool insured = false;
bool holeCardShown = false;
int bet = 0;
std::list<unsigned int> cards; std::list<unsigned int> cards;

// inline on purpose
int total() { int total() {
unsigned int soft = 0; unsigned int soft = 0;
unsigned int n = 0; unsigned int n = 0;
soft += (value == 11); soft += (value == 11);
} }
// this loop should be only executed once if everything works fine
while (n > 21 && soft > 0){ while (n > 21 && soft > 0){
n -= 10;
soft--;
n -= 10;
soft--;
} }
return (soft)?(-n):(n); return (soft)?(-n):(n);
}; };
// inline on purpose
bool blackjack() { bool blackjack() {
return (total() == 21 && cards.size() == 2); return (total() == 21 && cards.size() == 2);
}; };
// inline on purpose
bool busted() { bool busted() {
return (total() > 21); return (total() > 21);
} }

private:
void draw();
};
class PlayerHand : public Hand {
public:
std::list<unsigned int> cards;
int bet = 0;
int id = 0;
bool insured = false;
}; };


class dealerHand {
class DealerHand : public Hand {
public: public:
std::list<unsigned int> cards; std::list<unsigned int> cards;
unsigned int total() {
return 0;
}
private:
bool holeCardShown = false;
}; };




double M2 = 0; double M2 = 0;
double variance = 0; double variance = 0;
std::list<Hand> hands;
std::list<Hand>::iterator currentHand;
std::list<PlayerHand> hands;
std::list<PlayerHand>::iterator currentHand;
}; };


class Dealer { class Dealer {
// TODO: most of the games will have a single element, but maybe // TODO: most of the games will have a single element, but maybe
// there are games where the dealer has more than one hand // there are games where the dealer has more than one hand
// std::list <Hand> hands; // std::list <Hand> hands;
Hand hand;
DealerHand hand;
}; };

+ 9
- 9
src/blackjack.cpp Прегледај датотеку

if (n_hand != 0) { if (n_hand != 0) {
double delta = player->current_result - player->mean; double delta = player->current_result - player->mean;
player->mean += delta / (double)(n_hand); player->mean += delta / (double)(n_hand);
player->M2 += delta * (player->current_result - player->mean);
player->variance = player->M2 / (double)(n_hand);
player->M2 += delta * (player->current_result - player->mean);
player->variance = player->M2 / (double)(n_hand);
} }


infinite_decks_card_number_for_arranged_ones = 0; infinite_decks_card_number_for_arranged_ones = 0;


// erase all the player's, create one, add and make it the current one // erase all the player's, create one, add and make it the current one
player->hands.clear(); player->hands.clear();
player->hands.push_back(std::move(Hand()));
player->hands.push_back(std::move(PlayerHand()));
player->currentHand = player->hands.begin(); player->currentHand = player->hands.begin();
// state that the player did not win anything nor splitted nor doubled down // state that the player did not win anything nor splitted nor doubled down
player->total_money_waged += player->currentHand->bet; player->total_money_waged += player->currentHand->bet;


playerFirstCard = dealCard(&(*player->currentHand)); playerFirstCard = dealCard(&(*player->currentHand));
std::cout << "card_player_first " << card[playerFirstCard].ascii() << std::endl;
std::cout << "card_player_first " << card[playerFirstCard].text() << std::endl;
// std::cout << "card_player_first " << card[playerFirstCard].ascii() << std::endl;
// std::cout << "card_player_first " << card[playerFirstCard].text() << std::endl;
std::cout << "card_player_first " << card[playerFirstCard].utf8() << std::endl; std::cout << "card_player_first " << card[playerFirstCard].utf8() << std::endl;
// step 4. show dealer's upcard // step 4. show dealer's upcard
upCard = dealCard(&hand); upCard = dealCard(&hand);
std::cout << "card_dealer_up " << card[upCard].text() << std::endl;
std::cout << "card_dealer_up " << card[upCard].utf8() << std::endl;


// step 5. deal the second card to each player // step 5. deal the second card to each player
playerSecondCard = dealCard(&(*player->currentHand)); playerSecondCard = dealCard(&(*player->currentHand));
setNextAction(DealerAction::StartNewHand); setNextAction(DealerAction::StartNewHand);
player->actionRequired = PlayerActionRequired::None; player->actionRequired = PlayerActionRequired::None;
setInputNeeded(false); setInputNeeded(false);
std::cout << "next start a new hand";
std::cout << "next start a new hand" << std::endl;
return; return;
} else if (playerBlackack) { } else if (playerBlackack) {
setNextAction(DealerAction::StartNewHand); setNextAction(DealerAction::StartNewHand);
player->actionRequired = PlayerActionRequired::None; player->actionRequired = PlayerActionRequired::None;
setInputNeeded(false); setInputNeeded(false);
std::cout << "next start a new hand";
std::cout << "next start a new hand" << std::endl;
return; return;
} else { } else {
setNextAction(DealerAction::AskForPlay); setNextAction(DealerAction::AskForPlay);
player->actionRequired = PlayerActionRequired::Play; player->actionRequired = PlayerActionRequired::Play;
setInputNeeded(true); setInputNeeded(true);
std::cout << "prepare to play";
std::cout << "prepare to play" << std::endl;
return; return;
} }
break; break;

+ 1
- 1
src/cards.cpp Прегледај датотеку

number = 1 + (tag % 13); number = 1 + (tag % 13);
suit = static_cast<Suit>(tag/13); suit = static_cast<Suit>(tag/13);
value = (number == 1) ? 11 : ((number > 10) ? 10 : number); value = (number == 1) ? 11 : ((number > 10) ? 10 : number);
valueASCII = (number < 11) ? std::to_string(number) : TJQK[number-10];
numberASCII = (number == 1) ? "A" : ((number < 11) ? std::to_string(number) : TJQK[number-10]);
switch (suit){ switch (suit){
case Suit::Clubs: case Suit::Clubs:

Loading…
Откажи
Сачувај