2015-11-20 2 views
0

Форма 2 состоит в том, чтобы ввести основание лестницы и ее установленное значение, а также для змей, где находится змея, и отбрасывает заданное значение. Невозможно понять, почему он не работает. Когда значения вводятся, чтобы показать симуляцию, это означает, что ошибка show sandl является частной, а другая - проверкой.Змеи и лестницы Vb.net

Public Class Form2 
Dim sandl(99) As Integer 
Dim snakeshead As TextBox() 
Dim snakesoffset As TextBox() 
Dim ladderfoot As TextBox() 
Dim ladderoffset As TextBox() 
Dim rnd As Random = New Random 

Sub initialise() 
    For i = 0 To 99 
     sandl(i) = 0 ' reset data 
    Next 

End Sub 
Sub snake() 
    snakeshead = {txthead1, txthead2, txthead3, txthead4, txthead5, txthead6, txthead7, txthead8, txthead9, txthead10} 
    snakesoffset = {txtoffset1, txtoffset2, txtoffset3, txtoffset4, txtoffset5, txtoffset6, txtoffset7, txtoffset8, txtoffset9, txtoffset10} 

    ' SnakeHead(i).Text = (i + 81).ToString 
    ' SnakeOffset(i).Text = "10" '(i + 10).ToString 

    For i As Integer = 0 To 9 
     While True 
      Dim base = rnd.Next(90) + 11 
      If sandl(base - 1) <> 0 Then 
       Continue While 
      End If 
      Dim offset = rnd.Next(20) + 10 
      If base - offset < 1 Then 
       Continue While 
      End If 
      snakeshead(i).Text = base.ToString 
      snakesoffset(i).Text = offset.ToString 
      sandl(base - 1) = -offset 
      Exit While 
     End While 
    Next 
End Sub 
Sub ladders() 
    ladderfoot = {txtladder1, txtladder2, txtladder3, txtladder4, txtladder5, txtladder6, txtladder7, txtladder8, txtladder9, txtladder10} 
    ladderoffset = {txtladderoffset1, txtladderoffset2, txtladderoffset3, txtladderoffset4, txtladderoffset5, txtladderoffset6, txtladderoffset7, txtladderoffset8, txtladderoffset9, txtladderoffset10} 
    'For i As Integer = 0 To 9 
    ' LadderFoot(i).Text = (i + 11).ToString 
    ' LadderOffset(i).Text = "10" 

    For i As Integer = 0 To 99 
     sandl(i) = 0 'reset data 
    Next 
    For i As Integer = 0 To 9 
     While True 
      Dim base = rnd.Next(90) + 1 
      If sandl(base - 1) <> 0 Then 
       Continue While 
      End If 
      Dim offset = rnd.Next(20) + 10 
      If base + offset > 100 Then 
       Continue While 
      End If 
      ladderfoot(i).Text = base.ToString 
      ladderoffset(i).Text = offset.ToString 
      sandl(base - 1) = offset 
      Exit While 
     End While 
    Next 
End Sub 


Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click 
    For i As Integer = 0 To 99 
     sandl(i) = 0 'reset data 
    Next 
    Dim valid = Validate(ladderfoot, ladderoffset, +1, "Ladder") 
    If (valid) Then 
     valid = Validate(snakeshead, snakesoffset, -1, "Snake") 
    End If 
    If (valid) Then 
     'Form3 = New Form3 
     Form3.ShowDialog() 
    End If 
End Sub 
Private Function Validate(tbBase() As TextBox, tbOffset() As TextBox, delta As Integer, s As String) As Boolean 
    For i As Integer = 0 To 9 
     Dim base As Integer 
     If ((Not Integer.TryParse(tbBase(i).Text.Trim(), base)) OrElse (base < 1) OrElse (base > 100) OrElse (sandl(base - 1) <> 0)) Then 
      MessageBox.Show(s & (i + 1).ToString() & " base is invalid.") 
      tbBase(i).Select() 
      tbBase(i).SelectAll() 
      Return False 
     End If 
     base -= 1 'zero based 
     Dim offset As Integer 
     If ((Not Integer.TryParse(tbOffset(i).Text.Trim(), offset)) OrElse (offset < 10) OrElse (offset > 30) OrElse (base + offset * delta < 0) OrElse (base + offset * delta >= 100)) Then 
      MessageBox.Show(s & (i + 1).ToString() & " offset is invalid.") 
      tbOffset(i).Select() 
      tbOffset(i).SelectAll() 
      Return False 
     End If 
     sandl(base) = offset * delta 'write offset 
    Next 
    Return True 
End Function 
End Class 
Public Class Form3 
Enum EState 
    Dice 
    Move 
    Slide 
    Wait 
    Win 
End Enum 

Dim Fnt = New Font("Arial", 16) 
Dim FntBig = New Font("Arial", 256) 
Dim Frame As Integer = -1 'counter 
Dim State = EState.Dice 
Dim Rnd As Random = New Random 
Dim Dice As Integer 
Dim Pos As Point = New Point(32, 640 + 32) 
Dim CurrentIndex As Integer = -1 
Dim NextIndex As Integer 
Dim TargetIndex As Integer 

Private Sub Form3_Load(sender As Object, e As EventArgs) Handles MyBase.Load 
    Dice = 0 
    Frame = -1 
    State = EState.Dice 
    Pos = New Point(32, 640 + 32) 
    CurrentIndex = -1 
End Sub 

Private Sub PictureBox1_Paint(sender As Object, e As PaintEventArgs) Handles PictureBox1.Paint 
    DrawBackground(e.Graphics) 
    Frame += 1 
    Dim oldState = State 
    Select Case State 
     Case EState.Dice 
      If Frame = 0 Then 
       Dice = Rnd.Next(6) + 1 'roll dice 
       TargetIndex = CurrentIndex + Dice 
       NextIndex = CurrentIndex 
      ElseIf Frame >= 63 Then 
       If CurrentIndex + Dice < 100 Then 
        State = EState.Move 'valid dice 
       Else 
        State = EState.Wait 'invalid dice 
       End If 
       Dice = 0 
      End If 
     Case EState.Move 
      If Frame Mod 64 = 0 Then 
       CurrentIndex = NextIndex 
       If CurrentIndex = TargetIndex Then 
        If CurrentIndex < 99 Then 'not win 
         If Form2.sandl(CurrentIndex) <> 0 Then 
          State = EState.Slide 'snake or ladder 
         Else 
          State = EState.Dice 'empty tile 
         End If 
         TargetIndex = CurrentIndex + Form2.sandl(CurrentIndex) 
        Else 
         State = EState.Win 'win 
        End If 
       Else 
        NextIndex = CurrentIndex + 1 'move 
       End If 
      Else 
       Dim c = GetCoordinate(CurrentIndex) 
       Dim n = GetCoordinate(NextIndex) 
       Dim dx = (n.X - c.X) 
       Dim dy = (n.Y - c.Y) 
       Pos.X = c.X * 64 + (dx * (Frame Mod 64)) + 32 
       Pos.Y = c.Y * 64 + (dy * (Frame Mod 64)) + 32 
      End If 
     Case EState.Slide 
      If Frame >= 63 Then 
       CurrentIndex = TargetIndex 
       If CurrentIndex < 99 Then 
        State = EState.Dice 'not win 
       Else 
        State = EState.Win 'win 
       End If 
      Else 
       Dim c = GetCoordinate(CurrentIndex) 
       Dim n = GetCoordinate(TargetIndex) 
       Dim dx = (n.X - c.X) 
       Dim dy = (n.Y - c.Y) 
       Pos.X = c.X * 64 + (dx * (Frame Mod 64)) + 32 
       Pos.Y = c.Y * 64 + (dy * (Frame Mod 64)) + 32 
      End If 
     Case EState.Wait 
      If Frame >= 63 Then 
       State = EState.Dice 
      End If 
    End Select 
    e.Graphics.FillEllipse(Brushes.Blue, Pos.X - 16, Pos.Y - 16, 32, 32) 'draw player 
    If Dice > 0 Then 
     Dim size = e.Graphics.MeasureString(Dice.ToString, FntBig) 
     e.Graphics.DrawString(Dice.ToString, FntBig, Brushes.Black, 320 - size.Width/2, 320 - size.Height/2) 'print dice 
    End If 
    If State <> oldState Then 
     Frame = -1 'reset counter 
    End If 
    If State <> EState.Win Then 
     PictureBox1.Invalidate() 'schedule next paint 
    End If 
End Sub 

Private Sub DrawBackground(g As Graphics) 
    For y As Integer = 0 To 9 
     For x As Integer = 0 To 9 
      If (((x + y) Mod 2) = 0) Then 
       g.FillRectangle(Brushes.LightGray, x * 64, y * 64, 64, 64) 'dark rectangle 
      End If 
      Dim z = (9 - y) * 10 + x + 1 
      If y Mod 2 = 0 Then 
       z = (9 - y) * 10 + (9 - x) + 1 
      End If 
      g.DrawString(z.ToString, Fnt, Brushes.Black, x * 64, y * 64) 'number 
     Next 
    Next 
    For i As Integer = 0 To 99 
     If Form2.sandl(i) <> 0 Then 
      Dim base = GetCoordinate(i) 
      Dim offset = GetCoordinate(i + Form2.sandl(i)) 
      If Form2.sandl(i) > 0 Then 'ladder 
       Dim delta = Math.Abs(base.X - offset.X) + 4 
       g.DrawLine(Pens.Green, base.X * 64 + 32 - delta, base.Y * 64 + 32, offset.X * 64 + 32 - delta, offset.Y * 64 + 32) 'left part 
       g.DrawLine(Pens.Green, base.X * 64 + 32 + delta, base.Y * 64 + 32, offset.X * 64 + 32 + delta, offset.Y * 64 + 32) 'right part 
      Else 'snake 
       g.DrawLine(Pens.Red, base.X * 64 + 32, base.Y * 64 + 32, offset.X * 64 + 32, offset.Y * 64 + 32) 'red line 
      End If 
     End If 
    Next 
End Sub 

Private Function GetCoordinate(i As Integer) As Point 
    Dim result As Point 
    result.Y = 9 - (i \ 10) 
    result.X = i Mod 10 
    If result.Y Mod 2 = 0 Then 
     result.X = 9 - result.X 
    End If 
    Return result 
End Function 


End Class 

ответ

0

В Form2, изменить свою декларацию от

Dim sandl(99) As Integer 

в

Public sandl(99) As Integer 

Это позволит Форма Form3 доступ к вашему целочисленный массив

Переименовать метод Validate к чему-то еще, например ValidateTextBoxes, или если вы намерены перегрузить base.Validate, тогда объявите как

Private Overloads Function Validate 
Смежные вопросы