初めてPHPを学ぼう!

本ホームページでは、初めてPHPプログラムを学ぶ方を対象に、PHPの導入方法から実際にホームページで動かす為の方法を紹介しています。もちろん、PHPプログラムの書き方、また、PHPプログラムのサンプルプログラムを紹介していますので、参考にしてみて下さい。
また、こういったプログラムを紹介して欲しい!など御座いましたら、お気軽にご要望をあげて下さい。
▼スポンサードリンク
▼スポンサードリンク
◇PHPとは?
◇PHPは何が出来るの?
◇PHPを導入する

◇PHPの表し方
◇PHPプログラムの書き方1/3
◇PHPプログラムの書き方2/3
◇PHPプログラムの書き方3/3
◇コメントを記入する

◇簡単なアプリを作ってPHPの概念を学ぶ!
◇カウンターとは?
◇ブロックを作る
◇実際にプログラムを作成するフローにする
◇@ホームページにアクセスがあった時
◇補足:絶対パスと相対パス(1/2)
◇補足:絶対パスと相対パス(図)(2/2)
◇Aカウンター数が記入されたファイルを読み込む
◇B数を+1します
◇C総アクセス数をファイルに書き込む
◇参考:ファイルを開くモード
◇Dホームページにアクセス数を表示する
◇全体のプログラム
◇最後に・・・

◇始めに
◇用意するものの一覧
◇ANHTTPDをダウンロードしよう
◇次にPHPを実行するソフトをインストールしよう!
◇ANHHTPDの設定をしよう!(1/3)
◇ANHHTPDの設定をしよう! (2/3)
◇ANHTTPDの設定をしよう! (3/3)
◇各種設定しよう!
◇php.iniの設定をする
◇PHPが動くかテストしてみよう!
◇実行プログラムと結果
◇今後の利便性の為に・・・

◇始めに
◇フロー
◇@一言掲示板とは何か?
◇A掲示板のファイルを読み込む(1/3)
◇A掲示板のファイルを読み込む(2/3)
◇A掲示板のファイルを読み込む(3/3)
◇B掲示板を表示する
◇C書き込みがされる
◇D書き込みファイルが正常化確認する
◇Eファイルに書き込みする
◇F掲示板を表示する
◇全てのプログラム
◇最後に・・・

◇関数を使おう!
◇メニュー
◇関数とは何か?
◇関数の形
◇2つの変数を掛け算する関数を作りましょう
◇まとめ

◇条件分岐(if〜else)
◇繰り返し(whileとfor)
◇ファイルの読み書き(fopen)
◇日付を取得(time)
◇クッキー(setcookie)
◇セッション(session)

◇ニュースサイトの情報を取得しよう

「ブラックジャック」を作ろう!
ブラックジャックのルール
フローを考えよう!
先ずは絵柄を決めよう!
事前ルール
親を決めよう
初期手札を配る
トランプの絵柄の決定方法
初期絵柄を表示させる
次のトランプを取るかどうかを決めます
トランプを引く場合はフォームのデータを元に戻す
コンピュータのトランプ状況を表示する
ユーザがもう1枚トランプを引く
ユーザの点数を調べ、21であるかなど調べる
合計ポイントの数を計算する
合計点数により21か等を判定する
合計点数が21の場合
合計点数が21を超えた場合
合計点数がまだ21を超えていない点数がある
コンピュータがトランプの札を引く
ユーザ・コンピュータの点数を決定する
合計点数による条件判断を行う
どちらが勝つか決定する
両方とも21を超えている場合
どちらかが21を超える又は両方とも21未満の時
最後に
ブラックジャックのサンプルプログラム


ALL44965 TODAY11 YESTADAY72


(C)あいねこの館(aineko's YAKATA)
◆ブラックジャックを作ろう

目次
▼「ブラックジャック」を作ろう!
▼ブラックジャックのルール
▼フローを考えよう!
▼先ずは絵柄を決めよう!
▼事前ルール
▼親を決めよう
▼初期手札を配る
▼トランプの絵柄の決定方法
▼初期絵柄を表示させる
▼次のトランプを取るかどうかを決めます
▼トランプを引く場合はフォームのデータを元に戻す
▼コンピュータのトランプ状況を表示する
▼ユーザがもう1枚トランプを引く
▼ユーザの点数を調べ、21であるかなど調べる
▼合計ポイントの数を計算する
▼合計点数により21か等を判定する
▼合計点数が21の場合
▼合計点数が21を超えた場合
▼合計点数がまだ21を超えていない点数がある
▼コンピュータがトランプの札を引く
▼ユーザ・コンピュータの点数を決定する
▼ 合計点数による条件判断を行う
▼どちらが勝つか決定する
▼両方とも21を超えている場合
▼どちらかが21を超える又は両方とも21未満の時
▼最後に
▼ブラックジャックのサンプルプログラム

サンプルプログラムを見る
サンプルプログラムをダウンロードする
(txtをphpに変換して下さい)


ここまでPHPプログラムを学んできた方は、簡単なアプリケーションを作成できることだと思います。

条件分岐などでややこしくなるかと思いますが、その辺りはこまめにノートなどにまとめることでプログラムを作成すると取り掛かりやすいと思います。

次にブラックジャックといったトランプゲームを作ってみましょう!



・ルール
⇒1VS1の親と子を決めて真剣勝負!
⇒トランプの絵柄が21に揃えば勝利
⇒21でなくても、一番21に近い人が勝利
⇒同点なら親が勝利
⇒22以上はゲームオーバーです
⇒先ずトランプを親と子に2枚ずつ配って1枚だけ相手に見せます
⇒その後は、好きなだけトランプを取れます



一番初めに配った状態(親と子に2枚配ります。1枚目は 表に向けます)





子は1枚追加します。
自分の手札は始めに伏せた1枚目以外は見せてはいけません





・子が終わったら親も最後まで引き続けます ・子は合計23なので、負け

注意点
1は、1でも11でもどちらでもなります
JOKERは入れないで下さいね!





トランプは絵柄があるべきもの
しかし、絵柄を作るのも面倒ですしフリーの素材を探しましょう
デザインに自信のある方はぜひご自身の素材を使って下さい!

トランプは1〜52で13毎にハート、スペード、クローバー、ミツバと分別する


以下はブラックジャックのプログラムの流れになります。


先ずはどちらが優位か親を決めます

//#########################
// 親を決める #####
//#########################
1. list($msec,$sec)=split(' ',microtime());
2. mt_srand($msec*100000);

3. $start=mt_rand(0,1);

4. if($start==0){
5.  print "あなたが親です!";
6. }
7. else{
8.  print "コンピュータが親です";
9. }

上記プログラムの解説をします。

1〜2行目
ランダム数生成器にシードを与え、同じ今後のランダム数値が同じ数が出ないようにする。
PHP4.2以降から特に必要ないみたいですね。

3行目
0か1の値をランダムに決める

4〜9行目
今後変数startが0ならあなたが親になります。

親を決めたので次は手札を配りましょう!




コンピュータとユーザの初期絵柄を2枚ずつ決定します。
//#########################
// 手札を配る #####
//#########################

1. //コンピュータ
2. $com_tranpu = array();
3. $com_tranpu[0] = tranpu();
4. $com_tranpu[1] = tranpu();
5. 
6. //ユーザ
7. $you_tranpu = array();
8. $you_tranpu[0] = tranpu();
9. $you_tranpu[1] = tranpu();

1〜4行目
コンピュータのトランプの絵柄を配列に格納します
関数tranpuで絵柄を決めます
下のユーザの場合も同様です

トランプを決める場合は、絵柄がかぶらないようにしましょう。




トランプの絵柄を決定する関数tranpu

1. //トランプを決定させる
2. function tranpu(){
3. 
4.  global $picture;
5.  $all = count($picture);
6. 
7.  $flag = 1;
8. 
9.  while($flag==1){
10.  list($msec,$sec)=split(' ',microtime());
11.  mt_srand($msec*100000);
12.  $num = mt_rand(1,52); 13.  if(in_array($num,$picture)){
14. 
15.  }
16.  else{
17.  $flag=0;
18.  }
19.  }
20. 
21.  $picture[$all] = $num;
22. 
23.  return $num;
24. 
25. }

4〜5行目
関数外で、トランプを引いた絵柄を全て保存する関数を宣言
しておきます。それを関数内で呼びます。
関数外の変数を使用する場合にはglobalで宣言します。

9〜19行目
トランプの絵柄を引いて、それが引いたトランプの絵柄が全て入っている
配列を全てチェックしてかぶっていなければ、その絵柄を引いた目とする。

21行目
引いた絵柄に今回引いた絵柄を入れる




配った手札を今度は画面に表示してみましょう。

//トランプを表示させる
1. print "<table><tr><td class=tranpu>";
2. print "<strong>コンピュータ</strong>";
3. if($start==1){
4. 	print "【親】";
5. 
6. else{
7. 	print "【子】";
8. }
9. print "<br><br>";
10. print_tranpu($com_tranpu[0]);
11. ura();
12. 
13. print "<hr color=purple>";
14. 
15. print "<strong>あなた</strong>";
16. if($start==0){
17. 	print "【親】";
18. }
19. else{
20. 	print "【子】";
21. }
22. print "<br><br>";
23. print_tranpu($you_tranpu[0]);
24. print_tranpu($you_tranpu[1]);
25. 
26. print "</td></tr></table>";</pre>


11行目
トランプの裏の画像を出力する。




次のトランプを取るかどうかを決定するフォームのボタンを作成します。フォームで送るデータを決めます。

1. //データを送信する為のフォームを表示する

2. print "<table><tr><td>";
3. print "<FORM action=21.php method=POST>";
4. print "<INPUT TYPE=\"hidden\" NAME=\"select\" VALUE=\"1\">";
5. print "<INPUT TYPE=\"hidden\" NAME=\"start\" VALUE=\"$start\">";
6. $picture_all = count($picture);
7. print "<INPUT TYPE=\"hidden\" NAME=\"picture_all\" VALUE=\"$picture_all\">";
8. for($i=0;$i<$picture_all;$i++){
9.  print "<INPUT TYPE=\"hidden\" NAME=\"picture".$i."\" VALUE=\"$picture[$i]\">";
10. }
11. $com_all = count($com_tranpu);
12. print "<INPUT TYPE=\"hidden\" NAME=\"com_all\" VALUE=\"$com_all\">";
13. for($i=0;$i<$com_all;$i++){
14.  print "<INPUT TYPE=\"hidden\" NAME=\"com_tranpu".$i."\" VALUE=\"$com_tranpu[$i]\">";
15. }
16. $you_all = count($you_tranpu);
17. print "<INPUT TYPE=\"hidden\" NAME=\"you_all\" VALUE=\"$you_all\">";
18. for($i=0;$i<$you_all;$i++){
19.  print "<INPUT TYPE=\"hidden\" NAME=\"you_tranpu".$i."\" VALUE=\"$you_20. tranpu[$i]\">";
21. }
22. print "<INPUT TYPE=\"submit\" VALUE=\"もう1枚!\"></form>";
23. print "</td><td>";<
下記は上記のフォームの続きで、トランプを引くのを終了する場合です。
内容はフォームを送信するselectの違いです


24. print "<FORM action=21.php method=POST>";
25. print "<INPUT TYPE=\"hidden\" NAME=\"select\" VALUE=\"2\">";
26. print "<INPUT TYPE=\"hidden\" NAME=\"start\" VALUE=\"$start\">";
27. $picture_all = count($picture);
28. print "<INPUT TYPE=\"hidden\" NAME=\"picture_all\" VALUE=\"$picture_all\">";
29. for($i=0;$i<$picture_all;$i++){
30.  print "<INPUT TYPE=\"hidden\" NAME=\"picture".$i."\" VALUE=\"$picture[$i]\">";
31. }
32. $com_all = count($com_tranpu);
33. print "<INPUT TYPE=\"hidden\" NAME=\"com_all\" VALUE=\"$com_all\">";
34. for($i=0;$i<$com_all;$i++){
35.  print "<INPUT TYPE=\"hidden\" NAME=\"com_tranpu".$i."\" VALUE=\"$com_tranpu[$i]\">";
36. }
37. $you_all = count($you_tranpu);
38. print "<INPUT TYPE=\"hidden\" NAME=\"you_all\" VALUE=\"$you_all\">";
39. for($i=0;$i<$you_all;$i++){
40.  print "<INPUT TYPE=\"hidden\" NAME=\"you_tranpu".$i."\" VALUE=\"$you_tranpu[$i]\">";
41. }
42. 
43. print "<INPUT TYPE=\"submit\" VALUE=\"終わる\"></form>";
44. print "</td></tr></table>";
45. 
46. }

3行目
同じPHPファイルでブラックジャックを 用いています。二回目かどうかを場合分け するフラグを決める必要があります。

4行目
selectは二回目以降を分別するフラグ

5行目
startはどちらが親か決定する

6-10行目
トランプの絵柄を全て 送ります

11-15行目
コンピュータの絵柄 を全て送ります

16-21行目
ユーザの絵柄 を全て送ります




フォームから送られてきたデータを元に戻します

if($select==1){

//どちらが親かのデータを元に戻す
$start = $_POST['start'];

//トランプの全てを元に戻す
$picture_all = $_POST['picture_all'];
for($i=0;$i<$picture_all;$i++){
	$form_picture = "picture".$i;
	$picture[$i] = $_POST["$form_picture"];
}

//コンピュータの手札を元に戻す
$com_all = $_POST['com_all'];
for($i=0;$i<$com_all;$i++){
	$com_picture = "com_tranpu".$i;
	$com_tranpu[$i] = $_POST["$com_picture"];
}

//ユーザの手札を元に戻す
$you_all = $_POST['you_all'];
for($i=0;$i<$you_all;$i++){
	$you_picture = "you_tranpu".$i;
	$you_tranpu[$i] = $_POST["$you_picture"];
}



コンピュータのトランプを表示する。(先ずはユーザが全て引いてからになりますので、コンピュータはユーザが完全に引き終わるまで二枚しか持っていません。)

//トランプを表示させる
print "<table><tr><td class=tranpu>";
//コンピュータのトランプを表示する
print "<strong>コンピュータ</strong>";
if($start==1){
	print "【親】";
}
else{
	print "【子】";
}
print "<br><br>";
print_tranpu($com_tranpu[0]);
//一枚目は表示しているので、残りは裏を表示する
for($i=1;$i<$com_all;$i++){
	ura();
}

print "<hr color=purple>";



コンピュータのトランプを表示する。(先ずはユーザが全て引いてからになりますので、コンピュータはユーザ が完全に引き終わるまで二枚しか持っていません。)

1. //ユーザのトランプを表示する
2. print "<strong>あなた</strong>";
3. if($start==0){
4. 	print "【親】";
5. }
6. else{
7. 	print "【子】";
8. }
9. print "<br><br>";
10. $you_tranpu[$you_all] = tranpu();
11. for($i=0;$i<$you_all+1;$i++){
12. 	print_tranpu($you_tranpu[$i]);
13. }
14. 
15. print "<br><br>>トランプを1枚引きました!<br>";

プログラムの解説をします。

10行目
ユーザのトランプリストに引いたトランプを追加する

11〜13行目
引いたトランプを全て表示する




ユーザの点数が@21未満かA21かB21を超えているか調べる
1. //合計点数を計算する
2. $you_sum = cal_point($you_tranpu);
3. 
4. $you_num = count($you_sum);
5. 
6. for($i=0;$i<$you_num;$i++){
7. 	print ">合計点数は".$you_sum[$i]."です。
"; 8. }
1〜2行目
数えられる点数を全て配列に格納する

4〜8行目
数えられる点数の通り分だけ表示する




トランプの合計点数の可能性を全て網羅する関数cal_point

1. //合計ポイントを計算する
2. function cal_point($tranpu){
3. 	$score = 0;
4. 	$all_score = array();
5. 	$all_score[0] = 0;
6. 	$num = count($tranpu);
7. 	for($i=0;$i<$num;$i++){
8. 		$point = $tranpu[$i]%13;
9. 		if($point==0 || $point>9){
10. 			$point = 10;
11. 		}
12. 		if($point==1){
13. 			$patern = count($all_score);
14. 			for($j=0;$j<$patern;$j++){
15. 				$all_score[$j+$patern] = $all_score[$j] + 11;
16. 				$all_score[$j] = $all_score[$j] + 1;
17. 			}
18. 		}
19. 		else{
20. 			//全ての合計ポイントに現在のポイントを足す
21. 			$patern = count($all_score);
22. 			for($j=0;$j<$patern;$j++){
23. 				$all_score[$j] = $all_score[$j] + $point;
24. 			}
25. 		}
26. 	}
27. 	return $all_score;
28. }
3〜5行目
ひとまず合計点数は0にしておく

6〜7行目
トランプの枚数分だけ繰り返す

8行目
トランプの1〜13までの数を判定する

9〜11行目
13で割り切れるのはあまりが0なので、 0は13、9以上は9、10、11、12なので点数は10になる

12〜18行目
1は点数1と11を とるため、1と11 を足す点数を全て 点数リストに足し て網羅する

19〜25行目
1以外は1通りの点数 しか取らないため 全ての点数リストに そのトランプの出目 の点数を足す


ユーザの点数が@21未満かA21かB21を超えているか調べ、それぞれのフラグを返す

1. //合計点数による場合わけをする
2. function check_21($tranpu){
3. 	
4. 	$num = count($tranpu);
5. 	$check = 0;
6. 
7. 	for($i=0;$i<$num;$i++){
8. 
9. 		$point = $tranpu[$i];
10. 
11. 		if($point==21){
12. 			//21がある
13. 			return 1;
14. 		}
15. 		if($point>21){
16. 			$check++;
17. 		}
18. 		else{
19. 		}
20. 	}
21. 
22. 	if($check==$num){
23. 		//数値オーバー
24. 		return 2;
25. 	}
26. 	else{
27. 		//21未満がある
28. 		return 0;
29. 	}
30. 
31. }
4〜5行目
トランプの点数の通りを変数numに格納する

7〜20行目
点数に21がある場合はフラグ1を追加する 点数が21を超えている場合は変数checkを足し 変数checkにより、点数の通りが全て21を 超えていると失格のフラグを立てる

22〜25行目
全て21を超えていたらフラグ2を返す

26〜29行目
21未満があればフラグ0を返す




合計点数が21の場合は終了する。引くのを止めるフォームを提示する

if($sum==1){
	print ">おめでとうございます!21が出ました!<br>";
	print "<FORM action=21.php method=POST>";
	print "<INPUT TYPE=\"hidden\" NAME=\"select\" VALUE=\"2\">";
	print "<INPUT TYPE=\"hidden\" NAME=\"select\" VALUE=\"2\">";
	print "<INPUT TYPE=\"hidden\" NAME=\"start\" VALUE=\"$start\">";
	$picture_all = count($picture);
	print "<INPUT TYPE=\"hidden\" NAME=\"picture_all\" VALUE=\"$picture_all\">";
	for($i=0;$i<$picture_all;$i++){
		print "<INPUT TYPE=\"hidden\" NAME=\"picture".$i."\" VALUE=\"$picture[$i]\">";
	}
	$com_all = count($com_tranpu);
	print "<INPUT TYPE=\"hidden\" NAME=\"com_all\" VALUE=\"$com_all\">";
	for($i=0;$i<$com_all;$i++){
		print "<INPUT TYPE=\"hidden\" NAME=\"com_tranpu".$i."\" VALUE=\"$com_tranpu[$i]\">";
	}
	$you_all = count($you_tranpu);
	print "<INPUT TYPE=\"hidden\" NAME=\"you_all\" VALUE=\"$you_all\">";
	for($i=0;$i<$you_all;$i++){
		print "<INPUT TYPE=\"hidden\" NAME=\"you_tranpu".$i."\" VALUE=\"$you_tranpu[$i]\">";
	}

	print "<INPUT TYPE=\"submit\" VALUE=\"結果へ\"></form>";
	print "</td></tr></table>";

	exit;
}



合計点数が21を超えたら失格になる。引くのを止めるフォームを提示する

else if($sum==2){
	print ">22以上になりました。失格です!<br>";
	print "<FORM action=21.php method=POST>";
	print "<INPUT TYPE=\"hidden\" NAME=\"select\" VALUE=\"2\">";
	print "<INPUT TYPE=\"hidden\" NAME=\"select\" VALUE=\"2\">";
	print "<INPUT TYPE=\"hidden\" NAME=\"start\" VALUE=\"$start\">";
	$picture_all = count($picture);
	print "<INPUT TYPE=\"hidden\" NAME=\"picture_all\" VALUE=\"$picture_all\">";
	for($i=0;$i<$picture_all;$i++){
		print "<INPUT TYPE=\"hidden\" NAME=\"picture".$i."\" VALUE=\"$picture[$i]\">";
	}
	$com_all = count($com_tranpu);
	print "<INPUT TYPE=\"hidden\" NAME=\"com_all\" VALUE=\"$com_all\">";
	for($i=0;$i<$com_all;$i++){
		print "<INPUT TYPE=\"hidden\" NAME=\"com_tranpu".$i."\" VALUE=\"$com_tranpu[$i]\">";
	}
	$you_all = count($you_tranpu);
	print "<INPUT TYPE=\"hidden\" NAME=\"you_all\" VALUE=\"$you_all\">";
	for($i=0;$i<$you_all;$i++){
		print "<INPUT TYPE=\"hidden\" NAME=\"you_tranpu".$i."\" VALUE=\"$you_tranpu[$i]\">";
	}

	print "<INPUT TYPE=\"submit\" VALUE=\"結果へ\"></form>";
	print "</td></tr></table>";

	exit;
}



合計点数が21になっていない場合は、もう一枚引くか引かないか決めれる。
ここでは引く場合のフォームの例を示しています。
//データを送信する為のフォームを表示する
print "<table><tr><td>";
print "<FORM action=21.php method=POST>";
print "<INPUT TYPE=\"hidden\" NAME=\"select\" VALUE=\"1\">";
print "<INPUT TYPE=\"hidden\" NAME=\"start\" VALUE=\"$start\">";
$picture_all = count($picture);
print "<INPUT TYPE=\"hidden\" NAME=\"picture_all\" VALUE=\"$picture_all\">";
for($i=0;$i<$picture_all;$i++){
	print "<INPUT TYPE=\"hidden\" NAME=\"picture".$i."\" VALUE=\"$picture[$i]\">";
}
$com_all = count($com_tranpu);
print "<INPUT TYPE=\"hidden\" NAME=\"com_all\" VALUE=\"$com_all\">";
for($i=0;$i<$com_all;$i++){
	print "<INPUT TYPE=\"hidden\" NAME=\"com_tranpu".$i."\" VALUE=\"$com_tranpu[$i]\">";
}
$you_all = count($you_tranpu);
print "<INPUT TYPE=\"hidden\" NAME=\"you_all\" VALUE=\"$you_all\">";
for($i=0;$i<$you_all;$i++){
	print "<INPUT TYPE=\"hidden\" NAME=\"you_tranpu".$i."\" VALUE=\"$you_tranpu[$i]\">";
}
合計点数が21になっていない場合は、もう一枚引くか引かないか決めれる。
ここでは引かない場合のフォームの例を示しています。
print "<INPUT TYPE=\"submit\" VALUE=\"もう1枚!\"></form>";
print "</td><td>";
print "<FORM action=21.php method=POST>";
print "<INPUT TYPE=\"hidden\" NAME=\"select\" VALUE=\"2\">";
print "<INPUT TYPE=\"hidden\" NAME=\"start\" VALUE=\"$start\">";
$picture_all = count($picture);
print "<INPUT TYPE=\"hidden\" NAME=\"picture_all\" VALUE=\"$picture_all\">";
for($i=0;$i<$picture_all;$i++){
	print "<INPUT TYPE=\"hidden\" NAME=\"picture".$i."\" VALUE=\"$picture[$i]\">";
}
$com_all = count($com_tranpu);
print "<INPUT TYPE=\"hidden\" NAME=\"com_all\" VALUE=\"$com_all\">";
for($i=0;$i<$com_all;$i++){
	print "<INPUT TYPE=\"hidden\" NAME=\"com_tranpu".$i."\" VALUE=\"$com_tranpu[$i]\">";
}
$you_all = count($you_tranpu);
print "<INPUT TYPE=\"hidden\" NAME=\"you_all\" VALUE=\"$you_all\">";
for($i=0;$i<$you_all;$i++){
	print "<INPUT TYPE=\"hidden\" NAME=\"you_tranpu".$i."\" VALUE=\"$you_tranpu[$i]\">";
}
print "<INPUT TYPE=\"submit\" VALUE=\"終わる\"></form>";
//データ送信フォームの終了
print "</td></tr></table>";
print "</td></tr></table>";
}




コンピュータが合計点数が条件に適合するまで繰り返し引く

1. //コンピュータが引く
2. $com_flag = 1;
3. //コンピュータが引き終わるまで繰り返す
4. while($com_flag = 1){
5. 	//現在のポイント数を調べる
6. 	$com_sum = cal_point($com_tranpu);
7. 	//ポイントのMAXを調べる
8. 	$com_max = cal_max($com_sum);
9. 	//ポイントのMINを調べる
10. 	$com_min = cal_min($com_sum);
11. 	$com_num = check_21($com_sum);
12. 	if($com_num==2){
13. 		$com_point = $com_min;
14. 		break;
15. 	}
16. 	if($com_num==1){
17. 		$com_point = 21;
18. 		break;
19. 	}
20.	if($com_max>16 && $com_max<22){
21.		$com_point = cal_spot($com_sum);
22.		$com_flag = 0;
23.		break;
24.	}
25.	$com_tranpu[$com_all] = tranpu();
26.	$com_all++;
27.	$com_sum = cal_point($com_tranpu);
28.}
7〜10行目
ポイントの最大・最小を調べ 手札を引くか引かないか参考にする

11行目
点数によるフラグを決める

12〜15行目
22以上は手札を引かない

16〜19行目
21の場合は手札を引かない

20〜24行目
最大値が 17以上21以下の場合は札を引くのを中止する

25〜27行目
上記の条件に当てはまらない場合は手札をとり コンピュータのトランプリストに取った手札を 追加する




コンピュータが合計点数が条件に適合するまで繰り返し引く

1.$you_flag = check_21($tranpu);
2.
3.if($you_flag==1){
4.	$you_point = 21;
5.}
6.else if($you_flag==2){
7.	$you_sum = cal_point($you_tranpu);
8.	$you_point = cal_min($you_sum);
9.}
10.else{
11.	$you_sum = cal_point($you_tranpu);
12.	$you_point = cal_max2($you_sum);
13.}
1行目
点数によるフラグを決定する

3〜5行目
21の場合

10〜13行目
全ての点数が22を超えていた場合 22を超えた点数で最小なものを点数とする

6〜9行目
22未満の最大値を返す





コンピュータとユーザが同点数の場合

1.//どちらが勝つか決める
2.$win_flag=1;
3.
4.//両者が同一の時
5.if($you_point==$com_point){
6.
7.	if($start == 1){
8.		//親が勝つ
9.		win("com");
10.	}
11.	else{
12.		//あなたが勝つ
13.		win("you");
14.	}
15.	
16.	$win_flag=0;
17.
18.}

7〜10行目
変数startが1ならブラックジャックの親は コンピュータです

11〜14行目
変数startが0ならブラックジャックの親は ユーザです


両方とも21を超える場合

1.//両方とも21を超える時
2.if($you_point>21 && $com_point>21 && $win_flag==1){
3.
4.	if($start == 1){
5.		if($com_point<=$you_point){
6.			//親が勝つ
7.			win("com");
8.		}
9.		else{
10.			//あなたが勝つ
11.			win("you");
12.		}
13.	}
14.	else{
15.		if($you_point<=$com_point){
16.			//ユーザが勝つ
17.			win("you");
18.		}
19.		else{
20.			//親が勝つ
21.			win("com");
22.		}
23.	}
24.
25.	$win_flag=0;
26.
27.}
4〜13行目
親がコンピュータの場合 点数が低ければ親が勝つ

14〜23行目
親がユーザの場合 点数が低ければユーザが勝つ


両方とも21を超える場合又は、両方とも21未満の場合の処理をする

//どちらかが21を超える時
if($you_point>21 && $com_point<22 && $win_flag==1){
	win("com");
	$win_flag=0;
}
if($com_point>21 && $you_point<22 && $win_flag==1){
	win("you");
	$win_flag=0;
}


//両方とも21未満
if($you_point>$com_point && $com_point<22 && $you_point<22 && $win_flag==1){
	win("you");
	$win_flag=0;
}
if($com_point>$you_point && $com_point<22 && $you_point<22 && $win_flag==1){
	win("com");
	$win_flag=0;
}

説明が非常に長くなりましたが、PHPを作成するフローを立てておけば、とりあえずは作成することが出来ると思います
まだまだソースプログラムの効率化も出来ますが、始めは一度どんなものか作り上げてから効率化の方法を考えていけば良いかと思います

<?
//21だけのフィールド

$select = $_POST['select'];

//////////////////////////////////////
//     初めてトランプを引く場合     //
//////////////////////////////////////

if($select==""){

//トランプの全ての絵柄を記憶する変数
$picture = array();

//#########################
//     親を決める     #####
//#########################
list($msec,$sec)=split(' ',microtime());
mt_srand($msec*100000);
$start=mt_rand(0,1);

if($start==0){
	print "あなたが親です!";
}
else{
	print "コンピュータが親です";
}

//#########################
//     手札を配る     #####
//#########################

//コンピュータ
$com_tranpu = array();
$com_tranpu[0] = tranpu();
$com_tranpu[1] = tranpu();

//ユーザ
$you_tranpu = array();
$you_tranpu[0] = tranpu();
$you_tranpu[1] = tranpu();

//トランプを表示させる
print "<table><tr><td class=tranpu>";
print "<strong>コンピュータ</strong>";
if($start==1){
	print "【親】";
}
else{
	print "【子】";
}
print "<br><br>";
print_tranpu($com_tranpu[0]);
ura();

print "<hr color=purple>";

print "<strong>あなた</strong>";
if($start==0){
	print "【親】";
}
else{
	print "【子】";
}
print "<br><br>";
print_tranpu($you_tranpu[0]);
print_tranpu($you_tranpu[1]);

print "</td></tr></table>";

//データを送信する為のフォームを表示する
print "<table><tr><td>";
print "<FORM action=21.php method=POST>";
print "<INPUT TYPE=\"hidden\" NAME=\"select\" VALUE=\"1\">";
print "<INPUT TYPE=\"hidden\" NAME=\"start\" VALUE=\"$start\">";
$picture_all = count($picture);
print "<INPUT TYPE=\"hidden\" NAME=\"picture_all\" VALUE=\"$picture_all\">";
for($i=0;$i<$picture_all;$i++){
	print "<INPUT TYPE=\"hidden\" NAME=\"picture".$i."\" VALUE=\"$picture[$i]\">";
}
$com_all = count($com_tranpu);
print "<INPUT TYPE=\"hidden\" NAME=\"com_all\" VALUE=\"$com_all\">";
for($i=0;$i<$com_all;$i++){
	print "<INPUT TYPE=\"hidden\" NAME=\"com_tranpu".$i."\" VALUE=\"$com_tranpu[$i]\">";
}
$you_all = count($you_tranpu);
print "<INPUT TYPE=\"hidden\" NAME=\"you_all\" VALUE=\"$you_all\">";
for($i=0;$i<$you_all;$i++){
	print "<INPUT TYPE=\"hidden\" NAME=\"you_tranpu".$i."\" VALUE=\"$you_tranpu[$i]\">";
}

print "<INPUT TYPE=\"submit\" VALUE=\"もう1枚!\"></form>";
print "</td><td>";
print "<FORM action=21.php method=POST>";
print "<INPUT TYPE=\"hidden\" NAME=\"select\" VALUE=\"2\">";
print "<INPUT TYPE=\"hidden\" NAME=\"start\" VALUE=\"$start\">";
$picture_all = count($picture);
print "<INPUT TYPE=\"hidden\" NAME=\"picture_all\" VALUE=\"$picture_all\">";
for($i=0;$i<$picture_all;$i++){
	print "<INPUT TYPE=\"hidden\" NAME=\"picture".$i."\" VALUE=\"$picture[$i]\">";
}
$com_all = count($com_tranpu);
print "<INPUT TYPE=\"hidden\" NAME=\"com_all\" VALUE=\"$com_all\">";
for($i=0;$i<$com_all;$i++){
	print "<INPUT TYPE=\"hidden\" NAME=\"com_tranpu".$i."\" VALUE=\"$com_tranpu[$i]\">";
}
$you_all = count($you_tranpu);
print "<INPUT TYPE=\"hidden\" NAME=\"you_all\" VALUE=\"$you_all\">";
for($i=0;$i<$you_all;$i++){
	print "<INPUT TYPE=\"hidden\" NAME=\"you_tranpu".$i."\" VALUE=\"$you_tranpu[$i]\">";
}

print "<INPUT TYPE=\"submit\" VALUE=\"終わる\"></form>";
print "</td></tr></table>";

}

///////////////////////////////////////
//     もう1枚トランプを引く場合     //
///////////////////////////////////////

if($select==1){

//どちらが親かのデータを元に戻す
$start = $_POST['start'];

//トランプの全てを元に戻す
$picture_all = $_POST['picture_all'];
for($i=0;$i<$picture_all;$i++){
	$form_picture = "picture".$i;
	$picture[$i] = $_POST["$form_picture"];
}

//コンピュータの手札を元に戻す
$com_all = $_POST['com_all'];
for($i=0;$i<$com_all;$i++){
	$com_picture = "com_tranpu".$i;
	$com_tranpu[$i] = $_POST["$com_picture"];
}

//ユーザの手札を元に戻す
$you_all = $_POST['you_all'];
for($i=0;$i<$you_all;$i++){
	$you_picture = "you_tranpu".$i;
	$you_tranpu[$i] = $_POST["$you_picture"];
}

//トランプを表示させる
print "<table><tr><td class=tranpu>";
//コンピュータのトランプを表示する
print "<strong>コンピュータ</strong>";
if($start==1){
	print "【親】";
}
else{
	print "【子】";
}
print "<br><br>";
print_tranpu($com_tranpu[0]);
//一枚目は表示しているので、残りは裏を表示する
for($i=1;$i<$com_all;$i++){
	ura();
}

print "<hr color=purple>";

//ユーザのトランプを表示する
print "<strong>あなた</strong>";
if($start==0){
	print "【親】";
}
else{
	print "【子】";
}
print "<br><br>";
$you_tranpu[$you_all] = tranpu();
for($i=0;$i<$you_all+1;$i++){
	print_tranpu($you_tranpu[$i]);
}

print "<br><br>>トランプを1枚引きました!<br>";


//合計点数を計算する
$you_sum = cal_point($you_tranpu);

$you_num = count($you_sum);
for($i=0;$i<$you_num;$i++){
	print ">合計点数は".$you_sum[$i]."です。<br>";
}

//全ての合計が21を超えていないかを確認する。
$sum = check_21($you_sum);

if($sum==1){
	print ">おめでとうございます!21が出ました!<br>";
	print "<FORM action=21.php method=POST>";
	print "<INPUT TYPE=\"hidden\" NAME=\"select\" VALUE=\"2\">";
	print "<INPUT TYPE=\"hidden\" NAME=\"select\" VALUE=\"2\">";
	print "<INPUT TYPE=\"hidden\" NAME=\"start\" VALUE=\"$start\">";
	$picture_all = count($picture);
	print "<INPUT TYPE=\"hidden\" NAME=\"picture_all\" VALUE=\"$picture_all\">";
	for($i=0;$i<$picture_all;$i++){
		print "<INPUT TYPE=\"hidden\" NAME=\"picture".$i."\" VALUE=\"$picture[$i]\">";
	}
	$com_all = count($com_tranpu);
	print "<INPUT TYPE=\"hidden\" NAME=\"com_all\" VALUE=\"$com_all\">";
	for($i=0;$i<$com_all;$i++){
		print "<INPUT TYPE=\"hidden\" NAME=\"com_tranpu".$i."\" VALUE=\"$com_tranpu[$i]\">";
	}
	$you_all = count($you_tranpu);
	print "<INPUT TYPE=\"hidden\" NAME=\"you_all\" VALUE=\"$you_all\">";
	for($i=0;$i<$you_all;$i++){
		print "<INPUT TYPE=\"hidden\" NAME=\"you_tranpu".$i."\" VALUE=\"$you_tranpu[$i]\">";
	}

	print "<INPUT TYPE=\"submit\" VALUE=\"結果へ\"></form>";
	print "</td></tr></table>";

	exit;
}
else if($sum==2){
	print ">22以上になりました。失格です!<br>";
	print "<FORM action=21.php method=POST>";
	print "<INPUT TYPE=\"hidden\" NAME=\"select\" VALUE=\"2\">";
	print "<INPUT TYPE=\"hidden\" NAME=\"select\" VALUE=\"2\">";
	print "<INPUT TYPE=\"hidden\" NAME=\"start\" VALUE=\"$start\">";
	$picture_all = count($picture);
	print "<INPUT TYPE=\"hidden\" NAME=\"picture_all\" VALUE=\"$picture_all\">";
	for($i=0;$i<$picture_all;$i++){
		print "<INPUT TYPE=\"hidden\" NAME=\"picture".$i."\" VALUE=\"$picture[$i]\">";
	}
	$com_all = count($com_tranpu);
	print "<INPUT TYPE=\"hidden\" NAME=\"com_all\" VALUE=\"$com_all\">";
	for($i=0;$i<$com_all;$i++){
		print "<INPUT TYPE=\"hidden\" NAME=\"com_tranpu".$i."\" VALUE=\"$com_tranpu[$i]\">";
	}
	$you_all = count($you_tranpu);
	print "<INPUT TYPE=\"hidden\" NAME=\"you_all\" VALUE=\"$you_all\">";
	for($i=0;$i<$you_all;$i++){
		print "<INPUT TYPE=\"hidden\" NAME=\"you_tranpu".$i."\" VALUE=\"$you_tranpu[$i]\">";
	}

	print "<INPUT TYPE=\"submit\" VALUE=\"結果へ\"></form>";
	print "</td></tr></table>";

	exit;
}

//データを送信する為のフォームを表示する
print "<table><tr><td>";
print "<FORM action=21.php method=POST>";
print "<INPUT TYPE=\"hidden\" NAME=\"select\" VALUE=\"1\">";
print "<INPUT TYPE=\"hidden\" NAME=\"start\" VALUE=\"$start\">";
$picture_all = count($picture);
print "<INPUT TYPE=\"hidden\" NAME=\"picture_all\" VALUE=\"$picture_all\">";
for($i=0;$i<$picture_all;$i++){
	print "<INPUT TYPE=\"hidden\" NAME=\"picture".$i."\" VALUE=\"$picture[$i]\">";
}
$com_all = count($com_tranpu);
print "<INPUT TYPE=\"hidden\" NAME=\"com_all\" VALUE=\"$com_all\">";
for($i=0;$i<$com_all;$i++){
	print "<INPUT TYPE=\"hidden\" NAME=\"com_tranpu".$i."\" VALUE=\"$com_tranpu[$i]\">";
}
$you_all = count($you_tranpu);
print "<INPUT TYPE=\"hidden\" NAME=\"you_all\" VALUE=\"$you_all\">";
for($i=0;$i<$you_all;$i++){
	print "<INPUT TYPE=\"hidden\" NAME=\"you_tranpu".$i."\" VALUE=\"$you_tranpu[$i]\">";
}

print "<INPUT TYPE=\"submit\" VALUE=\"もう1枚!\"></form>";
print "</td><td>";
print "<FORM action=21.php method=POST>";
print "<INPUT TYPE=\"hidden\" NAME=\"select\" VALUE=\"2\">";
print "<INPUT TYPE=\"hidden\" NAME=\"start\" VALUE=\"$start\">";
$picture_all = count($picture);
print "<INPUT TYPE=\"hidden\" NAME=\"picture_all\" VALUE=\"$picture_all\">";
for($i=0;$i<$picture_all;$i++){
	print "<INPUT TYPE=\"hidden\" NAME=\"picture".$i."\" VALUE=\"$picture[$i]\">";
}
$com_all = count($com_tranpu);
print "<INPUT TYPE=\"hidden\" NAME=\"com_all\" VALUE=\"$com_all\">";
for($i=0;$i<$com_all;$i++){
	print "<INPUT TYPE=\"hidden\" NAME=\"com_tranpu".$i."\" VALUE=\"$com_tranpu[$i]\">";
}
$you_all = count($you_tranpu);
print "<INPUT TYPE=\"hidden\" NAME=\"you_all\" VALUE=\"$you_all\">";
for($i=0;$i<$you_all;$i++){
	print "<INPUT TYPE=\"hidden\" NAME=\"you_tranpu".$i."\" VALUE=\"$you_tranpu[$i]\">";
}

print "<INPUT TYPE=\"submit\" VALUE=\"終わる\"></form>";
//データ送信フォームの終了
print "</td></tr></table>";

print "</td></tr></table>";

}

//////////////////////////////////////////
//     トランプを引くのを止める場合     //
//////////////////////////////////////////

if($select==2){

//どちらが親かのデータを元に戻す
$start = $_POST['start'];

//トランプの全てを元に戻す
$picture_all = $_POST['picture_all'];
for($i=0;$i<$picture_all;$i++){
	$form_picture = "picture".$i;
	$picture[$i] = $_POST["$form_picture"];
}

//コンピュータの手札を元に戻す
$com_all = $_POST['com_all'];
for($i=0;$i<$com_all;$i++){
	$com_picture = "com_tranpu".$i;
	$com_tranpu[$i] = $_POST["$com_picture"];
}

//ユーザの手札を元に戻す
$you_all = $_POST['you_all'];
for($i=0;$i<$you_all;$i++){
	$you_picture = "you_tranpu".$i;
	$you_tranpu[$i] = $_POST["$you_picture"];
}

//コンピュータが引く
$com_flag = 1;

//コンピュータが引き終わるまで繰り返す
while($com_flag = 1){
	
	//現在のポイント数を調べる
	$com_sum = cal_point($com_tranpu);

	//ポイントのMAXを調べる
	$com_max = cal_max($com_sum);

	//ポイントのMINを調べる
	$com_min = cal_min($com_sum);

	$com_num = check_21($com_sum);
	
	if($com_num==2){
		$com_point = $com_min;
		break;
	}
	
	if($com_num==1){
		$com_point = 21;
		break;
	}

	if($com_max>16 && $com_max<22){
		$com_point = cal_spot($com_sum);
		$com_flag = 0;
		break;
	}

	$com_tranpu[$com_all] = tranpu();
	$com_all++;
	$com_sum = cal_point($com_tranpu);

	//print "親:";print_r($com_sum);print "<br>";

}

//トランプを表示させる
print "<table><tr><td class=tranpu>";
//コンピュータのトランプを表示する
print "<strong>コンピュータ</strong>";
if($start==1){
	print "【親】";
}
else{
	print "【子】";
}
print "<br><br>";
//一枚目は表示しているので、残りは裏を表示する
for($i=0;$i<$com_all;$i++){
	print_tranpu($com_tranpu[$i]);
}

print "<hr color=purple>";

//ユーザのトランプを表示する
print "<strong>あなた</strong>";
if($start==0){
	print "【親】";
}
else{
	print "【子】";
}

print "<br><br>";
//一枚目は表示しているので、残りは裏を表示する
for($i=0;$i<$you_all;$i++){
	print_tranpu($you_tranpu[$i]);
}

$you_flag = check_21($tranpu);

if($you_flag==1){
	$you_point = 21;
}
else if($you_flag==2){

	$you_sum = cal_point($you_tranpu);
	$you_point = cal_min($you_sum);


}
else{

	$you_sum = cal_point($you_tranpu);
	$you_point = cal_max2($you_sum);
}


print "<br><br>";
print ">コンピュータのポイントは".$com_point."です。<br>";
print ">あなたのポイントは".$you_point."です。<br><br>";

//どちらが勝つか決める
$win_flag=1;

//両者が同一の時
if($you_point==$com_point){

	if($start == 1){
		//親が勝つ
		win("com");
	}
	else{
		//あなたが勝つ
		win("you");
	}
	
	$win_flag=0;

}

//両方とも21を超える時
if($you_point>21 && $com_point>21 && $win_flag==1){

	if($start == 1){
		if($com_point<=$you_point){
			//親が勝つ
			win("com");
		}
		else{
			//あなたが勝つ
			win("you");
		}
	}
	else{
		if($you_point<=$com_point){
			//あなたが勝つ
			win("you");
		}
		else{
			//親が勝つ
			win("com");
		}
	}

	$win_flag=0;

}

//どちらかが21を超える時
if($you_point>21 && $com_point<22 && $win_flag==1){
	win("com");
	$win_flag=0;
}
if($com_point>21 && $you_point<22 && $win_flag==1){
	win("you");
	$win_flag=0;
}

//両方とも21未満
if($you_point>$com_point && $com_point<22 && $you_point<22 && $win_flag==1){
	win("you");
	$win_flag=0;
}
if($com_point>$you_point && $com_point<22 && $you_point<22 && $win_flag==1){
	win("com");
	$win_flag=0;
}

print "<br>><a href=\"21.php\">もう一度する</a>";

print "</td></tr></table>";


}

//トランプを決定させる
function tranpu(){

	global $picture;
	$all = count($picture);
	
	$flag = 1;

	while($flag==1){
		list($msec,$sec)=split(' ',microtime());
		mt_srand($msec*100000);
		$num = mt_rand(1,52);
		if(in_array($num,$picture)){

		}
		else{
			$flag=0;
		}
	}

	$picture[$all] = $num;

	return $num;

}
//特定範囲のポイントのMAXを返す
function cal_spot($tranpu){

	$num = count($tranpu);

	$max = 0;

	for($i=0;$i<$num;$i++){

		if($max<$tranpu[$i] && $tranpu[$i]<22 && $tranpu[$i]>16){
			$max = $tranpu[$i];
		}
	}

	return $max;

}

//MAXのポイントを返す
function cal_max($tranpu){

	$num = count($tranpu);

	$max = 0;

	for($i=0;$i<$num;$i++){

		if($max<$tranpu[$i]){
			$max = $tranpu[$i];
		}
	}

	return $max;

}

//22未満のMAXのポイントを返す
function cal_max2($tranpu){

	$num = count($tranpu);

	$max = 0;

	for($i=0;$i<$num;$i++){

		if($max<$tranpu[$i] && $tranpu[$i]<22){
			$max = $tranpu[$i];
		}
	}

	return $max;

}

//MINのポイントを返す
function cal_min($tranpu){

	$num = count($tranpu);

	$min = $tranpu[0];

	for($i=0;$i<$num;$i++){

		if($min>$tranpu[$i]){
			$min = $tranpu[$i];
		}
	}

	return $min;

}


//合計ポイントを計算する
function cal_point($tranpu){

	$score = 0;

	$all_score = array();
	$all_score[0] = 0;

	$num = count($tranpu);

	for($i=0;$i<$num;$i++){

		$point = $tranpu[$i]%13;

		if($point==0 || $point>9){
			$point = 10;
		}

		if($point==1){
			$patern = count($all_score);
			for($j=0;$j<$patern;$j++){
				$all_score[$j+$patern] = $all_score[$j] + 11;
				$all_score[$j] = $all_score[$j] + 1;
			}
		}
		else{
			//全ての合計ポイントに現在のポイントを足す
			$patern = count($all_score);
			for($j=0;$j<$patern;$j++){
				$all_score[$j] = $all_score[$j] + $point;
			}
		}
	}
	
	return $all_score;

}

//合計点数による場合わけをする
function check_21($tranpu){
	
	$num = count($tranpu);
	$check = 0;

	for($i=0;$i<$num;$i++){

		$point = $tranpu[$i];

		if($point==21){
			//21がある
			return 1;
		}
		if($point>21){
			$check++;
		}
		else{
		}
	}

	if($check==$num){
		//数値オーバー
		return 2;
	}
	else{
		//21未満がある
		return 0;
	}

}

//トランプの画像を表示させる
function print_tranpu($tranpu){

	$kind = $tranpu%13;

	$path = "";

	if($tranpu > 0 && $tranpu<=13){
		$path = "./tranpu/heart/";
	}
	else if($tranpu >= 14 && $tranpu<=26){
		$path = "./tranpu/diya/";
	}
	else if($tranpu >= 27 && $tranpu<=39){
		$path = "./tranpu/spade/";
	}
	else if($tranpu >= 40 && $tranpu <=52){
		$path = "./tranpu/clover/";
	}

	if($kind == 0){
		$kind = 13;
	}

	$path = $path . $kind . ".gif";

	print "<img src=\"".$path."\">";
}

//トランプの裏画像を表示させる
function ura(){

	$path = "./tranpu/other/ura.gif";

	print "<img src=\"".$path."\">";
}

function win($user){
	if($user=="com"){
		print ">コンピュータが勝利です!<br>";
	}
	else{
		print ">あなたが勝利です!<br>";
	}

}
?>