26 Mayıs 2011 Perşembe

Vb.Net Yılan Oyunu Yapımı

Visual Basic 2010' da Vb.Net ile hazırladığım bir kaç eksiği olan basit bir yılan oyunu. Genelde bizden staj klasörlerinde, okul sınavlarında istenen bir proje.. Bir form ve bir tane de Yılan adında açtığımız  class ile oluşturacağız bu oyunu. İlk önce Yılan adında bir class açıp buraya yılanımızın özelliklerini tanıtıyoruz.


Imports System.Threading


Public Class Yilan


    Public alanX(999) As Integer
    Public alanY(999) As Integer


    Public yilanX(999) As Integer
    Public yilanY(999) As Integer


    Public bmp As Drawing.Bitmap
    Public gfx As Drawing.Graphics
    Public rect As Drawing.Rectangle
    Public yilangolgesi As Drawing.Brush
    Public yilanrengi As Drawing.Brush
    Public yemgolgesi As Drawing.Brush
    Public yemrengi As Drawing.Brush
    Public background As Drawing.Brush


    
    Public uz, j As Integer
    Public x, y As Integer
    Public yem As New Drawing.Point


    Public yemvar As Boolean
    Public puan As Integer


    Public rota As Integer


    Public bekleint As Integer


    Public Sub Draw_Yilan(ByVal x As Integer, ByVal y As Integer)
        gfx.FillRectangle(yilanrengi, x * 10, y * 10, 10, 10)
        gfx.FillRectangle(yilanrengi, x * 10, y * 10, 8, 8)
    End Sub


    Public Sub Bos_Draw_Yilan(ByVal x As Integer, ByVal y As Integer)
        gfx.FillRectangle(background, x * 10, y * 10, 10, 10)
    End Sub


    Public Sub Load_Graphic()
        bmp = New System.Drawing.Bitmap(400, 400)
        gfx = System.Drawing.Graphics.FromImage(bmp)


        rect = New System.Drawing.Rectangle(0, 0, 400, 400)
        gfx.FillRectangle(System.Drawing.Brushes.Black, rect)
    End Sub


    Public Sub move_yilan_right()
        x += 1
    End Sub


    Public Sub move_yilan_left()
        x -= 1
    End Sub


    Public Sub move_yilan_up()
        y -= 1
    End Sub


    Public Sub move_yilan_down()
        y += 1
    End Sub


    Public Sub yem_koy(ByVal x As Integer, ByVal y As Integer)
        gfx.FillRectangle(yemrengi, x * 10, y * 10, 10, 10)
        gfx.FillRectangle(yemrengi, x * 10, y * 10, 8, 8)
    End Sub


    Public Function yilan_esit_yem() As Boolean
        Dim b As Boolean = False


        For i = 0 To (uz - 1)
            If yem.X = alanX(j - i) And yem.Y = alanY(j - i) Then
                b = True
            Else
                b = False
            End If
        Next


        Return b


    End Function


    Public Sub yem_koord_yerlestir()
        Dim rndX As New Random
        yem.X = rndX.Next(38) + 1


        Thread.Sleep(25)


        Dim rndY As New Random
        yem.Y = rndY.Next(38) + 1


        yemvar = True


    End Sub


    Public Function yilan_kendisine_carptimi() As Boolean
        Dim b As Boolean = False
        Dim x1 As Integer = x * 10
        Dim y1 As Integer = y * 10


        Try


            If rota = 1 Then


                If (bmp.GetPixel(x1 + 5, y1 + 5) = bmp.GetPixel(x1 - 5, y1 + 5)) Then
                    b = True
                Else
                    b = False
                End If


            End If


            If rota = 2 Then


                If (bmp.GetPixel(x1 + 5, y1 + 5) = bmp.GetPixel(x1 + 15, y1 + 5)) Then
                    b = True
                Else
                    b = False
                End If


            End If


            If rota = 3 Then


                If (bmp.GetPixel(x1 + 5, y1 + 5) = bmp.GetPixel(x1 + 5, y1 - 5)) Then
                    b = True
                Else
                    b = False
                End If


            End If


            If rota = 4 Then


                If (bmp.GetPixel(x1 + 5, y1 + 5) = bmp.GetPixel(x1 + 5, y1 + 15)) Then
                    b = True
                Else
                    b = False
                End If


            End If


        Catch ex As Exception
            Dim str As String = ex.Message.ToString()
            Return False
        End Try


        Return b
    End Function


    Public Sub game_reset()
        ReDim alanX(999)
        ReDim alanY(999)


        puan = 0


    End Sub


End Class




Yılan Classımıza bunları ekledikten sonra formumuza Menustrip, StatusStrip, Pictureboxve iki adette Timer ekliyoruz. MenuStripte Oyun sekmesi oluşturup altına Başlat ve Durdur seçeneklerini yazıyoruz. Timerın birini Oyun diğerini ise Bekle olarak adlandırıyoruz ve pictureboxımızın boyunu formla eşitliyoruz. Klavyeden yılanı hareket ettirebilmemiz için formun KeyPreview özelliğini True yapıyoruz ve formumuzun arkasında çalışacak kodlarımız ise;



Public Class Form1


    Dim yilan As New Yilan


    Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
        yilan.Load_Graphic()
        yilan.uz = 4
        yilan.j = 4
        yilan.x = 10
        yilan.y = 10
        yilan.yem.X = -1
        yilan.yem.Y = -1


        If (yilan.bmp Is Nothing) = False Then
            yilan.yilangolgesi = Brushes.DarkGreen
            yilan.background = Brushes.Black
            yilan.yilanrengi = Brushes.Green
            PictureBox1.Image = yilan.bmp
            PictureBox1.Refresh()
        End If


        yilan.rota = 2


        yilan.yemvar = False
        yilan.yemgolgesi = Brushes.DarkRed
        yilan.yemrengi = Brushes.Red


        yilan.puan = 0
        yilan.bekleint = 5


    End Sub


    Private Sub Oyun_timer_Tick(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Oyun_timer.Tick


        If (yilan.yilan_esit_yem() = True) Then
            yilan.yem.X = -1
            yilan.yem.Y = -1
            yilan.yemvar = False
            yilan.puan += 1
            ToolStripStatusLabel1.Text = " PUAN : " + yilan.puan.ToString()
            yilan.uz += 1
        End If


        If yilan.rota = 1 Then
            yilan.move_yilan_left()
        End If


        If yilan.rota = 2 Then
            yilan.move_yilan_right()
        End If


        If yilan.rota = 3 Then
            yilan.move_yilan_up()
        End If


        If yilan.rota = 4 Then
            yilan.move_yilan_down()
        End If


        yilan.Draw_Yilan(yilan.x, yilan.y)


        yilan.alanX(yilan.j) = yilan.x
        yilan.alanY(yilan.j) = yilan.y


        yilan.j += 1


        yilan.Bos_Draw_Yilan(yilan.alanX(yilan.j - yilan.uz), yilan.alanY(yilan.j - yilan.uz))


        If (yilan.j > 899) Then
            yilan.j = yilan.uz


            For z = 0 To yilan.uz
                yilan.alanX(yilan.uz - z) = yilan.alanX(900 - z)
                yilan.alanY(yilan.uz - z) = yilan.alanY(900 - z)
            Next


        End If


        If ((yilan.yilan_esit_yem() = False) And (yilan.yemvar = False)) Then
            yilan.yem_koord_yerlestir()
            yilan.yem_koy(yilan.yem.X, yilan.yem.Y)
        End If


        PictureBox1.Image = yilan.bmp
        PictureBox1.Refresh()


        If (yilan.yilan_kendisine_carptimi() = True) Then


            Oyun_timer.Enabled = False
            Bekle_timer.Enabled = True


            If yilan.bekleint <= 0 Then


            Else
                yilan.bekleint = 20
            End If


        End If


        If (yilan.x > 40) Then
            yilan.x = -1
        End If


        If (yilan.x < -1) Then
            yilan.x = 40
        End If


        If (yilan.y > 40) Then
            yilan.y = -1
        End If


        If (yilan.y < -1) Then
            yilan.y = 40
        End If


    End Sub


    Private Sub Form1_KeyDown(ByVal sender As System.Object, ByVal e As System.Windows.Forms.KeyEventArgs) Handles MyBase.KeyDown


        If e.KeyCode = Keys.Left Then
            yilan.rota = 1
        End If
        If e.KeyCode = Keys.Right Then
            yilan.rota = 2
        End If
        If e.KeyCode = Keys.Up Then
            yilan.rota = 3
        End If
        If e.KeyCode = Keys.Down Then
            yilan.rota = 4
        End If
        If e.KeyCode = Keys.Escape Then
            Application.Exit()
        End If


        yilan.bekleint = 20
        Bekle_timer.Enabled = False
        Oyun_timer.Enabled = True


    End Sub


    Private Sub BaşlatToolStripMenuItem_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles BaşlatToolStripMenuItem.Click
        Oyun_timer.Enabled = True
    End Sub


  Private Sub DurdurToolStripMenuItem_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles DurdurToolStripMenuItem.Click
        Oyun_timer.Enabled = False
    End Sub


    Private Sub Bekle_timer_Tick(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Bekle_timer.Tick
        yilan.bekleint += -1


        If yilan.bekleint = 0 Then
            Bekle_timer.Enabled = False
            Game_Over()
        End If


    End Sub


    Public Sub Game_Over()
        Oyun_timer.Enabled = False
        MessageBox.Show("Oyun Bitti. " + ToolStripStatusLabel1.Text)
        yilan.game_reset()
        yilan.Load_Graphic()
        yilan.yemvar = False
        Oyun_timer.Enabled = True
    End Sub


End Class



15 Aralık 2010 Çarşamba

C# : Kalıtım (Inheritance)

Kalıtım ile ilk oluşturduğumuz sınıfın özelliklerini, ikinci olarak oluşturacağımız sınıfın özelliklerine atarız. Bir sınıftan başka bir sınıf üreterek sınıflarda ki  ortak olan özellikleri tek bir sınıfta toplamış oluruz. Kalıtımın yapılabilmesi için ilk sınıftaki nesnelerin public veya protected ile oluşturulmuş olması gerekir. C# ' de bu şekilde türeyen bir çok sınıf mevcuttur. Nesnelerin türediği sınıfı base Sınıf olarak adlandırırız.

Örneğin; Araba adında bir sınırf oluşturalım ve nesneleri tanıtalım.

namespace Uygulama1
{
    class Araba
    {
        public string ArabaMarka;
        public string ArabaModel;
        public string ArabaRenk;
        public int ArabaYil;
        public int KapiSayisi;

        public void ArabaGoster()
        {
            Console.WriteLine("Araba Özellikleri ; \nMarkası: {0}\nModeli: {1}\nRengi:{2}\nYılı:{3}\nKapı Sayısı:{4}", ArabaMarka, ArabaModel, ArabaRenk, ArabaYil,KapiSayisi);
        }
    }
   
   //  Aşağıda ise Arabul sınıfını, ilk oluşturduğumuz Araba sınıfından türeterek oluştururuz. Araba sınıfında bulunan nesneler böylelikle ArabaBul sınıfına aktarılmış oldu.

class ArabaBul : Araba
    {
        public int fiyat;
        public void fiyatGoster()
        { Console.WriteLine("Fiyatı : {0}", fiyat); }
    }

    class Program
    {
        static void Main(string[] args)
        {

            ArabaBul Araba = new ArabaBul();
            Araba.Marka = "Audi";
            Araba.Model = "A6";
            Araba.Renk = "Siyah";
            Araba.Yil = 2010;
            Araba.KapiSayisi = 4;
            Araba.ArabaGoster();
            Araba.fiyatGoster();
            Console.Read();
        }
    }
}

3 Aralık 2010 Cuma

Sql Server' da Fonksiyonlar

Fonksiyonlar, değer döndüren program birimidir. Yerleşik fonksiyonlar dışında bizimde tanımlayacağımız fonksiyonlar vardır. Kullanıcı tanımlı fonksiyon "0" veya birden fazla değer alabilir. İstenilen değer tipinde dönüş yapabilirler. INT; VARCHAR değer döndürebileceği gibi bir tablo da döndürebilir. Output parametrelere destek vermezler.Sabit fonksiyonlar gibi tek bir değer döndürebilirler.

1- Scalar Functions () : Tek bir değer döndürebilirler.


CREATE FUNCTION fn_UrunSayisi()
RETURNS int
AS BEGIN
  DECLARE @UrunSayisi int

  SELECT @UrunSayisi = COUNT(*)
  FROM Production.Product

  RETURN @UrunSayisi
END

Oluşturduğumuz bu fonksiyon production tablosunda ki product yani ürünlerin toplam kaç tane olduğunu saymaya yarar.

Fonksiyonu çağırmak için kullandığımız T-SQL komutu ise ;

SELECT dbo.fn_UrunSayisi()

1 Aralık 2010 Çarşamba

Seninki kaç santim? - Greenpeace

Seninki kaç santim? - Greenpeace



C# : Nesneye Yönelik Programlama, Classes, Objects, Methods, Events


C# dili tam anlamıyla nesne tabanlı biri dildir. Bu dil içerisinde Class (sınıf) kavramının önemli bir yeri vardır.

Class yapısı herhangi bir nesnenin program içerisindeki kalıbı olarak düşünülebilir. Bu kalıp nesnenin tüm özelliklerini tutup, program içerisinde değişik yerlerde kullanımını sağlar. Class yapıları nesne yönelimli yazılım dillerinin temel yapılarından biridir ve yazılımcılar için değişik avantajları vardır.

1. Yazılan bir class ayni program içerisinde veya başka programlarda birçok kez kullanılabilir.
2. Yazılım ve test sürecilerini kısaltır.
3. Kod organizasyonunu sağlayıp hataların bulunmasını kolaylaştırır.
4. Kod üzerindeki yapılacak olan değişikliklerin kolaylaşmasını sağlar.

Nesneye yönelik programlama uygulamaları nesneler kullanarak yani bir çok nesnenin bir araya gelmesi ile oluşturularak yapılır. Yani kullandığımız yordamları direk uygulama koduna yazmayıp, sınıflar içine yazarak ve bu sınıflardan türettiğimiz nesneler üzerinden çağırarak yaparız.

Örneğin;  Animal adında bir class oluşturup olacak özelliklerini girelim.


namespace ClassLibrary1
{
    class Animal
    {
        public string Turu;
        public string Adi;
        public int Yas;
        public int BacakSayisi;
        public int Boyu;
        public int Uzunlugu;
        public string Rengi;
    }
}

Yukarıda Animal adında bir class oluşturduktan sonra özelliklerini tanıplayıp türlerini (int, string, bool) tanıttık.

namespace ClassLibrary1
{
    class myClass
    {
         public void Test1()
        {
            Animal OkulunKedisi;
            OkulunKedisi = new Animal();
            OkulunKedisi.Turu="Kedi";
            OkulunKedisi.Adi="Tombul Kedi";
            OkulunKedisi.Rengi = "Siyah & Beyaz";
            OkulunKedisi.BacakSayisi = 4;
            OkulunKedisi.Uzunlugu = 35;
            OkulunKedisi.Boyu = 25;
    }
    }
}

Bu kod da ise ilk önce "Animal OkulunKedisi;" diyerek  Animal classında OkulunKedisi adında bir nesne ile çalışacağımızı belirttik. Ardından da "OkulunKedisi = new Animal();" ile OkulunKedisi adında bir nesne ekledik ve daha önceden belirttiğimiz değerlerini girdik.

Public : Foknsiyona sınıf içinden ve sınıf dışından erişime izin verir.
Private : Bu erişim belirteci işaretlenen öğeye sadece sınıfın içinden erişilebileceği anlamına gelir.
Protected: Bu erişim belirteci işaratelenen ögeye sadece sınıfın içinden erişilebileceği fakat alt sınıflara aktarılabileceği anlamına gelmektedir.

Metotlar kontrollerin (Button, Label, Textbox...) yapabileceği işlemlerdir. Programın herhangi bir yerinde kullanmak için belirli bir işi yerine getirmek amacıyla tasarlanmış kod parçalarıdır.

 private void button1_Click(object sender, EventArgs e)
        {

            textBox1.Clear();
            //Textbox1 kontrolünün text'ini temizler.

            textBox1.Focus();
            //Textbox1 kontrolüne odaklanır.
        }
    }
}

Metotlar parametrelerle veya parametresiz çağırılabilirler. Parametreyle çağırmak, metodun girilen değere göre işlem yapacağını belirler.  Örneğin;

class Class1
    {
        int Topla(int Sayi1, int Sayi2)
        {
            int Sonuc;
            Sonuc = Sayi1 + Sayi2;
            return Sonuc;
        }
    }
}
Kontrollerin bazı ortak metodları vardır. Mesela;

BringToFont : Üst üste duran kontroller arasından en öne gelir.
SendToBack : Üst üste duran kontrollerin en arkasına gönderilir.
Hide : Kontrolün görünmesini engeller.
Show : Kontrolün görünmesini sağlar.

Olaylar kontrollerin cevap evrebileceği eylemlerdir.Bir olay gerçekleşeceği zaman yapılacak işlem, ilgli olayın metoduna yazılır.  Örneğin; bir Button kontrollü Click olayına, bir Texbox'taki yazının değişmesi sağlanabilir. Button1 isimli kontrolün üzerine tıklandığı zaman gerçekleştirmek istenen eylemler Button1_Click metoduna yazılır.

Click : Kontrol üzerine tıklandığı zaman tetiklenen olaydır.
MouseDown : Fere, kontrolün üzerindeyken herhangi ir tuşa basıldığı zaman gerçekleşen olaydır.
MouseUp : Fare, kontrolün üzerindeyken basılan tuş bırakıldığı zaman çalışır.
Enter : kontrol seçildiği veya üzerine odaklanıldığı zaman gerçekleşen oalydır.

12 Kasım 2010 Cuma

SQL Server'da View

İlişkisel veritabanlarında bilgiler tablolarda saklanır. Bu tabloların kesişimleri ve  birleşimleri ile View'ler oluşturulabilir. View'lerda veri tutulmaz. Sadece tabloların bir görünümüdür. View aslında sanal bir tablodur.
Bir view iki tablonun birleşimi olabilir.

View'lar birden fazla tablodan daha kolay veri almak için kullanılır. Program içinde yazılan kod daha basit olur. Yine tablolardaki bazı sütünlar gizlenebilir. View'lar ile sadece istediğimiz bilgilere ulaşabiliriz. Böylelikle bizi gereksiz bilgilerden kurtarmış olur. View'ler bir çeşit istatistik olarakta kullanılabilir. Bir tabloda kaç üye var gibi bilgiler bir view'e yazılabilir. Örneğin;














1. tablomuz öğrenci isimlerinin tutulduğu Ogrenciler tablosu olsun. 2. tablomuz ise sınıf adlarının tutulduğu Siniflar tablosu olsun. Öğrencilerin hangi sınıfta olduğu isimleriyle birlikte SinifID alanlarıyla birleştirilerek tek bir tabloda gösterilebilir.



Select o.*,s.*
From Ogrenciler o
Join Siniflar s on o.SinifID=s.SinifID

10 Kasım 2010 Çarşamba

Stored Procedure


Stored Procedure’ler database server üzerinde saklanan SQL cümlecikleridir. Parametreler alabilirler ve size sonuçlar döndürebilirler. Avantajları arasında DB server üzerinde olmasından dolayı daha hızlı çalışmaları, sadece ilk çalışmalarında derlenmeleri sonraki çalışmalarda derlenmemeleri (bu da neden hızlı olduğunu açıklıyor) SQL cümlecikleri ve programlama dilleri ile yazdığımız kodları birbirinden ayrıştırmamızı sağlaması sayılabilir.
Store Procedure  veritabanı üzerinde saklanan yordamlardır.  Yordamlar dışarıdan parametre alabilir ve geriye veri veya bilgi gönderebilirler.
Fonksiyon yazmamızın bir nedeni, yazılan kodun birden fazla kez kullanımını sağlamaktır. Bir kere yazdıktan sonra derlenir ve istediğimiz kadar çağırabiliriz.
Store Procedure'de isimlendirme yapılırken genellikle spProsedürAdı şeklinde yapılması, okunabilirliği arttırır.
Begin-End arasında kalan yer kapsam anlamına gelir. Buradaki anlamı Procedure içindeki kapsamı gösteriyor. Aynı şekilde While döngüsü, If koşulu  kullanmak istediğimizde Begin - End ile kapsamı belirtebiliriz.
Çalıştırma yaparken ise EXEC ProsedürAdı veya EXECUTE  ProsedürAdı komutlarını kullanarak yapabiliriz.

CREATE PROCEDURE UrunleriGetir @CategoryID int
   AS BEGIN

   SELECT *
   FROM
     Production.Product P
   WHERE
     P.ProductCategoryID = @CategoryID 

    END

    EXEC UrunleriGetir @CategoryID = 1

Yukarıda  Urunleri ekrana getirmek amaçlı bir prosedür oluşturmuş olduk. Tanıttığımız parametrenin değeri Product tablosundaki ProductCtaegoryID' ye eşit olursa bize o ürünün  tüm bilgilerini gösterecektir.
Parametre, SQL kodunuzdaki değişkenlerin atanmasında kullanılır. Kullanımı zorunlu değildir, ama programcının işini çok kolaylaştırır. Parametre alan bir fonksiyon yazmak istediğimizde ise prosedür adından sonra parantez içinde parametreleri veririz. Fakat parametre verirken @ işaretini kullanılır. Ayrıca parametrelere varsayılan değerde atama yapılabilir.

Geriye değer döndüren prosedürlerde out veya output kullanılır. Bu kelimeleri kullanarak, hangi parametrenin değer döndürdüğünü SQL SERVER'a tanıtırız.
SQL SERVER içinde değişken tanımlamak için DECLARE anahtar kelimesini kullanılır.

SP’ler şu faydaları sağlar:

1. Uygulamanın getirdiği bazı iş kuralları prosedür içinde tanımlanabilir. Bir kez oluştuktan sonra bu kurallar birden çok uygulama tarafından kullanılarak daha tutarlı bir veri yönetimi sağlanır. Ayrıca bir fonksiyonelliğin değişmesi ihtiyacı doğduğunda her uygulama için değişiklik yapmak yerine, sadece bir platformda değişiklik yapılır.


2. Tüm prosedürler üstün performansla çalışır ancak birden fazla çalıştırılacak olan prosedürler sorgulama planları procedure cache içinde saklandığından daha da hızlı çalışırlar.

3. Stored Procedure’ ler SQL Server start ettikten sonra otomatik olarak çalıştırılmak üzere ayarlanabilirler.

4. Stored Procedure’ ler harici olarak kullanılırlar. Uygulama tarafından çağrılmak zorundadırlar. Otomatik devreye giremezler.

5. Stored Procedure’ lerın içinde SQL sorgulama diline ek olarak T-SQL komutlarını kullanabiliriz.

6. Kullanıcının bir tabloya erişim izni olmasa bile o tablo üzerinde işlem yapan bir stored procedure’ ü kullanma izni olabilir.