Matrisle Snake Yapımı Hk. ( Soru )

  1. KısayolKısayol reportŞikayet pmÖzel Mesaj
    unchain
    unchain's avatar
    Kayıt Tarihi: 24/Ekim/2012
    Erkek

    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.

    snake%201

    Ş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 :
    snake%202

    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

     

     


    Yaptığım onca iyiliğin tek yanlışta unutulduğunu gördüğümden beri kötü biriyim.
  2. KısayolKısayol reportŞikayet pmÖzel Mesaj
    unchain
    unchain's avatar
    Kayıt Tarihi: 24/Ekim/2012
    Erkek

    Bir uplayayım.


    Yaptığım onca iyiliğin tek yanlışta unutulduğunu gördüğümden beri kötü biriyim.
  3. KısayolKısayol reportŞikayet pmÖzel Mesaj
    asa42
    asa42's avatar
    Kayıt Tarihi: 17/Eylül/2009
    Erkek

    switch case kullanaydın iyiydi. Şu haldeyken //yorum satırları yokken. okumak çok zor. 

  4. KısayolKısayol reportŞikayet pmÖzel Mesaj
    unchain
    unchain's avatar
    Kayıt Tarihi: 24/Ekim/2012
    Erkek

    Haklısın hocam ama pek üstünde duramadım ilk aklıma gelen şekilde yazdım maalesef.


    Yaptığım onca iyiliğin tek yanlışta unutulduğunu gördüğümden beri kötü biriyim.
  5. KısayolKısayol reportŞikayet pmÖzel Mesaj
    Huerfanos
    Huerfanos's avatar
    Kayıt Tarihi: 01/Ekim/2012
    Erkek

    up


    Anarsistherif...
  6. KısayolKısayol reportŞikayet pmÖzel Mesaj
    ltcelik
    ltcelik's avatar
    Kayıt Tarihi: 11/Mayıs/2007
    Erkek

    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..


    Din Kitaplarını Okuyup Anlayana Ateist, Okuyup Anlamayanlara "dindar" denir... Nikola TESLA.. ben mi? Ne okurum ne anlarım... Kendi kendime de uyuz oluyorum ama olamıyorum.. "Ama efsaneyi çıkarıp atarsan ve yaptıkları eylemlere bakarsan... ..Jedi'ların mirası başarısızlıktır. İkiyüzlülüktür, kibirdir."
  7. KısayolKısayol reportŞikayet pmÖzel Mesaj
    unchain
    unchain's avatar
    Kayıt Tarihi: 24/Ekim/2012
    Erkek
    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.


    Yaptığım onca iyiliğin tek yanlışta unutulduğunu gördüğümden beri kötü biriyim.
  8. KısayolKısayol reportŞikayet pmÖzel Mesaj
    ltcelik
    ltcelik's avatar
    Kayıt Tarihi: 11/Mayıs/2007
    Erkek

    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

     

     

     


    Din Kitaplarını Okuyup Anlayana Ateist, Okuyup Anlamayanlara "dindar" denir... Nikola TESLA.. ben mi? Ne okurum ne anlarım... Kendi kendime de uyuz oluyorum ama olamıyorum.. "Ama efsaneyi çıkarıp atarsan ve yaptıkları eylemlere bakarsan... ..Jedi'ların mirası başarısızlıktır. İkiyüzlülüktür, kibirdir."
  9. KısayolKısayol reportŞikayet pmÖzel Mesaj
    ltcelik
    ltcelik's avatar
    Kayıt Tarihi: 11/Mayıs/2007
    Erkek

     Ş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

     

     

     

     

     

     


    Din Kitaplarını Okuyup Anlayana Ateist, Okuyup Anlamayanlara "dindar" denir... Nikola TESLA.. ben mi? Ne okurum ne anlarım... Kendi kendime de uyuz oluyorum ama olamıyorum.. "Ama efsaneyi çıkarıp atarsan ve yaptıkları eylemlere bakarsan... ..Jedi'ların mirası başarısızlıktır. İkiyüzlülüktür, kibirdir."
Toplam Hit: 2246 Toplam Mesaj: 9