Admin Admin
Mesaj Sayısı : 63 Tecrübe Puanı : 173 Kayıt tarihi : 12/07/10
| Konu: Yılan Oyunu(Kodlar) Salı Tem. 13, 2010 3:40 pm | |
| Malzemeler ________________________________________ Standart EXE projesi açın. form un scalemodu "3-pixel" olacak 1 adet PictureBox ------------------ Name = Ekran ScaleMod = 3 - Pixel width = 484.................scalewidth = 480 olması için height = 324................scaleheight= 320 olması için tüm colorlar siyah AutReDraw = true 1 adet label ------------ caption = 0 ' puanı yazacağız. 1 adet Timer ------------ enabled = False interval = 100 4 adet image nesnesi --------------------- Bunlar yılan, duvar, puan ve boşluk olacaklar. Paintbrush'ı açın ve 16x16 ebatında siyah zemin üzerine yılan, duvar, puan çizin ve kopyala-yapıştır ile sırasıyla image nesnelerine yapıştırın. boşluk için düz siyah resim yeterli. image nesnelerinin adlarını parca, duvar, bos, yem yapın. visible özelliklerini False yapın. parca : Yılanın 1 karelik parçası duvar : Duvarın 1 karelik parçası bos : Silmek İçin 1 karelik parça yem : Puan için 1 karelik parça Şimdilik basit yapı için bu nesneler yeterli. PictureBox.PaintPicture Özelliği ________________________________________ PictureBox nesnesinin bu özelliği ile istenilen x,y koordinatına bir resim yapıştırabiliriz. Her karesi 16 pixel olmak üzere yatayda 480 / 16 = 30 ve düşeyde 320 / 16 = 20 kare oluşacak. Biz istediğimiz bir koordinatı verip buraya resim yapıştıracağız. Kullanımı : PictureBox.PaintPicture Resim.Kaynağı , YatayKoord, DüşeyKoord Ekran.PaintPicture parca.picture , 16, 16 Form başlarken PictureBox nesnesinin Scale ayarını yapalım. - Kod:
-
Private Sub Form_Load() Ekran.Scale ( 1 , 1 ) - ( 31 , 21 ) ' Bu şekilde 30 x 20 şeklinde karelere ayrılmış oldu. End Sub Ekranın çevresine duvar yerleştirmemiz gerekir. Ayrıca 10 birim uzunluğunda bir yılanı ekranın ortasına Doğu yönünde gidecek bilgisiyle yerleştiririz. Rastgele bir puan koordinatı üretip puanı da yerleştiririz. Bunları yaparken aynı bilgileri Tablo dizisine de kaydedeceğimizi unutmayın. Yılanın yerleşiminden sonra başlangıç ve bitiş karelerinin değerleri ve yönü Konum dizisine kaydedilir. - Kod:
-
Dim Tablo(1 To 30, 1 To 20) As Byte Dim Konum(1 To 5) As Byte
Private Sub Form_Load() Ekran.Scale (1, 1)-(31, 21) ' Tablo Temizlenir. For i = 1 To 30 For j = 1 To 20 Tablo(i, j) = 0 Next j Next i ' Yatay Duvarları Yerleştir For i = 1 To 30 Ekran.PaintPicture duvar.Picture, i, 1: Tablo(i, 1) = 1 ' Üst Yatay Sıra Ekran.PaintPicture duvar.Picture, i, 20: Tablo(i, 20) = 1 ' Alt Yatay Sıra Next ' Düşey Duvarları Yerleştir For i = 2 To 19 Ekran.PaintPicture duvar.Picture, 1, i: Tablo(1, i) = 1 ' Sol Düşey Sıra Ekran.PaintPicture duvar.Picture, 30, i: Tablo(30, i) = 1 ' Sağ Düşey Sıra Next ' Yılanı Yerleştirelim. Yılan 10 kare uzunluğunda ve yönü 2 (doğu) For i = 11 To 20 Ekran.PaintPicture parca.Picture, i, 10: Tablo(i, 10) = 2 Next 'Rasgele Bir Puan Yerleştirelim. 10: Randomize Timer x = Fix(Rnd * 30) + 1 y = Fix(Rnd * 20) + 1
If Tablo(x, y) = 0 Then Ekran.PaintPicture yem.Picture, x, y Tablo(x, y) = 8 Else GoTo 10 End If Konum(1) = 20 Konum(2) = 10 Konum(3) = 11 Konum(4) = 10 Konum(5) = 2 End Sub Projeyi çalıştırırsanız sonucu görürsünüz. Şu an hiçbir kontrol yok. Yön kontrollerini ekleyelim. - Kod:
-
Private Sub Ekran_KeyDown(KeyCode As Integer, Shift As Integer) Select Case KeyCode Case 37: If Konum(5) <> 2 Then Konum(5) = 4 ' Batı Case 38: If Konum(5) <> 3 Then Konum(5) = 5 ' Kuzey Case 39: If Konum(5) <> 4 Then Konum(5) = 2 ' Doğu Case 40: If Konum(5) <> 5 Then Konum(5) = 3 ' Güney Case 19: If Timer1.Enabled = True Then Timer1.Enabled = False Else Timer1.Enabled = True ' Pause Tuşu Case 32: Timer1.Enabled = True ' Space Tuşu End Select End Sub Ana döngüye de sorgulama ve kontrol kodlarını eklersek olay biter. Aşağıda, programın, kontrol edilmiş ve çalışan kodları bulunmaktadır. Yukarıdaki nesneleri ve ayarlamaları yaptıktan sonra bu kodları direkt olarak formun içine yapıştırın. - Kod:
-
Dim Tablo(1 To 30, 1 To 20) As Byte Dim Konum(1 To 5) As Byte Dim Puan As Boolean
Private Sub Ekran_KeyDown(KeyCode As Integer, Shift As Integer) Select Case KeyCode Case 37: If Konum(5) <> 2 Then Konum(5) = 4 ' Batı Case 38: If Konum(5) <> 3 Then Konum(5) = 5 ' Kuzey Case 39: If Konum(5) <> 4 Then Konum(5) = 2 ' Doğu Case 40: If Konum(5) <> 5 Then Konum(5) = 3 ' Güney Case 19: If Timer1.Enabled = True Then Timer1.Enabled = False Else Timer1.Enabled = True ' Pause Tuşu Case 32: Timer1.Enabled = True ' Space Tuşu End Select End Sub
Private Sub Form_Load() Ekran.Scale (1, 1)-(31, 21) ' Tablo Temizlenir. For i = 1 To 30 For j = 1 To 20 Tablo(i, j) = 0 Next j Next i ' Yatay Duvarları Yerleştir For i = 1 To 30 Ekran.PaintPicture duvar.Picture, i, 1: Tablo(i, 1) = 1 Ekran.PaintPicture duvar.Picture, i, 20: Tablo(i, 20) = 1 Next ' Düşey Duvarları Yerleştir For i = 2 To 19 Ekran.PaintPicture duvar.Picture, 1, i: Tablo(1, i) = 1 Ekran.PaintPicture duvar.Picture, 30, i: Tablo(30, i) = 1 Next ' Yılanı Yerleştirelim. Yılan 10 kare uzunluğunda ve yönü 2 (doğu) For i = 11 To 20 Ekran.PaintPicture parca.Picture, i, 10: Tablo(i, 10) = 2 Next 'Rasgele Bir Puan Yerleştirelim. 10: - Kod:
-
Randomize Timer x = Fix(Rnd * 30) + 1 y = Fix(Rnd * 20) + 1
If Tablo(x, y) = 0 Then Ekran.PaintPicture yem.Picture, x, y Tablo(x, y) = 8 Else GoTo 10 End If Konum(1) = 20 Konum(2) = 10 Konum(3) = 11 Konum(4) = 10 Konum(5) = 2 End Sub
Private Sub Timer1_Timer() Puan = False ' Puan alınıp-alınmadığı
Select Case Konum(5) Case 2: ' Doğu Yönüne If Tablo(Konum(1) + 1, Konum(2)) = 0 Or Tablo(Konum(1) + 1, Konum(2)) = 8 Then If Tablo(Konum(1) + 1, Konum(2)) = 8 Then Label1.Caption = Val(Label1.Caption) + 1 Puan = True End If Tablo(Konum(1), Konum(2)) = Konum(5) Konum(1) = Konum(1) + 1 Else ' Yılan Çarptı Timer1.Enabled = False MsgBox "Kaybettiniz" Exit Sub End If Case 3: ' Güney Yönüne If Tablo(Konum(1), Konum(2) + 1) = 0 Or Tablo(Konum(1), Konum(2) + 1) = 8 Then If Tablo(Konum(1), Konum(2) + 1) = 8 Then Label1.Caption = Val(Label1.Caption) + 1 Puan = True End If Tablo(Konum(1), Konum(2)) = Konum(5) Konum(2) = Konum(2) + 1 Else ' Yılan Çarptı Timer1.Enabled = False MsgBox "Kaybettiniz" Exit Sub End If Case 4: ' Batı Yönüne If Tablo(Konum(1) - 1, Konum(2)) = 0 Or Tablo(Konum(1) - 1, Konum(2)) = 8 Then If Tablo(Konum(1) - 1, Konum(2)) = 8 Then Label1.Caption = Val(Label1.Caption) + 1 Puan = True End If Tablo(Konum(1), Konum(2)) = Konum(5) Konum(1) = Konum(1) - 1 Else ' Yılan Çarptı Timer1.Enabled = False MsgBox "Kaybettiniz" Exit Sub End If Case 5: ' Kuzey Yönüne If Tablo(Konum(1), Konum(2) - 1) = 0 Or Tablo(Konum(1), Konum(2) - 1) = 8 Then If Tablo(Konum(1), Konum(2) - 1) = 8 Then Label1.Caption = Val(Label1.Caption) + 1 Puan = True End If Tablo(Konum(1), Konum(2)) = Konum(5) Konum(2) = Konum(2) - 1 Else ' Yılan Çarptı Timer1.Enabled = False MsgBox "Kaybettiniz" Exit Sub End If End Select Ekran.PaintPicture parca.Picture, Konum(1), Konum(2) If Puan = False Then ' son kare silinir. Ekran.PaintPicture bos.Picture, Konum(3), Konum(4) 'önceki yöne göre konum3 ve 4 ayarlanır. Select Case Tablo(Konum(3), Konum(4)) Case 2: Konum(3) = Konum(3) + 1 Tablo(Konum(3) - 1, Konum(4)) = 0 Case 3: Konum(4) = Konum(4) + 1 Tablo(Konum(3), Konum(4) - 1) = 0 Case 4: Konum(3) = Konum(3) - 1 Tablo(Konum(3) + 1, Konum(4)) = 0 Case 5: Konum(4) = Konum(4) - 1 Tablo(Konum(3), Konum(4) + 1) = 0 End Select Else ' Yeni Bir Puan Rasgele Ekrana Konur. 20: Randomize Timer x = Fix(Rnd * 30) + 1 y = Fix(Rnd * 20) + 1
If Tablo(x, y) = 0 Then Ekran.PaintPicture yem.Picture, x, y Tablo(x, y) = 8 Else GoTo 20 End If End If End Sub Bu kodlar daha da kısaltılabilir. Mesela rasgele puan yerleştirme işlemi ve yön kontrolü için bir sub veya function yapılabilir. - Kod:
-
Sub PuanKoy() BasaGel: Randomize Timer x = Fix(Rnd * 30) + 1 y = Fix(Rnd * 20) + 1
If Tablo(x, y) = 0 Then Ekran.PaintPicture yem.Picture, x, y Tablo(x, y) = 8 Else GoTo BasaGel End If End Sub Bu şekilde diğer bazı kodlar da kısaltılabilir. Niye kısaltmadım?? Uzun yoldan anlaşılması kolay olsun diye.. Öneri - 1 : Ekranın ortasına labirent duvarlar oluşturarak oyunu zorlaştırabilirsiniz. Veya bunları çeşitli etaplar şeklinde yapabilirsiniz. Öneri - 2 : Programdaki görsel imgeleri başka bmp dosyalarıyla değiştirebileceğiniz bir menü ekleyin. Kullanıcı kendi çizdiği resimleri program içerisinden açarak oyuna adapte etsin. Böylece görsel zenginlik artsın. Arka plan resmi de konulabilir. Bonus Öneri - 3: Eğer bir gün şu DirectX olayını da çözersem, yılan oyununu niye 3 boyutlu yapmayayım ki?.. Dim Tablo (1 to 20, 1 to 20, 1 to 20 ) as byte Dim Konum (1 to 7) as byte Bir kenarı 20 birimlik bir küp içinde 3 boyutlu hareket edebilen bir yılan tasarlayın. Walla ben bilsem hemen yaparım. Yılanın koordinatları (11,8,17) şeklinde 3 boyutlu olacak. Konum (1-2-3) ile baş kısmını Konum (4-5-6) ile son kısmını tutacağız. Yön ise 6 farklı değer alır. (ileri-geri-sağ-sol-yukarı-aşağı) 2-3-4-5-6-7 değerlerini verin. Puan zaten 8 değerinde. Olay bitti. | |
|