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 tushirishO'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):
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!