No puede seleccionar más de 25 temas Los temas deben comenzar con una letra o número, pueden incluir guiones ('-') y pueden tener hasta 35 caracteres de largo.

hace 5 años
hace 5 años
hace 5 años
hace 5 años
hace 5 años
hace 5 años
hace 5 años
hace 5 años
hace 5 años
hace 5 años
hace 5 años
hace 5 años
hace 5 años
hace 5 años
hace 5 años
hace 5 años
hace 5 años
hace 5 años
hace 5 años
hace 5 años
hace 5 años
hace 5 años
hace 5 años
hace 5 años
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207
  1. #include <iostream>
  2. #include <cstring>
  3. #include <thread>
  4. #include <chrono>
  5. #ifdef HAVE_LIBREADLINE
  6. #include <readline/readline.h>
  7. #include <readline/history.h>
  8. #endif
  9. #include "conf.h"
  10. #include "blackjack.h"
  11. #include "tty.h"
  12. Tty::Tty(Configuration &conf) {
  13. conf.set(&flat_bet, {"flat_bet", "flatbet"});
  14. conf.set(&no_insurance, {"no_insurance", "dont_insure"});
  15. #ifdef HAVE_LIBREADLINE
  16. prompt = cyan + " > " + reset;
  17. #endif
  18. }
  19. void Tty::info(Info msg, int intData) {
  20. std::string s;
  21. switch (msg) {
  22. case Info::NewHand:
  23. // s = "new_hand";
  24. s = "Starting new hand #" + std::to_string(intData);
  25. break;
  26. case Info::Shuffle:
  27. // s = "shuffle";
  28. s = "Deck needs to be shuffled.";
  29. break;
  30. case Info::CardPlayerFirst:
  31. // s = "card_player_first";
  32. s = "Player's first card is " + card[intData].utf8();
  33. break;
  34. case Info::CardDealerUp:
  35. // s = "card_dealer_up";
  36. s = "Dealer's up card " + card[intData].utf8();
  37. break;
  38. case Info::CardPlayerSecond:
  39. // s = "card_player_second";
  40. s = "Player's second card is " + card[intData].utf8();
  41. break;
  42. case Info::CardDealerHoleDealt:
  43. // s = "card_dealer_hole";
  44. s = "Dealer's hole card is dealt";
  45. break;
  46. case Info::CardDealerHoleRevealed:
  47. // s = "card_dealer_hole";
  48. s = "Dealer's hole card was " + card[intData].utf8();
  49. break;
  50. case Info::DealerBlackjack:
  51. // s = "dealer_blackjack";
  52. s = "Dealer has Blackjack";
  53. // TODO: draw dealer's hand
  54. break;
  55. case Info::PlayerWinsInsurance:
  56. // s = "player_wins_insurance";
  57. s = "Player wins insurance";
  58. break;
  59. case Info::PlayerBlackjackAlso:
  60. // s = "player_blackjack_also";
  61. s = "Player also has Blackjack";
  62. break;
  63. case Info::PlayerPushes:
  64. // s = "player_pushes";
  65. s = "Player pushes";
  66. // TODO:
  67. // print_hand_art (player->current_hand);
  68. break;
  69. case Info::PlayerLosses:
  70. // s = "player_losses";
  71. s = "Player losses";
  72. // TODO:
  73. // print_hand_art (player->current_hand);
  74. break;
  75. case Info::PlayerBlackjack:
  76. // s = "blackjack_player";
  77. s = "Player has Blackjack";
  78. // TODO:
  79. // print_hand_art (player->current_hand);
  80. break;
  81. case Info::PlayerWins:
  82. // s = "player_wins";
  83. s = "Player wins " + std::to_string(intData);
  84. break;
  85. case Info::NoBlackjacks:
  86. // s = "no_blackjacks";
  87. s = "No blackjacks";
  88. break;
  89. case Info::Bye:
  90. // s = "bye";
  91. s = "Bye bye! We'll play Blackjack again next time.";
  92. break;
  93. }
  94. if (delay > 0) {
  95. std::this_thread::sleep_for(std::chrono::milliseconds(delay));
  96. }
  97. std::cout << green << s << reset << std::endl;
  98. if (msg == Info::CardDealerHoleDealt) {
  99. // hand.render(hand.holeCardShown);
  100. currentHand->render();
  101. }
  102. return;
  103. }
  104. int Tty::play() {
  105. #ifdef HAVE_LIBREADLINE
  106. if ((input_buffer = readline(prompt.c_str())) == nullptr) {
  107. // EOF means "quit"
  108. actionTaken = PlayerActionTaken::Quit;
  109. std::cout << std::endl;
  110. } else {
  111. add_history(input_buffer);
  112. actionTaken = PlayerActionTaken::None;
  113. // TODO: convertir a string y usar algo comun para non-readline
  114. // check common commands first
  115. if (strcmp(input_buffer, "quit") == 0 || strcmp(input_buffer, "q")== 0) {
  116. actionTaken = PlayerActionTaken::Quit;
  117. } else if (strcmp(input_buffer, "help") == 0) {
  118. actionTaken = PlayerActionTaken::Help;
  119. } else if (strcmp(input_buffer, "count") == 0 || strcmp(input_buffer, "c")== 0) {
  120. actionTaken = PlayerActionTaken::Count;
  121. } else if (strcmp(input_buffer, "upcard") == 0 || strcmp(input_buffer, "u")== 0) {
  122. actionTaken = PlayerActionTaken::UpcardValue;
  123. } else if (strcmp(input_buffer, "bankroll") == 0 || strcmp(input_buffer, "b")== 0) {
  124. actionTaken = PlayerActionTaken::Bankroll;
  125. } else if (strcmp(input_buffer, "hands") == 0) {
  126. actionTaken = PlayerActionTaken::Hands;
  127. } else if (strcmp(input_buffer, "table") == 0) {
  128. actionTaken = PlayerActionTaken::Table;
  129. }
  130. if (actionTaken == PlayerActionTaken::None) {
  131. switch (actionRequired) {
  132. case PlayerActionRequired::Bet:
  133. currentBet = std::stoi(input_buffer);
  134. actionTaken = PlayerActionTaken::Bet;
  135. break;
  136. case PlayerActionRequired::Insurance:
  137. if (strcmp(input_buffer, "y") == 0 || strcmp(input_buffer, "yes") == 0) {
  138. actionTaken = PlayerActionTaken::Insure;
  139. } else if (strcmp(input_buffer, "n") == 0 || strcmp(input_buffer, "no") == 0) {
  140. actionTaken = PlayerActionTaken::DontInsure;
  141. } else {
  142. // TODO: chosse if we allow not(yes) == no
  143. actionTaken = PlayerActionTaken::None;
  144. }
  145. break;
  146. case PlayerActionRequired::Play:
  147. // TODO: sort by higher-expected response first
  148. if (strcmp(input_buffer, "h") == 0 || strcmp(input_buffer, "hit") == 0) {
  149. actionTaken = PlayerActionTaken::Hit;
  150. } else if (strcmp(input_buffer, "s") == 0 || strcmp(input_buffer, "stand") == 0) {
  151. actionTaken = PlayerActionTaken::Stand;
  152. } else if (strcmp(input_buffer, "d") == 0 || strcmp(input_buffer, "double") == 0) {
  153. actionTaken = PlayerActionTaken::Stand;
  154. } else if (strcmp(input_buffer, "p") == 0 || strcmp(input_buffer, "pair") == 0 || strcmp(input_buffer, "split") == 0) {
  155. actionTaken = PlayerActionTaken::Split;
  156. } else {
  157. actionTaken = PlayerActionTaken::None;
  158. }
  159. break;
  160. }
  161. }
  162. free(input_buffer);
  163. }
  164. #else
  165. std::cout << prompt;
  166. std::cin >> input_buffer;
  167. // TODO: check EOF
  168. // TODO: esto puede ir en algo comun para tty y stdout
  169. if (input_buffer == "hit" || input_buffer == "h") {
  170. *command = Command::Hit;
  171. } else {
  172. *command = Command::None;
  173. }
  174. #endif
  175. return 0;
  176. }