回答編集履歴

2

結果例を追加

2021/01/15 06:46

投稿

fana
fana

スコア11658

test CHANGED
@@ -299,3 +299,41 @@
299
299
  }
300
300
 
301
301
  ```
302
+
303
+
304
+
305
+ 結果例:
306
+
307
+ ```text
308
+
309
+ Dealer : C8( 8) HQ(18)
310
+
311
+ Player : H5( 5) CK(15) DQ(25)
312
+
313
+ -----------
314
+
315
+ Dealer : C2( 2) S5( 7) D2( 9) SQ(19)
316
+
317
+ Player : C3( 3) S8(11) H4(15) HT(25)
318
+
319
+ -----------
320
+
321
+ Dealer : HQ(10) H8(18)
322
+
323
+ Player : H4( 4) DT(14) ST(24)
324
+
325
+ -----------
326
+
327
+ Dealer : DJ(10) C9(19)
328
+
329
+ Player : DT(10) S8(18) H6(24)
330
+
331
+ -----------
332
+
333
+ Dealer : H5( 5) D2( 7) H3(10) SK(20)
334
+
335
+ Player : C4( 4) H9(13) DJ(23)
336
+
337
+ -----------
338
+
339
+ ```

1

コード追記

2021/01/15 06:46

投稿

fana
fana

スコア11658

test CHANGED
@@ -11,3 +11,291 @@
11
11
  あとは,今まさにプログラムが始まったかのようにプレイヤとのゲームを開始してみせるが,実際には単に先に発見した勝ちパターンを再現してみせるだけである.
12
12
 
13
13
  (プレイヤーがプレイする段階では,既に,ディーラー側のカード内容も,プレイヤーには何枚目に何のカードが配られるのかも確定している.)
14
+
15
+
16
+
17
+ ---
18
+
19
+
20
+
21
+ 実装してみた.
22
+
23
+
24
+
25
+ ```C
26
+
27
+ //カードのスコア.
28
+
29
+ //※面倒なので,Aのスコアは常に11点としている
30
+
31
+ unsigned char ScoreOfCard( unsigned char CardID )
32
+
33
+ {
34
+
35
+ static const unsigned char SCORE[] = { 11,2,3,4,5,6,7,8,9,10,10,10,10 };
36
+
37
+ return SCORE[ CardID % 13 ];
38
+
39
+ }
40
+
41
+
42
+
43
+ //カードの表示用
44
+
45
+ void PrintCard( unsigned char CardID )
46
+
47
+ {
48
+
49
+ printf( "%c%c", "SHDC"[ CardID/13 ], "A23456789TJQK"[ CardID%13 ] );
50
+
51
+ }
52
+
53
+
54
+
55
+ //デック
56
+
57
+ typedef struct Deck{ unsigned char Card[52]; } Deck;
58
+
59
+
60
+
61
+ //デックを初期化
62
+
63
+ void InitDeck( Deck *pDeck )
64
+
65
+ {
66
+
67
+ int i;
68
+
69
+ for( i=0; i<52; ++i ){ pDeck->Card[i]=i; }
70
+
71
+ }
72
+
73
+
74
+
75
+ //デックをシャッフルする
76
+
77
+ void ShuffleDeck( Deck *pDeck )
78
+
79
+ {
80
+
81
+ int i,j;
82
+
83
+ for( i=52; i>=1; --i )
84
+
85
+ {
86
+
87
+ j = rand() % i;
88
+
89
+ unsigned char tmp = pDeck->Card[i-1];
90
+
91
+ pDeck->Card[i-1] = pDeck->Card[j];
92
+
93
+ pDeck->Card[j] = tmp;
94
+
95
+ }
96
+
97
+ }
98
+
99
+
100
+
101
+ //ディーラーが勝利するようにデックをセットアップする.
102
+
103
+ //イカサマ方法として,ディーラーに対してカードを配る際には常にボトムディールすることとする
104
+
105
+ //(すなわち,ディーラーに配る用のカード群はデックのボトム側に仕込まれる).
106
+
107
+ //
108
+
109
+ //引数:
110
+
111
+ // pDeck : デック.処理が成功すると仕込まれた状態になる.
112
+
113
+ // pND : ディーラーに配る用にボトム側から仕込んだカードの枚数を返す用.
114
+
115
+ // pNP : プレイヤーに配る用にトップ側から仕込んだカードの枚数を返す用.
116
+
117
+ //
118
+
119
+ //戻り値:
120
+
121
+ // 成功時(うまく仕込めた時)には非0,失敗時は0を返す.
122
+
123
+ int SetupGame( Deck *pDeck, int *pND, int *pNP )
124
+
125
+ {
126
+
127
+ unsigned char DealerScore = 0;
128
+
129
+ unsigned char PlayerScore = 0;
130
+
131
+ const unsigned char *pCard;
132
+
133
+
134
+
135
+ //デックをシャッフル
136
+
137
+ ShuffleDeck( pDeck );
138
+
139
+
140
+
141
+ //ディーラーの手をチェック
142
+
143
+ pCard = pDeck->Card + 51; //ボトム
144
+
145
+ *pND = 0;
146
+
147
+ while( DealerScore<17 )
148
+
149
+ {
150
+
151
+ DealerScore += ScoreOfCard( *pCard );
152
+
153
+ ++*pND;
154
+
155
+ //※面倒なのでディーラーがバーストするパターンは棄却する
156
+
157
+ if( DealerScore > 21 )return 0;
158
+
159
+ --pCard;
160
+
161
+ }
162
+
163
+
164
+
165
+ //プレイヤーの手をチェック
166
+
167
+ pCard = pDeck->Card; //トップ
168
+
169
+ *pNP = 0;
170
+
171
+ while( 1 )
172
+
173
+ {
174
+
175
+ PlayerScore += ScoreOfCard( *pCard );
176
+
177
+ ++*pNP;
178
+
179
+
180
+
181
+ if( PlayerScore > 21 )break;
182
+
183
+ if( PlayerScore >= DealerScore )return 0;
184
+
185
+ ++pCard;
186
+
187
+ }
188
+
189
+ return 1;
190
+
191
+ }
192
+
193
+
194
+
195
+ //やってみる
196
+
197
+ void Test()
198
+
199
+ {
200
+
201
+ int i;
202
+
203
+ Deck TheDeck;
204
+
205
+ int ND, NP;
206
+
207
+ unsigned char Score;
208
+
209
+ const unsigned char *pCard;
210
+
211
+
212
+
213
+ //デックを初期化
214
+
215
+ InitDeck( &TheDeck );
216
+
217
+ //ディーラーの勝ちパターンを仕込む
218
+
219
+ while( !SetupGame( &TheDeck, &ND, &NP ) ){}
220
+
221
+
222
+
223
+ //以下,仕込んだ結果を表示してみる
224
+
225
+
226
+
227
+ //ディーラー側の手
228
+
229
+ Score = 0;
230
+
231
+ pCard = TheDeck.Card + 51; //※ボトム
232
+
233
+ printf( "Dealer : " );
234
+
235
+ for( i=0; i<ND; ++i, --pCard )
236
+
237
+ {
238
+
239
+ PrintCard( *pCard );
240
+
241
+ Score += ScoreOfCard( *pCard );
242
+
243
+ printf( "(%2d) ", (int)Score );
244
+
245
+ }
246
+
247
+ printf( "\n" );
248
+
249
+
250
+
251
+ //プレイヤー側(カードを配り続けてバーストするところまで)
252
+
253
+ Score = 0;
254
+
255
+ pCard = TheDeck.Card; //※トップ
256
+
257
+ printf( "Player : " );
258
+
259
+ for( i=0; i<NP; ++i, ++pCard )
260
+
261
+ {
262
+
263
+ PrintCard( *pCard );
264
+
265
+ Score += ScoreOfCard( *pCard );
266
+
267
+ printf( "(%2d) ", (int)Score );
268
+
269
+ }
270
+
271
+ printf( "\n" );
272
+
273
+ }
274
+
275
+
276
+
277
+ //main
278
+
279
+ int main(void)
280
+
281
+ {
282
+
283
+ int i;
284
+
285
+ srand( time(NULL) );
286
+
287
+ for( i=0; i<5; ++i )
288
+
289
+ {
290
+
291
+ Test();
292
+
293
+ printf( "-----------\n" );
294
+
295
+ }
296
+
297
+ return 0;
298
+
299
+ }
300
+
301
+ ```