티스토리 뷰
블랙잭 게임을 C로 구현해봅시다!
블랙잭은 기본적으로 보유한 카드 숫자의 합이 21을 초과하지 않으면서 클수록 승리하는 게임입니다.
컴퓨터가 dealer, 나와 컴퓨터 player n명이 게임을 합니다. 몇 명인지는 입력을 받아서 1-5로 결정하도록 했습니다.
블랙잭은 기본적으로 보유한 카드 숫자의 합이 21을 초과하지 않으면서 클수록 승리하는 게임입니다.
카드 한 세트는 HRT(하트), DIA(다이아), SPD(스페이드), CLB(클로버) 이렇게 4가지로 나뉘고, 각 모양 별로 A, 2, 3, 4, 5, 6, ,7, 8, 9, 10, J, Q, K 이렇게 13가지의 숫자 값을 가집니다. 즉, 카드 한 세트는 4모양 * 13숫자 = 52장 인거죠.
각 카드가 의미하는 숫자는 모양과는 무관합니다.
총 52장이 한 세트로 이루어진 트럼프카드 N_CARDSET세트 이용하는 게임으로, dealer가 자기자신과 player N명에게 카드를 나누어줍니다.
게임의 흐름은 이렇습니다.
- N_CARDSET개의 트럼프카드 세트를 섞어서 card tray에 넣음.
- 모든 player가 초기 자본 N_DOLLAR을 가지고 시작함.
- Round를 시작하면서 각 player별로 배팅을 함.
• 나의 경우 내가 보유한 자본 한도에서 배팅 금액을 입력 받음.
• 컴퓨터의 경우 최소 1에서 최대 N_MAX_BET 중 임의로 정해서 배팅 금액 지정.
- Round를 시작하면서 dealer가 각 player들에게 초기 2장 카드 배포하고 player별로 turn을 돌면서 play함
• 특정 player가 블랙잭이면 그 player는 곧바로 승리 처리가 되며, 배팅 금액의 2배를 받음.
• 내 turn부터 시작해서 다른 player들도 순서대로 turn을 거치면서 go/stop을 결정.
• player turn 도중 카드 합이 21을 초과하면 그 player는 곧바로 패배 처리가 되며, 배팅 금액만큼 잃음.
- Dealer turn을 거친 후 승패가 결정되지 않은 남은 player들의 승패 여부 결정.
• Dealer가 블랙잭이면 남은 player들은 모두 패배하며, 배팅 금액만큼 잃음.
• Dealer가 21을 초과하면 남은 player들은 모두 승리하며, 배팅 금액만큼 받음.
• Dealer 카드 합보다 player의 카드 합이 같거나 크면 승리하며, 배팅 금액만큼 받음.
- card tray에 카드가 소진되거나 player 한명이 파산 (가진 자본을 모두 잃음)하면 게임이 종료됨.
• 그때 자본이 가장 많은 player가 최종 승리자가 됨
header.h 파일입니다. 게임이 복잡하다 보니깐 여러 가지 기능을 담당하는 많은 함수들로 이루어져 있습니다.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
|
#include <stdio.h>
#include <stdlib.h>
#include <ctype.h>
#define N_CARDSET 1
#define N_CARD 52
#define N_DOLLAR 50
#define N_MAX_CARDNUM 13
#define N_MAX_USER 5
#define N_MAX_CARDHOLD 10
#define N_MAX_GO 17
#define N_MAX_BET 5
#define N_MIN_ENDCARD 30
//get an integer input from standard input (keyboard)
//return : input integer value
// (-1 is returned if keyboard input was not integer)
//card tray object //cardhold에 넣어놓고 cardtray에 임의로 섞어서 넣음.
//그리고 tray로부터 꺼 냄
int CardTray[N_CARDSET*N_CARD]; //52장 4*13 = 4*N_MAX_CARDNUM
int cardIndex = 0;
int pullnum = 52;
//player info
int u_dollar[N_MAX_USER]; //dollars that each player has
int dollar[N_MAX_USER]; //dollars that each player betting
int n_user = 0; //number of users
int userDollar[N_MAX_USER];
int roundNum = 1;
int flag = 0; //1이면 블랙잭 또는 패배. 턴 끝남.
//play yard information
int cardhold[N_MAX_USER + 1][N_MAX_CARDHOLD]; //cards that currently the players hold
int cardSum[N_MAX_USER]; //sum of the cards. player별
int bet[N_MAX_USER]; //current betting. player별
int gameEnd = 0;
int getIntegerInput(void);
int getCardNum(int cardnum);
void printCard(int cardnum);
int mixCardTray(void);
int pullCard(void);
int configUser(void);
int betDollar(void);
void offerCards(void);
void printCardInitialStatus(void);
int getAction(int user);
void printUserCardStatus(int user);
int calcStepResult(int user);
int checkResult(void);
int checkWinner(void);
int calcCardSum(int user);
void printWhoTurn(int user);
int calcCardNumber(int num);
http://colorscripter.com/info#e" target="_blank" style="color:#4f4f4ftext-decoration:none">Colored by Color Scripter
|
아래 코드가 main함수 부분입니다.
게임 초기화를 한 뒤,
do while문으로 각 라운드가 반복되는 것을 나타내었습니다. 라운드가 끝나는 것은 player의 자산이 다 떨어지거나, card tray의 카드가 모두 소진되었을 때, 게임이 종료되며 최종 승리자가 출력됩니다. 최종 승리자는 끝날 때에 자산이 가장 많은 player 입니다.
gameEnd라는 변수를 넣어주어서 게임 종료를 다루도록 했습니다.
for 문 안에서는 각 player들의 턴이 반복됨을 구현했습니다.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
|
int main(int argc, char *argv[]) {
int roundIndex = 0;
int max_user;
int i;
srand((unsigned)time(NULL));
//set the number of players
configUser();
//Game initialization --------
//1. players' dollar
//2. card tray
mixCardTray();
printf(" --> card is mixed and put into the tray\n\n");
dollarinit(); //init.
//Game start --------
do {
betDollar();
offerCards(); //1. give cards to all the players
if (gameEnd==1){
break;
}
printCardInitialStatus();
printf("\n------------------ GAME start --------------------------");
//each player's turn
int i;
for (i = 0;i <= n_user;i++) //each player
{
if (gameEnd==1){
break;
}
printWhoTurn(i);
flag = 0;
while (flag != 1) //do until the player dies or player says stop
{
printUserCardStatus(i);
if (gameEnd==1){
break;
}
calcStepResult(i);
if (gameEnd==1){
break;
}
getAction(i);
if (gameEnd==1){
break;
}
}
int p;
for (p = 0;p < n_user;p++) {
if (u_dollar[p] <= 0)
gameEnd = 1;
}
}
//result
checkResult();
clearCardhold();
} while (gameEnd == 0);
checkWinner();
return 0;
}
http://colorscripter.com/info#e" target="_blank" style="color:#4f4f4ftext-decoration:none">Colored by Color Scripter
|
함수들을 본격적으로 구현하기 전에 이 코드에서는 정수들을 입력받는 경우가 꽤 있습니다.
숫자가 아닌 다른 값이 들어올 경우엔 -1 을 리턴하는 방어코드를 가진 함수를 만들어줍시다.
1
2
3
4
5
6
7
8
9
10
11
|
int getIntegerInput(void) {
int input, num;
fflush(stdin);
num = scanf("%d", &input);
if (num != 1) //if it fails to get integer
input = -1;
return input;
}
http://colorscripter.com/info#e" target="_blank" style="color:#4f4f4ftext-decoration:none">Colored by Color Scripter
|
자, 이제 함수들을 구현해봅시다!
먼저, 게임이 시작할 때, 게임 초기화를 담당하는 함수인 dollarinit함수와 mixCardTray함수를 보겠습니다.
dollarinit함수는 초기 자산을 50으로 하기로 하고, 모든 플레이어들의 자산을 50으로 초기화해주는 함수입니다.
mixCardTray함수는 CardTray 배열 안에 0부터 51까지의 수를 랜덤으로 넣어줍니다. N_CARDSET세트의 트럼프카드를 임의로 섞어서 card tray에 넣어두고, 필요할 때 tray로부터 한장씩 순서대로 꺼내는 거죠.
clearCardhold함수는 card hold를 비워주는 역할을 합니다.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
|
void dollarinit() { //자산dollar 50으로 초기화
int i;
for (i = 0;i < n_user;i++) {
u_dollar[i] = 50;
}
}
//mix the card sets and put in the array
int mixCardTray(void) {
srand((unsigned)time(NULL));
printf("------------------------------------------------\n");
printf("------------ ROUND %d (cardIndex:0)--------------------------\n", roundNum++);
printf("------------------------------------------------\n\n");
int randomnumber; int i;
int temp; int rn; int num = 52;
int t;
for (t = 0;t<num;t++) CardTray[t] = t + 1;
for (i = 0;i<num - 1;i++) {
rn = rand() % (num - i) + i;
temp = CardTray[i];
CardTray[i] = CardTray[rn];
CardTray[rn] = temp;
}
}
void clearCardhold() { //cardhold 비우기
int i; int j;
for (i = 0;i <= n_user;i++) {
for (j = 0;j < N_MAX_CARDHOLD;j++)
cardhold[i][j] = '\0';
}
}
http://colorscripter.com/info#e" target="_blank" style="color:#4f4f4ftext-decoration:none">Colored by Color Scripter
|
게임이 시작할 땐, 몇 명의 플레이어로 시작하시겠습니까? 에 1-5명으로 답함과 동시에 게임이 시작합니다.
명수에 맞게 플레이어들의 자산, 초기 카드 등의 setting이 필요하겠죠?
configUser함수는 "Input the number of players (MAX:5) :"라는 출력문과 함께 플레이어수인 n_user를 결정짓습니다.
betDollar함수는 플레이어들이 얼마를 걸지 결정합니다. 여기서 게임을 하는 '나'는 숫자 입력을 통해 베팅을 하지만, 컴퓨터 플레이어들은 랜덤으로 1~50 사이의 달러를 베팅하도록 합니다.
printCardInitialStatus함수는 초기 2장씩 배정받은 카드들을 출력합니다. 이때, dealer의 첫 번째 카드는 공개하지 않습니다. 그게 원칙입니다!
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
|
//player settiing
int configUser(void) {
do {
printf("Input the number of players (MAX:5): ");
n_user = getIntegerInput();
if (n_user >5) printf("Too many players!\n");
if (n_user <1) printf("invalid input players (%d)\n", n_user);
} while (n_user>5 || n_user<1);
}
//betting
int betDollar(void) {
printf("------- BETTING STEP -------\n");
do {
printf(" -> your betting (total:$%d) : ",u_dollar[0]);
dollar[0] = getIntegerInput();
//scanf("%d", &dollar[0]);
if (dollar[0]>u_dollar[0]) printf(" -> you only have $%d! bet again\n",u_dollar[0]);
if (dollar[0]<0) printf(" -> invalid input for betting $%d\n", dollar[0]);
} while (dollar[0]>u_dollar[0] || dollar[0]<0);
//printf(" -> your betting (total:$50) : %d\n",dollar[0]);
int i;
for (i = 1;i<n_user;i++) {
int random = rand();
dollar[i] = random % 50 + 1;
printf(" -> player%d bets $%d (out of $%d)\n", i, dollar[i],u_dollar[i]);
}
printf("\n");
}
//offering initial 2 cards
void offerCards(void) {
printf(" ----------- CARD OFFERING ---------------\n");
int i;
//1. give two card for each players
for (i = 0;i<n_user;i++) //0~n_user-1만큼 player에
{
cardhold[i][0] = CardTray[pullCard()];
cardhold[i][1] = CardTray[pullCard()];
}
//2. give two card for the operator
cardhold[n_user][0] = CardTray[pullCard()];
cardhold[n_user][1] = CardTray[pullCard()];
return;
}
//print initial card status
void printCardInitialStatus(void) {
int p;
printf(" --- server : ");//server는 cardhold[][]에서 n_user번째
printf("X ");printCard(cardhold[n_user][1]);
printf("\n");
printf(" -> you : "); printCard(cardhold[0][0]); printf(" ");
printCard(cardhold[0][1]);
printf("\n");
for (p = 1;p<n_user;p++) {
printf(" -> player %d : ", p);
printCard(cardhold[p][0]); printf(" ");printCard(cardhold[p][1]);
printf("\n");
}
}
http://colorscripter.com/info#e" target="_blank" style="color:#4f4f4ftext-decoration:none">Colored by Color Scripter
|
나를 포함한 player들은 돌아가면서 카드를 더 받을지 (go), 그만 받을지 (stop) 결정합니다.
go를 하면 카드를 1장 더 받고, go/stop을 다시 결정하고,
stop을 하면 turn이 종료됩니다.
내 turn부터 시작하는데, 내 turn에서는 현재의 카드 숫자의 합을 고려하면서 go/stop을 결정하면 됩니다.
컴퓨터 player들은 17 이상이면 stop, 17 미만이면 go를 하도록 설정합니다.
마지막 dealer의 turn에서는 숨겨진 첫번째 장을 공개하고, 컴퓨터 player turn과 동일하게 진행합니다.
printWhoTurn함수에서는 말그대로 어떤 플레이어의 순서인지 출력해줍니다.
printUserCardStatus함수에서는 각 turn마다, 그리고 결정을 내릴 때마다 그 플레이어의 카드 상태를 보여줍니다.
clacCardNumber함수는 카드값을 계산하는 함수입니다. card tray에 0부터 51까지의 랜덤수를 넣어놓았으니 그 숫자를 의미있는 숫자를 가진 cardNumber로 바꿔주는 것이죠.
calcStepResult함수는 각 플레이어의 카드 합을 냅니다.
getAction함수는 go/stop을 결정하는 함수입니다. '나'의 경우, 결정을 입력받아서 그대로 수행하지만, 컴퓨터 player의 경우, 17을 기준으로 결정하게 해야 합니다.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
|
void printWhoTurn(int user) { //해당 turn의 플레이어 출력
if (user == 0) {
printf("\n>>> My turn!-----------\n");
}
else if (user == n_user) {
printf("\n>>> server turn! -----------------\n");
}
else
printf("\n>>> player %d turn! --------------\n", user);
}
void printUserCardStatus(int user) { //각 player의 card상태 출력
int cardcnt;
int r = 0;
while (cardhold[user][r] != '\0') {
r++;
}
cardcnt = r;
int i;
printf(" -> card : ");
for (i = 0;i<cardcnt;i++) {
printCard(cardhold[user][i]);
printf(" ");
}
}
//flag로 패배, 승리때 그 턴 끝나도록
int calcCardNumber(int num) { //카드value 구하는 함수
int cardNumber;
if (num % 13 >= 1 && num % 13 <= 9) cardNumber = (num % 13) + 1;
else if (num % 13 >= 10 && num % 13 <= 12) cardNumber = 10;
else if (num % 13 == 0) {
cardNumber = 1;
}
return cardNumber;
}
// calculate the card sum and see if : 1. under 21, 2. over 21, 3. blackjack
int calcStepResult(int user) { //cardsum 반환
int cardcnt;
int r = 0;
while (cardhold[user][r] != '\0')
r++;
cardcnt = r; //cardcnt구하기
int i;
int cardsum = 0;
for (i = 0;i < cardcnt;i++) { //cardsum 구하기
cardsum += calcCardNumber(cardhold[user][i]);
}
if (calcCardNumber(cardhold[user][i])==1){ //A 11 or 1
if ((cardsum+10) >21){
return cardsum;
}
else if ((cardsum+10)<=21){
return cardsum+10;
}
}
return cardsum;
}
int getAction(int user) {
int choose;
int cardcnt;
int r = 0;
while (cardhold[user][r] != '\0')
r++;
cardcnt = r; //일단 얘도 cardcnt는 구해놓긴함
if (user == 0) {
if (calcStepResult(0) < 21) {
printf("\t::: Action? (0 - go, others - stay) :");
scanf("%d", &choose);
if (choose == 0) { //go
cardhold[user][cardcnt] = CardTray[pullCard()];
}
else {
flag = 1; //stop
}
}
else if (calcStepResult(0) == 21) { //blackjack일때, 돈계산
printf("\t::: BLACKJACK!!!\n");
u_dollar[0] += 2 * dollar[0];
flag = 1;
}
else {
printf("\t::: DEAD (sum:%d)", calcStepResult(0));
u_dollar[0] -= dollar[0]; //DEAD하면 여기서 돈계산들어감.
printf(" --> -$%d ($%d)\n", dollar[0], u_dollar[0]);
flag = 1;
}
}
else {//dealer가 21보다 작을때
if (calcStepResult(user) >= 17) { //stop
if (calcStepResult(user) == 21) { //blackjack, 돈계산
u_dollar[user] += 2 * dollar[user];
printf(" ::: BLACKJACK!!!\n");
}
else if (calcStepResult(user) > 21) {
printf(" ::: DEAD (sum:%d)", calcStepResult(user));
u_dollar[user] -= dollar[user]; //DEAD하면 여기서 돈계산들어감.
printf(" --> -$%d ($%d)\n", dollar[user], u_dollar[user]);
}
else printf(" ::: STAY\n");
flag = 1;
}
else if (calcStepResult(user) < 17) { //go
printf(" ::: GO!\n");
cardhold[user][cardcnt] = CardTray[pullCard()];
}
}
}
http://colorscripter.com/info#e" target="_blank" style="color:#4f4f4ftext-decoration:none">Colored by Color Scripter
|
현재 0에서 51로 이루어진 카드들을 우리가 아는 형태로 출력을 하려면 아래 printCard함수가 필요합니다. 조금 노가다 같지만.. 저는 이렇게 구현했습니다!
0~51의 cardnum을 매개변수로 받고 13으로 나눈 나머지와 몫을 따져 모양과 숫자를 결정하여 출력해줍니다.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
|
//print the card information (e.g. DiaA)
void printCard(int cardnum) {
int quo = 0; int rest = 0;
quo = cardnum / 13; rest = cardnum % 13;
switch (rest) {
case 0:
if (quo == 0) printf("HRTA");
else if (quo == 1) printf("DIAA");
else if (quo == 2) printf("CLVA");
else if (quo == 3) printf("SPDA");
break;
case 1:
if (quo == 0) printf("HRT2");
else if (quo == 1) printf("DIA2");
else if (quo == 2) printf("CLV2");
else if (quo == 3) printf("SPD2");
break;
case 2:
if (quo == 0) printf("HRT3");
else if (quo == 1) printf("DIA3");
else if (quo == 2) printf("CLV3");
else if (quo == 3) printf("SPD3");
break;
case 3:
if (quo == 0) printf("HRT4");
else if (quo == 1) printf("DIA4");
else if (quo == 2) printf("CLV4");
else if (quo == 3) printf("SPD4");
break;
case 4:
if (quo == 0) printf("HRT5");
else if (quo == 1) printf("DIA5");
else if (quo == 2) printf("CLV5");
else if (quo == 3) printf("SPD5");
break;
case 5:
if (quo == 0) printf("HRT6");
else if (quo == 1) printf("DIA6");
else if (quo == 2) printf("CLV6");
else if (quo == 3) printf("SPD6");
break;
case 6:
if (quo == 0) printf("HRT7");
else if (quo == 1) printf("DIA7");
else if (quo == 2) printf("CLV7");
else if (quo == 3) printf("SPD7");
break;
case 7:
if (quo == 0) printf("HRT8");
else if (quo == 1) printf("DIA8");
else if (quo == 2) printf("CLV8");
else if (quo == 3) printf("SPD8");
break;
case 8:
if (quo == 0) printf("HRT9");
else if (quo == 1) printf("DIA9");
else if (quo == 2) printf("CLV9");
else if (quo == 3) printf("SPD9");
break;
case 9:
if (quo == 0) printf("HRT10");
else if (quo == 1) printf("DIA10");
else if (quo == 2) printf("CLV10");
else if (quo == 3) printf("SPD10");
break;
case 10:
if (quo == 0) printf("HRTJack");
else if (quo == 1) printf("DIAJack");
else if (quo == 2) printf("CLVJack");
else if (quo == 3) printf("SPDJack");
break;
case 11:
if (quo == 0) printf("HRTQueen");
else if (quo == 1) printf("DIAQueen");
else if (quo == 2) printf("CLVQueen");
else if (quo == 3) printf("SPDQueen");
break;
case 12:
if (quo == 0) printf("HRTKing");
else if (quo == 1) printf("DIAKing");
else if (quo == 2) printf("CLVKing");
else if (quo == 3) printf("SPDKing");
break;
}
}
http://colorscripter.com/info#e" target="_blank" style="color:#4f4f4ftext-decoration:none">Colored by Color Scripter
|
마지막으로, 결과를 내는 함수들입니다.
checkResult함수는 각 라운드마다의 결과를 도출합니다.
그 라운드에서 카드합이 21이 되는 플레이어는 BLACKJACK이고, 그 즉시 승리합니다.
또, 21을 초과하는 플레이어는 그 즉시 패배합니다.
dealer turn을 거친 후, 승패가 결정되지 않은 남은 player들의 승패 여부는,
1) dealer가 블랙잭이면 남은 player 모두 패배.
2) dealer가 21을 초과하면 남은 player 모두 승리.
3) dealer 카드 합보다 player의 카드 합이 같거나 크면 승리.
이때, 승리하면 베팅금액 * 2배를 벌고, 패배하면 베팅금액 만큼 잃습니다.
checkWinner함수는 게임이 모두 끝나고 최종 승리자를 출력합니다. 게임이 끝날 당시, 자산을 가장 많이 가지고 있는 player가 승리합니다.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
|
int checkResult() {
//dealer의 카드합마다 다른 출력
if (calcStepResult(n_user) > 21) printf("\n[[[[[[ server result is .... overflow! ]]]]]]\n");
else if (calcStepResult(n_user) == 21) {
printf("\n[[[[[[ server result is .... BLACKJACK! ]]]]]]\n");
printf("All Player is lose! (except for blackjack player)\n");
}
else printf("\n[[[[[[ server result is .... %d ]]]]]]\n", calcStepResult(n_user));
//dealer가 블랙잭이면 당시 블랙잭인 player제외하고 모두 패배
if (calcStepResult(n_user) == 21) {
printf(" -> your result : ");
if (calcStepResult(0) == 21) { //dealer가 bj일때 나부터 처리
printf(" win (sum:21) --> $%d\n", u_dollar[0]);
}
else if (calcStepResult(0) > 21) {
printf(" lose due to overflow! ($%d) \n", u_dollar[0]);
}
else if (calcStepResult(0) < 21) {
u_dollar[0] -= dollar[0];
printf(" lose! ($%d)\n", u_dollar[0]);
}
//player들
int i;
for (i = 0;i < n_user;i++) {
printf(" -> %d player's result : ", i);
if (calcStepResult(i) == 21) {
printf(" win (sum:21) --> $%d\n", u_dollar[i]);
}
else if (calcStepResult(i) > 21) {
printf(" lose due to overflow! ($%d) \n", u_dollar[i]);
}
else if (calcStepResult(i) < 21) {
u_dollar[i] -= dollar[i];
printf(" lose! ($%d)\n", u_dollar[i]);
}
}
}
//dealer가 overflow
else if (calcStepResult(n_user)>21){
printf(" -> your result : "); //you
if (calcStepResult(0) == 21) { //블랙잭일때 win
printf(" win (sum:21) --> $%d\n", u_dollar[0]);
}
else if (calcStepResult(0) > 21) {//overflow
printf(" lose due to overflow! ($%d) \n", u_dollar[0]);
}
else {
u_dollar[0]+=dollar[0];
printf(" win (sum:%d) --> $%d\n",calcStepResult(0),u_dollar[0]);
}
//players
int i;
for (i = 1;i < n_user;i++) {
printf(" -> %d player's result : ", i);
if (calcStepResult(i) == 21) {
printf(" win (sum:21) --> $%d\n", u_dollar[i]);
}
else if (calcStepResult(i) > 21) {
printf(" lose due to overflow! ($%d) \n", u_dollar[i]);
}
else{
u_dollar[i] += dollar[i];
printf(" win (sum:%d) --> $%d\n", calcStepResult(i), u_dollar[i]);
}
}
}
//dealer가 블랙잭 아닐때
else {
printf(" -> your result : ");
if (calcStepResult(0) == 21) { //블랙잭일때. 위에서 돈계산 이미함
printf(" win (sum:21) --> $%d\n", u_dollar[0]);
}
else if (calcStepResult(0) > 21) {//overflow일때. 위에서 돈게산 함
printf(" lose due to overflow! ($%d) \n", u_dollar[0]);
}
else if (calcStepResult(0) < 21 && calcStepResult(0) >= calcStepResult(n_user)) {//win일때
u_dollar[0] += dollar[0]; //돈계산
printf(" win (sum:%d) --> $%d\n", calcStepResult(0), u_dollar[0]);
}
else { //둘다 21보다 작고 player<dealer일때 lose
u_dollar[0]-=dollar[0];
printf(" lose (sum:%d) -> $%d\n",calcStepResult(0),u_dollar[0]);
}
int i;
for (i = 1;i < n_user;i++) {
printf(" -> %d player's result : ", i);
if (calcStepResult(i) == 21) {
printf(" win (sum:21) --> $%d\n", u_dollar[i]);
}
else if (calcStepResult(i) > 21) {
printf(" lose due to overflow! ($%d) \n", u_dollar[i]);
}
else if (calcStepResult(i) < 21 && calcStepResult(i) >= calcStepResult(n_user)) {
u_dollar[i] += dollar[i];
printf(" win (sum:%d) --> $%d\n", calcStepResult(i), u_dollar[i]);
}
else { //둘다 21보다 작고 player<dealer일때 lose
u_dollar[i]-=dollar[i];
printf(" lose (sum:%d) -> $%d\n",calcStepResult(i),u_dollar[i]);
}
}
}
printf("\n");
}
int checkWinner() { //최종 돈max인 사람이 winner
int maxDollar = 0; int i; int maxuser;
for (i = 0;i<n_user;i++) {
if (maxDollar<u_dollar[i]) {
maxDollar = u_dollar[i];
maxuser = i;
}
}
printf("\n-------------THE RESULT---------------\n");
printf("------WINNER : ");
if (maxuser == 0) {
printf("YOU!!!!!!!!!! CONGRATULATION!!!!\n");
}
else if (maxuser > 0 && maxuser < n_user) {
printf("Player %d!!!!!!!!!!!!!!! CONGRATULATION!!!!\n", maxuser);
}
}
http://colorscripter.com/info#e" target="_blank" style="color:#4f4f4ftext-decoration:none">Colored by Color Scripter
|
- Total
- Today
- Yesterday
- 병돌리기구현
- BOJ
- 티스토리챌린지
- React native 작동 원리
- PYTHON
- 파이썬
- easycode
- S3 403 forbidden
- 오블완
- 알고리즘
- 정적 웹페이지 배포
- partyrock앱
- vscode easycode
- mac vscode download fail
- AWSBedrock
- partyrock사용볍
- S3배포
- 생성형AI
- ChatGPT
- 백준
- genaiapp
- awsgenai
- aws생성형ai
- partyrock무료
- 정적 웹사이트 배포
- 코딩테스트
- easycode chatGPT
- partyrock
- 술자리병돌리기게임
- partyrock생성
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | |||||
3 | 4 | 5 | 6 | 7 | 8 | 9 |
10 | 11 | 12 | 13 | 14 | 15 | 16 |
17 | 18 | 19 | 20 | 21 | 22 | 23 |
24 | 25 | 26 | 27 | 28 | 29 | 30 |