بازی یادگیری پایتون با رابط وب فارسی و حالت آرکید. کاربر با چالشهای تعاملی پایتون یاد میگیره، ایکسپی کسب میکنه، لِوِل بالا میره، و از مکانیکهای بازی مثل استریک روزانه، ماموریت، انرژی و فروشگاه لذت میبره.
- HTML + CSS + JavaScript (Vanilla)
- SPA Router (hash-based)
- View-based architecture
- localStorage با versioning برای ذخیره پیشرفت
- مهاجرت خودکار دادههای قدیمی
- GitHub Pages برای هاست رایگان
- GitHub Actions برای دیپلوی خودکار
python-game-lab/
├── index.html # صفحه اصلی (SPA entry)
├── css/
│ ├── tokens.css # توکنهای طراحی (رنگها، فاصلهها و...)
│ ├── base.css # استایلهای پایه/ریست
│ ├── arcade.css # تم آرکید و سیستمهای گیمیفیکیشن
│ ├── components.css # کامپوننتهای قابل استفاده مجدد
│ └── pages.css # استایلهای اختصاصی صفحات
├── js/
│ ├── app.js # ورودی اصلی SPA + روترا
│ ├── router.js # مسیریاب هشبیس
│ ├── state.js # مدیریت وضعیت سراسری (versioned)
│ ├── migration.js # مهاجرت دادههای قدیمی
│ ├── views/
│ │ ├── home.js # صفحه خانه/داشبورد
│ │ ├── map.js # نقشه فصلها
│ │ ├── lesson.js # صفحه آموزش
│ │ ├── exercises.js # صفحه تمرینها
│ │ ├── challenges.js # صفحه چالشها
│ │ ├── result.js # صفحه نتیجه/امتیاز
│ │ ├── profile.js # صفحه پروفایل
│ │ └── settings.js # صفحه تنظیمات
│ ├── systems/
│ │ ├── xp.js # سیستم XP و لِوِل
│ │ ├── streak.js # پیگیری استریک روزانه
│ │ ├── energy.js # سیستم انرژی
│ │ ├── quests.js # ماموریتهای روزانه
│ │ ├── shop.js # فروشگاه بازی
│ │ └── sound.js # صدا و افکتها (Web Audio API)
│ ├── utils.js # توابع کمکی
│ ├── glossary.js # واژهنامه پایتون (۳۷ کلمه)
│ └── search.js # جستجوی فصل
├── data/
│ ├── chapter_1.json # فصل ۱: متغیرها
│ ├── chapter_2.json # فصل ۲: عملگرها
│ ├── ... # (۲۳ فصل)
│ └── chapter_23.json # فصل ۲۳: تستنویسی
├── .github/
│ └── workflows/
│ └── deploy.yml # دیپلوی GitHub Pages
├── .nojekyll # غیرفعال کردن Jekyll
├── DESIGN.md # همین فایل
└── README.md
مسیریابی هشبیس با الگوهای زیر:
#/home— صفحه خانه#/map— نقشه فصلها#/lesson/:id— صفحه آموزش فصل#/exercises/:id— صفحه تمرین فصل#/challenges/:id— صفحه چالش فصل#/result/:id— صفحه نتیجه#/profile— پروفایل کاربر#/settings— تنظیمات
هر صفحه یک ماژول view مستقل (views/*.js) هست که:
init()— مقداردهی اولیهrender()— رندر کردن محتواdestroy()— پاکسازی event listenerها
وضعیت سراسری در localStorage با versioning ذخیره میشه. هنگام آپگرید، migration.js دادههای قدیمی رو به فرمت جدید مهاجرت میده.
- چالش درست = ۱۰۰ XP
- چالش اشتباه = ۱۰ XP (تخفیف)
- هر لِوِل = لِوِل قبلی × ۱۵۰ XP
- لِوِل ۱ = ۱۵۰ XP, لِوِل ۲ = ۳۰۰ XP, لِوِل ۳ = ۴۵۰ XP ...
- هر روز ورود = +۱ استریک
- جایزه: لِوِل استریک × ۵۰ XP
- ریست: اگه یه روز وارد نشی
- حداکثر: ۵ انرژی
- بازیابی: ۱ انرژی هر ۳۰ دقیقه
- هزینه: ۱ انرژی برای هر چالش
- ۳ ماموریت روزانه
- مثال: "۳ چالش حل کن", "یه فصل کامل کن"
- جایزه: ۲۰۰ XP
- ریست: هر روز ساعت ۰۰:۰۰
- آیتمهای قابل خرید با XP
- اسکین پروفایل
- تایمر بونوس
- انرژی اضافی
{
"version": 2,
"username": "عرفان",
"currentChapter": 3,
"completedChapters": [1, 2],
"chapters": {
"1": {
"completed": true,
"score": 850,
"challenges": {
"predict_1": { "solved": true, "bestScore": 100, "attempts": 1 },
"bug_hunter_1": { "solved": true, "bestScore": 100, "attempts": 1 },
"fill_gap_1": { "solved": false, "bestScore": 0, "attempts": 0 }
}
}
},
"totalXP": 1570,
"totalPlayTime": 3600,
"lastPlayed": "2026-08-05T10:30:00",
"gamification": {
"level": 5,
"xp": 750,
"streak": { "current": 7, "best": 12, "lastDate": "2026-08-05" },
"energy": { "current": 4, "max": 5, "lastRegen": "2026-08-05T10:30:00" },
"dailyQuests": {
"date": "2026-08-05",
"quests": [...],
"completed": 1
},
"shop": {
"inventory": ["neon_frame", "double_xp"],
"equipped": { "frame": "neon_frame" }
}
}
}- پسزمینه: #0f0f23 (سرمهای تیره)
- متن اصلی: #e0e0e0
- رنگ اصلی: #00d4aa (سبز فیروزهای)
- رنگ خطا: #ff6b6b (قرمز)
- رنگ موفقیت: #51cf66 (سبز)
- کارتها: #1a1a2e با shadow تیره
- رنگ اصلی آرکید: #ff6b9d (صورتی نئونی)
- رنگ ثانویه: #c084fc (بنفش نئونی)
- حاشیههای درخشان (glow effects)
- انیمیشنهای لِوِل آپ و XP
- صفحه خانه — داشبورد با آمار روزانه و میانبر
- نقشه فصل — نمایش گرافیکی فصلها با قفل/باز
- صفحه آموزش — محتوای آموزشی فصل
- صفحه تمرین — تمرینهای ساده
- صفحه چالش — چالشهای اصلی
- صفحه نتیجه — امتیاز + پیشرفت + جوایز XP
- صفحه پروفایل — آمار کاربر + دستاوردها + استریک
- صفحه تنظیمات — تم + صدا + اطلاعات
- جواب درست: confetti + صدای تبریک
- جواب غلط: shake animation
- لِوِل آپ: انیمیشن درخشش
- انتقال صفحه: fade in/out
- پیشرفت: نوار لود روان
- استریک: آتش انیمیشنی 🔥
کد نشون داده میشه، کاربر جواب رو تایپ میکنه
کد: x = 5; y = 3; print(x + y)
جواب: 8
کد با خطا نشون داده میشه، کاربر خط خطا رو مشخص میکنه
کد: num = 5
if num = 5:
print('پنج')
خطا: خط ۲ (باید == باشه نه =)
کد ناقصه، کاربر قسمت خالی رو پر میکنه
کد: ___ = 10
print(x)
جواب: x
سوال + ۴ گزینه
سوال: type(3.14) چیه؟
گزینهها: a) int b) float c) str d) bool
جواب: b) float
خطوط کد جابهجا شدن، کاربر مرتبشون میکنه (drag & drop)
lines: ["print(y)", "x = 5", "y = x * 2"]
مرتب: ["x = 5", "y = x * 2", "print(y)"]
۱. مقادیر تصادفی: هر بار عدد فرق کنه (x=5 یا x=7) ۲. ترتیب تصادفی: گزینهها هر بار جابهجا بشن ۳. سؤالات متنوع: چند نسخه از هر سؤال ۴. بدون جواب در JSON: جوابها در کد کمتر مشخص باشن
ولی واقعیت: هدف یادگیریه، نه امتحان. اوپنسورس = اعتماد.
- طراحی کامل
- index.html + style.css
- app.js + progress.js + challenges.js
- فصل ۱ تا ۵ با چالشها
- تست در مرورگر
- انیمیشنها و صداها
- حالت موبایل
- فصلهای ۶ تا ۱۰
- GitHub Pages deploy
- ریسپانسیو کامل
- فصلهای پیشرفته
- SPA Router (hash-based)
- View pattern (home, map, lesson, exercises, challenges, result, profile, settings)
- XP و لِوِل
- استریک روزانه
- سیستم انرژی
- ماموریتهای روزانه
- فروشگاه بازی
- پروفایل
- تنظیمات
- CSS مدولار (tokens, base, arcade, components, pages)
- مدیریت وضعیت با versioning
- مهاجرت دادههای قدیمی
- جدول امتیازات (leaderboard)
- چالشهای چندنفره
- دستاوردهای جدید
- ترجمه انگلیسی کامل
- PWA (قابل نصب روی موبایل)
- حالت آفلاین