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

readline completion

master
gtheler пре 5 година
родитељ
комит
fd16c14dd5
4 измењених фајлова са 101 додато и 28 уклоњено
  1. +4
    -3
      src/base.h
  2. +6
    -7
      src/blackjack.cpp
  3. +87
    -14
      src/tty.cpp
  4. +4
    -4
      src/tty.h

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

Shuffle, Shuffle,
CardPlayer, CardPlayer,
CardDealer, CardDealer,
CardDealerHoleRevealed,
CardDealerRevealsHole,
DealerBlackjack, DealerBlackjack,
PlayerWinsInsurance, PlayerWinsInsurance,
PlayerBlackjackAlso, PlayerBlackjackAlso,
PlayerBlackjack, PlayerBlackjack,
PlayerWins, PlayerWins,
NoBlackjacks, NoBlackjacks,
PlayerBustedAllHands,
DealerBusted,
PlayerBustsAllHands,
DealerBusts,
Help,
Bye, Bye,
}; };



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

// step 8. check if there are any blackjack // step 8. check if there are any blackjack
playerBlackack = player->currentHand->blackjack(); playerBlackack = player->currentHand->blackjack();
if (hand.blackjack()) { if (hand.blackjack()) {
player->info(Info::CardDealerHoleRevealed, holeCard);
player->info(Info::CardDealerRevealsHole, holeCard);
player->info(Info::DealerBlackjack); player->info(Info::DealerBlackjack);
player->blackjacksDealer++; player->blackjacksDealer++;




if (player->bustedAllHands) { if (player->bustedAllHands) {


player->info(Info::PlayerBustedAllHands);
player->info(Info::CardDealerHoleRevealed, holeCard);
player->info(Info::PlayerBustsAllHands);
player->info(Info::CardDealerRevealsHole, holeCard);
// TODO: no tengo que sacarle todo el dinero? // TODO: no tengo que sacarle todo el dinero?
player->actionRequired = PlayerActionRequired::None; player->actionRequired = PlayerActionRequired::None;
case DealerAction::HitDealerHand: case DealerAction::HitDealerHand:
player->info(Info::CardDealerHoleRevealed, holeCard);
player->info(Info::CardDealerRevealsHole, holeCard);


// hit if count is less than 17 (or equalt to soft 17 if hit_soft_17 is true) // hit if count is less than 17 (or equalt to soft 17 if hit_soft_17 is true)
dealerTotal = hand.total(); dealerTotal = hand.total();
dealerTotal = std::abs(hand.total()); dealerTotal = std::abs(hand.total());


if (hand.busted()) { if (hand.busted()) {
player->info(Info::DealerBusted);
player->info(Info::DealerBusts);
player->bustsDealer++; player->bustsDealer++;
for (auto playerHand : player->hands) { for (auto playerHand : player->hands) {
if (playerHand.busted() == false) { if (playerHand.busted() == false) {
///ig+help+desc Ask for help ///ig+help+desc Ask for help
///ig+help+detail A succinct help message is written on the standard output. ///ig+help+detail A succinct help message is written on the standard output.
///ig+help+detail This command makes sense only when issued by a human player. ///ig+help+detail This command makes sense only when issued by a human player.
// TODO
case PlayerActionTaken::Help: case PlayerActionTaken::Help:
std::cout << "help yourself" << std::endl;
player->info(Info::Help);
return 0; return 0;
break; break;

+ 87
- 14
src/tty.cpp Прегледај датотеку

#include "blackjack.h" #include "blackjack.h"
#include "tty.h" #include "tty.h"






// extern "C" {

char *blackjack_commands[] = {
"help",
"hit",
"stand",
"yes",
"no",
NULL
};


char *blackjack_command_generator(const char *text, int state) {
static int list_index, len;
char *name;

if (!state) {
list_index = 0;
len = strlen(text);
}

while ((name = blackjack_commands[list_index++])) {
name = strdup(name);

if (strncmp(name, text, len) == 0) {
return name;
} else {
free(name);
}
}

return NULL;
}

char **blackjack_rl_completion(const char *text, int start, int end) {
char **matches = NULL;

#ifdef HAVE_LIBREADLINE
matches = rl_completion_matches(text, blackjack_command_generator);
#endif

return matches;
}



// }



Tty::Tty(Configuration &conf) { Tty::Tty(Configuration &conf) {
conf.set(&flat_bet, {"flat_bet", "flatbet"}); conf.set(&flat_bet, {"flat_bet", "flatbet"});
// TODO: choose utf8 or other representation // TODO: choose utf8 or other representation
switch (msg) { switch (msg) {
case Info::InvalidBet: case Info::InvalidBet:
if (intData < 0) { if (intData < 0) {
// s = "bet_negative"; // s = "bet_negative";


case Info::NewHand: case Info::NewHand:
// s = "new_hand"; // s = "new_hand";
std::cout << std::endl;
s = "Starting new hand #" + std::to_string(intData); s = "Starting new hand #" + std::to_string(intData);
dealerHand.cards.clear(); dealerHand.cards.clear();
break; break;
dealerHand.cards.push_back(intData); dealerHand.cards.push_back(intData);
break; break;
case Info::CardDealerHoleRevealed:
case Info::CardDealerRevealsHole:
// s = "card_dealer_hole"; // s = "card_dealer_hole";
s = "Dealer's hole card was " + card[intData].utf8(); s = "Dealer's hole card was " + card[intData].utf8();
*(++(dealerHand.cards.begin())) = intData; *(++(dealerHand.cards.begin())) = intData;
s = "No blackjacks"; s = "No blackjacks";
break; break;
case Info::PlayerBustedAllHands:
case Info::PlayerBustsAllHands:
// s = "player_busted_all_hands"; // s = "player_busted_all_hands";
if (hands.size() == 1) { if (hands.size() == 1) {
s = "Player busted"; s = "Player busted";
} }
break; break;
case Info::DealerBusts:
// s = "no_blackjacks";
s = "Dealer busts!";
break;
case Info::Help:
std::cout << "help yourself" << std::endl;
break;

case Info::Bye: case Info::Bye:
// s = "bye"; // s = "bye";
s = "Bye bye! We'll play Blackjack again next time."; s = "Bye bye! We'll play Blackjack again next time.";
break; break;


case PlayerActionRequired::Insurance: case PlayerActionRequired::Insurance:
renderTable();
s = "Insurance?"; s = "Insurance?";
break; break;
case PlayerActionRequired::Play: case PlayerActionRequired::Play:
std::cout << " -- Dealer's hand: --------" << std::endl;
render(&dealerHand);
std::cout << " Total: " << dealerHand.total() << std::endl;

std::cout << " -- Player's hand --------" << std::endl;
for (auto hand : hands) {
render(&hand);
std::cout << " Total: " << hand.total() << std::endl;
}
renderTable();
s = "Play?"; s = "Play?";
break; break;
} }
} }
#ifdef HAVE_LIBREADLINE #ifdef HAVE_LIBREADLINE
rl_attempted_completion_function = blackjack_rl_completion;
if ((input_buffer = readline(prompt.c_str())) == nullptr) { if ((input_buffer = readline(prompt.c_str())) == nullptr) {
// EOF means "quit" // EOF means "quit"
return 0; return 0;
} }


void Tty::renderTable(void) {


std::cout << " -- Dealer's hand: --------" << std::endl;
renderHand(&dealerHand);
std::cout << " Total: " << dealerHand.total() << std::endl;

std::cout << " -- Player's hand --------" << std::endl;
for (auto hand : hands) {
renderHand(&hand);
std::cout << " Total: " << hand.total() << std::endl;
}

return;
}


void Tty::render(Hand *hand) {
void Tty::renderHand(Hand *hand) {


for (auto it : hand->cards) { for (auto it : hand->cards) {
std::cout << " _____ "; std::cout << " _____ ";

+ 4
- 4
src/tty.h Прегледај датотеку

int play() override; int play() override;
void info(Info = Info::None, int = 0) override; void info(Info = Info::None, int = 0) override;


void render(Hand *);

private: private:

void renderHand(Hand *);
void renderTable(void);
#ifdef HAVE_LIBREADLINE #ifdef HAVE_LIBREADLINE
char *input_buffer; char *input_buffer;
#else #else

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