Python'da random fonksiyonunun kendini sürekli yenilemesi

SkyRose

Megapat
Katılım
26 Haziran 2019
Mesajlar
6.067
Makaleler
5
Çözümler
59
Merhaba. Kodumun okunabilirlik olarak iyi olduğundan pek emin değilim, umarım derdimi anlatabilmişimdir.

[CODE lang="python" title="Kodlarım"]import random
easy_fruits = ['armut', 'elma', 'muz', 'karpuz', 'kavun', 'erik', 'portakal', 'mandalina', 'şeftali', 'kayısı',
'dut', 'keçiboynuzu', 'beyaz dut', 'greyfurt', 'ceviz', 'kivi', 'badem', 'iğde', 'kestane', 'çilek', 'vişne', 'kiraz', 'incir', 'nar', ]


hard_fruits = ['hindistan cevizi', 'ayva', 'karadut', 'mango', 'ananas', 'muşmula', 'çağla', 'kızılcık',
'kırmızı erik', 'avokado', 'kaktüs inciri', 'yıldız meyvesi', 'ejder meyvesi', 'karayemiş', 'hünnap',
'trabzon hurması', 'nektarin', 'yeni dünya', 'zerdali', 'turunç']

extreme_fruits = ['papaya', 'kan portakalı', 'bektaşi üzümü', 'liçi', 'anona', 'feijoa', 'mangostan', 'kamkat', 'rambutan', 'tamarillo']



answer_from_robot = random.choice(easy_fruits)
def letter_check(n):
if n[0] != answer_from_robot[-1]:
print(answer_from_robot[-1], n[0])
exit()
else:
print("Harfler tamam")
pass

def word_check(n):
if n not in easy_fruits:
if n not in hard_fruits:
if n not in extreme_fruits:
print("Bunun bir meyve olduğuna emin misin?")
exit()
else:
print("Güzel") or ("iyi") or ("Doğru seçim")
pass

def answer_from_user():
global cevap
cevap = input("> ")

def remove_from_list(n):
for n in easy_fruits and hard_fruits and extreme_fruits:
easy_fruits and hard_fruits and extreme_fruits.remove(n)


def robot_answers():
for robo_cevap in easy_fruits and hard_fruits and extreme_fruits:
if robo_cevap[0] == r:
print(robo_cevap)
remove_from_list(robo_cevap)



cevap = input("Başla: ")
word_check(cevap)

r = cevap[-1]




while True:
robot_answers()
answer_from_user()
word_check(cevap)
letter_check(cevap)
remove_from_list(cevap)
continue[/CODE]


Benim yazmak istediğim program bir kelime oyunu programı. İlk önce meyveleri içeren listeler oluşturdum, zorluklarına göre. Sonra kullanıcıdan bir meyve istiyorum ve kullanıcı meyveyi girdikten sonra yazılım meyve listelerinden ilk harfi kullanıcının son harfine denk olan bir meyve seçip gönderiyor.
"Elma - Armut - Turunç - Çilek" gibi uyumlu meyveler sıralandığı sürece devam ediyor yani oyun.

Sonra yeniden kullanıcıdan girdi isteyip onun ilk harfi yazılımın verdiği cevap ile uyuşuyor mu kontrol ediyorum ve böyle böyle gidiyor.

Fakat bu kısımda sıkıntı oluyor ve ben doğru kelimeyi yazsam da harflerin uyuşmadığını belirtiyor. Bunun üzerine bir süre uğraştıktan sonra uyuşması gereken harfleri print edeyim bari dedim ve harflerin değiştiğini fark ettim.
Yani ben robotun verdiği cevabın son harfini isteyince yazılım onun yerine robot için yeni bir cevap seçip (random fonksiyonunu tekrarlayıp) yeni seçtiği cevabın son harfini yolluyor.
Böyle olunca da program bozuk oluyor :/


Ben ilk seçilen rastgele meyveyi nasıl depolayabilirim? Bana yardımcı olanlara şimdiden çok teşekkür ederim.
 
Son düzenleme:
Gönderdiğimi düşünüyorum, göndermesem program "r is not defined" diye uyarı vermez miydi?
Ve programın bence hatalarla dolu. Sadece ilk çalıştırışta bir kez random meyve alıyor.
Kodunu fazla incelememiştim doğru yazdığını varsayıp bir şey düzeltmek istemiştim ama yazdığın programdan bişey anlamadım. Yapmak istediğin işlemi nasıl yapmayı planlıyorsun.
Soru 1: Neden rastgele bir meyve seçtiriyorsun?
Soru 2: Neden bu programın başında sadece 1 kez yaptırıyorsun?
Soru 3: Neden global değişkenler kullanıyorsun? Mümkün olduğunca Local değişken kullan. Düzen sağlar.

Sana tavsiyem fonksyionları birbirinden çağır sırayla çalıştırmak yerine. Karmaşık olsada ne yaptığını daha iyi anlarsın. Ve AND kullanma FOR kullanırken. Kullanacaksanda robot_answer için bahsediyorum IF içinde aldığın değerleri bir listeye ekle. Ve o listeden random çek. Yoksa sürekli aynı değer (son bulduğu) döner.

Sürekli hata almanın nedeni programın başına random meyve belirlemen. Sen ne yazrasn yaz o başta seçtiği meyve değişmiyor. O yüzden çıkıyor programdan. Ki zaten random meyve çektirmek mantıksız bence.
 
Soru 1: Neden rastgele bir meyve seçtiriyorsun?
Haklısınız aslında, for ile istediğim özellikleri belirleyen tüm kelimeleri belirleyip ilkini seçsem zaten o kullanıldıktan sonra listeden kaldırılacağı için random ile pek bir farkı kalmıyor.
Soru 2: Neden bu programın başında sadece 1 kez yaptırıyorsun?
Programın başındaki meyve sonraki seçileceklerin aksine herhangi bir harf ile başlama zorunluluğuna sahip değil, bu yüzden farklı bir şey yazdım onu niçin.
Ve AND kullanma FOR kullanırken. Kullanacaksanda robot_answer için bahsediyorum IF içinde aldığın değerleri bir listeye ekle. Ve o listeden random çek. Yoksa sürekli aynı değer (son bulduğu) döner.
Fakat ben robotun kolay meyveler listesinden kelime çekebilecek durumdayken başka listelere gitmesini istemiyorum. Mesela turunç bir seçenek iken gidip tamarillo derse biraz garip olabilir.

Tabii daha programım düzgün çalışmıyorken tamarillo mu olsun turunç mu olsun diye düşünmem ne kadar doğru bilmiyorum :). Verdiğiniz fikir ile programı yeniden yazacağım. Teşekkürler.
 
Öncelikle kolay gelsin. Kodunuzda hatalı olan bir sürü yer var.

Örneğin remove_from_list() fonksiyonunuz hatalı. For döngüsünde listeleri toplamalısınız. and kullanmamalısınız. Ayrıca remove() metodunu kullanırken spesifik bir liste üzerinde kullanmalısınız. Bu liste kullanımını genel olarak her yerde hatalı yapmışsınız. Kodunuzu baz alarak düzgün ve çalışan bir kod yazdım basitçe. Aşağıya bırakıyorum.

[CODE lang="python" title="Çalışan kod:"]import random
meyve_list = [['armut', 'elma', 'muz', 'karpuz', 'kavun', 'erik', 'portakal', 'mandalina', 'şeftali', 'kayısı',
'dut', 'keçiboynuzu', 'beyaz dut', 'greyfurt', 'ceviz', 'kivi', 'badem', 'iğde', 'kestane', 'çilek', 'vişne', 'kiraz', 'incir', 'nar'],
['hindistan cevizi', 'ayva', 'karadut', 'mango', 'ananas', 'muşmula', 'çağla', 'kızılcık',
'kırmızı erik', 'avokado', 'kaktüs inciri', 'yıldız meyvesi', 'ejder meyvesi', 'karayemiş', 'hünnap',
'trabzon hurması', 'nektarin', 'yeni dünya', 'zerdali', 'turunç'],
['papaya', 'kan portakalı', 'bektaşi üzümü', 'liçi', 'anona', 'feijoa', 'mangostan', 'kamkat', 'rambutan', 'tamarillo']]


tum_meyveler = ['armut', 'elma', 'muz', 'karpuz', 'kavun', 'erik', 'portakal', 'mandalina', 'şeftali', 'kayısı',
'dut', 'keçiboynuzu', 'beyaz dut', 'greyfurt', 'ceviz', 'kivi', 'badem', 'iğde', 'kestane', 'çilek',
'vişne', 'kiraz', 'incir', 'nar', 'hindistan cevizi', 'ayva', 'karadut', 'mango', 'ananas', 'muşmula', 'çağla', 'kızılcık',
'kırmızı erik', 'avokado', 'kaktüs inciri', 'yıldız meyvesi', 'ejder meyvesi', 'karayemiş', 'hünnap',
'trabzon hurması', 'nektarin', 'yeni dünya', 'zerdali', 'turunç', 'papaya', 'kan portakalı',
'bektaşi üzümü', 'liçi', 'anona', 'feijoa', 'mangostan', 'kamkat', 'rambutan', 'tamarillo']


cevaplar = []


def meyve_kaldir(index, meyve):
meyve_list[index].remove(meyve)


def list_get(lst, index):
try:
return lst[index]
except IndexError:
return None


def input_al():
if len(cevaplar) == 0:
giris = input('Başla: ')
cevaplar.append(giris)
else:
giris = input('>> ')
cevaplar.append(giris)


def robot_kelime_sec(kelime):
if kelime is not None:
uyumlu_kelimeler = []
for i in range(len(meyve_list)):
for meyve in meyve_list:
if meyve[0] == kelime[-1]:
uyumlu_kelimeler.append([i, meyve])
secim = random.choice(uyumlu_kelimeler)
meyve_kaldir(secim[0], secim[1])
return secim[1]
else:
lst = None
index = random.randint(0, 2)
meyve = random.choice(meyve_list[index])
meyve_kaldir(index, meyve)
return meyve


def kontrol_meyve_mi(kullanici):
if kullanici not in tum_meyveler:
return False
else:
return True


def kontrol_uydu_mu(kullanici, robot):
if kullanici in (meyve_list[0] + meyve_list[1] + meyve_list[2]):
if kullanici[0] == robot[-1]:
print('Meyve uyuştu. Güzel.')
return True
else:
print('Harfler uyuşmadı. Kaybettin.')
return False
else:
print('Bu meyve daha önce girildi.')
return False


while True:
robot_secim = robot_kelime_sec(list_get(cevaplar, -1))
print(robot_secim)
input_al()
kullanici_giris = cevaplar[-1]
if kontrol_meyve_mi(cevaplar[-1]):
if kontrol_uydu_mu(kullanici_giris, robot_secim):
continue
else:
break
else:
print('Bu bir meyve değil.')
break
[/CODE]
 
Öncelikle kolay gelsin. Kodunuzda hatalı olan bir sürü yer var.

Örneğin remove_from_list() fonksiyonunuz hatalı. For döngüsünde listeleri toplamalısınız. and kullanmamalısınız. Ayrıca remove() metodunu kullanırken spesifik bir liste üzerinde kullanmalısınız. Bu liste kullanımını genel olarak her yerde hatalı yapmışsınız. Kodunuzu baz alarak düzgün ve çalışan bir kod yazdım basitçe. Aşağıya bırakıyorum.
Söyledikleriniz için teşekkürler.

Ben de siz ve @Luthienn 'in dediklerinden faydalanarak programı şöyle yazdım;

Python:
fruits = ['armut', 'üzüm', 'surinam kirazı', 'elma', 'muz', 'karpuz', 'kavun', 'erik', 'portakal', 'mandalina', 'şeftali', 'kayısı',
'dut', 'keçiboynuzu', 'beyaz dut', 'greyfurt', 'ceviz', 'kivi', 'badem', 'iğde', 'kestane', 'çilek', 'vişne', 'kiraz',
'hindistan cevizi', 'ayva', 'karadut', 'mango', 'ananas', 'muşmula', 'çağla', 'kızılcık', 'incir', 'nar',
'kırmızı erik', 'avokado', 'kaktüs inciri', 'yıldız meyvesi', 'ejder meyvesi', 'karayemiş', 'hünnap',
'trabzon hurması', 'nektarin', 'yeni dünya', 'zerdali', 'turunç', 'papaya', 'kan portakalı', 'bektaşi üzümü',
'liçi', 'anona', 'feijoa', 'mangostan', 'kamkat', 'rambutan', 'tamarillo',]

newlist = []
answers = []
def word_check(ans, rans):
    if rans[-1] != ans[0]:
        print("Harflere dikkat!")
        exit()
    else:
        print("Harfler tamam") or ("Harfler uyuşuyor")


def oyun():
    if len(answers) == 0:
        answer = input("Başla ")
        fruit_check(answer)
    else:
        answer = input("> ")
        word_check(answer, answer_robot)
        fruit_check(answer)

    for accurate_fruit in fruits:
        if accurate_fruit[0] == answer[-1]:
            newlist.append(accurate_fruit)
            return newlist

def fruit_check(x):
    if x in fruits:
        pass
    elif x in answers:
        print("Bu meyveyi daha önce söyledin")
        exit()
    else:
        print("Bu bir meyve değil!")
        exit()


while True:
    oyun()

    try:
        answer_robot = newlist[0]
    except IndexError:
        print("Tamam, sen kazandın")
        exit()

    print(answer_robot)
    fruits.remove(answer_robot)
    answers.append(answer_robot)
    newlist.clear()

Şu an tıkır tıkır çalışıyor :) Şurayı şöyle yaparsanız daha iyi olur dediğiniz bir yer olursa ve söylerseniz çok katkısı olur.
 
Tekrardan kolay gelsin, elinize sağlık. and, or gibi boolean operatörlerini yanlış anlamışsınız gibi gözüküyor. Hangi kaynaklardan yararlandıysanız tekrar etmenizi öneririm. print() komutunu kullanacağınız zaman or kullanmamalısınız. and ve or operatörler, True ve False yani boolean değişkenleri arasında kullanılır (0-1, açık-kapalı gibi yani iki tabanlı sayısal işlemler). Lisede mantık dersinde anlatılan mantık operatörleridir kendileri. Rastgele bir seçim yapmanızı sağlamaz. "Bunu ya da şunu yazdır." anlamını o operatörlerle sağlayamazsınız.

Ekrana rastgele bir yazı yardırmak için print(random.choice(["Harfler tamam", "Harfler uyuşuyor"])) yaparak bir listeden rasgele bir string seçtirmeniz gerekiyor.

Ayrıca boolean operatörlerini daha rahat anlamanız için güzel bir serim buldum internette. Buraya bırakayım.

Boolean_circuits_why.png
 

Geri
Yukarı