Kamis, 15 Desember 2011

Tutorial pembuatan game sederhana Snake

Untuk tutorial pembuatan game ini saya akan menggunakan Visual Basic 2010 Express, untuk
membuat tampilan snake yang menarik. Dalam pembuatan game ini digunakan juga, Graphics yang
telah dijelaskan pada artikel sebelumnya. Berikut langkah - langkah pembuatannya :

1. Buat sebuah form untuk form utama di mana permainan berlangsung, dengan tampilan :



  Setelah Label score, speed dan lives terdapat label yang terlihat masing - masing   
bernama scoreLabel, speedLabel dan livesLabel.
   Di dalam Menu File terdapat New Game (shortcut : F2), Exit (shortcut : Alt + F4).
   Di dalam Menu Help terdapat Controls (F1), About

2. Setelahnya untuk kode-kode yang digunakan bisa dilihat di bawah beserta keteranganya :



Imports System.Drawing
Imports System.Drawing.Drawing2D
Imports System.Drawing.Graphics


Public Class Form1
    'Variabel untuk menyimpan nilai, kecepatan dan nyawa
    Dim score, speed, live As Integer
    'Deklarasi Graphics
    Dim g As Graphics
    'Array x dan y digunakan untuk menyimpan posisi snake, dimana x(0) dan y(0) merupakan posisi kepala snake
    'ukuran maksimum snake = 1000
    Dim x(1000), y(1000) As Integer
    'ax dan ay digunakan untuk menyimpan perubahan gerak snake
    Dim ax, ay As Integer
    'aw digunakan untuk menyimpan lebar dari snake
    'ah digunakan untuk menyimpan panjang dari snake
    'p digunakan untuk menyimpan panjang dari snake
    Dim aw, ah, p As Integer
    'tx dan ty merupakan posisi dari target
    Dim tx, ty As Integer
    'tol untuk menyimpan toleransi posisi snake dan target
    Dim tol As Integer
    Dim flag As Integer

    Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
        'Inisialisasi awal permainan
        score = 0
        speed = 1
        live = 3
        scoreLabel.Text = score
        speedLabel.Text = speed
        livesLabel.Text = live
        Button1.Visible = False
        Button1.Enabled = False
        tol = 10
        flag = 0

        'Inisialisasi awal snake
        x(0) = 350
        y(0) = 270
        ax = 0
        ay = 0
        p = 1
        aw = 10
        ah = 10

        'Inisialisasi awal target
        Randomize()
        tx = Rnd() * 500 + 50 'Random posisi x target dari 50 - 549
        ty = Rnd() * 250 + 30 'Random posisi y target dari 30 - 280

        'Inisialisasi Graphics
        g = Me.CreateGraphics
        g.Clear(Me.BackColor)

        'Inisialisasi Timer
        Timer1.Interval = 100 / speed
        Timer1.Enabled = True
    End Sub

    Private Sub AboutToolStripMenuItem_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles AboutToolStripMenuItem.Click
        'Memberikan informasi pembuat game apabila About diclick
        Timer1.Enabled = False
        MsgBox("This game is made by Aaron", MsgBoxStyle.Information, "Snake ver. 1.0")
        Timer1.Enabled = True
    End Sub

    Private Sub ExitToolStripMenuItem_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles ExitToolStripMenuItem.Click
        'Bila menu exit diclick, hentikan program
        End
    End Sub

    Private Sub Form1_KeyDown(ByVal sender As Object, ByVal e As System.Windows.Forms.KeyEventArgs) Handles Me.KeyDown
        'Mengecek tombol yang ditekan pada Form

        'untuk mengetahui kode yang tombol yang ditekan bisa menggunakan perintah di bawah
        'MsgBox(e.KeyCode)

        '38 adalah keycode untuk tanda atas
        'Snake tidak bisa langsung menuju atas dari bawah
        If e.KeyCode = 38 And ay = 0 Then
            ay = -10
            ax = 0
        End If
        '37 adalah keycode untuk tanda kiri
        'Snake tidak bisa langsung menuju kiri dari kanan
        If e.KeyCode = 37 And ax = 0 Then
            ay = 0
            ax = -10
        End If
        '39 adalah keycode untuk tanda kanan
        'Snake tidak bisa langsung menuju kanan dari kiri
        If e.KeyCode = 39 And ax = 0 Then
            ay = 0
            ax = 10
        End If
        '40 adalah keycode untuk tanda bawah
        'Snake tidak bisa langsung menuju bawah dari kiri
        If e.KeyCode = 40 And ay = 0 Then
            ay = 10
            ax = 0
        End If
    End Sub

    Private Sub Timer1_Tick(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Timer1.Tick
        'Pada saat timer1 berjalan

        'Gambar target dengan posisi tx, ty dan ukuran 10 x 10
        g.FillEllipse(Brushes.Red, New Rectangle(tx, ty, 10, 10))

        'Gambar snake dengan panjang p sesuai posisinya
        Dim i As Integer
        For i = 0 To p
            g.FillRectangle(Brushes.DarkOrange, New Rectangle(x(i), y(i), aw, ah))
        Next
        'Hapus bagian ekor
        g.FillRectangle(Brushes.Black, New Rectangle(x(p), y(p), aw, ah))
        'Gambar bagian kepala
        g.FillRectangle(Brushes.LightGoldenrodYellow, New Rectangle(x(0), y(0), aw, ah))

        'Ubah posisi ekor dari ular mengikuti posisi ekor yang didepannya
        For i = p To 1 Step -1
            x(i) = x(i - 1)
            y(i) = y(i - 1)
        Next
        'Posisi kepala diubah sesuai perubahan gerakan
        x(0) = x(0) + ax
        y(0) = y(0) + ay

        'Mengecek apakah kepala snake telah mencapai target dengan toleransi posisi tol
        If ((x(0) > tx - tol And x(0) < tx + tol) And (y(0) > ty - tol And y(0) < ty + tol)) Then
            'Panjang snake bertambah 1
            p = p + 1

            'Score bertambah 10
            score = score + 10
            scoreLabel.Text = score

            'Hapus target
            g.FillEllipse(Brushes.Black, New Rectangle(tx, ty, 10, 10))

            'Merandom kembali posisi target
            tx = Rnd() * 500 + 50
            ty = Rnd() * 250 + 30

            'Menambah speed apabila score merupakan kelipatan 100
            flag = 0
            If (score Mod 100 = 0 And flag = 0) Then
                flag = 1
                If speed < 10 Then speed = speed + 1
                speedLabel.Text = speed
                Timer1.Interval = 100 / speed

                'Tambah nyawa apabila score merupakan kelipatan 100
                live = live + 1
                livesLabel.Text = live
            End If
        End If

        'Mengecek apakah snake melewati batas
        If (x(0) < 0 Or x(0) > 685 Or y(0) < 0 Or y(0) > 485) Then
            p = 1
            x(0) = 350
            y(0) = 270
            ax = 0
            ay = 0
            live = live - 1
            livesLabel.Text = live
            g.Clear(Color.Black)
            g.FillRectangle(Brushes.LightGoldenrodYellow, New Rectangle(x(0), y(0), aw, ah))
        End If

        'Mengecek apakah snake menabrak ekornya atau tidak
        For i = 2 To p
            If (x(0) = x(i) And y(0) = y(i)) Then
                p = 1
                x(0) = 350
                y(0) = 270
                ax = 0
                ay = 0
                live = live - 1
                livesLabel.Text = live
                g.Clear(Color.Black)
                g.FillRectangle(Brushes.LightGoldenrodYellow, New Rectangle(x(0), y(0), aw, ah))
                Exit For
            End If
        Next

        'Mengecek jika nyawa sudah habis
        If live = 0 Then
            scoreLabel.Text = ""
            speedLabel.Text = ""
            livesLabel.Text = ""
            g.Clear(Color.Black)
            Timer1.Enabled = False
            MsgBox("Game OVER !!" & vbNewLine & "Your Score is : " & score, MsgBoxStyle.OkOnly, "Snake ver. 1.0")
            Button1.Visible = True
            Button1.Enabled = True
        End If
    End Sub

    Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load

        'Ubah warna latar menjadi hitam
        Me.BackColor = Color.Black

        'Ubah warna setiap label dalam panel menjadi putih
        For Each Label In Panel1.Controls
            Label.ForeColor = Color.White
        Next

    End Sub

    Private Sub NewGameToolStripMenuItem_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles NewGameToolStripMenuItem.Click
        Dim ans
        Timer1.Enabled = False
        ans = MsgBox("Are you really sure want to start a new game ?", MsgBoxStyle.YesNo, "Snake ver. 1.0")
        If ans = vbYes Then
            scoreLabel.Text = ""
            speedLabel.Text = ""
            livesLabel.Text = ""
            g.Clear(Color.Black)
            Button1.Visible = True
            Button1.Enabled = True
        Else
            Timer1.Enabled = True
        End If
    End Sub
End Class


3. Apabila anda ingin mencoba game snake yang telah jadi ini langsung, bisa di download di:

http://www.mediafire.com/download.php?pv15gkd6lfaz65n

Penggunaan Graphics di VB.NET

 Dalam pembuatan graphics, template yang akan kita gunakan adalah Windows Forms Application. Yang pertama dibuat adalah kita membuat tombol (Button1) untuk menampilkan graphics yang kita buat. Untuk perintah - perintah yang digunakan bisa dilihat di bawah :


Imports System.Drawing.Graphics
Imports System.Drawing.Drawing2D

Public Class Form1

    Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click

        'Deklarasi graphic
        Dim g As Graphics

        'Inisialisasi pembuatan graphic di me (From ini)
        g = Me.CreateGraphics

        'Membersihkan graphic yang telah ada sebelumnya dengan warna Background Form
        g.Clear(Me.BackColor)

        'Cara deklarasi pen : Dim nama_pen as Pen = New Pen(Warna, Ukuran)
        Dim p1 As Pen = New Pen(Brushes.Blue, 2)
        Dim p2 As Pen = New Pen(Brushes.Crimson, 3)

        'Cara deklarasi brush : Dim nama_brush as Brush = Warna
        Dim b1 As Brush = Brushes.Goldenrod

        'Menggambar menggunakan graphics yang telah dideklarasi sebelumnya

        'graphics.DrawLine(pen, x1, y1, x2, y2) akan menggambar garis menggunakan pen yang telah
        'dideklarasikan sebelumnya dari titik (x1, y1) ke titik (x2, y2)
        g.DrawLine(p1, 20, 60, 300, 60)

        'graphics.DrawRectangle(pen, rectangle) akan menggambar sebuah persegi panjang (hanya dengan outline tanpa fill)
        'yang telah dideklarasikan sebelumnya menggunakan pen yang telah dideklarasikan sebelumnya
        'Cara deklarasi rectangle : Dim nama_rectangle As Rectangle = New Rectangle (x1, y1, l, p) dengan posisi titik
        'kiri atas di titik (x1, y1) dan lebar l, panjang p
        Dim rect1 As Rectangle = New Rectangle(20, 80, 150, 50)
        g.DrawRectangle(p2, rect1)

        'graphics.FillRectangle(brush, rectangle) akan menggambar sebuah persegi panjang (dengan fill / warna)
        'yang telah dideklarasikan sebelumnya menggunakan pen yang telah dideklarasikan sebelumnya
        Dim rect2 As Rectangle = New Rectangle(20, 140, 150, 50)
        g.FillRectangle(b1, rect2)

        'Selain cara penggunaan brush, pen serta rectangle yang telah dideklarasikan sebelumnya
        'kita juga bisa menggunakan brush dan pen dideklarasikan secara langsung
        'dicontohkan seperti berikut

        'graphics.DrawEllipse(pen, rectangle) akan menggambar ellipse (hanya dengan outline tanpa fill)
        'di dalam rectangle yang telah ditentukan
        g.DrawEllipse(New Pen(Brushes.YellowGreen, 4), New Rectangle(20, 200, 150, 50))

        'graphics.DrawEllipse(pen, rectangle) akan menggambar ellipse (dengan fill / warna) di dalam rectangle yang telah ditentukan
        g.FillEllipse(Brushes.Black, New Rectangle(20, 260, 150, 50))

    End Sub

End Class


Tampilan program :
(Sebelum Button1 diclick)
 
(Setelah Button1 diclick)

Simulator Queue menggunakan C++

Queue adalah tipe data abstract dimana data hanya bisa dimasukkan ke bagian belakang dan dikeluarkan dari depan. Queue juga sering disebut sebagai implementasi dari FIFO (First In First Out), yang bila diartikan menjadi yang duluan masuk, duluan keluar.

Di sini yang akan saya bahas adalah pembuatan sebuah program untuk mensimulasikan perintah yang bisa dilakukan pada queue menggunakan bahasa C++. Sebelum melanjutkan membaca ke bagian bawah , anda bisa mencoba untuk membuat terlebih dahulu program yang dimaksud, contoh penggunaan :

Input             Queue (belakang - depan)    Output
push(23)        23                                        -
push(20)        20 23                                   -
push(45)        45 20 23                              -
front               45 20 23                              23
back              45 20 23                              45
pop                45 20                                   -
front              45 20                                    20
pop               45                                         -
pop               -                                            -
pop               -                                           Queue is empty
front              -                                           Queue is empty
back              -                                           Queue is empty
push(45)        45                                         -
push(30)        30 45                                    -
push(13)        13 30 45                               -
empty            -                                           45 30 13
end

Queue yang digunakan di dalam program merupakan bagian dari STL (Standard Template Library) C++. Untuk keterangan mengenai fungsi - fungsi yang ada di dalam class bisa dilihat di : http://www.cplusplus.com/reference/stl/queue/
Untuk Queue di bahasa pemograman yang lain bisa dibuat sendiri menggunakan array dan berberapa variabel pembantu.

Kode program yang dimaksud :

#include <iostream>
#include <queue>
#include <string.h>

using namespace std;

int main(){
    char command[25];
   
    queue <int> que;
   
    while(1){
        cin >> command;
       
        if(command[1]=='u'){
            int c=5, temp=0;
            //mengambil angka yang berada didalam kurung
            while(command[c]!=')'){
                temp = temp*10 + (command[c]-'0');
                c++;
            }
            que.push(temp);
        }
        else if(strcmp(command,"back")==0){
            if(!que.empty()){
                cout << que.back() << endl;
            }
            else{
                cout << "Queue is empty" << endl;
            }
        }
        else if(strcmp(command,"front")==0){
            if(!que.empty()){
                cout << que.front() << endl;
            }
            else{
                cout << "Queue is empty" << endl;
            }
        }
        else if(strcmp(command,"pop")==0){
            if(!que.empty()){
                que.pop();
            }
            else{
                cout << "Queue is empty" << endl;
            }
        }
        else if(strcmp(command,"empty")==0){
            while(!que.empty()){
                cout << que.front() << endl;
                que.pop();
            }
        }
        else if(strcmp(command,"end")==0){
            return 0;
        }
        else{
            cout << "Command not recognized" << endl;
        }
    }
   
}

Algoritma dari kode program ini :
1. baca command / perintah
2. jika command adalah
    - "push" baca data yand ada di dalam kurung dan masukkan ke queue, kembali ke langkah 1
    - "back" jika queue tidak kosong cetak data di belakang, jika kosong cetak "Error", kembali ke langkah 1
    - "front" jika queue tidak kosong cetak data di data, jika kosong cetak "Error",kembali ke langkah 1
    - "pop" jika queue tidak kosong keluarkan satu data dari queue, jika kosong cetak "Error", kembali ke langkah 1
    - "empty" kosongkan queue, kembali ke langkah 1
    - "end" lanjutkan ke langkah 3
    - selain perintah - perintah di atas cetak "Error"
3. Program berhenti

Untuk tampilan hasil dari program :

Programming, Cara menguasainya ?

Programming ataupun pemograman adalah hal yang mutlak harus dikuasai oleh seorang professional di bidang IT.

Apa sebenarnya programming itu ?
Programming dapat diartikan secara sederahana sebagai kegiatan pembuatan program. Program sendiri merupakan kumpulan instruksi - instruksi yang akan dieksekusi oleh komputer. Program yang dimaksud bisa berupa software ataupun aplikasi yang kita gunakan, Operating System yang
mengatur semua kerja hardware dan software yang ada sampai dengan program yang dibuat hanya untuk menyelesaikan suatu problem pemograman yang diberikan.

dengan tujuan apa saja programming itu dipelajari ?
Programming dipelajari untuk berbagai tujuan, seperti untuk membuat software, untuk menyelesaikan persoalan pada saat mengikuti perlombaan pemograman dan juga untuk melakukan kegiatan hacking terhadap Operating System, webiste maupun software .Tujuan - tujuan yang ada pada akhirnya akan mencapai suatu tujuan yang umum yakni untuk mempersiapkan diri dalam menghadapi persoalan yang mungkin ditemui pada saat melakukan riset di bidang pemograman dan tentunya mengembangkan kemampuan untuk membuat software, aplikasi maupun operating system yang lebih baik dari sebelumnya.

Cara menguasainya ?
Banyak yang mengatakan bahwa programming itu sulit dan susah dimengerti, ada pula yang mengatakan bahwa programming itu sangat menarik dan menantang. Saya sendiri menganggap programming merupakan suatu kegiatan yang menarik dan menantang. Sebenarnya cara pandang terhadap programming itu tergantung pada mindset tiap - tiap orang, jadi dalam mempelajari programming, hal yang terpenting adalah mindset bahwa programming itu menarik, menantang, mudah dipelajari dan tentunya memiliki manfaat.

Cara untuk memiliki mindset seperti ini tentunya berbeda dari orang ke orang, mis: ada orang yang akan menyukai suatu hal apabila hal tersebut susah dan menantang, dengan kata lain, hal tersebut susah dilakukan. Sebagai perbandingan, ada orang yang menyukai suatu hal apabila hal tersebut mudah dilakukan dan bisa diselesaikan tanpa perlu usaha yang berarti. Untuk tipe orang yang berbeda tentunya memerlukan pendekatan yang berbeda.

Apabila anda adalah orang yang suka tantangan, maka carilah soal - soal / problem - problem programming yang susah ataupun pikirkanlah sebuah ide software yang rumit dan cobalah untuk menyelesaikannya. Sedangkan apabila anda adalah orang yang menyukai hal - hal yang mudah diselesaikan, maka pelajarilah pemograman dari awal dan dasar, seperti konsep pemograman, pengenalan syntax, serta algoritma secara bertahap sehingga anda merasa percaya diri dalam mempelajari tahap selanjutnya. Intinya pelajarilah programming sesuai dengan cara yang menurut anda paling menyenangkan !!

Setelah memiliki mindset yang tepat, maka yang selanjutnya dilakukan adalah menentukan bahasa pemograman yang ingin anda pelajari. Ada banyak bahasa pemograman yang bisa anda gunakan baik untuk membuat program maupun mempelajari programming. Tapi bahasa pemograman apapun yang anda pilih, yang terpenting dalam programming adalah Logika dan Algoritma. Logika merupakan cara berpikir secara rasional dan Algoritma adalah langkah - langkah sistematis untuk menyelesaikan persoalan. Logika dan Algoritma bersifat universal, sehingga bisa diaplikasikan dalam bahasa pemograman apapun (hanya saja dengan perbedaan syntax / cara penulisan kode program). Untuk yang baru mempelajari programming, dianjurkan untuk terlebih dahulu menguasai secara benar "Satu" bahasa pemograman.

Kemudian langkah terpenting dalam mempelajari programming adalah tentunya banyak membuat kode program, dengan kata lain Coding, coding dan coding !! Seperti Kata Einstein "Genius is 99% Hardwork, 1% Talent", Untuk mempelajari programming tidak ada jalan pintas, apabila anda ingin mahir hanya ada satu hal yang perlu dilakukan yaitu Coding.

Apa yang harus di Coding ?
Apapun, anda bisa mencari problem - problem programming, yang berupa soal - soal dan anda bisa mengirimkan kode program yang telah anda buat untuk diuji kebenaranya. Anda juga bisa membuat software - software sederhana, seperti software untuk menyelesaikan persoalan matematis yang sederhana maupuan software - software yang rumit seperti game dan program yang mengakses database.
Intinya Coding, Coding dan Coding !!

Perkenalan

Ini adalah postingan pertama untuk blog ini, jadi sebelum saya melakukan postingan untuk artikel yang lain, saya akan memperkenalkan diri saya terlebih dahulu. Saya bernama Aaron dengan marga Maslim, lahir pada tanggal 10 Oktober 1992 di kota Medan, Sumatera utara, Indonesia. Saya bersekolah di Perguruan Sutomo dari jenjang SD sampai jenjang SMA, dan sekarang sedang mengikuti perkuliahan di jurusan Teknologi Informasi (S1) di Fakultas MIPA, Universitas Sumatera Utara. Adapun berberapa prestasi yang pernah saya raih pada jenjang SMA, yaitu medali perunggu pada OSN (Olimpiade sains nasional) bidang komputer pada tahun 2008 dan medali perak pada OSN bidang komputer tahun 2009. Sedangkan pada saat perkuliahan, saya pernah mengikuti ICPC (International Colleague Programming Contest), meskipun hanya sampai pada penyisihan tingkat regional saja, serta perlombaan GEMASTIK bidang pemograman  (meraih peringkat ke-7).

Saya pertama kali mempelajari programming adalah pada saat sedang duduk di bangku SMP. Bahasa pemograman yang pertama kali saya pelajari adalah Bahasa C yang diajarkan oleh guru di sekolah pada saat pelajaran komputer Semester Genap kelas SMP 3. Setelah itu karena merasa menarik saat mempelajari bahasa C, saya ikut bergabung dengan kegiatan Programming Club. Di Programming Club, saya mempelajari bahasa Pascal dan berberapa algoritma sederhana seperti Bubble Sort, Quick Sort, BFS(Breadth First Search), DFS(Depth First Search), dan lainnya. Kemudian pada saat SMA, saya berhasil memenangkan kedua medali yang disebutkan sebelumnya, sehingga saya berkesempatan untuk mengikuti pelatnas bidang komputer. Di pelatnas, saya diajari tentang berbagai algoritma yang lebih rumit dan penggunaan bahasa C++. Di sekolah pada saat kelas SMA XII, saya diajari penggunaan VB.NET. Pada saat kuliah di USU pun, saya mempelajari bahasa pemograman yang lain yakni Java. Sampai sekarang bahasa pemograman yang saya kuasai adalah : C, C++, Pascal, Basic dan Java.

Hal - hal yang saya lakukan pada waktu luang saya adalah membrowsing problem - problem pemograman dan mensolvenya, memainkan game di berbagai platform (seperti PC, PSP, NDS), menonton anime (bagi yang tidak tahu, anime merupakan film animasi yang berasal dari jepang) dan membaca buku.

Artikel - artikel yang akan saya post nantinya akan merupakan hasil dari kesukaan saya terhadap programming, game dan anime.