回答受付が終了しました

先生から教えてもらったじゃんけんの配列のプログラムで分からないことがあるのですが int[][] JUDGE = { { 0, 1, -1},{-1, 0, 1},

先生から教えてもらったじゃんけんの配列のプログラムで分からないことがあるのですが int[][] JUDGE = { { 0, 1, -1},{-1, 0, 1}, { 1, -1, 0}, この配列(int[][])の意味がうまく理解できなかったので誰か教えてもらえませんか?

Java | C言語関連74閲覧

回答(4件)

0

ii3********さんの回答がわかりやすくて素晴らしい。 そこから、3行3列の組み合わせ表を見立てて、配列の添え字に、出した手の意味を持たせられるか。となって、ama********さんの回答に行き着くわけですが。 質問の配列は途中までで、JUDGEという変数名と、その要素からアルゴリズムを読み解くまで書かれていて、近年まれにみる良質問と回答になっている気がしました。 こういうの楽しいですね。

0

自分でシミュレーションしてみると良いでしょう。 注.配列要素の引数はゼロ・スタートです。 仕様が記述されおらず仕様が不明なので あくまで例えです、下記は あくまでも原理として把握して下さい。 つまり実際の仕様によっては「行は相手、列は自分」とも成りえますし、「グー、チョキ、パー」との値の対応や、「引き分け、負け、勝ち」との値の対応も あくまでも説明のために仮に定義しているだけであり、実際のものではありません(仕様が記述されおらず仕様が不明なので あくまで例えです)。 JUDGE[行][列]とします。 行は自分、列は相手の出したじゃんけんの形の値とします。 じゃんけんの形と値の対応は「グー:0、チョキ:1、パー:2」とします。 JUDGE[行][列]の返り値と勝敗の対応は「-1:負け、0:引き分け、1:勝ち」とします。 「自分(行):グー(0)」は行に「0」、「相手(列):グー(0)」は列に「0」、つまりJUDGE[0][0]の返り値は0(引き分け)となります。 「自分(行):グー(0)」は行に「0」、「相手(列):チョキ(1)」は列に「1」、つまりJUDGE[0][1]の返り値は1(勝ち)となります。 「自分(行):グー(0)」は行に「0」、「相手(列):パー(2)」は列に「2」、つまりJUDGE[0][2]の返り値は-1(負け)となります。 あとは この調子で自分でシミュレーションしてみると良いでしょう。 ただ読むより、自分でシミュレーションした方が理解が深まります。

>JUDGE[行][列]とします。 >行は自分、列は相手の出したじゃんけんの形の値とします。 >じゃんけんの形と値の対応は「グー:0、チョキ:1、パー:2」とします。 >JUDGE[行][列]の返り値と勝敗の対応は「-1:負け、0:引き分け、1:勝ち」とします。 JUDGE[行][列]とします。 行は自分、列は相手の出したじゃんけんの形の値とします(あくまでも説明のための仮の定義です)。 じゃんけんの形と値の対応は「グー:0、チョキ:1、パー:2」とします(あくまでも説明のための仮の定義です)。 JUDGE[行][列]の返り値と勝敗の対応は「-1:負け、0:引き分け、1:勝ち」とします(あくまでも説明のための仮の定義です)。

3

勝敗のパターンをまとめたもの。 0があいこ、1が勝ち、-1が負け。 2人でじゃんけんをする時、勝敗のパターンは全部で9通り。 自分がグー、相手がグー → あいこ 自分がグー、相手がチョキ → 勝ち 自分がグー、相手がパー → 負け 自分がチョキ、相手がグー → 負け 自分がチョキ、相手がチョキ → あいこ 自分がチョキ、相手がパー → 勝ち 自分がパー、相手がグー → 勝ち 自分がパー、相手がチョキ → 負け 自分がパー、相手がパー → あいこ これをコードに落とすとなると if (自分の手 == グー && 相手の手 == グー) { // あいこ } else if (自分の手 == グー && 相手の手 == チョキ) { // 勝ち } else if (自分の手 == グー && 相手の手 == パー) { // 負け } else if () { : とif-elseを9パターン作らないといけない。 9個もif-elseを書くのはすごい無駄。 それに異なる条件式で勝ち・負け・あいこが複数回出てくる。 もっと簡略化できそう。 たとえば、グーを0、チョキを1、パーを2と見立て、全パターンを変換するとこうなる。 自分が0、相手が0 → あいこ 自分が0、相手が1 → 勝ち 自分が0、相手が2 → 負け 自分が1、相手が0 → 負け 自分が1、相手が1 → あいこ 自分が1、相手が2 → 勝ち 自分が2、相手が0 → 勝ち 自分が2、相手が1 → 負け 自分が2、相手が2 → あいこ さらにあいこを0、勝ちを1、負けを-1に変換するとこうなる。 自分が0、相手が0 → 0 自分が0、相手が1 → 1 自分が0、相手が2 → -1 自分が1、相手が0 → -1 自分が1、相手が1 → 0 自分が1、相手が2 → 1 自分が2、相手が0 → 1 自分が2、相手が1 → -1 自分が2、相手が2 → 0 ここで、自分が0のところだけ抜き出す。 相手が0 → 0 相手が1 → 1 相手が2 → -1 0のとき0、1のとき1、2のとき-1だから、配列で表現できそう。 ということで、配列化して{0, 1, -1}とする。 同様に自分が1のところを抜き出して配列化すると{-1, 0, 1}、自分が2のところを抜き出して配列化すると{1, -1, 0}とする。 自分が0 → {0, 1, -1} 自分が1 → {-1, 0, 1} 自分が2 → {1, -1, 0} という状態まできたけど、さらにこれも配列化できそう。 ってことで、{{0, 1, -1}, {-1, 0, 1} ,{1, -1, 0}}。 こいつに名前をつけて、int[][] JUDGE = {{0, 1, -1}, {-1, 0, 1} ,{1, -1, 0}}; あとはJUDGE[自分の手][相手の手]が0ならあいこ、1なら勝ち、-1なら負け、という作りにできる。 つまり、こういう実装。 if (JUDGE[自分の手][相手の手] == 0) { // あいこ } else if (JUDGE[自分の手][相手の手] == 1) { // 勝ち } else if (JUDGE[自分の手][相手の手] == -1) { // 負け } 最初は9個ものif-elseで作ってたが、シンプルに3つにif-elseで作れた。

3人がナイス!しています

0

自分と相手の手を入れると自動的に勝敗が出てくる対応表じゃないでしょうか 紙の上に、自分の手と相手の手を縦横に書いて、2次元の表にして書くと、その配列の意味がわかるかとおもいます。