卒 業 研 究 報 告
題

目

「Ｖｉ
ｓ
ｕａｌＣ＋＋」によるカードゲーム作成

指 導 教 員原 央 教授

報 告 者

山科 高志

平成 １３年 ２月 ９日

高知工科大学 電子・光システム工学科

目次

１．概要

2

２．ＶｉｓｕａｌＣ＋＋について

3

３．「ＢｌａｃｋＪａｃｋ」について

4

３−１．「ＢｌａｃｋＪａｃｋ」のルール
４．プログラム内容の解説

4
6

４−１．プログラムを組むにあたって

6

４−２．基本概念

6

４−３．基本的な流れ

7

４−４．プログラム内容の解説

8

４−４−１．起動直後に行われる処理

8

４−４−２．「ヒット」時の処理

18

４−４−３．「スタンド」時の処理

19

５．参考文献21

６．付録１

各フローチャート

22

７．付録２

プログラムリスト

27

1

１．概要
この卒業研究のは、Ｗｉｎｄｏｗｓ上で動作するプログラムを作成する事を目的とする。
この目的を達するために「ＶｉｓｕａｌＣ＋＋」を選んだ。

これは身の回りに在るオ

ペレーティング・システムの大半を占めるＷｉｎｄｏｗｓ上で動作する事プログラムを組むことが出来、動作確認がしやすいと言う理由からである。
またプログラム内容はゲームとし、カードゲームの一種である「ＢｌａｃｋＪａｃｋ」
を選んだ。

2

２．ＶｉｓｕａｌＣ＋＋について「ＶｉｓｕａｌＣ＋＋」はＷｉｎｄｏｗｓ上のアプリケーションが開発できるプログラミ
ングツールである。 Ｗｉｎｄｏｗｓが高度な機能を持つようになり、それにともなってその実力を十分に引き出せる高度なアプリケーションが必要になってきた。

Ｗｉｎｄｏｗｓ上の開発ツールとしては「ＶｉｓｕａｌＢａｓｉｃ」が広く普及しているが、それと並んで「ＶｉｓｕａｌＣ＋＋」も重要な開発ツールである。

双方ともＷｉｎｄｏｗｓ用

プログラムを開発するための十分な機能を持ち合わせているが、比較すると「ＶｉｓｕａｌＢａｓｉｃ」の方は基本機能の習得が比較的容易で、小規模のプログラムならすぐに作成することができるようになっている。

それに対して「ＶｉｓｕａｌＣ＋＋」はより複雑なプログラムを作る能力を持っているが、反面大変回りくどい作業を必要とする。
上記のように性格の異なる両者はそれぞれに十分な機能を備えていて、個々のプログラ
マーの好み・用途に応じて使い分けられている重要な開発ツールである。

3

３．「ＢｌａｃｋＪａｃｋ」について「ＢｌａｃｋＪａｃｋ」は親と子に分かれ、手札が２１点を超えないように２１点に近づけるのが目的のカードゲームである。

カジノ等でも遊ばれており、比較的有名で大体のルールはよく知られている。

３−１．「ＢｌａｃｋＪａｃｋ」のルール
形式は親１人対子１〜５人の対戦形式で、子がチップを賭け、親との勝負を楽しむ形となる。

基本的にカードを卓の上に公開するので親と子の位置関係は余り決まってはいない。
まず子がチップを賭ける。

次に適度に繰られたカードを山札とし、親はプレイヤーに

表向きで１枚ずつ配り、自分には裏向き（子に数字が見えない様）に１枚配る。 次にもう一巡、親も含め全てのカードを表向きで配り、この２枚が基本の手札となる。 子は親の手札（１枚は見えないが）と自らの手札を考慮して２つの選択肢から次の行動を選ぶ事が出来る。

１つは「ヒット」と言って親からカードを１枚貰う。 この時、手札の合計が２１を超えたら「バースト」となり、チップは親に没収される。 もう一つは「スタンド（ステイ）」と言い手札を確定する。

つまりもう「ヒット」をしないという宣言で、子の手札によっては一度も「ヒット」せずに「スタンド」が宣言されることもある。

そして１人目の子が「スタンド」すると、次の子に移り「ヒット」と「スタンド」を行う。 子の手札がすべて確定したら、親は手札の１枚目を公開し、手札が２１に近付く様にカードを取る。

親が「バースト」したら、「バースト」していない子に賭けたチップと同額のチップを払う。

そうでなければ、最も（２１以下で）２１に近い人が勝ちとなる。

手札の点数の計算は、「Ａ」が１１または１、数字札はその数字と同じ、「Ｊ」「Ｑ」「Ｋ」
が１０となる（表 1）。

また、「バースト」時、手札に「Ａ」あった場合は「Ａ」を１１から１にして再計算できる。

つまり手札が「Ａ」「Ａ」だった時、点数は２２から１２に下げる事が出来るのである。

4

Ａ

１１、または１

２〜１０

その数字と同じ

Ｊ、Ｑ、Ｋ

１０‑‑‑‑表 1‑‑‑‑
子が勝てば賭けたチップと同額のチップが親から払われ、親が勝てば子のチップは全て没収となる。
以上が基本的な流れであるが、手札を作った時点で親がブラックジャック、つまり「Ａ」と絵札（「Ｊ」「Ｑ」「Ｋ」）だった場合は親の勝ちとなる。

ただし子がそれよりも強いブ

ラックジャックだった場合は、その子の勝ちとなる。
「ＢｌａｃｋＪａｃｋ」では、子が勝てば賭けた額と同額のチップが支払われる（つまり場に賭けたチップが、２倍になって返ってくる）。

しかし、もしそのとき子の手札の内容が「役」になっていれば、チップの増加は２倍に留まらず２．５〜１５倍になる。
ラックジャックの強さとは、増加チップの多さで決まる。

「ＢｌａｃｋＪａｃｋ」の役は以下の６種類である（表 2）。

表ブラックジャック（チップ×１５）「スペードのＡ」と「スペードの絵札」

裏ブラックジャック（×５）

同じスートの「Ａ」と「絵札」

ブラックジャック（×２．５）

違うスートの「Ａ」と「絵札」

セブンカード（×１０）

手札が７枚になっても２１を超えない時

シックスカード（×５）

手札が６枚になっても２１を超えない時

スリーセブン（×１０）

「７」が３枚揃った時‑‑‑‑表 2‑‑‑‑
つまり３種のブラックジャックの内、「表ブラックジャック」が最も強い。

5ブ

４．プログラム内容の解説
４−１．プログラムを組むにあたって
基本的に本に載っている「ＢｌａｃｋＪａｃｋ」のルールを採用した。
ノ等で行われている本格的なルールは省いてある。

しかし、カジ

例えば、「スプリット」と言うルール

は最初の手札２枚が同じ数字であった場合、手札を２組に出来るというものである。
れらは少々馴染みがないので採用しないこととした。

こ

また、表示スペースとカードの大きさから、手札の増えすぎを抑えるために「セブンカード」に達すれば勝ちとした。 「セブンカード」とは、手札が７枚以上になっても２１を超えていない場合に成り立つ役で、本来はこの役で勝つとチップが１０倍されるだけなのだが、本ゲームでは手札の最大を７枚に限定するために無条件で勝ちとした。

４−２．基本概念
本プログラム内ではカードは全てカード番号で処理されている。 そのカード番号は「ス
ペードのＡ」が１、「ハートのＡ」が２、「ダイヤのＡ」が３、「クラブのＡ」４、以下「クラブのＫ」まで５２の番号がふってある。 そしてそれぞれ山札に相当する配列や手札に相当する配列に順次代入していくことにより、カードの動きを実現している。

基本的な

流れは、山札に相当する配列にランダムで１から５２までの数字を重複がないように代入する。

この時、手札の上限は７枚なので単純計算で１４枚の山札があればよい。

「ＢｌａｃｋＪａｃｋ」のルール通りに手札を配る。

次に

これは山札に代入されたカード番

号を、山札の１番目からからそれぞれ順番に子と親の手札に相当する配列に代入しただけである。

そして手札が配られたら、カード番号からそれぞれのカードのスートと数字を算出し、それをもとにカードを表示させる。
ＡＰを使用した。

カードの表示には１８ファイルのＢＩＴＭ

内訳はスート４ファイル＋数字１３ファイル＋カードの裏１枚である。

スート画像はカードのフルサイズと同じサイズで上中下と３パートに分けることができる。
上と下にはスートが描いてあり、中は空白である。

数字画像の横幅はカードのサイズと同じであるが、縦幅はスート画像の上下に描いてあるスートを隠さないように狭めてある。
表示の際にスートを表示して、スート画像中部の空白に数字画像を上書き表示させる事によってカードを表現している。

6

４−３．基本的な流れ
プログラムの基本的な流れとしては、大まかに３つのパートに分けることができる。
・起動直後に行われる処理
・プレイヤーが「ヒット」したときに行われる処理
・プレイヤーが「スタンド」したときに行われる処理
以上の３つである。

「ヒット」と「スタンド」はそれに相当するボタンをクリックすることにより処理が開始される。
プログラムの起動直後に行われる処理は、・配列の初期化、山札の作成、カード配り・ゲーム台と手札の表示
以上の２つである。 内容は「ヒット」が子の処理、「スタンド」が親の処理を行う。 「ヒット」はヒットボタンがクリックされると、山札から新たなカード番号を子の手札に加えカード画像を表示し、合計を再計算して必要なら「Ａ」を１１から１になおし、「バースト」
判定をする。

「スタンド」も基本的には「ヒット」処理と同じだが、唯一違うのは親の思考が入っていることである。 スタンドボタンを押せば親の思考があり、カードを加えるならヒットボタンと同じく山札から親の手札へカードを配り、それに対応したカード画
像を表示する。

そして手札合計の再計算・「Ａ」の処理・バースト判定の後、再び親の思考に戻り、以下親が「スタンド」するまで繰り返される。

7

４−４．プログラムの内容解説
プログラムの内容に入る前に、プログラムの基礎的な用語解説をしておく。
関数：
命令文の塊のこと。
Ｃ＋＋では命令文は関数の中に所属する。
変数：
プログラム内で処理されるデータを記憶しておくところ。
配列：
複数の変数を成分に持った、変数の塊のこと。
コメント：
プログラマーが記述の内容を、解るように書き加えるメモ書きのこと。
コメントにしておくとその部分の記述はプログラムに影響しない。

４−４−１．起動直後の処理
まず、プログラム起動後に最初の処理として以下（Pro.1）の１６行の記述がある。
の内７・９行目は区切りとして書かれたコメントである。
/////////////////////////////////////////////////
1

void syokika(),yamaran(),kubari(),padown(),cadown();2
3

syokika();

4

yamaran();5

kubari();6

padown();cadown();7//-------------------------------------------

8

Invalidate();9//-------------------------------------------

10/*sprintf(ccfirst,"スートは = %d、数字は = %d",csuit[1],cnumb[1]);*/

11

printf(ccfirst,"ﾃﾞｨｰﾗｰ「さぁ、どうぞ」");//子関数:innumb(),insuit(),pmaxsan(),cmaxsan()//《処理》手札が｢Ａ｣｢Ａ｣の時の 11→1//OnPaint↓に飛ぶ

8

そ

12

m̲ed2.SetWindowText(ccfirst);

13

sprint(mmaaxx,"プレイヤーの合計点は = %d",pnumb[0]);14m̲ed1.SetWindowText(mmaaxx);

15

sprintf(cmmaaxx,"ディーラーの合計点は = ??");

16m̲ed3.SetWindowText(cmmaaxx);/////////////////////////////////////////////////‑‑‑‑Pro.1‑‑‑‑
Pro.1 の内容を上から解説していくと、１行目は関数呼び出しに必要な宣言である。
３行目が山札・手札等に相当する配列を初期化する関数 syokika （Pro.2）を実行させる命令であり、内容である初期化関数は以下 Pro.2 のようになっている。
全ての配列に「0」を代入させている。

内容としては、

繰り返し回数を制御する変数 yamamax と havemax

はプログラムの冒頭でそれぞれ 20 と 10 が代入してある/////////////////////////////////////////////////
void syokika(){
int co01;for(co01 = 0;co01 < yamamax;++co01){
yama[co01] = 0;}
for(co01 = 0;co01 < havemax;++co01){
pcard[co01] = 0;
ccard[co01] = 0;
psuit[co01] = 0;
csuit[co01] = 0;
pnumb[co01] = 0;
cnumb[co01] = 0;}}/////////////////////////////////////////////////‑‑‑‑Pro.2‑‑‑‑

9

次に Pro.1 で４行目に呼び出されている関数は以下 Pro.3 に示した山札を作る関数
yamaran （Pro.3）である。 乱数を利用してカード番号を代入するようになっている。 変数 yamamax には 20 がすでに代入されており、山札は１９枚しか作られない。
繰り返し回数が−１されているのは、繰り返しを終了させるキーワードに値「0」を使う
場合があるからである。

つまり１９回しかカード番号を代入しないことによって、配列の最後である２０番目の変数に「0」が残してある。 また変数 che01 により重複チェックがされており、重複を防いでいる。
/////////////////////////////////////////////////
void yamaran(int ranmax,int ranmin){int rand();int che01 = 0;
int co01, co02,co03 = 1;
srand((unsigned int)time(0));
rand();
for(co01 = 1;co01 < yamamax ‑ 1;){
ran01 = ranmin +(int)(rand() * (ranmax ‑ ranmin + 1) / (1 + RAND̲MAX));che01 = 0;
for(co02 = 1;yama[co02] != 0;++co02){
if(ran01 == yama[co02]){
che01 = 10;break;}}if(che01 == 0){yama[co03] = ran01;++co03;++co01;}}}/////////////////////////////////////////////////‑‑‑‑Pro.3‑‑‑‑10

５行目は最初のカード配りを行う関数 kubari（Pro.4）を呼び出している。 この関数は山札から子、親それぞれの手札にカード番号を渡しカード配りを再現している。 実際のカード配りと同様に、山札の１番目から子の１番目・親の１番目・子の２番目・親の２番目とそれぞれの配列に代入していく。 またこの関数内に出てくる変数 yamano・pcardno・
ccardno は、それぞれ山札と手札の処理を制御する為のもので、変数 yamano は山札配列からカード番号を参照する時に次に参照する配列の番号を現している。 変数 pcardno はプレ
イヤーの手札の配列番号を指定するもので、カード画像を表示する時の表示位置の決定時にも参照される。

変数 ccardno も同様にコンピューターの手札の配列番号を管理している。
/////////////////////////////////////////////////
void kubari(){
void insuit(),innumb(),pmaxsan(),cmaxsan();pcard[1] = yama[1];ccard[1] = yama[2];pcard[2] = yama[3];ccard[2] = yama[4];yamano = 5;//次に引くカードは「山札の５枚目」

pcardno = 3;ccardno = 3;//次に持つ位置は「ｐ、ｃ共に３枚目」

psuit[0] = 2;csuit[0] = 2;//「手札が２枚ある」と言う意味

insuit();innumb();pmaxsan();cmaxsan();}/////////////////////////////////////////////////‑‑‑‑Pro.4‑‑‑‑
上記の関数 kubari 内では、さらに４つの関数 insuit・innumb・pmaxsan・cmaxsan が呼び出されている。
この内、関数 insuit（Pro.5）・innumb（Pro.6）は親と子双方の手札配列に代入されているカード番号からスートと数字を算出し、それを記憶しておく別の配列に代入する役割を持っている。 この両関数は手札が増えたときなどの再計算にも呼び出されている。

両関数を以下に示す。 Pro.5 中に出てくる配列 psuit・csuit に手札のスートが記憶され、Pro.6

11の配列 pnumb・cnumb が数字を記憶する役割を持っている。
/////////////////////////////////////////////////
void insuit(){
int co01;//1:ｽﾍﾟｰﾄﾞ 2:ﾊｰﾄ 3:ﾀﾞｲﾔ 0:ｸﾛｰﾊﾞｰ

for(co01 = 1;pcard[co01] != 0;++co01){
psuit[co01] = pcard[co01] % 4;}
for(co01 = 1;ccard[co01] != 0;++co01){
csuit[co01] = ccard[co01] % 4;}}/////////////////////////////////////////////////‑‑‑‑Pro.5‑‑‑‑/////////////////////////////////////////////////
void innumb(){
int co01;for(co01 = 1;pcard[co01] != 0;++co01){
pnumb[co01] = ((pcard[co01] - 1) / 4) + 1;}
for(co01 = 1;ccard[co01] != 0;++co01){
cnumb[co01] = ((ccard[co01] - 1) / 4) + 1;}}/////////////////////////////////////////////////‑‑‑‑Pro.6‑‑‑‑12

また関数 kubari 中の他方の関数 pmaxsan（Pro.7）・cmaxsan（Pro.8）は、それぞれプレ
イヤーとコンピューターの手札の合計を計算し、配列 pnumb・cnumb の 1 番目の成分に記憶します。

配列 pnumb についての詳細は 1 番目の成分である pnumb[0]に手札の合計が代入され、次の成分 pnumb[1]に手札の１枚目の数字が、pnumb[2]に手札の２枚目の数字がと言う風に手札の数字が代入されるようにしました。
/////////////////////////////////////////////////
void pmaxsan(){int co01;
pnumb[0] = 0;
for(co01 = 1;pnumb[co01] != 0;++co01){
if((pnumb[co01] >= 1) && (pnumb[co01] <= 14)){if(pnumb[co01] == 1){
pnumb[0] += 11;}if((pnumb[co01] >= 2) && (pnumb[co01] <= 10)){
pnumb[0] += pnumb[co01];}if((pnumb[co01] >= 11) && (pnumb[co01] <= 13)){
pnumb[0] += 10;}if(pnumb[co01] == 14){pnumb[0] += 1;}}
else{
AfxMessageBox("!!警告!! 関数 pmaxsan に異常");}}}/////////////////////////////////////////////////‑‑‑‑Pro.7‑‑‑‑/////////////////////////////////////////////////
void cmaxsan(){int co01;

13

cnumb[0] = 0;
for(co01 = 1;cnumb[co01] != 0;++co01){
if((cnumb[co01] >= 1) && (cnumb[co01] <= 14)){if(cnumb[co01] == 1){
cnumb[0] += 11;}if((cnumb[co01] >= 2) && (cnumb[co01] <= 10)){
cnumb[0] += cnumb[co01];}if((cnumb[co01] >= 11) && (cnumb[co01] <= 13)){cnumb[0] += 10;}if(cnumb[co01] == 14){cnumb[0] += 1;}}
else{
AfxMessageBox("!!警告!! 関数 cmaxsan に異常");}}}/////////////////////////////////////////////////‑‑‑‑Pro.8‑‑‑‑次に Pro.1 の６行目の関数 padown（Pro.9）・cadown（Pro.10）の役割は、それぞれプレ
イヤーとコンピューターの手札中の「Ａ」を１１から１に変化させることである。

プレ

イヤーを担当する方の関数 padown で見ると、まずプレイヤーの手札が２１を超えているか
調べ超えていれば次に手札中の「Ａ」の有無を調べる。 そして「Ａ」が在れば１１を１に下げて、すでに解説した関数 pmaxsan を呼び出し合計を再計算する。

一応、再計算後も２１を越えていたらその作業を手札の終わりまで続けるようになっている。
ンピューターの「Ａ」処理を担当する関数 cadown でも同じである。
/////////////////////////////////////////////////
void padown(){
void pmaxsan();int co01;

14

内容はコ

for(co01 = 1;pnumb[0] > 21;++co01){
if(pnumb[co01] == 0){
break;}
if(pnumb[co01] == 1){
pnumb[co01] = 14;}pmaxsan();}}/////////////////////////////////////////////////‑‑‑‑Pro.9‑‑‑‑/////////////////////////////////////////////////
void cadown(){
void cmaxsan();int co01;for(co01 = 1;cnumb[0] > 21;++co01){
if(cnumb[co01] == 0){
break;}
if(cnumb[co01] == 1){
cnumb[co01] = 14;}
cmaxsan();}}/////////////////////////////////////////////////‑‑‑‑Pro.10‑‑‑‑
８行目の関数 Invalidate は、初期の表示のために呼び出される関数です。

この関数については、後で説明する。
１０〜１６行目（Pro.11）は、プログラム実行画面の下側にある３つのメッセージボッ
クス（図 1）にテキストを表示させる部分である。 その内、１行目デバッグ用の表示を行うようになっていて、隠されている親の手札の１枚目をプログラマーに伝える役割を持っている。

通常のゲーム時には、プレイヤーに見せないために１行目はコメントとし、２15

行目のセリフで埋めておく。

１行目を有効にするためには２行目をコメントにしておく必要がある。
/////////////////////////////////////////////////
1/*sprintf(ccfirst,"スートは = %d、数字は = %d",csuit[1],cnumb[1]);*/

2

printf(ccfirst,"ﾃﾞｨｰﾗｰ「さぁ、どうぞ」");3m̲ed2.SetWindowText(ccfirst);

4

sprint(mmaaxx,"プレイヤーの合計点は = %d",pnumb[0]);5m̲ed1.SetWindowText(mmaaxx);

6

sprintf(cmmaaxx,"ディーラーの合計点は = ??");

7m̲ed3.SetWindowText(cmmaaxx);/////////////////////////////////////////////////‑‑‑‑Pro.11‑‑‑‑‑‑‑‑図 1‑‑‑‑
最後に残っている８行目の関数 Invalidate だが、これは別の場所に書いてある最初の表示を行わせる命令（Pro.12）である。
の手札である。

表示内容はゲーム台の表示と最初に配られた２枚

８・９行目はコメントである。

まず１・２行目で表示に必要な宣言をする。
ている。

１行目の m̲land1 は表示スペースを指し

３行目はゲーム台の画像を展開する変数を確保している。

４行目で画像ファ

イル IDB̲LAND1 を３行目で確保した変数内に展開し、５行目でコンピューターが表示のために持っている変数を使えるようにして６行目で画像を展開した変数を表示のために選択している。

そして最後に７行目で選択した画像を場所を X,Y 座標で指定しながら表示の命令をしている。

９行目以降はカードを表示するための記述だが方法はゲーム台を表示したときと同じなので、ここでは割愛する。

16

/////////////////////////////////////////////////
1

CDC* pDC=m̲land1.GetDC();

2

CDC myDC;

3

CBitmap myBMP;

4

myBMP.LoadBitmap(IDB̲LAND1);

5

myDC.CreateCompatibleDC(pDC);

6

myDC.SelectObject(myBMP);

7

pDC->BitBlt(0,0,499,398,&myDC,0,0,SRCCOPY);

8//---------------------------------------

9//ｐ手札１枚目スート表示

10

CBitmap myPSUIT01;

11

int iti01 = 1;

12

if(psuit[iti01] == 1){

13

myPSUIT01.LoadBitmap(IDB̲SSUITS);myDC.SelectObject(myPSUIT01);

14

pDC->BitBlt(22 + (55 * (iti01 - 1)),205,48,68,&myDC,0,0,SRCCOPY);}〜 （中略） 〜

15//ｐ手札１枚目数字表示

16

CBitmap myPNUMB01;

17

if(pnumb[iti01] == 1){

18

myPNUMB01.LoadBitmap(IDB̲SNUMBA);myDC.SelectObject(myPNUMB01);

19

pDC->BitBlt(22 + (55 * (iti01 - 1)),228,48,23,&myDC,0,0,SRCCOPY);}〜 （中略） 〜/////////////////////////////////////////////////‑‑‑‑Pro.12‑‑‑‑
カードの表示はスート画像と数字画像の２種類の画像によって表示されている。

例えば「スペードのＡ」を表示したいとき、「スペード」のスート画像と「Ａ」の数字画像を重ねて表示することによって１枚のカードのように表示することが出来る（図 2）。

この方法によって５２枚のトランプカードを１７の画像（スート４、数字１３）で全て表現することが可能となっている。
（カードの画像としてはもう１枚、カードの裏画像もある（図 2 左上））17

‑‑‑‑図 2‑‑‑‑以上が起動直後に行われる処理である。

４−４−２．「ヒット」時の処理
プレイヤーが「ヒット」ボタンを押したときに処理される内容は、・山札から新しいカード番号をとって、手札に入れる
・新しいカードのスートと数字を算出する
・「バースト」していないかを調べ、「Ａ」処理を行う
・手札の合計を算出する
・手札が２１を超えていたら「バースト」でプレイヤーの負けを表示する
・手札が７枚に達していたら「セブンカード」でプレイヤーの勝ちを表示する
以上の処理が必要となる。

しかし、処理内容は起動直後の処理と同じ事が多く、つまり同じ関数がまた呼び出されているだけなので詳しい説明は割愛する。

18

４−４−３．「スタンド」時の処理
スタンド時の処理として必要なのは、・親、すなわちコンピューターの思考
・カードの表示・結果の判定以上の処理が必要となる。
この内、親の思考は以下（Pro.13）のようになっている。
（21 ページに、フローチャートを付属）/////////////////////////////////////////////////
if(cnumb[0] > pnumb[0]){cisi = 0;}if(cnumb[0] < pnumb[0]){cisi = 1;}
if(cnumb[0] == pnumb[0]){if(sa == 1){//2 の位置↓が、引く確立

if(ckettei[ccardno - 3] <= 2){cisi = 1;}}if(sa == 2){
if(ckettei[ccardno - 3] <= 3){cisi = 1;}}if(sa == 3){
if(ckettei[ccardno - 3] <= 5){cisi = 1;}}if(sa == 4){if(ckettei[ccardno - 3] <= 10){cisi = 1;}}if(sa == 5){if(ckettei[ccardno - 3] <= 20){cisi = 1;}}if(sa == 6){
if(ckettei[ccardno - 3] <= 50){cisi = 1;}}if(sa == 7){
if(ckettei[ccardno - 3] <= 70){cisi = 1;}}if(sa == 8){
if(ckettei[ccardno - 3] <= 85){cisi = 1;}}if(sa == 9){19

if(ckettei[ccardno - 3] <= 93){cisi = 1;}}if(sa == 10){if(ckettei[ccardno - 3] <= 98){cisi = 1;}}if(sa >= 11){cisi = 1;}}/////////////////////////////////////////////////‑‑‑‑Pro.13‑‑‑‑
カードの表示はすでに説明してあるので割愛する。
結果の判定は以下（Pro.14）のように、非常に簡単な物となっている/////////////////////////////////////////////////
if(pnumb[0] > cnumb[0]){AfxMessageBox("貴方の勝ちです");}if(pnumb[0] == cnumb[0]){AfxMessageBox("引き分けです");}if(pnumb[0] < cnumb[0]){AfxMessageBox("貴方の負けです");}/////////////////////////////////////////////////‑‑‑‑Pro.14‑‑‑‑‑

20

５．参考文献
今回の卒業研究を行うにあたって、下記の文献を参考にした。
・新ＶｉｓｕａｌＣ＋＋６.０入門〜スーパービギナー編〜
著者：林

晴比古

（ＳＯＦＴＢＡＮＫ）

・新ＶｉｓｕａｌＣ＋＋６.０入門〜ビギナー編〜
著者：林

晴比古

（ＳＯＦＴＢＡＮＫ）

・初めてのＶｉｓｕａｌＣ＋＋６.０
著者：山地

秀美

21

（技術評論社）

６．付録１

各フローチャート

・起動直後に行われる処理
・「ヒット」時の処理
・「スタンド」時の処理
・親の思考
上記の簡単な流れを、簡単なフローチャートとして表す。

22

起動直後に行われる処理
起動
初期化

配列の初期化用意した配列の全成分に「0」を代入する

山札作成

山札の作成
山札に相当する配列に、ランダムでカード番号を代入
山札配列の成分は２０個あるので、そこにカード番号を入れていく（ただし配列の最後には「0」を残しておきたいので、19回だけ実行する）
代入

変数nに「0」を代入

代入

ランダムなカード番号を山札配列n番目に代入（一番最初は 0番目 である事に注意）

加算

変数nに「1」を足した値を、変数nに入れる

ＮＯ
変数n ＞ 19
ＹＥＳ
カード配り

カード配り
山札配列からカード番号を親、子それぞれの手札配列へ
順番に２枚ずつ代入
代入

山札配列０番目→子手札配列０番目

代入

山札配列１番目→親手札配列０番目

代入

山札配列２番目→子手札配列１番目

代入

山札配列３番目→親手札配列１番目

算出

親、子双方の手札配列のカード番号からそれぞれのスートと数字を算出する

台
表示

ゲーム台を表示
ゲーム台となる画像を表示スペースに表示する

カード
表示

カードを表示
スート画像と数字画像を合わせて表示する
スート画像を手札の表示スペースに表示
数字画像を直前に表示したスート画像に重ねて表示

待機プレイヤーが「ボタン」をクリックするまで待機プレイヤーが「ヒット」したときに行われる処理「ヒット」ボタンをクリック
山札配列から新しいカード番号を子の手札配列に代入する

代入

新しいカード番号を子の手札配列に代入

算出

親、子双方の手札配列のカード番号からそれぞれのスートと数字を算出する
子の新しいカードを表示する「Ａ」の処理を行う

算出

ＮＯ

子の手札の合計を算出する

子の手札の合計 ＞ 21
ＹＥＳ
「Ａ」はあるか？
ＹＥＳ
ＮＯ「Ａ」を１つ、「11」→「1」にする
算出

ＹＥＳ

手札の合計を算出する

子の手札の合計 ＞ 21
ＮＯ

「バースト」の処理を行う

子の手札の合計 ＞ 21
ＹＥＳ
ＮＯ
表示

貴方の負けです「セブンカード」の処理を行う

子の手札の枚数 ＞ ７

表示

待機

貴方の勝ちです

プレイヤーが「ボタン」をクリックするまで待機プレイヤーが「スタンド」したときに行われる処理「スタンド」ボタンをクリック
親の１枚目の手札を公開する

親の思考「ヒット」か「スタンド」かを決定（親の思考フローチャート参照）「ヒット」する？
ＹＥＳ
山札配列から新しいカード番号を子の手札配列に代入しカードを表示する
この処理は基本的に子の時（「ヒット」時）と同じ「Ａ」の処理を行う
この処理は基本的に子の時（「ヒット」時）と同じ「バースト」の処理を行う
この処理は基本的に子の時（「ヒット」時）と同じ「セブンカード」の処理を行う
この処理は基本的に子の時（「ヒット」時）と同じ結果の判定を行う

貴方の勝ちですＮＯ

子の手札 ＞ 親の手札表示
ＹＥＳ

引き分けですＮＯ

子の手札 ＝ 親の手札表示
ＹＥＳ

貴方の負けですＮＯ

子の手札 ＜ 親の手札表示
ＹＥＳ

理論上、このＮＯは在り得ない
終了

親の思考

判定

親の手札 ＞ 子の手札 （つまり勝っている）
スタンドする （もうカードを引かない）
ＹＥＳ

ＮＯ
判定

親の手札 ＜ 子の手札 （つまり負けている）
ヒットする （次のカードを引いて、手札に加える）
ＹＥＳ

ＮＯ
判定
ＮＯ

親の手札 ＝ 子の手札 （引き分け状態）
差
手札（親）と21との差を考慮
ＹＥＳ
差が「1」
ＹＥＳ
２％の確率でヒットする
ＮＯ
差が「2」
ＹＥＳ
３％の確率でヒットする
ＮＯ
差が「3」
ＹＥＳ
５％の確率でヒットする
ＮＯ
差が「4」
ＹＥＳ
10％の確率でヒットする
ＮＯ
差が「5」
ＹＥＳ
20％の確率でヒットする
ＮＯ
差が「6」
ＹＥＳ
50％の確率でヒットする
ＮＯ
差が「7」
ＹＥＳ
70％の確率でヒットする
ＮＯ
差が「8」
ＹＥＳ
85％の確率でヒットする
ＮＯ
差が「9」
ＹＥＳ
93％の確率でヒットするＮＯ
差が「10」 ＹＥＳ
98％の確率でヒットするＮＯ
差が「11」 ＹＥＳ
ヒットする
ＮＯ

理論上、このＮＯは在り得ない７．付録２

プログラムリスト BJver100Dlg.cpp

今回作成したプログラムのリストを付録としてつけます。

論文中では書けなかったそ

れぞれの関数の位置などを、このリストによって補完できればと思います。

27

// BJver100Dlg.cpp : インプリメンテーション ファイル//#include "stdafx.h"#include "BJver100.h"#include "BJver100Dlg.h"#ifdef ̲DEBUG#define new DEBUG̲NEW#undef THIS̲FILE
static char THIS̲FILE[] = ̲̲FILE̲̲;#endif//===============================================
int ran01,yamano,pcardno,ccardno,cisi;char ccfirst[50],mmaaxx[50],cmmaaxx[50];const int yamamax = 20,havemax = 10;
int yama[yamamax];
int pcard[havemax];
int ccard[havemax];
int psuit[havemax];
int csuit[havemax];
int pnumb[havemax];//[0]:手札合計点 [1]〜[havemax]:手札の数字
int cnumb[havemax];//[0]:手札合計点 [1]〜[havemax]:手札の数字
int ckettei[havemax];//親の判断//===============================================/////////////////////////////////////////////////////////////////////////////// アプリケーションのバージョン情報で使われている CAboutDlg ダイアログ
class CAboutDlg : public CDialog{
public:CAboutDlg();// ダイアログ データ//{{AFX̲DATA(CAboutDlg)
enum { IDD = IDD̲ABOUTBOX };//}}AFX̲DATA// ClassWizard は仮想関数のオーバーライドを生成します//{{AFX̲VIRTUAL(CAboutDlg)
protected:
virtual void DoDataExchange(CDataExchange* pDX);// DDX/DDV のサポート//}}AFX̲VIRTUAL// インプリメンテーション
protected://{{AFX̲MSG(CAboutDlg)//}}AFX̲MSGDECLARE̲MESSAGE̲MAP()};
CAboutDlg::CAboutDlg() : CDialog(CAboutDlg::IDD){//{{AFX̲DATA̲INIT(CAboutDlg)//}}AFX̲DATA̲INIT}

1

void CAboutDlg::DoDataExchange(CDataExchange* pDX){
CDialog::DoDataExchange(pDX);//{{AFX̲DATA̲MAP(CAboutDlg)//}}AFX̲DATA̲MAP}
BEGIN̲MESSAGE̲MAP(CAboutDlg, CDialog)//{{AFX̲MSG̲MAP(CAboutDlg)// メッセージ ハンドラがありません。
//}}AFX̲MSG̲MAP
END̲MESSAGE̲MAP()/////////////////////////////////////////////////////////////////////////////// CBJver100Dlg ダイアログ
CBJver100Dlg::CBJver100Dlg(CWnd* pParent /*=NULL*/): CDialog(CBJver100Dlg::IDD, pParent){//{{AFX̲DATA̲INIT(CBJver100Dlg)// メモ: この位置に ClassWizard によってメンバの初期化が追加されます。
//}}AFX̲DATA̲INIT// メモ: LoadIcon は Win32 の DestroyIcon のサブシーケンスを要求しません。
m̲hIcon = AfxGetApp()‑>LoadIcon(IDR̲MAINFRAME);}
void CBJver100Dlg::DoDataExchange(CDataExchange* pDX){
CDialog::DoDataExchange(pDX);//{{AFX̲DATA̲MAP(CBJver100Dlg)
DDX̲Control(pDX, IDC̲EDIT3, m̲ed3);
DDX̲Control(pDX, IDC̲EDIT2, m̲ed2);
DDX̲Control(pDX, IDC̲EDIT1, m̲ed1);
DDX̲Control(pDX, IDC̲LAND1, m̲land1);//}}AFX̲DATA̲MAP}
BEGIN̲MESSAGE̲MAP(CBJver100Dlg, CDialog)//{{AFX̲MSG̲MAP(CBJver100Dlg)
ON̲WM̲SYSCOMMAND()ON̲WM̲PAINT()
ON̲WM̲QUERYDRAGICON()
ON̲BN̲CLICKED(IDC̲BHIT, OnBhit)
ON̲BN̲CLICKED(IDC̲BSTAND, OnBstand)//}}AFX̲MSG̲MAP
END̲MESSAGE̲MAP()/////////////////////////////////////////////////////////////////////////////// CBJver100Dlg メッセージ ハンドラ
BOOL CBJver100Dlg::OnInitDialog(){
CDialog::OnInitDialog();// "バージョン情報..." メニュー項目をシステム メニューへ追加します。
// IDM̲ABOUTBOX はコマンド メニューの範囲でなければなりません。
ASSERT((IDM̲ABOUTBOX & 0xFFF0) == IDM̲ABOUTBOX);ASSERT(IDM̲ABOUTBOX < 0xF000);2CMenu* pSysMenu = GetSystemMenu(FALSE);
if (pSysMenu != NULL){
CString strAboutMenu;
strAboutMenu.LoadString(IDS̲ABOUTBOX);if (!strAboutMenu.IsEmpty()){
pSysMenu‑>AppendMenu(MF̲SEPARATOR);
pSysMenu‑>AppendMenu(MF̲STRING, IDM̲ABOUTBOX, strAboutMenu);}}// このダイアログ用のアイコンを設定します。フレームワークはアプリケーショ
ンのメイン// ウィンドウがダイアログでない時は自動的に設定しません。
SetIcon(m̲hIcon, TRUE);// 大きいアイコンを設定
SetIcon(m̲hIcon, FALSE);// 小さいアイコンを設定// TODO: 特別な初期化を行う時はこの場所に追加してください。
//===========================================
void syokika(),yamaran(),kubari(),padown(),cadown();

/*
c
c
c

syokika();yamaran();kubari();//子関数:innumb(),insuit(),pmaxsan(),cmaxsan()padown();cadown();//《処理》手札が｢Ａ｣｢Ａ｣の時の11→1//《処理》親手札のＢＪ判定//《処理》子手札のＢＪ判定（親がＢＪなら）//‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑
Invalidate();//OnPaint↓に飛ぶ//‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑
sprintf(ccfirst,"スートは = %d、数字は = %d",csuit[1],cnumb[1]);*///

sprintf(ccfirst,"ﾃﾞｨｰﾗｰ「さぁ、どうぞ」");//

m̲ed2.SetWindowText(ccfirst);//

sprintf(mmaaxx,"プレイヤーの合計点は = %d",pnumb[0]);m̲ed1.SetWindowText(mmaaxx);
sprintf(cmmaaxx,"ディーラーの合計点は = ??");m̲ed3.SetWindowText(cmmaaxx);//===========================================ん。
}

return TRUE;

//c
//c

//c
//c

// TRUE を返すとコントロールに設定したフォーカスは失われませvoid CBJver100Dlg::OnSysCommand(UINT nID, LPARAM lParam){if ((nID & 0xFFF0) == IDM̲ABOUTBOX){
CAboutDlg dlgAbout;
dlgAbout.DoModal();
}
else
{
3

}

}

CDialog::OnSysCommand(nID, lParam);// もしダイアログボックスに最小化ボタンを追加するならば、アイコンを描画する// コードを以下に記述する必要があります。MFC アプリケーションは document/view// モデルを使っているので、この処理はフレームワークにより自動的に処理されます。
void CBJver100Dlg::OnPaint(){
if (IsIconic()){
CPaintDC dc(this); // 描画用のデバイス コンテキスト
SendMessage(WM̲ICONERASEBKGND, (WPARAM) dc.GetSafeHdc(), 0);// クライアントの矩形領域内の中央
int cxIcon = GetSystemMetrics(SM̲CXICON);
int cyIcon = GetSystemMetrics(SM̲CYICON);
CRect rect;
GetClientRect(&rect);
int x = (rect.Width() ‑ cxIcon + 1) / 2;
int y = (rect.Height() ‑ cyIcon + 1) / 2;

}
else
{

// アイコンを描画します。
dc.DrawIcon(x, y, m̲hIcon);

CDialog::OnPaint();//=======================================//台表示
CDC* pDC=m̲land1.GetDC();
CDC myDC;
CBitmap myBMP;
myBMP.LoadBitmap(IDB̲LAND1);
myDC.CreateCompatibleDC(pDC);
myDC.SelectObject(myBMP);
pDC‑>BitBlt(0,0,499,398,&myDC,0,0,SRCCOPY);//‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑//ｐ手札１枚目スート表示
CBitmap myPSUIT01;
int iti01 = 1;
if(psuit[iti01] == 1){
myPSUIT01.LoadBitmap(IDB̲SSUITS);myDC.SelectObject(myPSUIT01);
pDC‑>BitBlt(22 + (55 * (iti01 ‑ 1)),205,48,68,&myDC,0,0,SRCCOPY);}
if(psuit[iti01] == 2){
myPSUIT01.LoadBitmap(IDB̲SSUITH);myDC.SelectObject(myPSUIT01);
pDC‑>BitBlt(22 + (55 * (iti01 ‑ 1)),205,48,68,&myDC,0,0,SRCCOPY);}
if(psuit[iti01] == 3){
myPSUIT01.LoadBitmap(IDB̲SSUITD);myDC.SelectObject(myPSUIT01);
pDC‑>BitBlt(22 + (55 * (iti01 ‑ 1)),205,48,68,&myDC,0,0,SRCCOPY);}
if(psuit[iti01] == 0){
myPSUIT01.LoadBitmap(IDB̲SSUITC);myDC.SelectObject(myPSUIT01);
pDC‑>BitBlt(22 + (55 * (iti01 ‑ 1)),205,48,68,&myDC,0,0,SRCCOPY);}4

if(psuit[iti01] != 1 && psuit[iti01] != 2 && psuit[iti01] != 3 && psuit[iti01] != 0){
myPSUIT01.LoadBitmap(IDB̲RCARD);myDC.SelectObject(myPSUIT01);
pDC‑>BitBlt(22 + (55 * (iti01 ‑ 1)),205,48,68,&myDC,0,0,SRCCOPY);}//ｐ手札１枚目数字表示
CBitmap myPNUMB01;
if(pnumb[iti01] == 1){
myPNUMB01.LoadBitmap(IDB̲SNUMBA);myDC.SelectObject(myPNUMB01);
pDC‑>BitBlt(22 + (55 * (iti01 ‑ 1)),228,48,23,&myDC,0,0,SRCCOPY);}
if(pnumb[iti01] == 2){
myPNUMB01.LoadBitmap(IDB̲SNUMB2);myDC.SelectObject(myPNUMB01);
pDC‑>BitBlt(22 + (55 * (iti01 ‑ 1)),228,48,23,&myDC,0,0,SRCCOPY);}
if(pnumb[iti01] == 3){
myPNUMB01.LoadBitmap(IDB̲SNUMB3);myDC.SelectObject(myPNUMB01);
pDC‑>BitBlt(22 + (55 * (iti01 ‑ 1)),228,48,23,&myDC,0,0,SRCCOPY);}
if(pnumb[iti01] == 4){
myPNUMB01.LoadBitmap(IDB̲SNUMB4);myDC.SelectObject(myPNUMB01);
pDC‑>BitBlt(22 + (55 * (iti01 ‑ 1)),228,48,23,&myDC,0,0,SRCCOPY);}
if(pnumb[iti01] == 5){
myPNUMB01.LoadBitmap(IDB̲SNUMB5);myDC.SelectObject(myPNUMB01);
pDC‑>BitBlt(22 + (55 * (iti01 ‑ 1)),228,48,23,&myDC,0,0,SRCCOPY);}
if(pnumb[iti01] == 6){
myPNUMB01.LoadBitmap(IDB̲SNUMB6);myDC.SelectObject(myPNUMB01);
pDC‑>BitBlt(22 + (55 * (iti01 ‑ 1)),228,48,23,&myDC,0,0,SRCCOPY);}
if(pnumb[iti01] == 7){
myPNUMB01.LoadBitmap(IDB̲SNUMB7);myDC.SelectObject(myPNUMB01);
pDC‑>BitBlt(22 + (55 * (iti01 ‑ 1)),228,48,23,&myDC,0,0,SRCCOPY);}
if(pnumb[iti01] == 8){
myPNUMB01.LoadBitmap(IDB̲SNUMB8);myDC.SelectObject(myPNUMB01);
pDC‑>BitBlt(22 + (55 * (iti01 ‑ 1)),228,48,23,&myDC,0,0,SRCCOPY);}
if(pnumb[iti01] == 9){
myPNUMB01.LoadBitmap(IDB̲SNUMB9);myDC.SelectObject(myPNUMB01);
pDC‑>BitBlt(22 + (55 * (iti01 ‑ 1)),228,48,23,&myDC,0,0,SRCCOPY);}
if(pnumb[iti01] == 10){
myPNUMB01.LoadBitmap(IDB̲SNUMB10);myDC.SelectObject(myPNUMB01);
pDC‑>BitBlt(22 + (55 * (iti01 ‑ 1)),228,48,23,&myDC,0,0,SRCCOPY);}
if(pnumb[iti01] == 11){
myPNUMB01.LoadBitmap(IDB̲SNUMBJ);myDC.SelectObject(myPNUMB01);
pDC‑>BitBlt(22 + (55 * (iti01 ‑ 1)),228,48,23,&myDC,0,0,SRCCOPY);}
if(pnumb[iti01] == 12){
myPNUMB01.LoadBitmap(IDB̲SNUMBQ);myDC.SelectObject(myPNUMB01);
pDC‑>BitBlt(22 + (55 * (iti01 ‑ 1)),228,48,23,&myDC,0,0,SRCCOPY);}
if(pnumb[iti01] == 13){
myPNUMB01.LoadBitmap(IDB̲SNUMBK);myDC.SelectObject(myPNUMB01);
pDC‑>BitBlt(22 + (55 * (iti01 ‑ 1)),228,48,23,&myDC,0,0,SRCCOPY);}//ｃ手札１枚目表示（裏面）
CBitmap myCSUIT01;
iti01 = 1;
myCSUIT01.LoadBitmap(IDB̲RCARD);myDC.SelectObject(myCSUIT01);
pDC‑>BitBlt(90 + (55 * (iti01 ‑ 1)),55,48,68,&myDC,0,0,SRCCOPY);//ｐ手札２枚目スート表示
CBitmap myPSUIT02;
iti01 = 2;
if(psuit[iti01] == 1){
myPSUIT02.LoadBitmap(IDB̲SSUITS);myDC.SelectObject(myPSUIT02);
pDC‑>BitBlt(22 + (55 * (iti01 ‑ 1)),205,48,68,&myDC,0,0,SRCCOPY);}
if(psuit[iti01] == 2){
myPSUIT02.LoadBitmap(IDB̲SSUITH);myDC.SelectObject(myPSUIT02);
pDC‑>BitBlt(22 + (55 * (iti01 ‑ 1)),205,48,68,&myDC,0,0,SRCCOPY);}5

if(psuit[iti01] == 3){
myPSUIT02.LoadBitmap(IDB̲SSUITD);myDC.SelectObject(myPSUIT02);
pDC‑>BitBlt(22 + (55 * (iti01 ‑ 1)),205,48,68,&myDC,0,0,SRCCOPY);}
if(psuit[iti01] == 0){
myPSUIT02.LoadBitmap(IDB̲SSUITC);myDC.SelectObject(myPSUIT02);
pDC‑>BitBlt(22 + (55 * (iti01 ‑ 1)),205,48,68,&myDC,0,0,SRCCOPY);}
if(psuit[iti01] != 1 && psuit[iti01] != 2 && psuit[iti01] != 3 && psuit[iti01] != 0){
myPSUIT02.LoadBitmap(IDB̲RCARD);myDC.SelectObject(myPSUIT02);
pDC‑>BitBlt(22 + (55 * (iti01 ‑ 1)),205,48,68,&myDC,0,0,SRCCOPY);}//ｐ手札２枚目数字表示
CBitmap myPNUMB02;
if(pnumb[iti01] == 1){
myPNUMB02.LoadBitmap(IDB̲SNUMBA);myDC.SelectObject(myPNUMB02);
pDC‑>BitBlt(22 + (55 * (iti01 ‑ 1)),228,48,23,&myDC,0,0,SRCCOPY);}
if(pnumb[iti01] == 2){
myPNUMB02.LoadBitmap(IDB̲SNUMB2);myDC.SelectObject(myPNUMB02);
pDC‑>BitBlt(22 + (55 * (iti01 ‑ 1)),228,48,23,&myDC,0,0,SRCCOPY);}
if(pnumb[iti01] == 3){
myPNUMB02.LoadBitmap(IDB̲SNUMB3);myDC.SelectObject(myPNUMB02);
pDC‑>BitBlt(22 + (55 * (iti01 ‑ 1)),228,48,23,&myDC,0,0,SRCCOPY);}
if(pnumb[iti01] == 4){
myPNUMB02.LoadBitmap(IDB̲SNUMB4);myDC.SelectObject(myPNUMB02);
pDC‑>BitBlt(22 + (55 * (iti01 ‑ 1)),228,48,23,&myDC,0,0,SRCCOPY);}
if(pnumb[iti01] == 5){
myPNUMB02.LoadBitmap(IDB̲SNUMB5);myDC.SelectObject(myPNUMB02);
pDC‑>BitBlt(22 + (55 * (iti01 ‑ 1)),228,48,23,&myDC,0,0,SRCCOPY);}
if(pnumb[iti01] == 6){
myPNUMB02.LoadBitmap(IDB̲SNUMB6);myDC.SelectObject(myPNUMB02);
pDC‑>BitBlt(22 + (55 * (iti01 ‑ 1)),228,48,23,&myDC,0,0,SRCCOPY);}
if(pnumb[iti01] == 7){
myPNUMB02.LoadBitmap(IDB̲SNUMB7);myDC.SelectObject(myPNUMB02);
pDC‑>BitBlt(22 + (55 * (iti01 ‑ 1)),228,48,23,&myDC,0,0,SRCCOPY);}
if(pnumb[iti01] == 8){
myPNUMB02.LoadBitmap(IDB̲SNUMB8);myDC.SelectObject(myPNUMB02);
pDC‑>BitBlt(22 + (55 * (iti01 ‑ 1)),228,48,23,&myDC,0,0,SRCCOPY);}
if(pnumb[iti01] == 9){
myPNUMB02.LoadBitmap(IDB̲SNUMB9);myDC.SelectObject(myPNUMB02);
pDC‑>BitBlt(22 + (55 * (iti01 ‑ 1)),228,48,23,&myDC,0,0,SRCCOPY);}
if(pnumb[iti01] == 10){
myPNUMB02.LoadBitmap(IDB̲SNUMB10);myDC.SelectObject(myPNUMB02);
pDC‑>BitBlt(22 + (55 * (iti01 ‑ 1)),228,48,23,&myDC,0,0,SRCCOPY);}
if(pnumb[iti01] == 11){
myPNUMB02.LoadBitmap(IDB̲SNUMBJ);myDC.SelectObject(myPNUMB02);
pDC‑>BitBlt(22 + (55 * (iti01 ‑ 1)),228,48,23,&myDC,0,0,SRCCOPY);}
if(pnumb[iti01] == 12){
myPNUMB02.LoadBitmap(IDB̲SNUMBQ);myDC.SelectObject(myPNUMB02);
pDC‑>BitBlt(22 + (55 * (iti01 ‑ 1)),228,48,23,&myDC,0,0,SRCCOPY);}
if(pnumb[iti01] == 13){
myPNUMB02.LoadBitmap(IDB̲SNUMBK);myDC.SelectObject(myPNUMB02);
pDC‑>BitBlt(22 + (55 * (iti01 ‑ 1)),228,48,23,&myDC,0,0,SRCCOPY);}//ｃ手札２枚目スート表示
CBitmap myCSUIT02;
iti01 = 2;
if(csuit[iti01] == 1){
myCSUIT02.LoadBitmap(IDB̲SSUITS);myDC.SelectObject(myCSUIT02);
pDC‑>BitBlt(90 + (55 * (iti01 ‑ 1)),55,48,68,&myDC,0,0,SRCCOPY);}
if(csuit[iti01] == 2){
myCSUIT02.LoadBitmap(IDB̲SSUITH);myDC.SelectObject(myCSUIT02);
6

pDC‑>BitBlt(90 + (55 * (iti01 ‑ 1)),55,48,68,&myDC,0,0,SRCCOPY);}
if(csuit[iti01] == 3){
myCSUIT02.LoadBitmap(IDB̲SSUITD);myDC.SelectObject(myCSUIT02);
pDC‑>BitBlt(90 + (55 * (iti01 ‑ 1)),55,48,68,&myDC,0,0,SRCCOPY);}
if(csuit[iti01] == 0){
myCSUIT02.LoadBitmap(IDB̲SSUITC);myDC.SelectObject(myCSUIT02);
pDC‑>BitBlt(90 + (55 * (iti01 ‑ 1)),55,48,68,&myDC,0,0,SRCCOPY);}
if(csuit[iti01] != 1 && csuit[iti01] != 2 && csuit[iti01] != 3 && csuit[iti01] != 0){
myCSUIT02.LoadBitmap(IDB̲RCARD);myDC.SelectObject(myCSUIT02);
pDC‑>BitBlt(90 + (55 * (iti01 ‑ 1)),55,48,68,&myDC,0,0,SRCCOPY);}//ｃ手札２枚目数字表示
CBitmap myCNUMB02;
if(cnumb[iti01] == 1){
myCNUMB02.LoadBitmap(IDB̲SNUMBA);myDC.SelectObject(myCNUMB02);
pDC‑>BitBlt(90 + (55 * (iti01 ‑ 1)),78,48,23,&myDC,0,0,SRCCOPY);}
if(cnumb[iti01] == 2){
myCNUMB02.LoadBitmap(IDB̲SNUMB2);myDC.SelectObject(myCNUMB02);
pDC‑>BitBlt(90 + (55 * (iti01 ‑ 1)),78,48,23,&myDC,0,0,SRCCOPY);}
if(cnumb[iti01] == 3){
myCNUMB02.LoadBitmap(IDB̲SNUMB3);myDC.SelectObject(myCNUMB02);
pDC‑>BitBlt(90 + (55 * (iti01 ‑ 1)),78,48,23,&myDC,0,0,SRCCOPY);}
if(cnumb[iti01] == 4){
myCNUMB02.LoadBitmap(IDB̲SNUMB4);myDC.SelectObject(myCNUMB02);
pDC‑>BitBlt(90 + (55 * (iti01 ‑ 1)),78,48,23,&myDC,0,0,SRCCOPY);}
if(cnumb[iti01] == 5){
myCNUMB02.LoadBitmap(IDB̲SNUMB5);myDC.SelectObject(myCNUMB02);
pDC‑>BitBlt(90 + (55 * (iti01 ‑ 1)),78,48,23,&myDC,0,0,SRCCOPY);}
if(cnumb[iti01] == 6){
myCNUMB02.LoadBitmap(IDB̲SNUMB6);myDC.SelectObject(myCNUMB02);
pDC‑>BitBlt(90 + (55 * (iti01 ‑ 1)),78,48,23,&myDC,0,0,SRCCOPY);}
if(cnumb[iti01] == 7){
myCNUMB02.LoadBitmap(IDB̲SNUMB7);myDC.SelectObject(myCNUMB02);
pDC‑>BitBlt(90 + (55 * (iti01 ‑ 1)),78,48,23,&myDC,0,0,SRCCOPY);}
if(cnumb[iti01] == 8){
myCNUMB02.LoadBitmap(IDB̲SNUMB8);myDC.SelectObject(myCNUMB02);
pDC‑>BitBlt(90 + (55 * (iti01 ‑ 1)),78,48,23,&myDC,0,0,SRCCOPY);}
if(cnumb[iti01] == 9){
myCNUMB02.LoadBitmap(IDB̲SNUMB9);myDC.SelectObject(myCNUMB02);
pDC‑>BitBlt(90 + (55 * (iti01 ‑ 1)),78,48,23,&myDC,0,0,SRCCOPY);}
if(cnumb[iti01] == 10){
myCNUMB02.LoadBitmap(IDB̲SNUMB10);myDC.SelectObject(myCNUMB02);
pDC‑>BitBlt(90 + (55 * (iti01 ‑ 1)),78,48,23,&myDC,0,0,SRCCOPY);}
if(cnumb[iti01] == 11){
myCNUMB02.LoadBitmap(IDB̲SNUMBJ);myDC.SelectObject(myCNUMB02);
pDC‑>BitBlt(90 + (55 * (iti01 ‑ 1)),78,48,23,&myDC,0,0,SRCCOPY);}
if(cnumb[iti01] == 12){
myCNUMB02.LoadBitmap(IDB̲SNUMBQ);myDC.SelectObject(myCNUMB02);
pDC‑>BitBlt(90 + (55 * (iti01 ‑ 1)),78,48,23,&myDC,0,0,SRCCOPY);}
if(cnumb[iti01] == 13){
myCNUMB02.LoadBitmap(IDB̲SNUMBK);myDC.SelectObject(myCNUMB02);
pDC‑>BitBlt(90 + (55 * (iti01 ‑ 1)),78,48,23,&myDC,0,0,SRCCOPY);}//=======================================}}// システムは、ユーザーが最小化ウィンドウをドラッグしている間、// カーソルを表示するためにここを呼び出します。
HCURSOR CBJver100Dlg::OnQueryDragIcon()7

{}return (HCURSOR) m̲hIcon;
void syokika(){//===========================
int co01;for(co01 = 0;co01 < yamamax;++co01){
yama[co01] = 0;}
for(co01 = 0;co01 < havemax;++co01){
pcard[co01] = 0;
ccard[co01] = 0;
psuit[co01] = 0;
csuit[co01] = 0;
pnumb[co01] = 0;
cnumb[co01] = 0;ckettei[co01] = 0;}}
void yamaran(){//===========================
int rand();int ranmax = 52,ranmin = 1;
int che01 = 0;
int co01,co02,co03 = 1;
srand((unsigned int)time(0)););}

rand();
for(co01 = 1;co01 < yamamax ‑ 1;){
ran01 = ranmin + (int)(rand() * (ranmax ‑ ranmin + 1) / (1 + RAND̲MAX)}

che01 = 0;
for(co02 = 1;yama[co02] != 0;++co02){
if(ran01 == yama[co02]){
che01 = 10;break;}}if(che01 == 0){yama[co03] = ran01;++co03;++co01;}

void kubari(){//===========================
void insuit(),innumb(),pmaxsan(),cmaxsan();pcard[1] = yama[1];ccard[1] = yama[2];pcard[2] = yama[3];ccard[2] = yama[4];yamano = 5;//次に引くカードは「山札の５枚目」
pcardno = 3;ccardno = 3;//次に持つ位置は「ｐ、ｃ共に３枚目」
psuit[0] = 2;csuit[0] = 2;//「手札が２枚ある」と言う意味}

insuit();innumb();pmaxsan();cmaxsan();8

void insuit(){
int co01;}for(co01 = 1;pcard[co01] != 0;++co01){
psuit[co01] = pcard[co01] % 4;}
for(co01 = 1;ccard[co01] != 0;++co01){
csuit[co01] = ccard[co01] % 4;}
void innumb(){
int co01;}//===========================

for(co01 = 1;pcard[co01] != 0;++co01){
pnumb[co01] = ((pcard[co01] ‑ 1) / 4) + 1;}
for(co01 = 1;ccard[co01] != 0;++co01){
cnumb[co01] = ((ccard[co01] ‑ 1) / 4) + 1;}
void pmaxsan(){int co01;}//===========================//1:ｽﾍﾟｰﾄﾞ 2:ﾊｰﾄ 3:ﾀﾞｲﾔ 0:ｸﾛｰﾊﾞｰ//===========================

pnumb[0] = 0;
for(co01 = 1;pnumb[co01] != 0;++co01){
if((pnumb[co01] >= 1) && (pnumb[co01] <= 14)){if(pnumb[co01] == 1){
pnumb[0] += 11;}if((pnumb[co01] >= 2) && (pnumb[co01] <= 10)){
pnumb[0] += pnumb[co01];}if((pnumb[co01] >= 11) && (pnumb[co01] <= 13)){
pnumb[0] += 10;}if(pnumb[co01] == 14){pnumb[0] += 1;}}
else{
AfxMessageBox("!!警告!! 関数pmaxsanに異常");}}void cmaxsan(){int co01;//===========================

cnumb[0] = 0;
for(co01 = 1;cnumb[co01] != 0;++co01){
if((cnumb[co01] >= 1) && (cnumb[co01] <= 14)){if(cnumb[co01] == 1){
cnumb[0] += 11;}if((cnumb[co01] >= 2) && (cnumb[co01] <= 10)){
cnumb[0] += cnumb[co01];}if((cnumb[co01] >= 11) && (cnumb[co01] <= 13)){cnumb[0] += 10;}if(cnumb[co01] == 14){cnumb[0] += 1;}
}
else{
9

}

}

AfxMessageBox("!!警告!! 関数cmaxsanに異常");}void CBJver100Dlg::OnBhit(){// TODO: この位置にコントロール通知ハンドラ用のコードを追加してください//===========================================
void insuit(),innumb(),padown();
pcard[pcardno] = yama[yamano];insuit();innumb();//ｐ手札３枚目以降スート表示
CDC* pDC=m̲land1.GetDC();
CDC myDC;
myDC.CreateCompatibleDC(pDC);
CBitmap myPSUIT03;if(psuit[pcardno] == 1){
myPSUIT03.LoadBitmap(IDB̲SSUITS);myDC.SelectObject(myPSUIT03);
pDC‑>BitBlt(22 + (55 * (pcardno ‑ 1)),205,48,68,&myDC,0,0,SRCCOPY);}
if(psuit[pcardno] == 2){
myPSUIT03.LoadBitmap(IDB̲SSUITH);myDC.SelectObject(myPSUIT03);
pDC‑>BitBlt(22 + (55 * (pcardno ‑ 1)),205,48,68,&myDC,0,0,SRCCOPY);}
if(psuit[pcardno] == 3){
myPSUIT03.LoadBitmap(IDB̲SSUITD);myDC.SelectObject(myPSUIT03);
pDC‑>BitBlt(22 + (55 * (pcardno ‑ 1)),205,48,68,&myDC,0,0,SRCCOPY);}
if(psuit[pcardno] == 0){
myPSUIT03.LoadBitmap(IDB̲SSUITC);myDC.SelectObject(myPSUIT03);
pDC‑>BitBlt(22 + (55 * (pcardno ‑ 1)),205,48,68,&myDC,0,0,SRCCOPY);}
if(psuit[pcardno] != 1 && psuit[pcardno] != 2 && psuit[pcardno] != 3 && psuit[pcardno] != 0){
myPSUIT03.LoadBitmap(IDB̲RCARD);myDC.SelectObject(myPSUIT03);
pDC‑>BitBlt(22 + (55 * (pcardno ‑ 1)),205,48,68,&myDC,0,0,SRCCOPY);}//ｐ手札３枚目以降数字表示
CBitmap myPNUMB03;
if(pnumb[pcardno] == 1){
myPNUMB03.LoadBitmap(IDB̲SNUMBA);myDC.SelectObject(myPNUMB03);
pDC‑>BitBlt(22 + (55 * (pcardno ‑ 1)),228,48,23,&myDC,0,0,SRCCOPY);}
if(pnumb[pcardno] == 2){
myPNUMB03.LoadBitmap(IDB̲SNUMB2);myDC.SelectObject(myPNUMB03);
pDC‑>BitBlt(22 + (55 * (pcardno ‑ 1)),228,48,23,&myDC,0,0,SRCCOPY);}
if(pnumb[pcardno] == 3){
myPNUMB03.LoadBitmap(IDB̲SNUMB3);myDC.SelectObject(myPNUMB03);
pDC‑>BitBlt(22 + (55 * (pcardno ‑ 1)),228,48,23,&myDC,0,0,SRCCOPY);}
if(pnumb[pcardno] == 4){
myPNUMB03.LoadBitmap(IDB̲SNUMB4);myDC.SelectObject(myPNUMB03);
pDC‑>BitBlt(22 + (55 * (pcardno ‑ 1)),228,48,23,&myDC,0,0,SRCCOPY);}
if(pnumb[pcardno] == 5){
myPNUMB03.LoadBitmap(IDB̲SNUMB5);myDC.SelectObject(myPNUMB03);
pDC‑>BitBlt(22 + (55 * (pcardno ‑ 1)),228,48,23,&myDC,0,0,SRCCOPY);}
if(pnumb[pcardno] == 6){
myPNUMB03.LoadBitmap(IDB̲SNUMB6);myDC.SelectObject(myPNUMB03);
pDC‑>BitBlt(22 + (55 * (pcardno ‑ 1)),228,48,23,&myDC,0,0,SRCCOPY);}
if(pnumb[pcardno] == 7){
myPNUMB03.LoadBitmap(IDB̲SNUMB7);myDC.SelectObject(myPNUMB03);
pDC‑>BitBlt(22 + (55 * (pcardno ‑ 1)),228,48,23,&myDC,0,0,SRCCOPY);}
if(pnumb[pcardno] == 8){10

myPNUMB03.LoadBitmap(IDB̲SNUMB8);myDC.SelectObject(myPNUMB03);
pDC‑>BitBlt(22 + (55 * (pcardno ‑ 1)),228,48,23,&myDC,0,0,SRCCOPY);}
if(pnumb[pcardno] == 9){
myPNUMB03.LoadBitmap(IDB̲SNUMB9);myDC.SelectObject(myPNUMB03);
pDC‑>BitBlt(22 + (55 * (pcardno ‑ 1)),228,48,23,&myDC,0,0,SRCCOPY);}
if(pnumb[pcardno] == 10){
myPNUMB03.LoadBitmap(IDB̲SNUMB10);myDC.SelectObject(myPNUMB03);
pDC‑>BitBlt(22 + (55 * (pcardno ‑ 1)),228,48,23,&myDC,0,0,SRCCOPY);}
if(pnumb[pcardno] == 11){
myPNUMB03.LoadBitmap(IDB̲SNUMBJ);myDC.SelectObject(myPNUMB03);
pDC‑>BitBlt(22 + (55 * (pcardno ‑ 1)),228,48,23,&myDC,0,0,SRCCOPY);}
if(pnumb[pcardno] == 12){
myPNUMB03.LoadBitmap(IDB̲SNUMBQ);myDC.SelectObject(myPNUMB03);
pDC‑>BitBlt(22 + (55 * (pcardno ‑ 1)),228,48,23,&myDC,0,0,SRCCOPY);}
if(pnumb[pcardno] == 13){
myPNUMB03.LoadBitmap(IDB̲SNUMBK);myDC.SelectObject(myPNUMB03);
pDC‑>BitBlt(22 + (55 * (pcardno ‑ 1)),228,48,23,&myDC,0,0,SRCCOPY);}++pcardno;++yamano;//‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑
pmaxsan();if(pnumb[0] > 21){padown();}//子関数pmaxsan、バースト処理
char mmaaxx[50];sprintf(mmaaxx,"プレイヤーの合計点は = %d",pnumb[0]);m̲ed1.SetWindowText(mmaaxx);}

if(pnumb[0] >= 22){
AfxMessageBox("バースト、貴方の負けです");
CDialog::OnOK();}//===========================================
void padown(){//===========================
void pmaxsan();int co01;}for(co01 = 1;pnumb[0] > 21;++co01){
if(pnumb[co01] == 0){
break;}
if(pnumb[co01] == 1){
pnumb[co01] = 14;}pmaxsan();}void cadown(){//===========================
void cmaxsan();int co01;}for(co01 = 1;cnumb[0] > 21;++co01){
if(cnumb[co01] == 0){
break;}
if(cnumb[co01] == 1){
cnumb[co01] = 14;}
cmaxsan();
}

11

//c
//c
//c

void CBJver100Dlg::OnBstand(){// TODO: この位置にコントロール通知ハンドラ用のコードを追加してください//===========================================
void thinkran(),cthink(),insuit(),innumb(),cadown();//‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑//ｃ１枚目公開
CDC* pDC=m̲land1.GetDC();
CDC myDC;
myDC.CreateCompatibleDC(pDC);//ｃ１枚目スート表示
CBitmap myCSUIT01;if(csuit[1] == 1){
myCSUIT01.LoadBitmap(IDB̲SSUITS);myDC.SelectObject(myCSUIT01);
pDC‑>BitBlt(90,55,48,68,&myDC,0,0,SRCCOPY);}
if(csuit[1] == 2){
myCSUIT01.LoadBitmap(IDB̲SSUITH);myDC.SelectObject(myCSUIT01);
pDC‑>BitBlt(90,55,48,68,&myDC,0,0,SRCCOPY);}
if(csuit[1] == 3){
myCSUIT01.LoadBitmap(IDB̲SSUITD);myDC.SelectObject(myCSUIT01);
pDC‑>BitBlt(90,55,48,68,&myDC,0,0,SRCCOPY);}
if(csuit[1] == 0){
myCSUIT01.LoadBitmap(IDB̲SSUITC);myDC.SelectObject(myCSUIT01);
pDC‑>BitBlt(90,55,48,68,&myDC,0,0,SRCCOPY);}//ｃ１枚目数字表示
CBitmap myCNUMB01;
if(cnumb[1] == 1){
myCNUMB01.LoadBitmap(IDB̲SNUMBA);myDC.SelectObject(myCNUMB01);
pDC‑>BitBlt(90,78,48,23,&myDC,0,0,SRCCOPY);}
if(cnumb[1] == 2){
myCNUMB01.LoadBitmap(IDB̲SNUMB2);myDC.SelectObject(myCNUMB01);
pDC‑>BitBlt(90,78,48,23,&myDC,0,0,SRCCOPY);}
if(cnumb[1] == 3){
myCNUMB01.LoadBitmap(IDB̲SNUMB3);myDC.SelectObject(myCNUMB01);
pDC‑>BitBlt(90,78,48,23,&myDC,0,0,SRCCOPY);}
if(cnumb[1] == 4){
myCNUMB01.LoadBitmap(IDB̲SNUMB4);myDC.SelectObject(myCNUMB01);
pDC‑>BitBlt(90,78,48,23,&myDC,0,0,SRCCOPY);}
if(cnumb[1] == 5){
myCNUMB01.LoadBitmap(IDB̲SNUMB5);myDC.SelectObject(myCNUMB01);
pDC‑>BitBlt(90,78,48,23,&myDC,0,0,SRCCOPY);}
if(cnumb[1] == 6){
myCNUMB01.LoadBitmap(IDB̲SNUMB6);myDC.SelectObject(myCNUMB01);
pDC‑>BitBlt(90,78,48,23,&myDC,0,0,SRCCOPY);}
if(cnumb[1] == 7){
myCNUMB01.LoadBitmap(IDB̲SNUMB7);myDC.SelectObject(myCNUMB01);
pDC‑>BitBlt(90,78,48,23,&myDC,0,0,SRCCOPY);}
if(cnumb[1] == 8){
myCNUMB01.LoadBitmap(IDB̲SNUMB8);myDC.SelectObject(myCNUMB01);
pDC‑>BitBlt(90,78,48,23,&myDC,0,0,SRCCOPY);}
if(cnumb[1] == 9){
myCNUMB01.LoadBitmap(IDB̲SNUMB9);myDC.SelectObject(myCNUMB01);
pDC‑>BitBlt(90,78,48,23,&myDC,0,0,SRCCOPY);}
if(cnumb[1] == 10){
myCNUMB01.LoadBitmap(IDB̲SNUMB10);myDC.SelectObject(myCNUMB01);
pDC‑>BitBlt(90,78,48,23,&myDC,0,0,SRCCOPY);}
if(cnumb[1] == 11){
myCNUMB01.LoadBitmap(IDB̲SNUMBJ);myDC.SelectObject(myCNUMB01);
12

pDC‑>BitBlt(90,78,48,23,&myDC,0,0,SRCCOPY);}
if(cnumb[1] == 12){
myCNUMB01.LoadBitmap(IDB̲SNUMBQ);myDC.SelectObject(myCNUMB01);
pDC‑>BitBlt(90,78,48,23,&myDC,0,0,SRCCOPY);}
if(cnumb[1] == 13){
myCNUMB01.LoadBitmap(IDB̲SNUMBK);myDC.SelectObject(myCNUMB01);
pDC‑>BitBlt(90,78,48,23,&myDC,0,0,SRCCOPY);}//‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑
cisi = 1;
for(;cisi == 1;){//《処理》親思考
thinkran();cthink();//子関数pmaxsan,cmaxsan//‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑//《処理》思考結果がカード引き可ならカード引き
if(cisi == 1){
ccard[ccardno] = yama[yamano];insuit();innumb();
//
//
//

PY);}

PY);}

PY);}

PY);}

//ｃ手札３枚目以降スート表示
CDC* pDC=m̲land1.GetDC();
CDC myDC;
myDC.CreateCompatibleDC(pDC);
CBitmap myCSUIT03;if(psuit[ccardno] == 1){
myCSUIT03.LoadBitmap(IDB̲SSUITS);myDC.SelectObject(myCSUIT03);
pDC‑>BitBlt(90 + (55 * (ccardno ‑ 1)),55,48,68,&myDC,0,0,SRCCO
if(psuit[ccardno] == 2){
myCSUIT03.LoadBitmap(IDB̲SSUITH);myDC.SelectObject(myCSUIT03);
pDC‑>BitBlt(90 + (55 * (ccardno ‑ 1)),55,48,68,&myDC,0,0,SRCCO
if(psuit[ccardno] == 3){
myCSUIT03.LoadBitmap(IDB̲SSUITD);myDC.SelectObject(myCSUIT03);
pDC‑>BitBlt(90 + (55 * (ccardno ‑ 1)),55,48,68,&myDC,0,0,SRCCO
if(psuit[ccardno] == 0){
myCSUIT03.LoadBitmap(IDB̲SSUITC);myDC.SelectObject(myCSUIT03);
pDC‑>BitBlt(90 + (55 * (ccardno ‑ 1)),55,48,68,&myDC,0,0,SRCCO

if(psuit[ccardno] != 1 && psuit[ccardno] != 2 && psuit[ccardno] !=3 && psuit[ccardno] != 0){
myCSUIT03.LoadBitmap(IDB̲RCARD);myDC.SelectObject(myCSUIT03);
pDC‑>BitBlt(90 + (55 * (ccardno ‑ 1)),55,48,68,&myDC,0,0,SRCCO
PY);}//ｃ手札３枚目以降数字表示
CBitmap myCNUMB03;
if(cnumb[ccardno] == 1){
myCNUMB03.LoadBitmap(IDB̲SNUMBA);myDC.SelectObject(myCNUMB03);
pDC‑>BitBlt(90 + (55 * (ccardno ‑ 1)),78,48,23,&myDC,0,0,SRCCO
PY);}
if(cnumb[ccardno] == 2){
myCNUMB03.LoadBitmap(IDB̲SNUMB2);myDC.SelectObject(myCNUMB03);
pDC‑>BitBlt(90 + (55 * (ccardno ‑ 1)),78,48,23,&myDC,0,0,SRCCO
PY);}
if(cnumb[ccardno] == 3){
myCNUMB03.LoadBitmap(IDB̲SNUMB3);myDC.SelectObject(myCNUMB03);
pDC‑>BitBlt(90 + (55 * (ccardno ‑ 1)),78,48,23,&myDC,0,0,SRCCO
PY);}
13

if(cnumb[ccardno] == 4){
myCNUMB03.LoadBitmap(IDB̲SNUMB4);myDC.SelectObject(myCNUMB03);
pDC‑>BitBlt(90 + (55 * (ccardno ‑ 1)),78,48,23,&myDC,0,0,SRCCO
PY);}
if(cnumb[ccardno] == 5){
myCNUMB03.LoadBitmap(IDB̲SNUMB5);myDC.SelectObject(myCNUMB03);
pDC‑>BitBlt(90 + (55 * (ccardno ‑ 1)),78,48,23,&myDC,0,0,SRCCO
PY);}

PY);}

PY);}

PY);}

PY);}
;
PY);}

PY);}

PY);}

PY);}

if(cnumb[ccardno] == 6){
myCNUMB03.LoadBitmap(IDB̲SNUMB6);myDC.SelectObject(myCNUMB03);
pDC‑>BitBlt(90 + (55 * (ccardno ‑ 1)),78,48,23,&myDC,0,0,SRCCO
if(cnumb[ccardno] == 7){
myCNUMB03.LoadBitmap(IDB̲SNUMB7);myDC.SelectObject(myCNUMB03);
pDC‑>BitBlt(90 + (55 * (ccardno ‑ 1)),78,48,23,&myDC,0,0,SRCCO
if(cnumb[ccardno] == 8){
myCNUMB03.LoadBitmap(IDB̲SNUMB8);myDC.SelectObject(myCNUMB03);
pDC‑>BitBlt(90 + (55 * (ccardno ‑ 1)),78,48,23,&myDC,0,0,SRCCO
if(cnumb[ccardno] == 9){
myCNUMB03.LoadBitmap(IDB̲SNUMB9);myDC.SelectObject(myCNUMB03);
pDC‑>BitBlt(90 + (55 * (ccardno ‑ 1)),78,48,23,&myDC,0,0,SRCCO
if(cnumb[ccardno] == 10){
myCNUMB03.LoadBitmap(IDB̲SNUMB10);myDC.SelectObject(myCNUMB03)
pDC‑>BitBlt(90 + (55 * (ccardno ‑ 1)),78,48,23,&myDC,0,0,SRCCO
if(cnumb[ccardno] == 11){
myCNUMB03.LoadBitmap(IDB̲SNUMBJ);myDC.SelectObject(myCNUMB03);
pDC‑>BitBlt(90 + (55 * (ccardno ‑ 1)),78,48,23,&myDC,0,0,SRCCO
if(cnumb[ccardno] == 12){
myCNUMB03.LoadBitmap(IDB̲SNUMBQ);myDC.SelectObject(myCNUMB03);
pDC‑>BitBlt(90 + (55 * (ccardno ‑ 1)),78,48,23,&myDC,0,0,SRCCO
if(cnumb[ccardno] == 13){
myCNUMB03.LoadBitmap(IDB̲SNUMBK);myDC.SelectObject(myCNUMB03);
pDC‑>BitBlt(90 + (55 * (ccardno ‑ 1)),78,48,23,&myDC,0,0,SRCCO++ccardno;++yamano;}//‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑
cmaxsan();if(cnumb[0] > 21){cadown();}//子関数cmaxsan、バースト処理
char cmmaaxx[50];sprintf(cmmaaxx,"ディーラーの合計点は = %d",cnumb[0]);m̲ed3.SetWindowText(cmmaaxx);//《処理》バースト判定（バーストなら終わり）
if(cnumb[0] >= 22){
AfxMessageBox("バースト、貴方の勝ちです");
cisi = 2;
CDialog::OnOK();}}//===========================================
14

//c
//c
//c

}

//《処理》判定
pmaxsan();cmaxsan();if(cisi == 0){if(pnumb[0] > cnumb[0]){AfxMessageBox("貴方の勝ちです");}if(pnumb[0] == cnumb[0]){AfxMessageBox("引き分けです");}if(pnumb[0] < cnumb[0]){AfxMessageBox("貴方の負けです");}}CDialog::OnOK();
void cthink(){//===========================
void pmaxsan(),cmaxsan();int sa,coa;}cisi = 0;
pmaxsan();cmaxsan();sa = 21 ‑ cnumb[0];//‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑//《処理》親の｢Ａ｣の枚数カウント（思考に影響）
coa = 0;//‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑‑
if((ckettei[ccardno ‑ 3] <= 0) ￨￨ (ckettei[ccardno ‑ 3] >= 101)){
AfxMessageBox("!!警告!! 親思考確立数値異常");}if(cnumb[0] > pnumb[0]){cisi = 0;}if(cnumb[0] < pnumb[0]){cisi = 1;}
if(cnumb[0] == pnumb[0]){if(sa == 1){//2の位置↓が、引く確立
if(ckettei[ccardno ‑ 3] <= 2){cisi = 1;}}if(sa == 2){
if(ckettei[ccardno ‑ 3] <= 3){cisi = 1;}}if(sa == 3){
if(ckettei[ccardno ‑ 3] <= 5){cisi = 1;}}if(sa == 4){if(ckettei[ccardno ‑ 3] <= 10){cisi = 1;}}if(sa == 5){if(ckettei[ccardno ‑ 3] <= 20){cisi = 1;}}if(sa == 6){
if(ckettei[ccardno ‑ 3] <= 50){cisi = 1;}}if(sa == 7){
if(ckettei[ccardno ‑ 3] <= 70){cisi = 1;}}if(sa == 8){
if(ckettei[ccardno ‑ 3] <= 85){cisi = 1;}}if(sa == 9){if(ckettei[ccardno ‑ 3] <= 93){cisi = 1;}}if(sa == 10){if(ckettei[ccardno ‑ 3] <= 98){cisi = 1;}}if(sa >= 11){cisi = 1;}}
void thinkran(){//=======================
int rand();int ranmax = 100,ranmin = 1;
int co01;
15

srand((unsigned int)time(0));
rand();
for(co01 = 0;co01 < (havemax ‑ 1);++co01){
ckettei[co01] = ranmin + (int)(rand() * (ranmax ‑ ranmin + 1) / (1 + R
AND̲MAX));}}

16