bardakların rastgele yerini değiştirmek için nasıl bir yöntem kullanabilirim? physics kütüphanesinde olabilir diye düşündüm ama bilmediğim için bir şey yapamadım
3 konum belirle bu konumları bir liste içerisinde birleştir.
Ardından bir fonksiyon oluştur. Bu fonksiyon her bir bardak için diğerlerinden farklı olmak koşulu ile kendisine bir konum seçsin.
Bunu da
dediği gibi bu modülü kullanarak yapabilirsin. Bir önceki konumdan farklı olması için bunu for döngüsü ve koşul ifadeleri ile kontrol edebilirsin.
Örnek kod istersen;
import random
konum_1 = 1,2
konum_2 = 3,4
konum_3 = 5,6
aktif_konum_list = list()
konum_list = [konum_1, konum_2, konum_3]
while True:
konum_secim_1 = random.choice(konum_list)
aktif_konum_list.append(konum_secim_1)
print("1 > {}".format(konum_secim_1))
while True:
konum_secim_2 = random.choice(konum_list)
if konum_secim_2 == aktif_konum_list[0]:
print("2.hata > {}".format(konum_secim_2))
konum_secim_2 = random.choice(konum_list)
else:
aktif_konum_list.append(konum_secim_2)
print("2 > {}".format(konum_secim_2))
break
while True:
konum_secim_3 = random.choice(konum_list)
if konum_secim_3 == aktif_konum_list[0] or konum_secim_3 == aktif_konum_list[1]:
print("3.hata > {}".format(konum_secim_3))
konum_secim_3 = random.choice(konum_list)
else:
aktif_konum_list.append(konum_secim_3)
print("3 > {}".format(konum_secim_3))
break
break
print("aktif konum liste > {}".format(aktif_konum_list))
Daha basit ve kısa bir yapı ile de oluşturulabilir. Zaten bunu alıp direk kendi kodlarında kullanmak biraz zor. Sen sadece kodu okuyup mantığı anladıktan sonra kendi programına uygun şekilde dahil edersin.
not: döngü her yeniden başlatılması gerektiğinde aktif_konum_list içerisindeki elemanları silmen gerekiyor. Onu da kendi programında uygularsın
Oyunun dogasi geregi bardaklarin yerlerini rastgele degil, birbirleriyle degistirmek istedigini, ve bunu bardaklarin zaman icinde hareket ettigi bir animasyonla yapmak istedigini varsayiyorum.
- rastgele 2 farkli bardak sec
- her biri icin:
- src = kendi pozisyon, dst = digerinin pozisyonu
- t=0’da src, t=1’de dst olacak bir ease fonksiyonu tanimla, f(t) = src*(1-t) + dst*t gibi
- t = 0
- her frame’de:
- t’yi biraz arttir
- bardagin ease fonksiyonu varsa calistir ve pozisyonunu update et
- t = 1 ise ease fonksiyonlarini sil
Pygame’de nasıl yapılır bilmiyorum ama aşağıdaki uygulama belki fikir verebilir.
Yan tarafta gördüğünüz bira bardağı resmini kullanabilirsiniz.
Üç adet bardak arasından bir tane bardak seçimi yapabileceğimiz bir tane entry widgeti tanımlandı. Bu widgete 1, 2, 3
sayılarından herhangi birini yazıyoruz. Daha sonra Çalıştır
tuşuna bir kez basıyoruz. 5 saniye boyunca (ön-tanımlı zaman 5 saniye) sürekli rastgele 2 tane bardak seçiliyor ve bu bardakların yerleri değiştiriliyor. Belirlenen saniye sonunda bir tane bardağın üstüne fare ile geliyorsunuz ve bardağın üzerine tıklıyorsunuz. Eğer seçiminiz doğruysa "Doğru!"
, yanlışsa "Yanlış!"
şeklinde bildirimler alıyorsunuz.
Kodlar:
#!/usr/bin/python3
# -*- coding: utf-8 -*-
import tkinter as tk
from time import time
from PIL import ImageTk
from random import sample
from tkinter.messagebox import showinfo
def func(label, entry):
if label["text"] != entry.get():
showinfo(title="Bilgi", message="Yanlış!")
else:
showinfo(title="Bilgi", message="Doğru!")
def bind(label, entry):
label.bind(
sequence="<Button-1>",
func=lambda event: func(label, entry)
)
def create_labels(master, image, entry, n, x, y):
labels = []
for i in range(1, n + 1):
num = tk.Label(
master=master,
text=i
).place(x=x * i + 10, y=y - 20)
label = tk.Label(master=master, image=image, text=str(i))
label.place(x=x * i, y=y)
bind(label, entry)
labels.append(label)
return labels
def start(root, button, labels, zaman):
global t
button.configure(command=lambda: None)
if not t:
t = int(time())
selected = sample(population=labels, k=2)
x = lambda select: int(select.place_info()["x"])
x_first = x(selected[0])
x_second = x(selected[1])
def configure():
global t
if x(selected[0]) > x_second:
selected[0].place_configure(x=x(selected[0]) - 1, y=100)
selected[1].place_configure(x=x(selected[1]) + 1, y=100)
elif x(selected[1]) > x_first:
selected[0].place_configure(x=x(selected[0]) + 1, y=100)
selected[1].place_configure(x=x(selected[1]) - 1, y=100)
else:
if int(time()) - t < zaman:
start(root, button, labels, zaman)
return
else:
t = 0
button.configure(
command=lambda: start(
root=root,
button=button,
labels=labels,
zaman=zaman
)
)
return
root.after(1, configure)
configure()
def main():
global t
t = 0
root = tk.Tk()
root.geometry("230x230")
image = ImageTk.PhotoImage(file="beer.png")
root.image = image
select_label = tk.Label(master=root, text="Seç").pack()
select_entry = tk.Entry(master=root, width=5)
select_entry.pack()
labels = create_labels(
master=root,
entry=select_entry,
image=image,
n=3,
x=50,
y=100
)
start_button = tk.Button(master=root, text="Çalıştır")
start_button.configure(
command=lambda: start(
root=root,
button=start_button,
labels=labels,
zaman=5
)
)
start_button.pack()
root.mainloop()
if __name__ == "__main__":
main()
Soylede yapa bilirsiniz:bir dizi olusturun icinde 3 tane konum olsun:sol,sag,orta.random moduluyla 0 dan 2 ye kadar bir rakam secin ve ve bunu dizinin indexi seklinde bir degiskene atayin.daha sonra secilen konumu diziden otomatik silin.ve bu sefer 0 dan 1 e kadar bir rakam secin.bu islemi 3 kere tekrarlayin(3.ye cok gerek yok ama olsun).boylece elinizde 3 degiskene rastgele sekilde atanmis konum olucak.