人力検索はてな
モバイル版を表示しています。PC版はこちら
i-mobile

プログラム初級者からの質問です。言語はPHPです。

じゃんけんの勝負判定のコードを書くとします。
もっとも短く書いてください。
全体のコードではなく、勝負判定の部分を、出来る限り短く、です。関数を定義しても構いません。

●質問者: シオン
●カテゴリ:インターネット ウェブ制作
✍キーワード:PHP じゃんけん コード プログラム 定義
○ 状態 :終了
└ 回答数 : 5/5件

▽最新の回答へ

1 ● KUROX
●24ポイント

x = ((A==0)&&(B==1))||((A==1)&&(B==2))||((A==2)&&(B==0));

y = ((A==0)&&(B==2))||((A==1)&&(B==0))||((A==2)&&(B==1));

hantei = x ? 1 : (y ? 2 : 0);

http://192.244.150.43/lecture/lbp/hw/hw05.htm

より引用

----------------------------------------------------

PHPは、3行目のような?を使えたと思います。

http://www.atmarkit.co.jp/flinux/php4/php4_3/php4_4.html

こちらを見ると?は使えそうですね。

あと、演算子は見直さないと駄目かもしれませんが、ロジックは

これでいけるはずです。

◎質問者からの返答

これは短い! 論理的に3行で収まるとは…

私が書くとif?endifの嵐になるのでどうしようかと思ってたのですよ…勉強になります!


2 ● wizemperor
●20ポイント

チョキ = 0, グー = 1, パー = 2 のようにして、次のような感じではどうですか?

// $hand1 = プレイヤー1の手, $hand2 = プレイヤー2の手
function judge($hand1, $hand2) {
 if (($hand1 + 2) % 3 == $hand2) return 1;
 if (($hand1 + 1) % 3 == $hand2) return 2;
 return 0;
}

プレイヤー1が勝ちなら 1 、プレイヤー2が勝ちなら 2 、あいこなら 0 が返ります。

使い方はこんな感じで。


$hand1 = 2; // プレイヤー1の手 = パー
$hand2 = 0; // プレイヤー2の手 = チョキ

$winner = judge($hand1, $hand2); // $winner = 2(プレイヤー2の勝ち)
◎質問者からの返答

除余算を使うのは思いもつきませんでした。

ifの使い方でも式の建て方一つで随分変わりますね。


3 ● GEN111
●20ポイント
$hand = array('グー', 'チョキ', 'パー') ;
$result = array('ぞうさんの勝ち', 'きりんさんの勝ち', 'あいこ') ;

$e = rand(0, 2) ; // ぞうさん
$g = rand(0, 2) ; // きりんさん

echo "ぞうさん(${hand[$e]}) vs. きりんさん(${hand[$g]})<br />\n" ;
echo $result[($g - $e + 2) % 3] ;
◎質問者からの返答

やはり最終判定の部分は除余算ですね…使い方をマスターせねば。

わざわざrand()関数を入れてこれだけでゲームになっている回答ありがとうございました(´∀`*)


4 ● pyopyopyo
●25ポイント ベストアンサー

じゃんけんの勝敗判定は 一行で書けます.

まず,じゃんけんの手を

と0,1,2の数字で表現します

そして,Aさんの出した手を変数$a,Bさんの出した手を変数$bとすると,以下の計算式で, Aさんの勝敗が計算できます.

 ($a-$b+3)%3;

この計算式の値が

となります.


具体的なプログラムとしては以下のようになります.

<?php

// 引数
// 0 グー
// 1 チョキ
// 2 パー

// 戻値
// 0 アイコ
// 1 aの負け
// 2 aの勝ち
function janken($a, $b)
{
 return ($a-$b+3)%3;
}


$hand = array(0 => "グー ", 1=>"チョキ", 2=>"パー ");
$result = array(0 => "アイコ ", 1=>"aの負け", 2=>"aの勝ち");
 
echo "<pre>";
for ($a=0; $a<3; ++$a){
 for ($b=0; $b<3; ++$b){
 $r = janken($a, $b);
 echo "a: $hand[$a] b: $hand[$b] $result[$r]\n";
 }
}
echo "</pre>";

?>
◎質問者からの返答

全体文はこれはこれでありがたいです。勉強になります。


5 ● Mook
●20ポイント

判定部分だけとはいっても、前後の処理がないと意味がわかりませんので、全体を書いてみました。

赤い部分が判定部分です。


<?php
// 定義
$ar = array( "1"=>"グー", "2"=>"チョキ", "3"=>"パー" );

// 試験ルーチン
foreach ($ar as $a=>$ap) {
 foreach ($ar as $b=>$bp) {
 print $ap. " は ".$bp." に ".janken( $a, $b )."<br>\n";
 }
}

// 勝敗判定関数
function janken( $a, $b ) {
 return ( $a == $b ) ? "あいこ" : ( ( ($a - $b + 3) % 3 != 1 ) ? "勝ち" : "負け" );
}
?>
◎質問者からの返答

フォ、foreachうちの本載ってない(;´д`)もー

除余算なんてどこで使うのかと思っていましたが、結構頻回に使えそうですね。もっと勉強します。

関連質問


●質問をもっと探す●



0.人力検索はてなトップ
8.このページを友達に紹介
9.このページの先頭へ
対応機種一覧
お問い合わせ
ヘルプ/お知らせ
ログイン
無料ユーザー登録
はてなトップ