2011-12-26 5 views
0

私は文字列値 "ABCD"を持っていてButtonClickイベントであれば、文字列をランダムに表示し、他の文字は隠しておく必要があります。すなわち「B *」と表示され、「AB **」と表示されます。隠蔽と表示による文字列操作

これまでのところ、私はforループで立ち往生しています。

For Each c As Char In x 
     y = Random.Next(0, x.IndexOf(c)) 
    Next 

私はまだこの段階でVB.NETを学んでいます。

答えて

1
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 
+0

ありがとう..私は後でこのコードを試してみる.. –

+0

デバッガを使ってコードが何か分からない場合は、そのコードを解析したいかもしれない。デバッガでは、コードを段階的に実行したり、コードの実行時に変数の値を検査したりすることができます。 –

+0

実際には動作しますが、Console.WritelineではなくMessageBoxを使用します。 ラベルで変数結果を使用するにはどうすればよいですか? –

0

私はすでにアルゴリズムに焦点を当てた回答を掲載しています。アルゴリズムコードはフォームに直接統合されています。これは機能しますが、良い習慣ではありません。このコードは、再利用可能で、理解しやすく、別のクラスに抽出された場合、より簡単にテストすることができます。

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 

今私達のフォームのコードは非常にきれいに見えます。