Şimdi Ara

Python Yılan Oyunu Problemi

Daha Fazla
Bu Konudaki Kullanıcılar: Daha Az
1 Misafir - 1 Masaüstü
5 sn
8
Cevap
0
Favori
2.902
Tıklama
Daha Fazla
İstatistik
  • Konu İstatistikleri Yükleniyor
0 oy
Öne Çıkar
Sayfa: 1
Giriş
Mesaj
  • Yılan oyunu yazmaya çalıştım.Fakat kıvrılma hareketini nasıl yazacağımla ilgili bir fikrim yok.Yılanın başını çevirdiğimde bütün kuyruk da başıyla beraber dönüyor.Şimdilik yılanı tek karede bırakmak zorunda kalıyorum.Bu sorunu çözmeme yardım edebilecek birisi var mı?Bu arada Class kullanmıyorum.Yeni başladığım için bana zor geliyor.Mümkünse Class kullanmadan yardımcı olunuz.Aslında amacım yılanın her karesinin kendinden önceki karenin koordinatlarını tekrar etmesi.Böylece kıvrım yapabilirim ama bunu nasıl kodlayabilirim bilmiyorum.
    Kod aşağıdadır.

    import pygame
    import random
    from pygame.locals import *
    from time import sleep
    pygame.init()
    pencerem=pygame.display.set_mode((800,600))
    WHITE=(255,255,255)
    BLACK=(0,0,0)
    RED=(255,0,0)
    GREEN=(0,255,0)
    knmx=60
    knmy=60
    sagx=20
    asagiy=20
    yemx=100
    yemy=100
    haritasol=False
    haritasag=False
    haritayuk=False
    haritaasg=False
    yembyk=10
    saga=True
    sola=False
    asg=False
    yuk=False
    hiz=10
    tailsize=2
    uyku=0.05
    konum=[knmx,knmy]
    gercekhiz=0.02 #ters orantı
    def yon(x):
    if int(x)==273 and (saga or sola)==True and (yuk and asg)==False:
    a=True
    b=False
    c=False
    d=False
    return a,b,c,d
    elif int(x)==274 and (saga or sola)==True and (yuk and asg)==False:
    a=False
    b=False
    c=False
    d=True
    return a,b,c,d
    elif int(x)==275 and (saga and sola)==False and (yuk or asg)==True:
    a=False
    b=True
    c=False
    d=False
    return a,b,c,d
    elif int(x)==276 and (saga and sola)==False and (yuk or asg)==True:
    a=False
    b=False
    c=True
    d=False
    return a,b,c,d
    else:
    return yuk,saga,sola,asg
    def hareket():
    global n,m
    if yuk==True:
    for i in range(1):
    n=knmy-hiz
    m=knmx
    sleep(uyku)
    return n,m
    if asg==True:
    for i in range(1):
    n=knmy+hiz
    m=knmx
    sleep(uyku)
    return n,m
    if sola==True:
    for i in range(1):
    m=knmx-hiz
    n=knmy
    sleep(uyku)
    return n,m
    if saga==True:
    for i in range(1):
    m=knmx+hiz
    n=knmy
    sleep(uyku)
    return n,m
    while True:
    pencerem.fill(BLACK)
    for i in range(1):
    bas=pygame.draw.rect(pencerem, RED, (knmx,knmy,sagx,asagiy))
    konum.append=[knmx,knmy]



    for olay in pygame.event.get():
    if olay.type==QUIT:
    pygame.quit()
    elif olay.type==KEYDOWN:
    kolay=olay.key
    yuk,saga,sola,asg=yon(kolay)
    sleep(0.1)
    knmy,knmx=hareket()
    if knmx==800 and saga:
    knmx=0
    elif knmx==0 and sola:
    knmx=800
    elif knmy==0 and yuk:
    knmy=600
    elif knmy==600 and asg:
    knmy=0
    sleep(gercekhiz)

    pygame.display.flip()







  • Kuyruklarin koordinatlarini bir dizi icinde tutup her oyun dongusunde başın önceki koordinatini 1. Kuyruga 1. Kuyrugu 2 ye atayip boyle devam ederek yapabilirsin

    < Bu ileti mobil sürüm kullanılarak atıldı >
  • kurosaki_ichigo kullanıcısına yanıt
    şöyle bir problem var bu yılana 20 tane kuyruk kutusu eklersem 20 kere bu koşulları değerlendiren ifadeler girmek zorunda kalacağım.Bu işlemi birka. fonksiyon ve döngü ile yapmak mümkün mü?
  • hala güncel
  • Yilanin konumunu X ve Y yapmissin, hata orada. Python syntaxini pek bilmiyorum ama X[] ve Y[] seklinde olmali koordinatlar, yani array/list tarz bir structure. Saga gideceksin diyelim, yilanin boyu da 20, yani 20 lik bir array var elinde ve x[19] da yilanin başı. x[0] = x[1], x[1] = x[2], .... , x[18] = x[19], x[19] = x[19] + 1 yaparsin, boylece yilanin basi saga, geri kalanlar da kendisinden bir oncekine gitmis, yani takip etmis olur.

    Tabi bunu ornek olarak verdim, simdi bastan yazmaya usendim ama basi arrayin basinda olsa cok daha mantikli olur tabi, zira yilanin boyu buyuyecek. Ayni zamanda buyudugu icin de array gibi degil de arraylist tadinda, dedigim gibi python bilmiyorum, size'i sabit olmayan bir data structure kullanirsin. Yukarida yazdigimin tersini loopla yapip x[20] yi de x[19]'un onceki yerine koyarsin.

    Kahvemi yeni ictim, cok kendime gelemedim, anlatamadiysam soyle.

    < Bu ileti tablet sürüm kullanılarak atıldı >
  • quote:

    Orijinalden alıntı: Yirikalische

    Yilanin konumunu X ve Y yapmissin, hata orada. Python syntaxini pek bilmiyorum ama X[] ve Y[] seklinde olmali koordinatlar, yani array/list tarz bir structure. Saga gideceksin diyelim, yilanin boyu da 20, yani 20 lik bir array var elinde ve x[19] da yilanin başı. x[0] = x[1], x[1] = x[2], .... , x[18] = x[19], x[19] = x[19] + 1 yaparsin, boylece yilanin basi saga, geri kalanlar da kendisinden bir oncekine gitmis, yani takip etmis olur.

    Tabi bunu ornek olarak verdim, simdi bastan yazmaya usendim ama basi arrayin basinda olsa cok daha mantikli olur tabi, zira yilanin boyu buyuyecek. Ayni zamanda buyudugu icin de array gibi degil de arraylist tadinda, dedigim gibi python bilmiyorum, size'i sabit olmayan bir data structure kullanirsin. Yukarida yazdigimin tersini loopla yapip x[20] yi de x[19]'un onceki yerine koyarsin.

    Kahvemi yeni ictim, cok kendime gelemedim, anlatamadiysam soyle.
    hocam teşekkür ederim, for döngüsüyle bir listeye gömdüm ve her biri diğerinin koordinatı olacak şekilde çağırdım.Sizin yaptığınız daha profesyonel.Bu oyunu yapma amacım oyunu yapay zekaya oynatmak.Bunun için input olarak yılanın başının yemin ve yılanın parçalarına olan uzaklığını kullanmayı düşünüyorum.Sizin bu konuda fikriniz var mı?Duymayı çok isterim.




  • bastan ekle kuyruktan sil. aralari dusunme kuyruga gelene kadar kalsin bosta. eklerken saga sola ekle klavyeye gore bitti gitti akar kivrilir gider. uzamasi icin bastan ekle ama kuyruktan silme.



    < Bu mesaj bu kişi tarafından değiştirildi 26_bbz_26 -- 21 Ocak 2019; 6:21:23 >
    < Bu ileti mini sürüm kullanılarak atıldı >
  • 
Sayfa: 1
- x
Bildirim
mesajınız kopyalandı (ctrl+v) yapıştırmak istediğiniz yere yapıştırabilirsiniz.