ConsoleApplication2.cpp

Programming 500 - kanata, 2015/10/17 07:40

ダウンロード (3.36 KB)

 
1
// ConsoleApplication2.cpp : ?R???\?[?? ?A?v???P?[?V??????G???g?? ?|?C???g???`??????B
2
//
3

    
4
#include "stdafx.h"
5

    
6
struct node {
7
        int card[11]; //A??1?@JQK??10
8
        int myhand , myace;
9
        int dlhand , dlace;
10
        int cardnum;
11
        int life;
12
};
13
#define LIFE 21
14
struct node default_node = {
15
        { 0,8,8,8,8,8,8,8,8,8,32 },
16
        0,0,0,0, 0, LIFE
17
};
18

    
19
void node_init(struct node * node) {
20
        *node = default_node;
21
}
22
FILE *fp_out2;
23

    
24

    
25
double calc_win_dealer(struct node node) {
26
        int i;
27
        double ret = 0.0;
28
        struct node node2;
29

    
30
        //?f?B?[???[??o?[?X?g????
31
        while (node.dlhand > 21 && node.dlace > 0) {
32
                node.dlace--; node.dlhand -= 10;
33
        }
34
        if (node.dlhand > 21) {
35
                return 1.0;
36
        }
37

    
38
        //?f?B?[???[??Stand?????
39
        if (node.dlhand > 16) {
40
                if (node.myhand > node.dlhand) {
41
                        return 1.0;
42
                }
43
                else if (node.myhand == node.dlhand) {
44
                        return 0.0;
45
                }
46
                else{
47
                        return 0.0;
48
                }
49
        }
50

    
51
        //?f?B?[???[??Hit?????
52
        for (i = 1; i < 11; i++) {
53
                if (node.card[i] == 0) {
54
                        continue;
55
                }
56

    
57
                //?J?[?h???h???[????O????????
58
                node2 = node;
59
                //?J?[?h???h???[
60
                node2.card[i]--; node2.cardnum--;
61
                switch (i) {
62
                case 1:
63
                        node2.dlhand += 11; node2.dlace += 1;
64
                        break;
65
                default:
66
                        node2.dlhand += i;
67
                        break;
68
                }
69
                ret += calc_win_dealer(node2) * (double)(node.card[i]) / (double)node.cardnum ;
70
        }
71
        return ret;
72
}
73

    
74
double calc_win_player(struct node node, int nohit) {
75
        int i,j;
76
        double ret = 0.0;
77
        struct node node2;
78
        double stand = 0.0;
79

    
80
        //?v???C???[??o?[?X?g????
81
        while (node.myhand > 21 && node.myace > 0) {
82
                node.myace--; node.myhand -= 10;
83
        }
84
        if (node.myhand > 21) {
85
                for (j = 0; j < LIFE - node.life; j++)fputc(' ', fp_out2);
86
                fprintf(fp_out2,"Burst\n");
87
                return 0.0;
88
        }
89

    
90
        //Stand???????m??
91
        if (nohit == 0) {
92
                stand = calc_win_dealer(node);
93
                for (j = 0; j < LIFE - node.life; j++)fputc(' ', fp_out2);
94
                fprintf(fp_out2, "Now %d, ace %d\n", node.myhand, node.myace);
95
        }
96

    
97
        //??????????m????????o???????Stand??m??????
98
        if (node.life > 0 && node.myhand < 19) {
99
                node.life--;
100
                //Hit?????
101
                for (i = 1; i < 11; i++) {
102
                        if (node.card[i] == 0) {
103
                                continue;
104
                        }
105
                        //?J?[?h???h???[????O????????
106
                        node2 = node;
107
                        //?J?[?h???h???[
108
                        node2.card[i]--; node2.cardnum--;
109
                        switch (i) {
110
                        case 1:
111
                                node2.myhand += 11; node2.myace += 1;
112
                                break;
113
                        default:
114
                                node2.myhand += i;
115
                                break;
116
                        }
117
                        for (j = 0; j < LIFE - node.life; j++)fputc(' ', fp_out2);
118
                        fprintf(fp_out2, "Hit %d (%d/%d) now %d, ace %d\n", i, node.card[i], node.cardnum, node.myhand, node.myace);
119
                        ret += calc_win_player(node2, 0) * (double)(node.card[i]) / (double)node.cardnum;
120
                }
121
        }
122
        for (j = 0; j < LIFE - node.life; j++)fputc(' ', fp_out2);
123
        fprintf(fp_out2,"stand %10.7f, Hit %10.7f\n", stand, ret);
124
        if (ret < stand) return stand;
125
        return ret;
126
}
127

    
128

    
129
int main()
130
{
131
        struct node node;
132
        int i;
133

    
134
        fopen_s(&fp_out2, "d:\\bj.debug.txt", "w");
135

    
136
        //?????m?[?h??
137
        node_init(&node);
138
        //???????D2???
139
        node.card[1]--;
140
        node.card[2]--;
141
        node.myhand = 13;
142
        node.myace = 1;
143
        //?f?B?[?????D1???
144
        node.card[3]--;
145
        node.dlhand = 3;
146
        node.dlace = 0;
147
        
148
        //???????J?E???g
149
        for (i = 1; i < 11; i++) {
150
                node.cardnum += node.card[i];
151
        }
152

    
153
        //Stand?????m??
154
        fprintf(fp_out2,"stand %10.7f\n",calc_win_dealer(node));
155
        fprintf(fp_out2,"hit %10.7f\n", calc_win_player(node,1));
156
        //getchar();
157

    
158
        return 0;
159
}
160

    
クリップボードから画像を追加 (サイズの上限: 100 MB)