私は文字列値 "ABCD"を持っていてButtonClickイベントであれば、文字列をランダムに表示し、他の文字は隠しておく必要があります。すなわち「B *」と表示され、「AB **」と表示されます。隠蔽と表示による文字列操作
これまでのところ、私はforループで立ち往生しています。
For Each c As Char In x
y = Random.Next(0, x.IndexOf(c))
Next
私はまだこの段階でVB.NETを学んでいます。
私は文字列値 "ABCD"を持っていてButtonClickイベントであれば、文字列をランダムに表示し、他の文字は隠しておく必要があります。すなわち「B *」と表示され、「AB **」と表示されます。隠蔽と表示による文字列操作
これまでのところ、私はforループで立ち往生しています。
For Each c As Char In x
y = Random.Next(0, x.IndexOf(c))
Next
私はまだこの段階でVB.NETを学んでいます。
Public Class Form1
Private _indexes As Integer()
Private _currentIndex As Integer
Private _chars As Char()
Private _template As String
Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
Dim rnd = New Random()
_template = "ABCD"
' Create indexes that are randomly sorted
_indexes = Enumerable _
.Range(0, _template.Length) _
.OrderBy(Function(i) rnd.Next()) _
.ToArray()
'Create an array of chars with stars '****'.
_chars = New String("*"c, _template.Length).ToCharArray()
_currentIndex = 0
End Sub
Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
If _currentIndex < _template.Length Then
Dim index As Integer = _indexes(_currentIndex)
_currentIndex += 1
_chars(index) = _template(index)
Dim result As String = New String(_chars)
Label1.Text = result
End If
End Sub
End Class
私はすでにアルゴリズムに焦点を当てた回答を掲載しています。アルゴリズムコードはフォームに直接統合されています。これは機能しますが、良い習慣ではありません。このコードは、再利用可能で、理解しやすく、別のクラスに抽出された場合、より簡単にテストすることができます。
Public Class RandomTextRevealer
Private _indexes As Integer()
Private _currentIndex As Integer
Private _chars As Char()
Private _template As String
Private _result As String
Public Sub New(ByVal templateText As String)
Dim rnd = New Random()
_template = templateText
' Create indexes that are randomly sorted
_indexes = Enumerable _
.Range(0, _template.Length) _
.OrderBy(Function(i) rnd.Next()) _
.ToArray()
'Create an array of chars with stars '****'.
_chars = HiddenText.ToCharArray()
_currentIndex = 0
End Sub
Public Function RevealNext() As String
If _currentIndex < _template.Length Then
Dim index As Integer = _indexes(_currentIndex)
_currentIndex += 1
_chars(index) = _template(index)
_result = New String(_chars)
End If
Return _result
End Function
Public ReadOnly Property HiddenText() As String
Get
Return New String("*"c, _template.Length)
End Get
End Property
End Class
我々はフォームなしで、小さなコンソールアプリケーションでは、このようなクラスをテストすることができます。
Module Programm
Public Sub Main()
Dim revealer = New RandomTextRevealer("Just a test")
Console.WriteLine(revealer.HiddenText)
For i As Integer = 1 To 12
Console.WriteLine(revealer.RevealNext())
Next
Console.ReadKey()
End Sub
End Module
を今、私たちは、このような形でそれを統合することができます(私は、リセットボタンを追加しました異なるランダムな値でテストを繰り返すことができるようにするため):
Public Class Form2
Dim revealer As RandomTextRevealer
Private Sub Form2_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
Reset()
End Sub
Private Sub btnReveal_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnReveal.Click
Label1.Text = revealer.RevealNext()
End Sub
Private Sub btnReset_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnReset.Click
Reset()
End Sub
Private Sub Reset()
revealer = New RandomTextRevealer("ABCD")
Label1.Text = revealer.HiddenText
End Sub
End Class
今私達のフォームのコードは非常にきれいに見えます。
ありがとう..私は後でこのコードを試してみる.. –
デバッガを使ってコードが何か分からない場合は、そのコードを解析したいかもしれない。デバッガでは、コードを段階的に実行したり、コードの実行時に変数の値を検査したりすることができます。 –
実際には動作しますが、Console.WritelineではなくMessageBoxを使用します。 ラベルで変数結果を使用するにはどうすればよいですか? –