アプリ版:「スタンプのみでお礼する」機能のリリースについて

VB2010を使って、基礎から勉強中です。
テキストに紹介してあるサンプルプログラムを作っているところですが、
どうしても、わからないところがあります。

乱数を発生させ、こんばんはという文字を、5つのボタンにランダムに表示させて
ボタンをクリックして、なんという言葉か当てるゲームです。

その中で、For ~ Nextの中に入力されている内容の意味を
詳しく知りたいです。よろしくお願いします。



Public Class Form1
Private answer As String = "こんばんは" '答え
Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load

'答えを文字列の配列に変換
Dim moji() As Char = answer.ToCharArray()

'文字入れ替え
Dim rnd As New Random() '乱数を発生させる

For i As Integer = 1 To 10
Dim n1 As Integer = rnd.Next(5)
Dim n2 As Integer = rnd.Next(5)
Dim m As Char = moji(n1)
moji(n1) = moji(n2)
moji(n2) = m
Next

Button1.Text = moji(0)
Button2.Text = moji(1)
Button3.Text = moji(2)
Button4.Text = moji(3)
Button5.Text = moji(4)

'回答欄を初期化
Label2.Text = ""

End Sub

Private Sub btns_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click,
Button2.Click, Button3.Click, Button4.Click, Button5.Click

Dim btn As Button = CType(sender, Button)
Label2.Text &= btn.Text
btn.Visible = False

If Label2.Text = answer Then
MsgBox("おめでとう", 0, "正解")
ElseIf Label2.Text.Length >= answer.Length Then
MsgBox("残念!", 0, "不正解")
End If

A 回答 (2件)

プログラムの頭から「'答えを文字列の配列に変換」までで、



moji(0) = 'こ'
moji(1) = 'ん'
moji(2) = 'ば'
moji(3) = 'ん'
moji(4) = 'は'

になっていますね。

さてforの中身は。

まず、
入れ替え元のindex番号 n1 (0から4の間)
入れ替え先のindex番号 n2 (0から4の間)
を乱数で選びます。

そして次の3行で、moji(n1) と moji(n2) を入れ替えています。

なぜ m を介しているかというと……。

moji(0) と moji(1) を入れ替えることを考えてみましょう。

いきなり moji(0) = moji(1) を実行してしまうと、
moji(0) = 'ん'
moji(1) = 'ん'
になっちゃいます。

だから、m = moji(0) として'こ'を保存しておけば、続く2行で
moji(0) = moji(1) ' moji(0)='ん'
moji(1) = m    ' moji(1)='こ'
と、入れ替えられるわけです。

for~next文で、それを10回繰り返して、シャッフルしているというわけです。
(n1 と n2 が等しい場合、その1回はシャッフルされてないことになりますが、まあ大きな影響は無いでしょう)
    • good
    • 0
この回答へのお礼

ありがとうございます。すっきりしました。
テキストには詳しく解説がなかったので4日間ぐらい悩んでました。

丁寧に答えていただきありがとうございました。

お礼日時:2011/06/24 23:28

まず、オブジェクト指向プログラミングの独特の記述法を説明します。



オブジェクトの実体名 = new オブジェクト名

例 VBプログラムでエクセルシートを操るとき、 
 プログラム上のエクセルブック名 = New Excel.Application
プログラム上のエクセルブック名.操作命令( )

といった形で、名前を付けて実体化したオブジェクト(インスタンス)の命令を使う形を取ります。

質問のコードの場合、
乱数のオブジェクトRANDOMにrndと名前を付けて、乱数発生命令 next( )を働かせています。
rnt.next(5)とすれば、0以上5未満の乱数が発生するので、0番から4番までの配列の添字の指定ができます。
例えば、4番と1番の文字を入れ替えよとか、0番と2番の文字を入れ替えよとか、気まぐれに入れ替えをします。この気まぐれな入れ替えを10回すると語群の順番は大きく入れ替わります。
このようにして、5つの語群の順番を入れ替えてしまう動作をします。
    • good
    • 0
この回答へのお礼

ありがとうございます。実は何で 1 to 10 なんだろう…といろいろ試していた
ところです。助かりました。

お礼日時:2011/06/24 23:30

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!