Blackjack Game [Project #1] Multiplayer Blackjack Game 블랙잭은 21을넘지않는한도내에서딜러와겨루어숫자가높으면이기는게임 1 딜러 (House) 가자신을포함한참가자전원에게카드두장을나누어주는데, 딜러의카드한장은참가자들에게보이지않는다. 1.1 첫카드두장을나누어줄때, Player1 -> Player2 -> House 순서로한장씩나누어주고, 다시한번같은순서로한장씩나누어준다. 1.2 딜러 (House) 가받는첫번째카드는공개되지않는다. (HIDDEN) 1.3 딜러가받은두장의카드가 21이되면, 게임은즉시종료된다. 이경우모든참가자는본인점수와상관없이더이상진행하지못하고게임에서진다. (House Win, All Players Lose) 2 먼저받은카드두장의합이 21에못미치면히트 (Hit) 라고말한뒤한장씩더받을수있고, 멈추려면스탠드 (Stand) 라고말한다. 2.1 이때, 참가자번호의숫자가낮은순서부터본인의카드가버스트 (Bust) 혹은스탠드 (Stand) 될때까지진행한다. 2.2 이전참가자의순서가끝난뒤, 그다음참가자가진행한다. 3 카드의합이딜러보다먼저 21이되거나딜러보다 21에가깝게되면이기고, 카드를더받았는데 21을초과하면버스트 (Bust) 된다. 4 딜러는카드의합이 16 이하면무조건한장을더받아야하고, 17 이상의경우에는멈추어야한다. 5 딜러의카드와합이같으면비긴것이된다. 6 에이스카드는 1이나 11로취급할수있고, 10, J, Q, K는모두 10으로계산한다. 6.1 에이스카드는기본적으로 11로계산한뒤, 카드를더받아 21이초과하는경우에 1로계산한다. 7 모든참가자와딜러가스탠드 (Stand) 혹은버스트 (Bust) 되면게임결과를출력한다. 7.1 참가자와딜러사이의승패를결정하고, 다른참가자들과는독립적이다.
Game Rule Random Seed 와참가자의수를 Command Line Arguments 로받는다. [ 명령인수 ] Random_seed #of Players e. g., 100 4 카드덱의개수는 4로고정한다. (decks = 4) Player1 은사용자입력을받아플레이한다. (interactive mode) 다른 Player 들은다음의규칙을따라 Hit 와 Stand를결정한다. 카드의합이 14 미만일때, 항상 Hit (if sum < 14) 카드의합이 17 초과일때, 항상 Stand (if sum > 17) 카드의합이 14 와 17 사이일때, 1/2 확률로 Hit 혹은 Stand int is_hit = rand() % 2 is_hit == 1 -> Hit, is_hit == 0 -> Stand 초기카드상태는다음과같다. (4 decks) 각한덱은낮은수부터정렬 같은숫자카드는 Clobber(c), Heart(h), Diamond(d), Spade(s) 문양순서로정렬 Ac Ah Ad As 2c 2dh 2d 2s 10c 10h 10d 10s Jc Jh Jd Js Qc Qh Qd Qs Kc Kh Kd Ks Ac Ah Ad As 2c 2dh 2d 2s 10c 10h 10d 10s Jc Jh Jd Js Qc Qh Qd Qs Kc Kh Kd Ks Ac Ah Ad As 2c 2dh 2d 2s 10c 10h 10d 10s Jc Jh Jd Js Qc Qh Qd Qs Kc Kh Kd Ks Ac Ah Ad As 2c 2dh 2d 2s 10c 10h 10d 10s Jc Jh Jd Js Qc Qh Qd Qs Kc Kh Kd Ks Requirements and Considerations Skeleton code 수정가능, 단 rand( ) 함수가있는 statements 수정불가 No errors and warnings Submit your code named StudentID1_StudentID2.cpp or StudentID.cpp in Icampus only (no.zip file, no text field submission) Due data: 2017-09-24(Sun) 11:59 PM
Input / Output 명령인수 (Command line arguments) 로 random seed 와 Player 수를입력받아프로그램실행 ( e.g., 200 4 ) 초기화된카드를한번 shuffle_cards( ) 수행 House 와모든 Player 에게처음카드두장을배포 (draw) 후, 카드정보를출력 이때, House 의첫번째카드는 HIDDEN으로표시 Player1 의 turn 에서사용자의 std 입력으로 Hit 혹은 Stand 를입력받아수행 입력받을때마다카드를출력 (Stand 를입력하거나, Bust 되면다음플레이어 turn)
다른 Player 들은정해둔규칙에따라 Hit, Stand 가결정되고, 각단계를카드정보와함 께출력 모든 Player 들의 turn 후에 House 의첫번째카드를공개하고, Hit 혹은 Stand 수행 각 Player 들의승패여부 (Win, Lose, Draw) 와함께카드를출력 (Game Results)
Output Case Command Line Arguments [Random_seed #_of_players] [100 4] 처음카드 2 장을받았을때, House 가 21 즉시게임종료, All Players Lose
[2 4] Player Bust Bust 된 Player 는항상 Lose
[10 4] 에이스카드는 11 혹은 1 로취급 Player1
[10 2] House Bust vs. Player Bust Player1 Hit, Hit 입력시 House Bust, Player1 Bust Player 가 Bust 인경우, House 의상태와상관없이무조건 Bust
[12 2] Draw Player1 Hit, Stand 입력시 House = Player1 Bust 가아닌상황에서 House 와 Player 의점수가같은경우 Draw
Skeleton Code #include <iostream> #include <cstdlib> #include <vector> #include <string> using namespace std; vector<string> cards; int players; void swap(int i, int j) { auto n = cards[i]; cards[i] = cards[j]; cards[j] = n; string draw_card() { string str = cards.back(); cards.pop_back(); return str; void shuffle_cards() { for (int i = 0; i < 1000; i++) swap(rand() % cards.size(), rand() % cards.size()); int main(int argc, char **argv) { if (argc!= 3) { cout << "Command Line Error!" << endl; exit(0); int decks = 4; int seed = stoi(argv[1]); players = stoi(argv[2]); srand(seed); for (int j = 0; j < decks; j++) { for (int i = 1; i <= 13; i++) { string cardnum; if (i == 1) cardnum = "A"; else if (i == 11) cardnum = "J"; else if (i == 12) cardnum = "Q"; else if (i == 13) cardnum = "K"; else cardnum = to_string(i); cards.push_back(cardnum + "c"); cards.push_back(cardnum + "h"); cards.push_back(cardnum + "d"); cards.push_back(cardnum + "s"); shuffle_cards(); /* Your Code */