December 10, 2025

Xotira o'yini (Memory Game / Memo) - Flet bilan

# Xotira o'yini (Memory Game / Memo) - Flet bilan
# Bu kod Flet kutubxonasi yordamida xotira o'yini yaratadi.
# O'yinchi kartalarni teskari qilib, juftlarini topishi kerak.
# Ishga tushirish: `pip install flet` so'ng `python memory_game.py`
# O'yin: Kartalarni juftlashtiring, vaqtni o'lchang!

import flet as ft  # Flet - veb va desktop ilovalar uchun Python UI kutubxonasi
import random     # Tasodifiy sonlar va aralashtirish uchun
import time       # Vaqtni o'lchash va kechikishlar uchun

def main(page: ft.Page):
    # Asosiy funksiya: Sahifani sozlash va o'yin logikasini boshqarish
    page.title = "Xotira o'yini - Flet"  # Sahifa sarlavhasi
    page.window_height = 710             # Oyna balandligi
    page.window_width = 910              # Oyna kengligi

    number_of_single_cards: int = 20     # Har bir juftdan nechta (umumiy 40 karta)

    global idx_of_cards                  # Kartalar ro'yxati global o'zgaruvchi
    list_of_pairs = []                   # Tanlangan kartalar juftligi
    find = []                            # Topilgan juftlar
    image_page = "https://picsum.photos/id/"  # Rasmlar uchun URL (tasodifiy rasmlar)

    def make_cards(number_of_single_cards):
        # Kartalarni yaratish: Har bir raqamdan ikkita nusxa (A va B)
        card_deck_with_duplicates = \
            [f"{i}_A" for i in range(number_of_single_cards)] + \
            [f"{i}_B" for i in range(number_of_single_cards)]
        random.shuffle(card_deck_with_duplicates)  # Aralashtirish
        return card_deck_with_duplicates

    idx_of_cards = make_cards(number_of_single_cards)  # Kartalarni yaratish va aralashtirish

    def start_game(e):
        # O'yinni boshlash funksiyasi
        start_button.disabled = True  # Tugmani o'chirish

        global start_time
        start_time = time.time()      # Vaqtni boshlash

        # Orqa tomonlarni qo'yish: Barcha kartalarni teskari qilish
        for i in range(len(idx_of_cards)):
            row_board.controls[i].content = None            # Rasmlarni yashirish
            row_board.controls[i].bgcolor = ft.colors.AMBER # Orqa rang
            row_board.controls[i].border_radius = \
                ft.border_radius.all(10)                    # Burchaklarni yumaloq qilish
            page.update()                                   # Sahifani yangilash

    def match_pairs(e):
        # Kartalarni juftlashtirish funksiyasi (klik bo'lganda ishlaydi)
        if len(list_of_pairs) == 2:  # Ikki karta tanlangan bo'lsa, qaytish
            return

        if start_button.disabled:    # O'yin boshlangan bo'lsa
            num = e.control.data     # Bosilgan karta indeksi

            idx = idx_of_cards[num].split('_')[0]  # Kartaning raqami (masalan, 5)
            index_a = idx_of_cards.index(str(idx)+'_A')  # A nusxasi indeksi
            index_b = idx_of_cards.index(str(idx)+'_B')  # B nusxasi indeksi
            index_of_image_ = idx_of_cards[num].split("_")[0]  # Rasm indeksi

            if len(list_of_pairs) < 2:
                # Kartani ochish: Rasmini ko'rsatish
                row_board.controls[num].content = ft.Image(src=f"{image_page+'1'+index_of_image_}/100",
                                                           border_radius=ft.border_radius.all(10))
                if idx_of_cards[num] not in list_of_pairs:
                    list_of_pairs.append(idx_of_cards[num])  # Tanlanganlarga qo'shish

            page.update()  # Sahifani yangilash

            if len(list_of_pairs) == 2:
                # Ikki karta tanlangan: Juftligini tekshirish
                a = int(list_of_pairs[0].split('_')[0])
                b = int(list_of_pairs[1].split('_')[0])

                if a == b:
                    # Juft: Muvaffaqiyatli
                    time.sleep(.4)  # Qisqa pauza

                    for index in (index_a, index_b):
                        row_board.controls[index].disabled = True  # Kartalarni o'chirish
                        row_board.controls[index].content = None   # Rasmlarni olib tashlash
                        row_board.controls[index].bgcolor = ft.colors.BLACK  # Qora rang

                    find.append(index_a)  # Topilganlarga qo'shish

                    if len(find) == number_of_single_cards:
                        # O'yin tugadi: Barcha juftlar topildi
                        stop_time = time.time()
                        start_button.text = "Vaqt: \n{} soniya".format(
                            str(round(stop_time - start_time, 0)))  # Vaqtni ko'rsatish
                        page.update()

                    page.update()
                    list_of_pairs.clear()  # Tanlanganlarni tozalash
                else:
                    # Juft emas: Qayta teskari qilish
                    time.sleep(1)  # Pauza
                    flip_a = idx_of_cards.index(list_of_pairs[0])
                    flip_b = idx_of_cards.index(list_of_pairs[1])

                    for index in (flip_a, flip_b):
                        row_board.controls[index].content = None
                        row_board.controls[index].bgcolor = ft.colors.AMBER

                    list_of_pairs.clear()
                    page.update()

            page.update()

    def board(idx_of_cards):
        # O'yin taxtasini yaratish: Kartalarni konteynerlar sifatida
        card_images = []

        for num in range(len(idx_of_cards)):
            index_of_image = idx_of_cards[num].split("_")[0]

            card_images.append(
                ft.Container(
                    width=100,                  # Karta kengligi
                    height=100,                 # Karta balandligi
                    bgcolor=ft.colors.AMBER,    # Boshlang'ich rang
                    border_radius=ft.border_radius.all(10),  # Burchaklar
                    data=num,                   # Indeks saqlash
                    on_click=match_pairs        # Klik hodisasi
                )
            )
        return card_images

    row_board = ft.Row(wrap=True, controls=board(idx_of_cards), spacing=10)  # Kartalarni satrga joylash
    start_button = ft.ElevatedButton(text="O'yinni boshlash", width=200, height=50, on_click=start_game)  # Boshlash tugmasi
    
    page.add(
        ft.Column([
            ft.Text("Xotira o'yini: Kartalarni juftlashtiring!", size=24, weight=ft.FontWeight.BOLD),  # Sarlavha
            row_board,  # O'yin taxtasi
            start_button  # Tugma
        ], horizontal_alignment=ft.CrossAxisAlignment.CENTER)  # Markazga joylash
    )

ft.app(target=main)  # Ilovani ishga tushirish

O'yin kodini ishga tushirganingizda, u quyidagi kabi ko'rinadi: Boshida kartalar teskari (orqa tomoni ko'rinadi), siz kartalarni bosib ochasiz va juftlarini topasiz. Bu yerda umumiy xotira o'yini misollari (Flet versiyasi o'xshash):

wordwall.net

memory-games.en.softonic.com

memozor.com

mindgames.com

Kodda rasmlar tasodifiy (picsum.photos dan), shuning uchun sizda turli rasmlar chiqishi mumkin, lekin mexanizm bir xil. Agar o'zingiz ishga tushirib ko'rmoqchi bo'lsangiz, python memory_game.py buyruq bilan bajaring!