Beggar My Neighbour
Beggar My Neighbour |
``Beggar My Neighbour'' (sometimes known as ``Strip Jack Naked'') is a traditional card game, designed to help teach beginners something about cards and their values. A standard deck is shuffled and dealt face down to the two players, the first card to the non-dealer, the second to the dealer, and so on until each player has 26 cards. The dealer receives the last card. The non-dealer starts the game by playing the top card of her deck (the second last card dealt) face up on the table. The dealer then covers it by playing her top card face up. Play continues in this fashion until a ``face'' card (Ace, King, Queen or Jack) is played. The next player must then ``cover'' that card, by playing one card for a Jack, two for a Queen, three for a King and four for an Ace. If a face card is played at any stage during this sequence, play switches and the other player must cover that card. When this sequence has ended, the player who exposed the last face card takes the entire heap, placing it face down under her existing deck. She then starts the next round by playing one card face up as before, and play continues until one player cannot play when called upon to do so, because they have no more cards.
Write a program that will simulate playing this game. Remember that a standard deck (or pack) of cards contains 52 cards. These are divided into 4 suits--Spades ( ), Hearts (
), Diamonds (
) and Clubs (
). Within each suit there are 13 cards--Ace (A), 2-9, Ten (T), Jack (J), Queen (Q) and King (K).
Input
Input will consist of a series of decks of cards. Each deck will give the cards in order as they would be dealt (that is in the example deck below, the non-dealer would start the game by playing the H2). Decks will occupy 4 lines with 13 cards on each. The designation of each card will be the suit (S, H, D, C) followed by the rank (A, 2-9, T, J, Q, K). There will be exactly one space between cards. The file will be terminated by a line consisting of a single #.
Output
Output will consist of a series of lines, one for each deck in the input. Each line will consist of the number of the winning player (1 is the dealer, 2 is the first to play) and the number of cards in the winner's hand (ignoring any on the stack), right justified in a field of width 3.
Sample input
HA H3 H4 CA SK S5 C5 S6 C4 D5 H7 HJ HQ D4 D7 SJ DT H6 S9 CT HK C8 C9 D6 CJ C6 S8 D8 C2 S2 S3 C7 H5 DJ S4 DQ DK D9 D3 H9 DA SA CK CQ C3 HT SQ H8 S7 ST H2 D2 #
Sample output
1 44
#include <iostream> #include <cstdio> #include <queue> #include <string> #include <stack> #include <cstring> using namespace std; queue<char> dealer[2] , deck; stack<char> q[2]; string card; int r , h , face; void initial(){ for(int i = 0; i < 2; i++){ while(!dealer[i].empty()){ dealer[i].pop(); } } while(!deck.empty()){ deck.pop(); } r = 1; h = 0; face = 0; } void readcase(){ q[0].push(card[1]); int d = 1 , n = 0; while(n < 51){ cin >> card; q[d].push(card[1]); d = !d; n++; } for(int i = 0; i < 2; i++){ while(!q[i].empty()){ dealer[i].push(q[i].top()); q[i].pop(); } } } bool turn(){ int i; for(i = 0; i < r && !dealer[h].empty(); i++){ char tem = dealer[h].front(); dealer[h].pop(); deck.push(tem); if(tem == 'J'){ face = 1; r = 1; return true; } if(tem == 'Q'){ face = 1; r = 2; return true; } if(tem == 'K'){ face = 1; r = 3; return true; } if(tem == 'A'){ face = 1; r = 4; return true; } } if(i < r) return false; r = 1; if(face == 1){ while(!deck.empty()){ dealer[!h].push(deck.front()); deck.pop(); } } face = 0; return true; } void computing(){ while(!dealer[h].empty()){ if(turn()){ h = !h; } } printf("%d%3d\n" , h+1 , dealer[!h].size()); } int main(){ while(cin >> card && card != "#"){ initial(); readcase(); computing(); } return 0; }