3 bardağın yerini değiştirme

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

Merhaba.

Python’da rastgele işlemler için random modülü var.

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
1 Beğeni

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

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