質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.49%
PHP

PHPは、Webサイト構築に特化して開発されたプログラミング言語です。大きな特徴のひとつは、HTMLに直接プログラムを埋め込むことができるという点です。PHPを用いることで、HTMLを動的コンテンツとして出力できます。HTMLがそのままブラウザに表示されるのに対し、PHPプログラムはサーバ側で実行された結果がブラウザに表示されるため、PHPスクリプトは「サーバサイドスクリプト」と呼ばれています。

Q&A

解決済

1回答

296閲覧

配列内の最大値の合計を求めたい

iwahaku

総合スコア4

PHP

PHPは、Webサイト構築に特化して開発されたプログラミング言語です。大きな特徴のひとつは、HTMLに直接プログラムを埋め込むことができるという点です。PHPを用いることで、HTMLを動的コンテンツとして出力できます。HTMLがそのままブラウザに表示されるのに対し、PHPプログラムはサーバ側で実行された結果がブラウザに表示されるため、PHPスクリプトは「サーバサイドスクリプト」と呼ばれています。

0グッド

0クリップ

投稿2023/05/24 09:54

実現したいこと

チャンスの出目が出た時に最も大きい出目の合計が表示されるようにしたい

前提

サイコロを5つ振って役を作り、得点を出すゲームです。

役は以下の通りです。
スリーダイス・・・3つの出目が同じ。全ての出目の合計が得点になります。
フォーダイス・・・4つの出目が同じ。全ての出目の合計が同じになります。
フルハウス・・・3つの出目が同じ、かつ残りの2つの出目が同じ。すべての出目の合計が得点になります。
ショートストレート・・・4つの出目が連続している(1,2,3,4,6 / 1,2,2,3,4等)。25点。
ビッグストレート・・・5つの出目がすべて連続している。30点。
ヨット・・・5つの出目が全て同じ。50点。 
チャンス・・・上記の役に該当しなかった場合。最も大きい出目の合計。

サイコロの出目はランダム関数を用いて、ランダムに1~6の値を取得してください。
ランダムな数値はmt_rand(最小値, 最大値)を使用することで取得できます。
$diceに配列として出目が格納されています。

結果表示時は以下の例のように、 1.出目を小さい順に出力し、 2.役 と 3.得点 を表示すること。
役は得点が高い役を採用すること。

発生している問題・エラーメッセージ

現状だと全ての値の合計値が出てしまう

該当のソースコード

function judge($dice) { sort($dice);// $sum = array_sum($dice); //配列の中の値の合計を整数または float として返す。 $name = ""; $u_dice = array_unique($dice);// 配列から重複した値を削除する $count = max(array_count_values($dice)); if($count === 5){ $name = "ヨット"; $sum = 50; } else if($count === 4){ $name = "フォーダイス"; } else if($count === 3){ $name = "スリーダイス"; } else if(range(1,5) == $dice or range(2,6) == $dice){//range:ある範囲の整数を有する配列を作成します。 $name = "ビックストレート"; $sum = "30"; } else if(array_intersect($u_dice, range(1,4)) === range(1,4) || array_intersect($u_dice, range(2,5)) === range(2,5) || array_intersect($u_dice, range(3,6)) === range(3,6)){ $name = "ショートストレート"; $sum = "25"; } //(1)1,2,3,4,? (2)2,3,4,5,? (3)3,4,5,6,?の3通り*(18通り) else { $name = "チャンス"; $sum = } echo "出目は",implode(",",$dice),"<br>"; echo "役は".$name."<br>"; echo "得点は",$sum."点です"; } $dice = [1, 2, 3, 4, 5, 6]; for($i=1; $i<=5; $i++) { $dice[$i] = mt_rand(1,6); } judge($dice); ?>

試したこと

最大値の合計=右2桁の合計と考えて処理を記入するのでしょうか
解説も頂けたらありがたいです。

補足情報(FW/ツールのバージョンなど)

ここにより詳細な情報を記載してください。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

yambejp

2023/05/24 10:23 編集

ちょっと説明不足 スリーダイス、フォーダイス、フルハウスの得点は出目の合計数なんですか・ そうなるとフルハウスはジャッジ不要ですよね?(スリーダイスで要件満たしているので) フォーダイスもヨットでなければスリーダイスと同じですね? チャンスもよくわからないのですが「1,2,3,6,6」は12ということですかね? それぞれの手役の具体的な例を上げたほうが良いと思います
iwahaku

2023/05/24 10:34

得点が同じでも表示されるようにしたいのでフルハウスもフォーダイスも名前は表示したいです。 はい。1,2,3,6,6の場合は[12] 1,2,3,5,6の場合は[6]と表示したいです。
yambejp

2023/05/24 11:10

スリーダイス:[1,1,1,2,3]→8 フォーダイス:[1,1,1,1,2]→6 フルハウス:[1,1,1,2,2]→7 という認識でよいですか?
iwahaku

2023/05/24 11:13

はい。その認識で間違いございません。
guest

回答1

0

ベストアンサー

適当に・・・

PHP

1function judge($a){ 2 sort($a); 3 $tmp=array_reduce($a,function($x,$y){ 4 if(!isset($x[$y]))$x[$y]=0; 5 $x[$y]++; 6 return $x; 7 }); 8 sort($tmp); 9 $point=array_slice($a,-1,1)[0]*(array_slice($a,-1,1)[0]==array_slice($a,-2,1)[0]?2:1); 10 $min=array_slice($tmp,0,1)[0]; 11 $max=array_slice($tmp,-1,1)[0]; 12 $diff=array_values(array_diff(range(1,6),$a)); 13 $hand="buta"; 14 if($max==3) $hand="3dices"; 15 if($max==4) $hand="4dices"; 16 if($min==2 and $max==3) $hand="fullhouse"; 17 if(count($tmp)==5 and in_array($diff[0],[2,5]) or 18 count($tmp)==4 and in_array(implode(",",$diff),["1,6","1,2","5,6"])){ 19 $point=25; 20 $hand="shortstraight"; 21 } 22 if($max==5){ 23 $point=50; 24 $hand="yacht"; 25 } 26 if(count($tmp)==5 and in_array($diff[0],[1,6])){ 27 $point=30; 28 $hand="bigstraight"; 29 } 30 if(in_array($hand,["3dices","4dices","fullhouse"])) $point=array_sum($a); 31 return $hand.":".$point; 32} 33 34print judge([1,2,3,4,5]);

投稿2023/05/25 05:45

yambejp

総合スコア114740

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

iwahaku

2023/05/25 06:47

ありがとうございます。 お手数ですが私の書いたコードのチャンスの$sum = に書き加えるとするとどのように書けばよいでしょうか。。。
iwahaku

2023/05/25 07:56

かけました!ありがとうございました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.49%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問