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


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

回答の条件
  • 1人2回まで
  • 登録:2007/09/29 15:34:43
  • 終了:2007/09/29 17:41:27

ベストアンサー

id:pyopyopyo No.4

pyopyopyo回答回数357ベストアンサー獲得回数882007/09/29 17:19:06

ポイント25pt

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

まず,じゃんけんの手を

  • グーを0
  • チョキを1
  • パーを2

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

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

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

この計算式の値が

  • 0 ならアイコ
  • 1 ならaさんの負け
  • 2 ならaさんの勝ち

となります.


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

<?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>";

?>
id:countd

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

2007/09/29 17:30:10

その他の回答(4件)

id:KUROX No.1

KUROX回答回数3542ベストアンサー獲得回数1402007/09/29 16:03:48

ポイント24pt

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

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

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

これでいけるはずです。

id:countd

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

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

2007/09/29 17:20:53
id:wizemperor No.2

wizemperor回答回数379ベストアンサー獲得回数522007/09/29 16:08:27

ポイント20pt

チョキ = 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の勝ち)
id:countd

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

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

2007/09/29 17:24:28
id:GEN111 No.3

GEN111回答回数472ベストアンサー獲得回数582007/09/29 16:56:54

ポイント20pt
$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] ;
id:countd

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

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

2007/09/29 17:26:31
id:pyopyopyo No.4

pyopyopyo回答回数357ベストアンサー獲得回数882007/09/29 17:19:06ここでベストアンサー

ポイント25pt

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

まず,じゃんけんの手を

  • グーを0
  • チョキを1
  • パーを2

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

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

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

この計算式の値が

  • 0 ならアイコ
  • 1 ならaさんの負け
  • 2 ならaさんの勝ち

となります.


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

<?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>";

?>
id:countd

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

2007/09/29 17:30:10
id:Mook No.5

Mook回答回数1312ベストアンサー獲得回数3912007/09/29 17:21:33

ポイント20pt

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

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


<?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 ) ? "勝ち" : "負け" );
}
?>
id:countd

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

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

2007/09/29 17:38:52
  • id:Mook
      条件 ? true値 : false値 ;
    の構文は3項演算子で調べると出てくると思います。

      foreach は
    http://php.benscom.com/manual/ja/control-structures.foreach.php
    などをご参照あれ。

    個人的には、GEN111さんの回答好きです。

この質問への反応(ブックマークコメント)

「あの人に答えてほしい」「この質問はあの人が答えられそう」というときに、回答リクエストを送ってみてましょう。

これ以上回答リクエストを送信することはできません。制限について

絞り込み :
はてなココの「ともだち」を表示します。
回答リクエストを送信したユーザーはいません