クラスを使ったジャンケンプログラムを作成しよう
今回は、クラスを使ったジャンケンプログラムを作成しましょう。
本記事で作成するプログラムの環境は、以下の通りです。
本記事で使用する開発環境
- IDE(統合開発環境)は、Visual Studio Community 2022 を使用します。
- 開発言語は、Visual Basic を使用します。
- フレームワークは、.NET Framework 4.8 を使用します。
Visual Studioのインストール方法は、以下のマイクロソフト公式サイトを参照してください。
ジャンケンのルール
ジャンケンはご存じのように、「グー」「チョキ」「パー」の三すくみになっています。
プレイヤーはグー、チョキ、パーのどれかを画面から入力して、コンピューターはグー、チョキ、パーをランダムに選択するようにします。
このゲームの仕様は、以下のようになります。
ゲームの仕様
- プレイヤーは、グーは「1」、チョキは「2」、パーは「3」を入力する
- プレイヤーが、1、2、3以外を入力した場合、メッセージを表示し、再度入力させるようにする
- コンピューターはランダムにグー、チョキ、パーを選択する
- プレイヤーとコンピューターの出した値を画面に表示する
- どちらが勝ったかを表示する
- ジャンケンを3回繰り返し、合計の勝利数が多い方を勝者とする
ジャンケンをするメンバーのクラス
まず、ジャンケンをするメンバーの情報を格納するクラスを作成します。
コンピューターのジャンケンの手は、Randomクラスを使ってランダムに出します。
クラスをインスタンス化する時に、メンバー名が渡されるようにして、コンストラクタの中でプロパティに設定します。
ジャンケン実行メソッド(Play)では、RandomクラスのNext()メソッドを使って、1~3の値を発生させ、Actプロパティに設定します。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 |
Public Class Member 'プロパティ定義 Public ReadOnly Property Name As String '名前 Public Property Act As Integer 'ジャンケンの手 Public Property Win As Integer '勝数 Public Property Lose As Integer '負数 '乱数オブジェクト Private rnd As Random 'コンストラクタ Sub New(Name As String) Me.Name = Name Me.Act = 0 Me.Win = 0 Me.Lose = 0 rnd = New Random() End Sub 'ジャンケン実行メソッド Sub Play() Me.Act = rnd.Next(1, 4) End Sub End Class |
ジャンケンプログラムのモジュール
ジャンケンプログラムのモジュールは、以下のようになります。
ジャンケンの手(グー、チョキ、パー)を、Dictionaryを使って設定します。
ジャンケンの勝ち負けを、各インスタンスのプロパティに加算していき、ジャンケンが終わった後に勝敗を判定します。
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 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 |
Module Janken 'ジャンケン回数 Private Const CNT As Integer = 3 'ジャンケン定義 Private HAND As New Dictionary(Of Integer, String) From {{1, "グー"}, {2, "チョキ"}, {3, "パー"}} 'メイン処理 Sub Main() Dim Player = New Member("Player") Dim Computer = New Member("Computer") Dim InpNum As Integer 'プレイヤーの入力値 'ジャンケン回数分ループ For i = 1 To CNT 'ジャンケンの手を入力 Console.WriteLine("◆ {0:d}回目 ◆", i) Console.WriteLine("### 1:グー 2:チョキ 3:パー ###") Console.Write("> ") '入力チェック(1~3以外はやり直し) If Integer.TryParse(Console.ReadLine(), InpNum) = False Then Player.Act = 0 Else Player.Act = InpNum End If If Player.Act < 1 OrElse Player.Act > HAND.Count Then Console.WriteLine(">>> 1~3を入力してください! <<<") Console.WriteLine() i -= 1 Continue For End If 'コンピューターがジャンケンを実行 Computer.Play() '各メンバーの実行結果を表示 Console.Write("{0,-10}-> ", Player.Name) Console.WriteLine(HAND(Player.Act)) Console.Write("{0,-10}-> ", Computer.Name) Console.WriteLine(HAND(Computer.Act)) '勝敗判定 If Player.Act = Computer.Act Then Console.WriteLine("*** 引き分け ***") ElseIf (Player.Act = 1 And Computer.Act = 2) OrElse (Player.Act = 2 And Computer.Act = 3) OrElse (Player.Act = 3 And Computer.Act = 1) Then Console.WriteLine("*** {0}の勝利 ***", Player.Name) Player.Win += 1 Computer.Lose += 1 Else Console.WriteLine("*** {0}の勝利 ***", Computer.Name) Player.Lose += 1 Computer.Win += 1 End If Console.WriteLine() Next '結果表示 Console.WriteLine("■■■ 結果 ■■■") Console.WriteLine("{0,-10}:{1:d}勝 {2:d}敗", Player.Name, Player.Win, Player.Lose) Console.WriteLine("{0,-10}:{1:d}勝 {2:d}敗", Computer.Name, Computer.Win, Computer.Lose) If Player.Win > Computer.Win Then Console.WriteLine("*** {0}の勝利!! ***", Player.Name) ElseIf Player.Win < Computer.Win Then Console.WriteLine("*** {0}の勝利!! ***", Computer.Name) Else Console.WriteLine("*** 引き分け ***") End If End Sub End Module |
プログラムの実行
プログラムの実行結果は、以下のようになります。
実行する時は、Ctrl + F5キーを押下してデバッグなしモードで開始します。
クラスのフィールドにPrivate変数を使ったプログラム
上記の例では、クラスのフィールドにPropertyを使っていますが、これをPrivate変数に置き換えると、以下のようなプログラムになります。
Private変数にすると、外部から直接アクセス出来なくなるので、アクセスするためのメソッドを用意する必要があります。
その分コードが長くなりますが、オブジェクト指向のカプセル化という観点では、こちらの方が良いでしょう。
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 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 |
Public Class Member 'プロパティ定義 Private Name As String '名前 Private Act As Integer 'ジャンケンの手 Private Win As Integer '勝数 Private Lose As Integer '負数 '乱数オブジェクト Private rnd As Random 'コンストラクタ Sub New(Name As String) Me.Name = Name Me.Act = 0 Me.Win = 0 Me.Lose = 0 rnd = New Random() End Sub 'ジャンケン実行 Sub Play() Me.Act = rnd.Next(1, 4) End Sub 'ジャンケン結果設定 Sub SetAct(act As Integer) Me.Act = act End Sub '名前取得 Function GetName() As String Return Me.Name End Function 'ジャンケン結果取得 Function GetAct() As Integer Return Me.Act End Function '勝数加算 Sub AddWin() Me.Win += 1 End Sub '負数加算 Sub AddLose() Me.Lose += 1 End Sub '勝数取得 Function GetWin() As Integer Return Me.Win End Function '負数取得 Function GetLose() As Integer Return Me.Lose End Function End Class |
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 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 |
Module Janken 'ジャンケン回数 Private Const CNT As Integer = 3 'ジャンケン定義 Private HAND As New Dictionary(Of Integer, String) From {{1, "グー"}, {2, "チョキ"}, {3, "パー"}} 'メイン処理 Sub Main() Dim Player = New Member("Player") Dim Computer = New Member("Computer") Dim InpNum As Integer 'プレイヤーの入力値 'ジャンケン回数分ループ For i = 1 To CNT 'ジャンケンの手を入力 Console.WriteLine("◆ {0:d}回目 ◆", i) Console.WriteLine("### 1:グー 2:チョキ 3:パー ###") Console.Write("> ") '入力チェック(1~3以外はやり直し) If Integer.TryParse(Console.ReadLine(), InpNum) = False Then Player.SetAct(0) Else Player.SetAct(InpNum) End If If Player.GetAct() < 1 OrElse Player.GetAct() > HAND.Count Then Console.WriteLine(">>> 1~3を入力してください! <<<") Console.WriteLine() i -= 1 Continue For End If 'コンピューターがジャンケンを実行 Computer.Play() '各メンバーの実行結果を表示 Console.Write("{0,-10}-> ", Player.GetName()) Console.WriteLine(HAND(Player.GetAct())) Console.Write("{0,-10}-> ", Computer.GetName()) Console.WriteLine(HAND(Computer.GetAct())) '勝敗判定 If Player.GetAct() = Computer.GetAct() Then Console.WriteLine("*** 引き分け ***") ElseIf (Player.GetAct() = 1 And Computer.GetAct() = 2) OrElse (Player.GetAct() = 2 And Computer.GetAct() = 3) OrElse (Player.GetAct() = 3 And Computer.GetAct() = 1) Then Console.WriteLine("*** {0}の勝利 ***", Player.GetName()) Player.AddWin() Computer.AddLose() Else Console.WriteLine("*** {0}の勝利 ***", Computer.GetName()) Player.AddLose() Computer.AddWin() End If Console.WriteLine() Next '結果表示 Console.WriteLine("■■■ 結果 ■■■") Console.WriteLine("{0,-10}:{1:d}勝 {2:d}敗", Player.GetName(), Player.GetWin(), Player.GetLose()) Console.WriteLine("{0,-10}:{1:d}勝 {2:d}敗", Computer.GetName(), Computer.GetWin(), Computer.GetLose()) If Player.GetWin() > Computer.GetWin() Then Console.WriteLine("*** {0}の勝利!! ***", Player.GetName()) ElseIf Player.GetWin() < Computer.GetWin() Then Console.WriteLine("*** {0}の勝利!! ***", Computer.GetName()) Else Console.WriteLine("*** 引き分け ***") End If End Sub End Module |