蛇和梯子Vb.net

时间:2015-11-20 08:09:29

标签: vb.net

表格2是输入梯形底座及其偏离设定值,以及蛇头所在的蛇并且跳过设定值。 无法弄清楚为什么它不起作用。当输入值以显示模拟时,它显示错误sandl是私有的,另一个是验证错误。

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

1 个答案:

答案 0 :(得分:0)

在Form2中,从

更改声明
Dim sandl(99) As Integer

Public sandl(99) As Integer

这将允许Form3访问整数数组

将Validate方法重命名为其他内容,例如ValidateTextBoxes,或者如果您想重载base.Validate,则声明为

Private Overloads Function Validate