Изобразить лодку, которая перемещается слева направо по нижнему краю формы - VB

Узнай цену своей работы

Формулировка задачи:

Программа - генерация графических объектов . Компактный набор треугольников одного цвета и квадратов другого цвета произвольно движутся по форме, изменяя размеры только квадратов и общие цвета рисуются с помощью графических методов формы или управляющего элемента PictureBox. Лодка, которая перемещается слева направо по нижнему краю формы, а при достижении края формы изменяет направление движения, рисуется с помощью массива управляющих элементов Shape или Line. Перемещение осуществляется по траектории, определенной вариантом и с временной задержкой, определяемой элементом Timer.
С элементом ProgressBar, с помощью которого иллюстрируется полный цикл процесса, проблема. Определяется интервал отображения процесса неверно. В первом случае - при достижении набора краев должен достигаться максимум,а во втором случае - когда лодочка опаздывает, когда ProgressBar видно (с этим проблема появилась после применения его к первому заданию). Подскажите где ошибка и как исправить, пожалуйста.
Как исправить ошибку?

Решение задачи: «Изобразить лодку, которая перемещается слева направо по нижнему краю формы»

textual
Листинг программы
Option Explicit
 
Dim xx As Integer, yy As Integer
Dim cv As Integer
Dim iPositon As Integer
Dim iDirection As Integer
 
Private Sub Command1_Click()
    start
End Sub
 
Private Sub Command2_Click()
    Call brake
End Sub
 
Private Sub Command3_Click()
  If MsgBox("Вы уверены ?", vbYesNo + vbQuestion, "Quit") = vbYes Then
    Unload Form1
  End If
End Sub
 
Private Sub Form_Load()
   Dim i As Integer
 
    For i = 0 To 3
      Line1(i).Visible = False
    Next i
    
    ScaleMode = 1
    SSTab1.Tabs = 2
    SSTab1.TabsPerRow = 2
    SSTab1.TabCaption(0) = "Задание 1"
    SSTab1.TabCaption(1) = "Задание 2"
    SSTab1.Tab = 0
 
    InSSTabRazm
 
    Form1.Caption = ""
    Command1.Caption = "Пуск"
    Command2.Caption = "Стоп"
    Command3.Caption = "Выход"
 
End Sub
 
Private Sub InSSTabRazm()
 
    Form1.Top = 0
    Form1.Left = 0
    Form1.Height = Screen.Height
    Form1.Width = Screen.Width
 
    SSTab1.Top = Form1.Top + 200
    SSTab1.Left = Form1.Left + 3000
    SSTab1.Height = Form1.Height - 2000
    SSTab1.Width = Form1.Width - 4000
 
    Command1.Top = Form1.Top + 500
    Command1.Left = Form1.Left + 100
    Command1.Height = 500
    Command1.Width = 1500
    Command2.Height = 500
    Command2.Width = 1500
    Command3.Height = 500
    Command3.Width = 1500
    Command2.Top = Command1.Top + Command1.Height + 300
    Command2.Left = 100
    Command3.Top = Command2.Top + Command2.Height + 300
    Command3.Left = Form1.Left + 100
 
    Picture1.BorderStyle = 0
    Picture1.Left = SSTab1.Left - 2960
    Picture1.Top = SSTab1.Top + 600
    Picture1.Height = Me.ScaleHeight - 3000 
    Picture1.Width = SSTab1.Width - 90
    
    iPositon = 0
    iDirection = 1
    
    ProgressBar1.Top = SSTab1.Top + SSTab1.Height + 200
    ProgressBar1.Left = SSTab1.Left
    ProgressBar1.Width = SSTab1.Width
    ProgressBar1.Visible = False
    ProgressBar1.Min = 0
    ProgressBar1.Max = ProgressBar1.Width
 
End Sub
 
Private Sub start()
 
    Dim i As Integer
    
    ProgressBar1.Visible = True
 
    If SSTab1.Tab = 0 Then
        Timer1.Interval = 50
        Timer1.Enabled = True
        Picture1.Visible = True
    Else
        For i = 0 To 3
            Line1(i).Visible = True
        Next i
        Timer2.Interval = 20
        Timer2.Enabled = True
    End If
 
End Sub
 
Private Sub SSTab1_Click(PreviousTab As Integer)
    
    If SSTab1.Tab <> PreviousTab Then
        Call brake1
    End If
 
End Sub
 
Private Sub Timer1_Timer()
    MkPcBx
End Sub
 
Private Sub Timer2_Timer()
    MkLin
End Sub
 
Private Sub brake()
 
    If SSTab1.Tab = 0 Then
        Timer1.Enabled = False
    Else
        Timer2.Enabled = False
    End If
 
End Sub
Private Sub brake1()
    Dim i As Integer
    
    ProgressBar1.Visible = False
    If SSTab1.Tab = 0 Then
        xx = 0
        yy = 0
        ProgressBar1.Value = 0
        Timer1.Enabled = False
        Timer2.Enabled = False
        Picture1.Cls
        For i = 0 To 3
            Line1(i).Visible = False
        Next i
    Else
        ProgressBar1.Value = 0
        Timer1.Enabled = False
        Timer2.Enabled = False
        Form1.Cls
        For i = 0 To 3
            Line1(i).Visible = False
        Next i
    End If
 
End Sub
 
Private Sub MkPcBx()
Dim dX As Integer, dY As Integer
 
    dX = Int(Rnd * 500)
    dY = Int(Rnd * 100)
    If iDirection = 1 Then
    If xx + 1800 + dX >= Picture1.ScaleWidth Then iDirection = -1
    ProgressBar1.Value = xx + 1600
    Else
    If xx + 300 - dX <= 0 Then iDirection = 1
    ProgressBar1.Value = xx + 300
    End If
    xx = xx + dX * iDirection
    
    'ProgressBar1.Value = xx + 1600
    
    If iDirection = 1 Then
    If yy + 2100 >= Picture1.Height Then iDirection = -1
    Else
    If yy - 300 <= 0 Then iDirection = 1
    End If
    yy = yy + dY * iDirection
    Call PcBx(xx, yy)
    Exit Sub
End Sub
 
Private Sub PcBx(x As Integer, y As Integer)
Dim c As Integer
 
Picture1.Cls
Picture1.DrawWidth = 2
c = Rnd * 10
Picture1.Line (x + 800, y + 600)-(x + 950, y + 300), QBColor(c + 2)
Picture1.Line (x + 950, y + 300)-(x + 1100, y + 600), QBColor(c + 2)
Picture1.Line (x + 1100, y + 600)-(x + 800, y + 600), QBColor(c + 2)
 
Picture1.Line (x + 1300, y + 2000)-(x + 1450, y + 1700), QBColor(c + 2)
Picture1.Line (x + 1450, y + 1700)-(x + 1600, y + 2000), QBColor(c + 2)
Picture1.Line (x + 1600, y + 2000)-(x + 1300, y + 2000), QBColor(c + 2)
 
Picture1.Line (x + 300, y + 2000)-(x + 450, y + 1700), QBColor(c + 2)
Picture1.Line (x + 450, y + 1700)-(x + 600, y + 2000), QBColor(c + 2)
Picture1.Line (x + 600, y + 2000)-(x + 300, y + 2000), QBColor(c + 2)
 
Picture1.Line (x + 800 + c * 10, y + 800)-(x + 1100, y + 1100 + c * 30), QBColor(c + 4), B
 
Picture1.Line (x + 800 + c * 10, y + 1300)-(x + 1100, y + 1600 + c * 30), QBColor(c + 4), B
End Sub
 
Private Sub MkLin()
    Dim YS As Integer
    Dim i As Integer
 
     
    iPositon = iPositon + 50 * iDirection
    If iDirection = 1 Then
    If iPositon + 1000 >= ProgressBar1.Width Then iDirection = -1 * iDirection
    Else
    If iPositon - 1000 <= 0 Then iDirection = -1 * iDirection
    End If
    
    ProgressBar1.Value = iPositon + 1000 * iDirection
    YS = SSTab1.Height - 1000
    Line1(0).X1 = iPositon
    Line1(0).X2 = iPositon + 1000 * iDirection
    Line1(0).Y1 = YS
    Line1(0).Y2 = YS
    
    Line1(1).X1 = iPositon
    Line1(1).X2 = iPositon + 1000 * iDirection - 200 * iDirection
    Line1(1).Y1 = YS + 400
    Line1(1).Y2 = YS + 400
    
    Line1(2).X1 = iPositon
    Line1(2).X2 = iPositon
    Line1(2).Y1 = YS
    Line1(2).Y2 = YS + 400
    
    Line1(3).X1 = iPositon + 1000 * iDirection
    Line1(3).X2 = iPositon + 1000 * iDirection - 200 * iDirection
    Line1(3).Y1 = YS
    Line1(3).Y2 = YS + 400
    
End Sub

ИИ поможет Вам:


  • решить любую задачу по программированию
  • объяснить код
  • расставить комментарии в коде
  • и т.д
Попробуйте бесплатно

Оцени полезность:

13   голосов , оценка 4.077 из 5
Похожие ответы