باران ایموجی در ترمینال با پایتون | ۳ روش جذاب و خلاقانه
✨ هنر ایموجی بازی در ترمینال پایتون
تا حالا شده توی ترمینال سیاه و خشک ویندوز یا لینوکس یه کاری کنی که دوستات بگن "وااای، این چطور کار میکنه؟" توی این مقاله قراره سه تا اسکریپت باحال پایتون رو با هم بسازیم که توی ترمینال ایموجیهای تصادفی رو به شکلهای مختلف نمایش میدن. از یه خط ساده شروع میکنیم و به یه شبیهساز واقعی سقوط میرسیم.
۱. خطوط تصادفی ایموجی (سطح مبتدی)
سادهترین کار ممکن: توی یه حلقه بینهایت، ۲۰ تا ایموجی تصادفی رو کنار هم بذاریم و چاپ کنیم. نتیجه یه افکت شلوغ و پرسرعته که مدام خطوط جدید از ایموجیهای مختلف میسازه.
🎨 کد
import random
import time
import sys
emojis = ["😀", "😂", "🤣", "😍", "😎", "🥳", "😇", "🤖", "👻", "💀", "🎉", "❤️", "🔥", "⭐", "🌈"]
print("🎲 خطوط تصادفی ایموجی (Ctrl+C برای توقف)")
print("-" * 50)
try:
while True:
row = ''.join(random.choice(emojis) for _ in range(20))
print(row)
time.sleep(0.1)
except KeyboardInterrupt:
print("\n✨ تموم شد!")
sys.exit(0)
🧠 این کد چطور کار میکنه؟
while True: یه حلقه بینهایت میسازه که تا ابد ادامه داره، مگر اینکه کاربر با Ctrl+C متوقفش کنه.random.choice(emojis): از لیستemojisیه ایموجی تصادفی انتخاب میکنه.- List Comprehension: توی یه خط، ۲۰ بار
random.choiceرو صدا میزنه و نتیجه رو به صورت یه رشته درمیاره. همون''.join(...)این کار رو میکنه. time.sleep(0.1): بین هر خط ۰.۱ ثانیه مکث میکنه تا خروجی قابل دیدن باشه.try/except KeyboardInterrupt: اگه کاربر Ctrl+C رو بزنه، به جای ارور، یه پیام خداحافظی نشون میده و تمیز خارج میشه.
۲. باران عمودی ایموجی (سطح متوسط)
حالا میخوایم واقعاً حس "بارش" رو ایجاد کنیم. توی این نسخه، ۱۰ تا ایموجی توی موقعیتهای افقی تصادفی قرار میگیرن و هر بار که صفحه پاک و دوباره رسم میشه، انگار دارن از بالا به پایین حرکت میکنن.
🎨 کد
import random
import time
import os
emojis = ["😀", "😂", "🤣", "😍", "😎", "🥳", "💀", "🎉", "❤️", "🔥"]
WIDTH = 30
HEIGHT = 15
# موقعیت افقی ۱۰ قطره
drops = [random.randint(0, WIDTH - 1) for _ in range(10)]
print("🌧️ باران ایموجی (Ctrl+C برای توقف)")
time.sleep(1)
try:
while True:
os.system('cls' if os.name == 'nt' else 'clear')
for _ in range(HEIGHT):
line = [' '] * WIDTH
for x in drops:
line[x] = random.choice(emojis)
print(''.join(line))
drops = [(x + random.choice([-1, 0, 1])) % WIDTH for x in drops]
time.sleep(0.2)
except KeyboardInterrupt:
print("\n✨ باران تموم شد!")
🧠 چطور کار میکنه؟
os.system('cls'/'clear'): صفحه ترمینال رو پاک میکنه تا افکت حرکت ایجاد بشه.- لیست
drops: موقعیت افقی ۱۰ قطره رو نگه میداره. هر قطره یه عدد بین ۰ تا ۲۹ هست. - حلقه داخلی: ۱۵ خط چاپ میکنه. توی هر خط، برای هر قطره یه ایموجی تصادفی توی ستون مربوطه میذاره.
- جابجایی قطرهها: هر قطره با احتمال ۱/۳ به چپ یا راست حرکت میکنه تا طبیعیتر به نظر بیاد.
۳. شبیهساز سقوط با ماتریس (سطح پیشرفته)
این یکی دیگه یه قدم جلوتر میره. یه ماتریس دوبعدی (Grid) میسازیم که توش ایموجیها واقعاً از بالا به پایین سقوط میکنن. هر فریم، ردیفها یکی به سمت پایین شیفت میشن و ایموجیهای جدید توی ردیف بالا تولید میشن. این دقیقاً همون تکنیکیه که توی ساخت بازیهای ساده استفاده میشه.
🎨 کد
import random
import time
import os
WIDTH, HEIGHT = 30, 15
emojis = ["😀", "😂", "🤣", "😍", "😎", "🥳", "💀", "🎉", "❤️", "🔥"]
# ماتریس خالی
grid = [[" " for _ in range(WIDTH)] for _ in range(HEIGHT)]
print("🕹️ شبیهساز سقوط (Ctrl+C برای توقف)")
time.sleep(1)
try:
while True:
os.system('cls' if os.name == 'nt' else 'clear')
# ایموجیهای جدید در ردیف بالا
for col in range(WIDTH):
if random.random() < 0.3:
grid[0][col] = random.choice(emojis)
# چاپ کل ماتریس
for row in range(HEIGHT):
print(''.join(grid[row]))
# شیفت همه ردیفها به پایین
for row in range(HEIGHT - 1, 0, -1):
for col in range(WIDTH):
grid[row][col] = grid[row - 1][col]
# پاک کردن ردیف بالا
for col in range(WIDTH):
grid[0][col] = " "
time.sleep(0.15)
except KeyboardInterrupt:
print("\n✨ سقوط تموم شد!")
🧠 این یکی چطور کار میکنه؟
- ماتریس
grid: یه آرایه دوبعدی ۱۵×۳۰ که هر سلولش یا فضای خالیه (" ") یا یه ایموجی. - تولید ایموجی جدید: توی هر فریم، برای هر ستون ۳۰٪ احتمال داره که یه ایموجی تصادفی توی ردیف بالا (
grid[0][col]) قرار بگیره. - چاپ ماتریس: همه ۱۵ ردیف رو پشت سر هم چاپ میکنیم.
- شیفت به پایین: از پایینترین ردیف شروع میکنیم و هر سلول رو با سلول بالاییش جایگزین میکنیم. اینجوری انگار همه چی یه ردیف پایین میره.
- پاک کردن ردیف بالا: بعد از شیفت، ردیف بالا رو خالی میکنیم تا برای فریم بعد آماده باشه.
🛠 مرجع کدهای یونیکد ایموجیها
اگه نمیخواید از خود ایموجی توی کد استفاده کنید، میتونید از کدهای یونیکد (Unicode) استفاده کنید. کدهای ۸ رقمی با \U نوشته میشن (مخصوص ایموجیها) و کدهای ۴ رقمی با \u.
# ایموجیهای پرکاربرد (۸ رقمی)
print("\U0001F600") # 😀
print("\U0001F602") # 😂
print("\U0001F923") # 🤣
print("\U0001F60D") # 😍
print("\U0001F60E") # 😎
print("\U0001F973") # 🥳
print("\U0001F607") # 😇
print("\U0001F916") # 🤖
print("\U0001F47B") # 👻
print("\U0001F480") # 💀
print("\U0001F389") # 🎉
print("\U0001F525") # 🔥
print("\U0001F308") # 🌈
# کاراکترهای ۴ رقمی
print("\u2764\uFE0F") # ❤️
print("\u2B50\uFE0F") # ⭐
\U برای کدهای ۸ رقمی (اکثر ایموجیها) و \u برای کدهای ۴ رقمی استفاده میشه. بعضی کاراکترهای قدیمی (مثل قلب ❤️) برای نمایش درست نیاز به \uFE0F دارن.📊 جدول مقایسه روشها
| روش | پیچیدگی | جلوه بصری | مفهوم آموزشی | مناسب برای |
| خطوط تصادفی | ⭐ ساده | شلوغ و سریع | حلقه بینهایت، random، List Comprehension | شروع یادگیری |
| باران عمودی | ⭐⭐ متوسط | حرکت عمودی | پاک کردن صفحه، مدیریت موقعیت | بات ها و افکت های ساده |
| شبیهساز سقوط | ⭐⭐⭐ پیشرفته | طبیعی تر | ماتریس دوبعدی، شیفت ردیفها | مبانی بازیسازی |
🔧 کاربردهای واقعی این تکنیکها
شاید فکر کنی اینا فقط سرگرمی هستن، ولی تکنیکهایی که اینجا یاد گرفتی توی پروژههای واقعی هم کاربرد دارن:
- باتهای تلگرام: میتونی برای جذابتر کردن پیامها از ایموجیهای تصادفی استفاده کنی. مثلاً هر بار که کاربر
/startمیزنه، یه ایموجی خوشآمدگویی تصادفی نشون بده. - سیستمهای مانیتورینگ: توی داشبوردهای CLI، از ایموجی برای نمایش وضعیت استفاده کن: ✅ برای موفقیت، ❌ برای خطا، ⚠️ برای هشدار.
- تست نرمافزار: با
randomمیتونی دادههای تست تصادفی تولید کنی. - بازیسازی: ماتریس دوبعدی، حلقههای تو در تو، و آپدیت فریمها پایه و اساس ساخت بازیهای ساده با پایتون هستن.
🎓 جمعبندی
توی این مقاله سه تا روش برای نمایش ایموجیهای تصادفی توی ترمینال پایتون یاد گرفتی. از یه خط ساده با random.choice شروع کردیم، به باران عمودی با پاک کردن صفحه رسیدیم، و در نهایت یه شبیهساز سقوط با ماتریس دوبعدی ساختیم.
این کدها شاید در ظاهر فقط سرگرمی باشن، ولی مفاهیمی مثل حلقههای بینهایت، تولید داده تصادفی، List Comprehension، مدیریت خطا، و کار با ماتریسها توشون نهفته شده. هر سه تا کد رو توی ترمینال خودت اجرا کن و ببین کدوم رو بیشتر دوست داری.
گفتگو درباره این پست
برای ثبت پیام ابتدا وارد حساب خود شوید.
هنوز پیامی ثبت نشده است.