Блондинке нужно сделать задание, есть программка, необходимо внести изменения) - VB
Формулировка задачи:
Есть програмка (в окне бегают разные шарики и квадратики, при столкновении одинаковых исчезают) нужно внести изменения, а именно:
Во вселенной должен быть один экземпляр ShapeRect и один экземпляр ShapeSphere. Последний при движении отражается от левой, верхней и правой границ окна, а также от верхней грани экземпляра ShapeRect.
a. При достижении экземпляром ShapeSphere нижней границы окна должно выводиться сообщение об «окончании игры», а затем вселенная должна создаваться заново.
b. Экземпляр ShapeRect находится в самом низу окна; абсцисса его центра должна совпадать с абсциссой мыши, а ордината должна быть постоянна.
Полный ноль, не понимаю ничего!!!
Если кто-нибудь откликнется, скину задание на мыло. Заранее большое спасибо!
Решение задачи: «Блондинке нужно сделать задание, есть программка, необходимо внести изменения)»
textual
Листинг программы
Public Class Form1 Dim m_univ As New Universe Dim bDrawCircle As Boolean Dim m_v_max As Single = 5 Private Sub ButtonAdd_Click(ByVal sender As Object, ByVal e As System.EventArgs) Handles ButtonAdd.Click Dim shape As New Shape Dim r As RectangleF r = New RectangleF(Rnd() * PictureBox1.ClientSize.Width, _ Rnd() * PictureBox1.ClientSize.Height, 20, 20) 'r = New RectangleF(Rnd() * PictureBox1.ClientSize.Width, _ ' 100, 20, 20) shape.rect() = r shape.velocity = New Windows.Vector(Rnd() * m_v_max, Rnd() * m_v_max) 'shape.velocity = New Windows.Vector(Rnd() * m_v_max, 0) Dim drawObj As IDrawShape Select Case ComboBox1.SelectedIndex Case 0 drawObj = New DrawShapeCircle shape.ShapeType = 1 Case 1 drawObj = New DrawShapeRect shape.ShapeType = 2 Case 2 drawObj = New DrawShapeSphere("ball3d.png") shape.ShapeType = 1 End Select shape.DrawObj = drawObj Dim opts As IDrawShapeOpts opts = TryCast(drawObj, IDrawShapeOpts) If (opts IsNot Nothing) Then opts.pen = Pens.Brown opts.brush = Brushes.Yellow End If m_univ.AddShape(shape) Refresh() End Sub Private Sub PictureBox1_Paint(ByVal sender As Object, ByVal e As System.Windows.Forms.PaintEventArgs) Handles PictureBox1.Paint m_univ.Draw(e) End Sub Private Sub Timer1_Tick(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Timer1.Tick m_univ.DoTimeStep() Refresh() End Sub Private Sub PictureBox1_Resize(ByVal sender As Object, ByVal e As System.EventArgs) Handles PictureBox1.Resize 'Dim r As Rectangle = PictureBox1.ClientRectangle m_univ.BoundingBox = PictureBox1.ClientRectangle 'New RectangleF(r.X, r.Y, r.Width, r.Height) End Sub Private Sub Form1_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Load ComboBox1.SelectedIndex = 0 Dim testCircle As ICollisionTest = New CollisionTestCircle m_univ.CollisionTest(1, 1) = testCircle Dim actionDestory As ICollisionAction = New CollisionActionDestory m_univ.CollisionAction(1, 1) = actionDestory End Sub End Class Public Class CollisionTestCircle Implements ICollisionTest Dim v As New Windows.Vector Public Function IsCollided(ByVal shape1 As Shape, ByVal shape2 As Shape) As Boolean Implements ICollisionTest.IsCollided Dim r1 As RectangleF = shape1.rect Dim r2 As RectangleF = shape2.rect v.X = (r1.Left + r1.Right) / 2 - (r2.Left + r2.Right) / 2 v.Y = (r1.Top + r1.Bottom) / 2 - (r2.Top + r2.Bottom) / 2 Return (v.Length < (r1.Width / 2 + r2.Width / 2)) End Function End Class Public Class CollisionActionDestory Implements ICollisionAction Public Sub CollideShapes(ByVal shape1 As Shape, ByVal shape2 As Shape) Implements ICollisionAction.CollideShapes shape1.Universe.DelShape(shape1) shape2.Universe.DelShape(shape2) End Sub End Class Public Class DrawShapeOpts Implements IDrawShapeOpts Dim m_pen As Pen = Pens.Black Dim m_br As Brush Public Property brush() As System.Drawing.Brush Implements IDrawShapeOpts.brush Get Return m_br End Get Set(ByVal value As System.Drawing.Brush) m_br = value End Set End Property Public Property pen() As System.Drawing.Pen Implements IDrawShapeOpts.pen Get Return m_pen End Get Set(ByVal value As System.Drawing.Pen) m_pen = value End Set End Property End Class Public Class DrawShapeCircle Inherits DrawShapeOpts Implements IDrawShape Public Sub DrawShape(ByVal shape As Shape, ByVal e As System.Windows.Forms.PaintEventArgs) Implements IDrawShape.DrawShape If brush() IsNot Nothing Then e.Graphics.FillEllipse(brush(), shape.rect) End If If pen() IsNot Nothing Then e.Graphics.DrawEllipse(pen(), shape.rect()) End If 'e.Graphics.DrawEllipse(Pens.Black, shape.rect()) End Sub End Class Public Class DrawShapeRect Inherits DrawShapeOpts Implements IDrawShape Public Sub DrawShape(ByVal shape As Shape, ByVal e As System.Windows.Forms.PaintEventArgs) Implements IDrawShape.DrawShape e.Graphics.DrawRectangle(Pens.Black, shape.rect.X, shape.rect.Y, _ shape.rect.Width, shape.rect.Height) End Sub End Class Public Class DrawShapeSphere Implements IDrawShape Dim m_pic As System.Drawing.Bitmap Public Sub DrawShape(ByVal shape As Shape, ByVal e As System.Windows.Forms.PaintEventArgs) Implements IDrawShape.DrawShape e.Graphics.DrawImage(m_pic, shape.rect) End Sub Sub New(ByVal file As String) m_pic = New System.Drawing.Bitmap(file) End Sub End Class Public Interface IDrawShape Sub DrawShape(ByVal shape As Shape, ByVal e As PaintEventArgs) End Interface Public Interface IDrawShapeOpts Property pen() As Pen Property brush() As Brush End Interface Public Interface IMoveShape Sub MoveShape(ByVal shape As Shape) End Interface Public Interface ICollisionTest Function IsCollided(ByVal shape1 As Shape, ByVal shape2 As Shape) As Boolean End Interface Public Interface ICollisionAction Sub CollideShapes(ByVal shape1 As Shape, ByVal shape2 As Shape) End Interface Public Class MoveShapeReflect Implements IMoveShape Dim pt As New Windows.Vector Public Sub MoveShape(ByVal shape As Shape) Implements IMoveShape.MoveShape Dim r As RectangleF = shape.rect() pt.X = shape.velocity.X pt.Y = shape.velocity.Y r.Offset(pt.X, pt.Y) Dim box As RectangleF = shape.Universe.BoundingBox If r.Left < box.Left Then r.X = box.Left pt.X = -pt.X ElseIf r.Right > box.Right Then r.X = box.Right - r.Width pt.X = -pt.X End If If r.Top < box.Top Then r.Y = box.Top pt.Y = -pt.Y ElseIf r.Bottom > box.Bottom Then r.Y = box.Bottom - r.Height pt.Y = -pt.Y End If shape.rect = r shape.velocity = pt End Sub End Class Public Class Shape Dim m_rect As New RectangleF Dim m_drawObj As IDrawShape Dim m_velocity As Windows.Vector Dim m_moveObj As IMoveShape = New MoveShapeReflect Dim m_univ As Universe Dim m_bCollided As Boolean Dim m_type As Integer Dim m_brushOld As Brush = Brushes.Red Property DrawObj() As IDrawShape Get Return m_drawObj End Get Set(ByVal value As IDrawShape) m_drawObj = value End Set End Property Property rect() As RectangleF Get Return m_rect End Get Set(ByVal value As RectangleF) m_rect = value End Set End Property Public Sub DrawShape(ByVal e As PaintEventArgs) If m_drawObj IsNot Nothing Then m_drawObj.DrawShape(Me, e) End If End Sub Public Property velocity() As Windows.Vector Get Return m_velocity End Get Set(ByVal value As Windows.Vector) m_velocity = value End Set End Property Public Sub MoveShape() If m_moveObj IsNot Nothing Then m_moveObj.MoveShape(Me) End If End Sub Property MoveObj() As IMoveShape Get Return m_moveObj End Get Set(ByVal value As IMoveShape) m_moveObj = value End Set End Property Property Universe() As Universe Get Return m_univ End Get Set(ByVal value As Universe) m_univ = value End Set End Property Property Collided() As Boolean Get Return m_bCollided End Get Set(ByVal value As Boolean) If m_bCollided <> value Then Dim opts As IDrawShapeOpts = TryCast(m_drawObj, IDrawShapeOpts) If opts IsNot Nothing Then Dim br As Brush = opts.brush opts.brush = m_brushOld m_brushOld = br End If End If m_bCollided = value End Set End Property Property ShapeType() As Integer Get Return m_type End Get Set(ByVal value As Integer) m_type = value End Set End Property End Class Public Class Universe Dim m_shapes As New List(Of Shape) Dim m_box As RectangleF Dim m_shAdd As New List(Of Shape) Dim m_shDel As New List(Of Shape) Dim m_bEditEnabled As Boolean = True Const nShapeTypes As Integer = 10 Dim m_clnTest(nShapeTypes, nShapeTypes) As ICollisionTest Dim m_clnAction(nShapeTypes, nShapeTypes) As ICollisionAction ReadOnly Property Shapes() As List(Of Shape) Get Return m_shapes End Get End Property Public Sub AddShape(ByVal shape As Shape) If m_bEditEnabled Then shape.Universe = Me m_shapes.Add(shape) Else m_shAdd.Add(shape) End If End Sub Public Sub DelShape(ByVal shape As Shape) If m_bEditEnabled Then m_shapes.Remove(shape) Else m_shDel.Add(shape) End If End Sub Public Sub Draw(ByVal e As PaintEventArgs) For i As Integer = 0 To m_shapes.Count - 1 'e.Graphics.DrawEllipse(Pens.Black, m_shapes(i).rect()) m_shapes(i).DrawShape(e) Next End Sub Public Sub DoTimeStep() m_bEditEnabled = False For i As Integer = 0 To m_shapes.Count - 1 m_shapes(i).MoveShape() m_shapes(i).Collided = False Next Dim sh1 As Shape, sh2 As Shape 'Dim r1 As RectangleF, r2 As RectangleF For i As Integer = 0 To m_shapes.Count - 1 sh1 = m_shapes(i) For j As Integer = i + 1 To m_shapes.Count - 1 sh2 = m_shapes(j) If Not sh1.rect.IntersectsWith(sh2.rect) Then Continue For End If If m_clnTest(sh1.ShapeType, sh2.ShapeType) Is Nothing Then Continue For End If If m_clnTest(sh1.ShapeType, sh2.ShapeType).IsCollided(sh1, sh2) Then If m_clnAction(sh1.ShapeType, sh2.ShapeType) IsNot Nothing Then m_clnAction(sh1.ShapeType, sh2.ShapeType).CollideShapes(sh1, sh2) End If sh1.Collided = True sh2.Collided = True End If Next Next m_bEditEnabled = True For i = 0 To m_shAdd.Count - 1 AddShape(m_shAdd(i)) Next For i = 0 To m_shDel.Count - 1 DelShape(m_shDel(i)) Next m_shAdd.Clear() m_shDel.Clear() End Sub Property BoundingBox() As RectangleF Get Return m_box End Get Set(ByVal value As RectangleF) m_box = value End Set End Property Property CollisionTest(ByVal i As Integer, ByVal j As Integer) As ICollisionTest Get Return m_clnTest(i, j) End Get Set(ByVal value As ICollisionTest) m_clnTest(i, j) = value End Set End Property Property CollisionAction(ByVal i As Integer, ByVal j As Integer) As ICollisionAction Get Return m_clnAction(i, j) End Get Set(ByVal value As ICollisionAction) m_clnAction(i, j) = value End Set End Property End Class
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д