総合演習2. Advanced

はじめに

クラスを使ってオブジェクト指向の概念に触れてみよう!

それぞれの問にはヒントを用意しましたので、つまずいたら見てみましょう。
オブジェクト指向が得意だという方はヒントを見ずに挑戦してみましょう。

じゃんけんのシミュレーションを行うプログラムを考えます。
以下はプログラムの実行結果例です。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
それではじゃんけんをはじめます!
第1回戦!!
ジャンケン...ポン!
太郎 : パー
二郎 : パー
三郎 : グー
四郎 : パー

1回戦の勝者は...
太郎 さん!
二郎 さん!
四郎 さん!

第2回戦!!
ジャンケン...ポン!
太郎 : パー
二郎 : チョキ
四郎 : グー

あいこでしょ!
太郎 : グー
二郎 : グー
四郎 : パー

優勝者は...
四郎 さん!

以下の問に従って、プログラムを実装してください。

問0(下準備)

まずは以下の構成にしたがってディレクトリを作成してください。

1
2
3
4
5
6
7
  exercises/
    ├ advanced/
    :  ├ main.rb        # 実行ファイル
       └ lib/           # クラスやモジュールを置くためのディレクトリ
          ├ player.rb   # Playerクラスを定義するファイル
          └ janken.rb   # Jankenクラスを定義するファイル

問1

lib/player.rb に、じゃんけんの参加者を表現するPlayerクラスを実装してください。
ただし、このクラスから生成されたインスタンスは以下の属性と振る舞いを持つこととします。(ヒント1

属性

名前

振る舞い

「グー」・「チョキ」・「パー」のいずれか一つを出す

問2

試合を統括するためのJankenクラスを作成してください。
Jankenクラスから生成されたインスタンスは以下の属性を持つこととします。(ヒント2)

属性

じゃんけんに参加する全プレイヤーを格納する配列

問3

Jankenクラスのインスタンス生成時に二人のPlayerインスタンスを渡して、勝敗が決まるまでじゃんけんができるようJankenクラスを拡張してください。(ヒント3

問4

Jankenクラスのインスタンス生成時に任意の人数のPlayerインスタンスを渡して、勝敗が決まるまでじゃんけんができるようJankenクラスを拡張してください。
ただし、勝者が複数人であってもそこで終了とします。
必要に応じてPlayerクラスにもインスタンス変数を追加しても構いません。(ヒント4

問5.

勝ち抜き方式で、最後の一人になるまでじゃんけんができるようJankenクラスを拡張してください。

ヒント

ヒント1

クラスの作成

まずは、「名前」を属性に持つクラスを作成しましょう。
クラスの定義方法はこちらを参考にしてください。

いくつかの選択肢からランダムに値を取り出す

「グー」・「チョキ」・「パー」のいずれか一つを出す

3種類の要素から一つ選択する…いろいろ方法がありそうですね。
どんな方法を使えば簡単に実装できるでしょうか?
与えられた配列の中からランダムで一つの要素を取り出すというピッタリなメソッドが存在します。
調べてみましょう。

ヒント2

Jankenクラスの定義

Jankenクラスに参加者を渡すにはどうすればよいでしょうか?
インスタンス生成時に参加者全員を配列として保持するインスタンス変数を用意しておくと、後の問題が楽になるかもしれません。

ヒント3

二人でのじゃんけんの勝敗判定

二人のプレイヤーをそれぞれABとします。
また、3種類の手に対して、それぞれ以下のように値を割り当てます。

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

このとき、プレイヤーAとプレイヤーBの出した手に応じた数値をそれぞれabとして、その差分a-bを計算すると、法則が見えてきます。

  • Aが勝つパターン: 2 または -1
  • あいこになるパターン: 0
  • Aが負けるパターン: 1 または -2

それぞれに3を足してみると…

  • Aが勝つパターン: 5 または 2 (3で割った余りが2)
  • あいこになるパターン: 3 (3で割った余りが0)
  • Aが負けるパターン: 4 または 1 (3で割った余りが1)

ヒント4

複数人でのじゃんけんの勝敗判定

まず、「あいこ」と「勝敗がついた場合」で後の処理が変わります。
二人でじゃんけんをする場合、あいこになる条件は同じ手を出したときのみでした。
それでは、3人以上でじゃんけんをした時にあいこになる条件は…?
普段複数人でじゃんけんをするとき、勝敗はどのように判断しているのでしょうか?
自分がじゃんけんをした場合を思い返してみてください。
ヒントは「全員が出した手の種類の数」です。
それをプログラムで一般化して表現できれば、参加者の人数によらない柔軟なプログラムにすることが可能です。