Results 1 to 5 of 5

Thread: [VB.Net] Pong

  1. #1

    Thread Starter
    Super Moderator dday9's Avatar
    Join Date
    Mar 2011
    Location
    South Louisiana
    Posts
    11,698

    [VB.Net] Pong

    This is the source code and the .exe

    Features:
    1. Plays Pong


    Drawbacks:
    1. The ai is very hard. You can make it a little easier, but I like it like it is.
    2. It is a very basic program. No graphics, or special effects. Just a very simple game


    Notes:
    • It's just a basic example of one of my favorite atari games


    Full Project:
    pong.zip

    Source Code:
    Code:
    Option Strict On
    Option Explicit On
    Public Class Form1
        'Variabl
        Private speed As Integer = 35
        Private playing As Boolean = False
        Private wins As Integer = 0
        Private x As Integer = -10
        Private y As Integer = -10
    
        'Controls
        Private userPaddle As New Panel
        Private cpuPaddle As New Panel
        Private ball As New Panel
        Private tmr As New System.Windows.Forms.Timer
    
    
        Private Sub Form1_Load(sender As System.Object, e As System.EventArgs) Handles MyBase.Load
    
            With Me
                .Text = "Pong"
                .WindowState = FormWindowState.Maximized
                .KeyPreview = True
            End With
    
            With userPaddle
                userPaddle.BackColor = Color.Black
                userPaddle.BorderStyle = BorderStyle.FixedSingle
                userPaddle.Size = New Size(10, 150)
                userPaddle.Location = New Point(15, CInt(Me.Height / 2 - userPaddle.Height / 2))
                Me.Controls.Add(userPaddle)
            End With
    
            With cpuPaddle
                cpuPaddle.BackColor = Color.Black
                cpuPaddle.BorderStyle = BorderStyle.FixedSingle
                cpuPaddle.Size = New Size(10, 150)
                cpuPaddle.Location = New Point(Me.Width - cpuPaddle.Width - 30, CInt(Me.Height / 2 - cpuPaddle.Height / 2))
                Me.Controls.Add(cpuPaddle)
            End With
    
            With ball
                ball.BackColor = Color.Black
                ball.BorderStyle = BorderStyle.FixedSingle
                ball.Size = New Size(10, 10)
                ball.Location = New Point(CInt(Me.Width / 2 - ball.Width / 2), CInt(Me.Height / 2 - ball.Height / 2))
                Me.Controls.Add(ball)
            End With
    
            With tmr
                .Interval = speed
                .Enabled = False
            End With
    
            AddHandler tmr.Tick, AddressOf Timer_Tick
    
        End Sub
    
        Private Sub Form1_KeyDown(sender As Object, e As System.Windows.Forms.KeyEventArgs) Handles Me.KeyDown
            If e.KeyCode = Keys.Space Then
                If playing = False Then
                    playing = True
                    tmr.Enabled = True
                End If
            End If
    
            If e.KeyCode = Keys.Up Then
                If playing Then
                    userPaddle.Top -= 20
                End If
            End If
    
            If e.KeyCode = Keys.Down Then
                If playing Then
                    userPaddle.Top += 20
                End If
            End If
        End Sub
    
        Private Sub Timer_Tick(sender As Object, e As EventArgs)
            If playing Then
                collision()
            End If
        End Sub
    
        Private Sub collision()
            ai()
    
            ball.Location = New Point(ball.Location.X + x, ball.Location.Y + y)
    
            'If it hits the top of the form
            If ball.Top <= Me.Top Then
                y = -y
            End If
    
            'If it hits the bottom of the form
            If ball.Bottom >= Me.Bottom Then
                y = -y
            End If
    
            'If it hits the userPaddle
            If ball.Bounds.IntersectsWith(userPaddle.Bounds) Then
                x = -x
                speed -= 1
            End If
    
            'If it hits the cpuPaddle
            If ball.Bounds.IntersectsWith(cpuPaddle.Bounds) Then
                x = -x
            End If
    
            'If it hits the cpu's wall
            If ball.Right >= Me.Right Then
                wins += 1
                tmr.Enabled = False
                reset()
            End If
    
            'If it hits the player's wall
            If ball.Left <= Me.Left Then
                tmr.Enabled = False
                reset()
            End If
    
    
        End Sub
    
        Private Sub reset()
            playing = False
            x = -10
            y = -10
    
            With Me
                .Text = "Pong | Score: " & wins
                .WindowState = FormWindowState.Maximized
                .KeyPreview = True
            End With
    
            With userPaddle
                userPaddle.BackColor = Color.Black
                userPaddle.BorderStyle = BorderStyle.FixedSingle
                userPaddle.Size = New Size(10, 150)
                userPaddle.Location = New Point(15, CInt(Me.Height / 2 - userPaddle.Height / 2))
                Me.Controls.Add(userPaddle)
            End With
    
            With cpuPaddle
                cpuPaddle.BackColor = Color.Black
                cpuPaddle.BorderStyle = BorderStyle.FixedSingle
                cpuPaddle.Size = New Size(10, 150)
                cpuPaddle.Location = New Point(Me.Width - cpuPaddle.Width - 30, CInt(Me.Height / 2 - cpuPaddle.Height / 2))
                Me.Controls.Add(cpuPaddle)
            End With
    
            With ball
                ball.BackColor = Color.Black
                ball.BorderStyle = BorderStyle.FixedSingle
                ball.Size = New Size(10, 10)
                ball.Location = New Point(CInt(Me.Width / 2 - ball.Width / 2), CInt(Me.Height / 2 - ball.Height / 2))
                Me.Controls.Add(ball)
            End With
    
            With tmr
                .Interval = speed
                .Enabled = False
            End With
        End Sub
    
        Private Sub ai()
            If ball.Location.Y < cpuPaddle.Bottom - 10 Then
                cpuPaddle.Location = New Point(cpuPaddle.Location.X, cpuPaddle.Location.Y - 20)
            End If
            If ball.Location.Y > cpuPaddle.Top + 10 Then
                cpuPaddle.Location = New Point(cpuPaddle.Location.X, cpuPaddle.Location.Y + 20)
            End If
    
        End Sub
    End Class
    Edit - Here is a player vs. player version I worked up. It's at 200 lines of code, so it's fairly simple:

    Code:
    Option Strict On
    Option Explicit On
    Public Class Form1
    
    #Region "Variables"
        'The controls
        Private game_timer As New Timer
        Private lbl_over As New Label
        Private p1_paddle As New Panel
        Private p2_paddle As New Panel
        Private ball As New Panel
    
        'Other variables
        Private playing As Boolean = False
        Private game_speed As Integer = 10
        Private x_move As Integer = -1
        Private y_move As Integer = -1
    #End Region
    
    #Region "New/End Game"
    
        Private Sub NewGame()
    
            'Put the paddles in their location
            p1_paddle.Location = New Point(15, CInt(Me.Width / 2 - p1_paddle.Width / 2))
            p2_paddle.Location = New Point(Me.Width - 30, CInt(Me.Width / 2 - p2_paddle.Width / 2))
    
            'Put the ball in it's location
            'It will be Me's <height/width> divided by two minus the ball's <height/width> divided by two for an exact center
            ball.Location = New Point(CInt(Me.Width / 2 - ball.Width / 2), CInt(Me.Height / 2 - ball.Height / 2))
    
            'Make the ball visibile again
            ball.Visible = True
    
            'Hide the label
            lbl_over.Visible = False
    
        End Sub
        Private Sub GameOver()
            'Stop the timer
            playing = False
            game_timer.Enabled = playing
    
            'Hide the ball
            ball.Visible = False
    
            'Hide the label
            lbl_over.Visible = True
    
        End Sub
    
    #End Region
    
    #Region "Movement"
    
        Private Sub Form1_MouseMove(sender As Object, e As System.Windows.Forms.MouseEventArgs) Handles Me.MouseMove
            'Move only the y loction value or the top
            p1_paddle.Top = CInt(e.Location.Y - p1_paddle.Height / 2)
    
        End Sub
    
        Private Sub Form1_KeyDown(sender As Object, e As System.Windows.Forms.KeyEventArgs) Handles Me.KeyDown
            'Move only the y loction value
            If e.KeyCode = Keys.Up Then
                p2_paddle.Top -= 5
            ElseIf e.KeyCode = Keys.Down Then
                p2_paddle.Top += 5
            ElseIf e.KeyCode = Keys.Space Then
                If Not (playing) Then
                    playing = True
                    game_timer.Enabled = playing
    
                    Call NewGame()
                End If
            End If
    
        End Sub
    
    #End Region
    
    #Region "Control Events"
    
        Private Sub Form1_Load(sender As System.Object, e As System.EventArgs) Handles MyBase.Load
    
            'Set up tick event
            AddHandler game_timer.Tick, AddressOf Game_Tick
    
            'Set up paint event for the ball
            AddHandler ball.Paint, AddressOf Ball_Paint
    
            'Set up timer
            With game_timer
                .Enabled = playing
                .Interval = game_speed
            End With
    
            'Set up the paddles
            With p1_paddle
                .BackColor = Color.White
                .BorderStyle = BorderStyle.FixedSingle
                .Size = New Size(10, 100)
            End With
    
            With p2_paddle
                .BackColor = Color.Honeydew
                .BorderStyle = BorderStyle.FixedSingle
                .Size = New Size(10, 100)
            End With
    
            'Set up the ball
            With ball
                .BackColor = Color.Ivory
                .BorderStyle = BorderStyle.None
                .Size = New Size(25, 25)
            End With
    
            'Set up the label
            With lbl_over
                .ForeColor = Color.White
                .Left = CInt(Me.Width / 2 - lbl_over.Width / 2)
                .Text = "Press the spacebar or left-click for a new game."
                .Top = 5
                .Visible = True
            End With
    
            'Set up me!
            With Me
                .BackColor = Color.Black
                .Controls.AddRange({p1_paddle, p2_paddle, ball, lbl_over})
                .Size = New Size(450, 600)
                .Text = "Pong - PVP"
                .StartPosition = FormStartPosition.CenterScreen
            End With
        End Sub
    
        Private Sub Form1_Click(sender As Object, e As System.EventArgs) Handles Me.Click
            playing = True
            game_timer.Enabled = playing
    
            Call NewGame()
        End Sub
    
        Private Sub Form1_Resize(sender As Object, e As System.EventArgs) Handles Me.Resize
            If Not (playing) Then
                'Put the paddles in their location
                p1_paddle.Location = New Point(15, CInt(Me.Width / 2 - p1_paddle.Width / 2))
                p2_paddle.Location = New Point(Me.Width - 30, CInt(Me.Width / 2 - p2_paddle.Width / 2))
    
                'Put the ball in it's location
                'It will be Me's <height/width> divided by two minus the ball's <height/width> divided by two for an exact center
                ball.Location = New Point(CInt(Me.Width / 2 - ball.Width / 2), CInt(Me.Height / 2 - ball.Height / 2))
            End If
        End Sub
    
        Private Sub Ball_Paint(sender As Object, e As PaintEventArgs)
            Dim gp As New System.Drawing.Drawing2D.GraphicsPath
    
            ' Set a new rectangle to the same size as the button's  
            ' ClientRectangle property. 
            Dim newRectangle As Rectangle = ball.ClientRectangle
    
            ' Decrease the size of the rectangle.
            newRectangle.Inflate(-1, -1)
    
            ' Draw the button's border. 
            e.Graphics.DrawEllipse(System.Drawing.Pens.Black, newRectangle)
    
            'Increase the size of the rectangle to include the border.
            newRectangle.Inflate(1, 1)
    
            ' Create a circle within the new rectangle.
            gp.AddEllipse(newRectangle)
            e.Graphics.FillPath(New SolidBrush(ball.BackColor), gp)
    
            ' Set the button's Region property to the newly created  
            ' circle region.
            ball.Region = New System.Drawing.Region(gp)
        End Sub
    
        Private Sub Game_Tick(sender As Object, e As EventArgs)
            'Move the ball
            ball.Left += x_move
            ball.Top += y_move
    
            If ball.Bounds.IntersectsWith(p1_paddle.Bounds) OrElse ball.Bounds.IntersectsWith(p2_paddle.Bounds) Then
                'the ball hit one of the paddles
                x_move = -x_move
            ElseIf ball.Top <= 0 OrElse ball.Bottom >= Me.Height - ball.Height Then
                'the ball hit the top or bottom
                y_move = -y_move
            ElseIf ball.Left <= 0 OrElse ball.Right >= Me.Width - ball.Width Then
                'game over
                Call GameOver()
            End If
    
        End Sub
    
    #End Region
    
    End Class
    Last edited by dday9; Jun 27th, 2013 at 02:13 PM.
    "Code is like humor. When you have to explain it, it is bad." - Cory House
    VbLessons | Code Tags | Sword of Fury - Jameram

  2. #2
    New Member
    Join Date
    Sep 2012
    Location
    Ahmedabad, Gujarat
    Posts
    2

    Re: [VB.Net] Pong

    It's really nice game. I think this is really good concept and really impressive graphic.. I am very tired after playing such a unique concept like racing, horror games but it is really good game to play.

  3. #3

    Thread Starter
    Super Moderator dday9's Avatar
    Join Date
    Mar 2011
    Location
    South Louisiana
    Posts
    11,698

    Re: [VB.Net] Pong

    Thanks alot, me and my brother use to stay up all night playing pong when we were kids, so it's just natural that I wanted to make my rendetion of pong.
    "Code is like humor. When you have to explain it, it is bad." - Cory House
    VbLessons | Code Tags | Sword of Fury - Jameram

  4. #4

    Thread Starter
    Super Moderator dday9's Avatar
    Join Date
    Mar 2011
    Location
    South Louisiana
    Posts
    11,698

    Re: [VB.Net] Pong

    Update!

    I've added a player vs. player version. You can find it in post #1!
    "Code is like humor. When you have to explain it, it is bad." - Cory House
    VbLessons | Code Tags | Sword of Fury - Jameram

  5. #5
    Fanatic Member Flashbond's Avatar
    Join Date
    Jan 2013
    Location
    Istanbul
    Posts
    646

    Re: [VB.Net] Pong

    I played the game for a while and it has been a great nostalgia especially when I think it was my favouite game in Atari2600.
    You wrote it in drawbacks that ai is very hard. I don't agree this. Since it tracks the ball continuously, it is invincible.
    I didn't look at your code in a detailed way but I couldn't see any randomization with a quick look.
    For instance, I started 5 rounds and as I recalled all first 8-10 moves of the ball in game openings were the same (most probably all movements of ball are going to be same in each round).
    I don't remeber the original game exactly but some randomization to ball movement(especially at bouncing points) and confisuion parameter to ai would be great.

    Anyway, it made me feel great. Thank you
    Last edited by Flashbond; Aug 30th, 2013 at 08:59 PM.
    God, are you punishing me because my hair is better than yours? -Jack Donaghy

Posting Permissions

  • You may not post new threads
  • You may not post replies
  • You may not post attachments
  • You may not edit your posts
  •  



Click Here to Expand Forum to Full Width