Visual Basic - Basic - PicBasic ve Türevleri
Matrisle Snake Yapımı Hk. ( Soru )
Matrisle Snake Yapımı Hk. ( Soru )
-
Matrislerle ilgili birşey bilmiyordum. Staj yerinde bir abi sağolsun biraz gösterdi tamamlayıp snake yapmamı istedi.
100 tane label ile 10x10 bi matris oluşturup rastgele sayı gönderip yılanı ortaya çıkartıyorum.
ilk parça
yukarı giderken - 10
aşağı giderken + 10
sağa giderken + 1
sola giderken - 1 değer alıyor.
2. parça ilk parçanın değer almadan önceki haline geçiyor 3. parça 2. parçanın değer almadan önceki haline geçiyor yani ;
ilk hali 1. parça 45 2. parça 55 3. parça 65 ise yukarı gittiğinde 1. parça 35 2. parça 45 3. parça 55 oluyor. Parçalara eski değerleri aktarma konusunda bir sıkıntı yok ama sıkıntı şurada başlıyor.Kısa dönüş yapmak istediğimde ilk parça sağa gidiyor 2. parça ilk parçanın değerini alıyor ama 3. sü olduğu yerde takılıyor.
Şu haldeyken sağa gittiğimde ilk parçanın 26 2. parçanın 25 3. parçanın 15 olması gerekiyor. Ama durum bu :
Nasıl çözeceğimi bir türlü bulamadım kodlarıda atayım :
Public Class Form1 Dim l As Label Dim lbl As New List(Of Label) Dim labelsayisi As New List(Of Integer) Dim random, randomyon As Integer Dim surekli As String Dim yukari, asagi, saga, sola As Boolean Private Sub label_olustur() Try Dim sira, kolon As Integer For i As Integer = 1 To 100 l = New Label sira = Math.Ceiling(i / 10) kolon = i Mod 10 If kolon = 0 Then kolon = kolon + 10 l.Name = "lbl" & i l.Height = 50 l.Width = 50 l.TextAlign = System.Drawing.ContentAlignment.MiddleCenter l.Top = 20 + ((sira - 1) * 55) l.Left = 20 + (kolon * 55) l.Text = i.ToString l.BorderStyle = System.Windows.Forms.BorderStyle.FixedSingle l.BackColor = Color.White l.Font = New Font("", 8, FontStyle.Bold) lbl.Add(l) GroupBox1.Controls.Add(l) Next Catch ex As Exception MsgBox(ex) End Try End Sub Private Sub random_olustur() labelsayisi.Clear() Randomize() random = Int(Rnd() * 100) labelsayisi.Add(random) : labelsayisi.Add(random + 10) : labelsayisi.Add(random + 20) randomyon = Int(Rnd() * 4) surekli = randomyon.ToString End Sub Private Sub Form1_Load() Handles MyBase.Load label_olustur() random_olustur() End Sub Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click Timer1.Enabled = False random_olustur() boyama(labelsayisi) 'Timer1.Enabled = True End Sub Public Sub boyama(ByVal boya As List(Of Integer)) Try For i As Integer = 0 To lbl.Count - 1 lbl(i).BackColor = Color.White : lbl(i).ForeColor = Color.Black Next For b As Integer = 0 To labelsayisi.Count - 1 If lbl(labelsayisi(b)).BackColor = Color.White Then lbl(labelsayisi(b)).BackColor = Color.Black : lbl(labelsayisi(b)).ForeColor = Color.White Else lbl(labelsayisi(b)).BackColor = Color.White : lbl(labelsayisi(b)).ForeColor = Color.Black End If Next lbl(labelsayisi(0)).BackColor = Color.Red lbl(labelsayisi(1)).BackColor = Color.Green lbl(labelsayisi(2)).BackColor = Color.Black Catch ex As Exception End Try End Sub Public Sub hareket_ettir(ByVal move As String) If move = "1" Then For i As Integer = labelsayisi.Count - 1 To 1 Step -1 If labelsayisi(i - 1) - 10 = labelsayisi(i) Or labelsayisi(i - 1) + 90 = labelsayisi(i) Then Else labelsayisi(i) = labelsayisi(i - 1) If i = 1 Then labelsayisi(0) = labelsayisi(0) - 10 End If If labelsayisi(0) < 0 Then labelsayisi(0) = labelsayisi(0) + 100 End If End If Next End If boyama(labelsayisi) If move = "2" Then For i As Integer = labelsayisi.Count - 1 To 1 Step -1 If labelsayisi(i - 1) + 10 = labelsayisi(i) Or labelsayisi(i - 1) - 90 = labelsayisi(i) Then Else labelsayisi(i) = labelsayisi(i - 1) If i = 1 Then labelsayisi(0) = labelsayisi(0) + 10 End If If labelsayisi(0) >= 100 Then labelsayisi(0) = labelsayisi(0) - 100 End If End If Next End If boyama(labelsayisi) If move = "3" Then For i As Integer = labelsayisi.Count - 1 To 1 Step -1 If labelsayisi(i - 1) - 1 = labelsayisi(i) Or labelsayisi(i - 1) + 9 = labelsayisi(i) Then Else labelsayisi(i) = labelsayisi(i - 1) If i = 1 Then labelsayisi(0) = labelsayisi(0) - 1 If labelsayisi(0) Mod 10 = 9 Or labelsayisi(0) < 0 Then labelsayisi(0) = labelsayisi(0) + 10 End If End If boyama(labelsayisi) End If Next End If If move = "4" Then For i As Integer = labelsayisi.Count - 1 To 1 Step -1 If labelsayisi(i - 1) + 1 = labelsayisi(i) Or labelsayisi(i - 1) - 9 = labelsayisi(i) Then Else labelsayisi(i) = labelsayisi(i - 1) If i = 1 Then labelsayisi(0) = labelsayisi(0) + 1 If labelsayisi(0) Mod 10 = 0 Or labelsayisi(0) < 0 Then labelsayisi(0) = labelsayisi(0) - 10 End If End If boyama(labelsayisi) End If Next End If Label1.Text = "baş red : " + labelsayisi(0).ToString Label2.Text = "orta green : " + labelsayisi(1).ToString Label3.Text = "son black : " + labelsayisi(2).ToString End Sub Private Sub Button1_KeyDown(sender As Object, e As KeyEventArgs) Handles Button1.KeyDown Try If e.KeyCode = Keys.W Or e.KeyCode = Keys.Up Then hareket_ettir("1") surekli = "1" End If If e.KeyCode = Keys.S Or e.KeyCode = Keys.Down Then hareket_ettir("2") surekli = "2" End If If e.KeyCode = Keys.A Or e.KeyCode = Keys.Left Then hareket_ettir("3") surekli = "3" End If If e.KeyCode = Keys.D Or e.KeyCode = Keys.Right Then hareket_ettir("4") surekli = "4" End If Catch ex As Exception MsgBox(ex.ToString) End Try End Sub Private Sub Timer1_Tick(sender As Object, e As EventArgs) Handles Timer1.Tick hareket_ettir(surekli) End Sub End Class
-
Bir uplayayım.
-
switch case kullanaydın iyiydi. Şu haldeyken //yorum satırları yokken. okumak çok zor.
-
Haklısın hocam ama pek üstünde duramadım ilk aklıma gelen şekilde yazdım maalesef.
-
up
-
Daha pratik bir çözüm düşün..
Koddan birşey anlamadım ama sanırm algoritmada ince bir sorun olabilir ..
bi anlatsaydın nasıl hareket ettiğini yılanın
Çıkmam gerekiyo
maksat up olsun..
-
ltcelik bunu yazdı
Daha pratik bir çözüm düşün..
Koddan birşey anlamadım ama sanırm algoritmada ince bir sorun olabilir ..
bi anlatsaydın nasıl hareket ettiğini yılanın
Çıkmam gerekiyo
maksat up olsun..
diyelim yılanın başı 25 de meydana geliyor 2. parçası için sayıya +10 ekleniyor ve 35 de beliriyor. 3. parçası için ise 25 e +20 ekleniyor ve 45 de meydana geliyor.
Yer değiştirmesi için yukarı gitmek istendiğinde ilk sayıdan -10 düşüyor. Aşağı gitmek istediğinde +10 ekleniyor. Sağa gitmek için +1 ekleniyor. Sola gitmek için -1 düşüyor.
Diğer parçaların hareketi ise sadece bir üstündekinin yerini almak.
Kısacası : Yılanın parçalarının değeri 1. parça 25 2. parça 35 3. parça 45 ise yukarı gitmek istediğinde kodlarda yaptığım şey şu :
3. parça = 2. parçanın değeri ( yani 35 i 3. parçaya aktarmak oda bir kare yukarı çıkmasını sağlıyor )
2. parça = 1. parçanın değeri (25 i 2. parçaya aktarmak oda bir kare yukarı çıkmasını sağlıyor )
1. parça = 1. parça değeri - 10 (25 ten 10 düşünce 15 oluyor ve buda bir kare yukarı çıkmasını sağlıyor )
kısacası 1. parçanın değeri gitmek istediği yöne doğru eksilirken diğer parçalarda bir öncekinin değerini alıyor.
Yılan bu şekilde hareket ediyor. -
Olayı böyle çözmeye çalışmakla matrisi diziye çevirmişsin
..
diğer yandan 3. parça yerinde kalıyorsa hareket kontrol programında sıkıntı vardır 3. parça için icraat yapmıyordur.. çıkış koşullarında yanlış düşünmü ş olabilirsin
..
Ben pratik olarak şöyle düşündüm
önce hedef pozisyonlarını sırasıyla bir diziye aktarırım ( yılanın işgal edeceği kareleri)
sonra uygun şekilde bu pozisyonlara karlerin indislerini atarım ..
..
ya da en arkdaki parçayı hedef kareye atlatırsan da olur praik olarak yılan ilerler .. aynı renk olursa bişi farketmez
-
Şimdi şöyle matrisi ve yılanı oluşturdun diyelim
yılanı oluşturan hücreleri sıaralı olarak yılanın şu andaki pozisyonu YŞAP dizisinde tutalım
bundan sonra hareket verme ve yanma koşulları devreye girecek
öncelikle yön (lendirme ) koşullarını denetlememiz gerekli
bir hareket denetleme bloğu yapalım
yılana verilen yön mevcut yönün tam aksi ise yön değişmeycek
sonra yanma koşulları denetlencek
hedef hücre matris sınırları dışındaysa yandın
ya da yılan hedef hücreye yerleştiğinde orda yılanın gövdesi varsa yandın olacak
hareket denetleme bloğu çıkışı
program bu bloğu geçtiyse sorun yok oyuna devam
hareket bloğuna geçelim
öncelikle yılanın konumunu değerlendirelim
//senin yılan mesela 5 elemanlı olsun beslenmiyor olsun
yılanın şu andaki pozisyonu YŞAP=( 45,44,34,33,23) olsun (kafa 45te varsayıyorum)
// yılan buardan nereye haret ederse etsin (yasak olmayan hücrelere) yılanın en son lelmanı diziden atılırken
// hedef hücre diziye katılacaktır olan sadece budur 46 ya gitse 46,45,44,34,33 olur diğerlerine gitse başa 35 ya da 55 gelir
her halukarda YŞAP dizisinden son eleman silinir hedef hücre (HH) dizinin başına gelir
Yılanın Hedef Pozisyonu YHP=(HH,.. 33) dizisini oluşturduk
Görüntüleme Bloğu
Yılanı yeni pozisyonunda görüntüledik
GB çıkışı
YŞAP=YHP yapıp ( yeni hareket için denetlemeye hazır hale getiriyoruz )
hareket denetleme bloğuna dön