دانشکده مهندسی کامپیوتر
دانشگاه صنعتی شریف
نیمسال دوم 05-04
استاد:
دکتر محمد امین فضلی
طراحان:
مهدی علی نژاد، عارف زارع زاده، پارسا ضمیری، امیرمهدی طهماسبی
علیرضا مهندسی، متین باقری، رهام قاسمی، محمدامین حقجو، یاسمن کاویانپور
حسین زاهدی ادیب، محمدپارسا آرانی، آرش شاه حسینی، امیرحسین مهبودی
پروژه درس برنامهنویسی پیشرفته نسخهای از بازی Plants vs. Zombies 2 خواهد بود.
در این بازی، بازیکن در یک دنیای خیالی و آخرالزمانی قرار دارد که توسط زامبیها تصاحب شده است. مأموریت اصلی حفاظت از آخرین خطوط دفاعی انسانها با استفاده از انواع گیاهان است. هر گیاه دارای تواناییهای منحصربهفرد و اثرات ویژهای است که بازیکن باید بر اساس نوع تهدید و شرایط مرحلهی بازی، استراتژی مناسبی را انتخاب کند.
پروژهی درس برنامهسازی پیشرفته، مکان خوبی برای آشنایی با کار بر روی پروژههای گسترده است و بزرگترین قدم برای یادگیری مهارت کار. هدف اصلی ما از طرح این پروژه یاد دادن کار تیمی و کار بر روی یک کدبیس بزرگ است، پس از حجم زیاد آن نترسید. در محیط کار و حتی بعضا محیطهای آکادمیک به طور مداوم با همچین پروژههایی سروکار دارید و توانایی کنترل کردن حجم زیاد برنامه مهارت مهمی است که در این درس یاد خواهید گرفت. کاری که ما سعی کردیم انجام بدیم، تفننی کردن پروژه است. دلیل انتخاب بازی به عنوان پروژه نیز همین است، زدن میزان زیادی کد عذابآور است ولی در توسعهی بازیها معمولا مواجهه با باگها جنبهی فانی دارند و دیدن دستآورد خود به صورت یک بازی گرافیکی برای اکثر افراد لذتبخش است. یک نکتهی مهم دیگر، استفاده از هوش مصنوعی است. سطح پروژه مشابه تمرینها ساده ولی طولانی است، که مستلزم کار مستمر و با دقت بالا است. هوش مصنوعی میتواند گاها با راهنمایی درست، کار خیلی افراد را سادهتر کند ولی نباید به صورت کورکورانه استفاده شود. به همین دلیل، استفادهی بیرویه از هوش مصنوعی در پروژه غیرمجاز است. تسلط بالا به کد از موارد مهم هنگام تحویل پروژه است، پس حواستان باشد که استفاده از هوش مصنوعی فقط در حد جستجو باشد. کلاسهای پروژه را خودتان مشخص کنید، منطقها را بنویسید تا یاد بگیرید در آینده هوش مصنوعی را هدایت کنید، نه اینکه فرمان را به دستش بدهید.
از آنجایی که هدف اصلی پروژه، یادگیری مهارتهایی مانند مدیریت پروژه با حجم زیاد، کار گروهی، و پیادهسازی یک محصول کامل است، نمرهدهی فقط وابسته به بخشهای پیادهسازی شده نیست، و ریز موارد نمرهدهی را در زیر توضیح میدهیم:
قوانین لینتر (Checkstyle و PMD)
هدف: بررسی و حفظ کیفیت کد Java و جلوگیری از خطاها و کد غیرضروری.
قواعد Checkstyle (نامگذاری و ساختار)
قواعد PMD (کیفیت و جلوگیری از بوی کد)
نکات رفع خطاها:
در این فاز، شما باید مخزن کد خود را در همگیت ایجاد کرده، و دیاگرامهای UML اولیه پروژه را آماده نمایید.
به دلیل در دسترس نبودن اینترنت بینالملل، در این ترم به جای سرویسهای خارجی گیت، از سامانهی همگیت استفاده میکنیم. همگیت یک سرویس مدیریت کد مشابه Github در داخل کشور است.
۱. همه افراد وارد آدرس زیر شوند و یک حساب کاربری بسازند.
https://hamgit.ir/users/sign_in
۲. یکی از اعضای گروه، مخزنی بسازد و باقی اعضا را هم در آن اضافه کند.
۱. ترمینال (یا Git Bash در ویندوز) را باز کنید.
۲. دستور زیر را وارد کنید:
ssh-keygen -t ed25519 -C "your_email@example.com"
به جای your_email@example.com ایمیلی را که در همگیت ثبت کردهاید بنویسید.
پس از اتمام، دو فایل کلید در سیستم شما ایجاد میشود (یکی خصوصی و یکی عمومی). فایل عمومی معمولا پسوند .pub دارد (برای مثال: id_ed25519.pub).
۳. فایل کلید عمومی (.pub) را با باز کنید و محتوای آن را به طور کامل کپی کنید و وارد حساب کاربری خود در همگیت شوید و از منوی کاربری، بخش SSH Keys را پیدا کنید و یک کلید جدید اضافه کنید. متن کپیشده را در آنجا قرار دهید و ذخیره کنید.
با اینکه بستر اصلی گیت در این ترم همگیت است، همزمان در گیتهاب نیز به روال سالهای قبل یک organization تشکیل دادیم تا کدهای خود را در مواقعی که میتوانسید آنجا نیز قرار دهید. این کار صرفا به دلیل ماندگار شدن کدها بر یک پلتفرم جهانی است. برای ثبت کدهای پروژه در گیتهاب، ابتدا وارد سازمان زیر شوید و مخزن گروه خود را در همان سازمان بسازید:
https://github.com/organizations/advanced-progamming-sut-2026
نام مخزن باید دقیقا با قالب زیر ساخته شود:
group-{id}
که در آن به جای {id} شماره گروه خود را قرار میدهید. اگر چند ریموت برای مخزن خود دارید، میتوانید هر کدام را جداگانه به مخزن محلی اضافه کنید و تغییرات را روی همه آنها push کنید. برای مثال:
git remote add origin <repo-url>
git remote add backup <other-repo-url>
git push origin main
git push backup main
در صورت نیاز میتوانید با دستور زیر ریموتهای ثبتشده را ببینید:
git remote -v
در این مرحله باید یک UML اولیه برای پروژه طراحی کنید که مبنای کار شما در فاز ۱ باشد. این UML باید مطابق نیازمندیها و توضیحات فاز ۱ تهیه شده و شامل تمام کلاسهای لازم برای پیادهسازی منطق پروژه، همراه با روابط و نوتاسیونهای استاندارد UML باشد. هرچند ممکن است در حین پیادهسازی فاز ۱ تغییراتی در طراحی ایجاد شود، اما نقطه شروع و پایهی معماری پروژه باید همین UML اولیه باشد. توصیه میشود برای رسم نمودار از ابزارهای دیجیتال، نرمافزارهای طراحی UML یا حتی قابلیتهای داخلی IntelliJ استفاده کنید و نسخه نهایی را در مخزن پروژه قرار دهید.
در پایان هر فاز، لازم است یک Git Tag روی آخرین commit همان فاز ثبت و به مخزن همگیت push شود.
برای مثال، در پایان فاز صفر از تگ phase-0 و در پایان فازهای بعدی بهترتیب از phase-2، phase-1 و ... استفاده کنید.
جزيیات بیشتر تحویل هر فاز، به شما اطلاع داده خواهد شد.
جریان کامل ورود و ثبتنام، اعتبارسنجیها، پیام خطاها و بازیابی حساب مشخص میشود. مراحل ساخت کاربر جدید و پروفایل اولیه (نام، تصویر، تنظیمات پایه) توضیح داده میشود. ارتباط این بخش با دسترسی به منوها و ذخیرهسازی وضعیت کاربر مستند میشود.
در داخل بازی، منوها برای دسترسی کاربر به بخشهای مختلف بازی مانند نقشه، تنظیمات، فضای کاربری و ... توسعه مییابند. دستورات زیر در همه منوها قابل استفاده هستند:
کاربر در هر منو که باشد، قادر خواهد بود به منوهای خاصی برود:
menu enter <menu_name>
menu show current
کاربر با خروج از منو، به شرح زیر به منوی دیگری باید هدایت شود:
logout که در ادامه توضیح داده میشود، باید اقدام شود.menu exit
در نظر داشته باشید که پیشرفت بازیکنان نباید با بسته و باز شدن برنامه از دست برود. پس در هنگام بستن برنامه باید تمام اطلاعات ذخیره شود.
در ادامه به توضیح انواع منوهایی که باید پیادهسازی شوند میپردازیم:
بازی از این منو شروع میشود. در این قسمت با توجه به اینکه کاربر قبلا حساب کاربری دارد یا نه، میتواند یکی از گزینههای زیر را انتخاب کند:
در این قسمت کاربر را وارد کردن اطلاعات زیر در همان منو (با قوانین اعتبارسنجی هر کدام)، یک حساب کاربری جدید برای خود میسازد:
register -u <username> -p <password> <password_confirm> -n <nickname> -e <email> -g <gender>
نام کاربری برای شناسایی حساب کاربری در سطح بازی است. نام کاربری تنها میتواند شامل حروف کوچک و بزرگ، اعداد و نماد - باشد.
در رمز عبور، تنها مجاز به استفاده از حروف کوچک و بزرگ، اعداد و نمادهای خاص هستید.
? > < , " ' ; : \ / | [ ] } { + = ( ) * & ^ % $ # !)الگوریتم SHA-256 (مخفف Secure Hash Algorithm 256-bit) یک تابع هش رمزنگاریشدهی یکطرفه است که هر ورودی دلخواه (مانند رمز عبور) را به خروجیای با طول ثابت ۲۵۶ بیت تبدیل میکند. این الگوریتم بهگونهای طراحی شده که بازیابی مقدار اولیه از خروجی تولیدشده عملاً غیرممکن باشد.
علت استفاده از رمزنگاری یکطرفه
رمزنگاری یکطرفه برای حفاظت از اطلاعات حساس (مانند رمز عبور) طراحی شده است تا حتی در صورت دسترسی غیرمجاز به فایلهای ذخیرهسازی، امکان بازیابی رمز اصلی وجود نداشته باشد. در این روش، رمز عبور کاربران هنگام ذخیرهسازی، هش میشود و هنگام ورود مجدد، تنها خروجی هششدهی رمز واردشده با مقدار ذخیرهشده مقایسه میگردد.
پیادهسازی رمزهای عبور با استفاده از الگوریتمهایی مانند SHA-256، امنیت سیستم را بهطور قابل توجهی افزایش داده و از افشای مستقیم اطلاعات کاربران جلوگیری میکند. انجام این پیادهسازی برای رمز عبور کاربران، بهعنوان یک بخش امتیازی در ارزیابی در نظر گرفته شده است.
ذخیرهسازی اطلاعات کاربران باید بهصورت فایل خارجی انجام شود تا در هنگام اجرای مجدد برنامه، اطلاعات قبلی بازیابی شده و در دسترس باشد. این فرآیند شامل موارد زیر است:
این نام به عنوان نام نمایشی (Display Name) باید استفاده شود.
ایمیل شما باید از قوانین اعتبارسنجی زیر پیروی کند، در غیر این صورت باید خطای مربوطه را به کاربر نمایش دهید:
@ باشد.@ باشد:
A-Z, a-z)، اعداد (0-9)، نقطه (.)، خط تیره (-)، و آندرلاین(_) باشد..) نباید دو بار پشت سر هم بیاید.@) باید:
.) باشد.com ، .org، .ir.) باید حداقل دو حرف باشد.A-Z، a-z)، اعداد (0-9)، خط تیره (-) باشد.? > < , " ' ; : \ / | [ ] } { + = ( ) * & ^ % $ # !
باشد.john..doe@example.com (دو نقطه پشت سر هم)user@domain (پسوند دامنه ندارد)user@domain.c (پسوند یک حرفی نامعتبر است)user@domain..com (نقطههای دوتایی در دامنه)user@.com (دامنه با نقطه شروع شده)شامل مرد یا زن میباشد.
پس از بررسی تمام خطاهای بالا، در صورت وجود هر گونه خطا هیچ عملیاتی نباید انجام شود و منتظر دستور بعد کاربر میمانیم. در صورتی که هیچگونه خطایی رخ نداد لیست سوالات امنیتی به کاربر نشان داده شده و کاربر میتواند یک پرسش امنیتی را به دلخواه انتخاب کند. توجه شود که لیست سوالات امنیتی توسط خود شما تعیین میشود و در بازی قرار داده میشود.
pick question -q <question_number> -a <answer> -c <answer_confirm>
در انتها کاربر با ایجاد حساب کاربری جدید، به منوی ورود هدایت میشود تا از آنجا بتواند با وارد کردن حساب کاربری خود، وارد منوی اصلی بازی شود.
در این قسمت، با زدن دکمه Login menu، کاربر بایستی به منوی ورود انتقال یابد.
در فاز ۱، کاربر با دستور ورود به منو میتواند به منوی ورود برود.
در این قسمت میتواند یکی از اقدامات زیر را انجام دهد:
در این حالت، کاربران میتوانند با وارد کردن نام کاربری و رمز عبور خود وارد منوی اصلی برنامه شوند.
Stay logged in قرار داده شود. این قابلیت زمانی استفاده میشود که کاربر اگر بازی را نیز ببندد و مجدد باز کند، همچنان در حال logged in که از پیش قرار داشت، بماند.login -u <username> -p <password> -stay-logged-in
کاربر میتواند در این بخش با وارد کردن نام کاربری خود و پاسخ دادن به پرسشهای امنیتی که در حساب کاربری ذخیره شده، یک کلمه عبور جدید برای خود انتخاب کند.
forget password -u <username> -e <email>
answer -a <answer>
در ادامه اگر جواب درست بود به صورت خودکار پیغام داده شود که رمز عبور جدید را وارد کنید و اگر پاسخ درست نبود هم به اول منو بازگردد. توجه کنید که در این بخش هم مانند منوی ثبتنام در صورت نیاز لازم است تا پیغام خطای مناسب نمایش داده شود.
بعد از انجام مراحل Authorization/Authentication و زمانی که کاربر توانست با یک حساب کاربری شناخته شود، وارد منوی اصلی میشویم.
این منوی ارتباط اصلی ما را دیگر منوهای بازی برقرار میکند. از این منو میتوان با انتخاب گزینه آنها به یکی از منوهای زیر رفت:
با اعمال این دستور، کاربر از حساب کاربری خود خارج و وارد منوی ثبتنام خواهد شد.
menu logout
همانطور که در عکس بالا هم مشخص است، کاربر با انتخاب یکی از این منوها به منوی مربوطه خواهد رفت.
در این منو، چند قسمت (Chapter) وجود دارد که هر زمان تمام مراحل آن Chapter تمام شد، مراحل Chapter بعد باز میشوند. با انتخاب هر Chapter وارد قسمت بازی میشوید و شروع به بازی کردن با آن مرحله از بازی خواهید شد.
menu enter chapter -c <chaptername>
در قسمت بالای صفحه هم، المانهای مختلفی وجود دارد.
menu enter باید بتوان به این منو رفت.)menu greenhouse
menu travel-log
menu leaderboard
menu coin-wallet
menu gem-wallet
هنگامی که هر Chapter یا مرحله را به سرانجام رساندید، Chapterها و مراحل جدید برای شما باز میشوند و میتوانید آنها را ادامه دهید ولی در غیر این صورت آنها هنوز باز (Unlock) نشدهاند.
نکته: همچنین بایستی گزینه جابجا شدن بین دنیاهای مختلف بازی هم در این منو قرار داده شود.
با دستورات زیر، میتوان به تعداد الماسها یا سکههای خود اضافه کرد.
menu cheat add <n> <coin/diamond>
در این منو، میتوان تنظیمات مربوط به بازی از جمله میزان سختی بازی و ... را تغییر داد. میزان سختی بازی (که مقدار
difficulty level
باید مقداری بین ۱ تا ۵ باشد. وقتی حساب کاربری جدید ساخته میشود، به صورت پیشفرض میزان سختی روی مقدار ۳ است). تغییر میزان سختی بازی، این موارد ضریب میگیرند:
برای افزایش از ضریب {dl}/3 و برای کاهش 3/{dl} استفاده خواهد بود. . در ادامه توضیحات، همواره فرض میشود میزان سختی ۳ است، مگر آنکه خلاف آن گفته شود.
menu settings change-difficulty -l <difficulty_level>
نکته: در فازهای بعدی، موارد دیگری به منوی تنظیمات اضافه خواهد شد.
این منو مربوط به اخبار بازی است. مانند زامبیها، گیاهان، minigameها، پیام از طرف سایر کاربران (داخل قسمت شبکه) و سایر موارد که در داخل بازی اتفاق میافتد، در این بخش قرار میگیرند. هرگاه پیام جدیدی برای کاربر قرار داده شود، باید دکمه News داخل منوی اصلی، باید یک علامت قرمز رنگی برای اطلاع کاربر قرار داده شود. در ادامه به توضیح بیشتر مواردی که باید در این بخش پیادهسازی کنید میپردازیم.
menu news show-unread
در این صورت بایستی این اخبار خوانده شده در نظر گرفته شوند و در دفعات بعدی اجرای این کد، این اخبار نشان داده نشوند.
menu news show-all
در این منو، کاربر بایستی بتواند تغییرات مربوط به حساب کاربری خود، شامل موارد زیر را تغییر دهد:
menu profile change-username -u <username>
menu profile change-nickname -u <nickname>
menu profile change-email -e <email>
menu profile change-password -p <new_password> -o <old_password>
با وارد کردن این دستور، باید اطلاعات کاربر شامل موارد زیر نمایش داده شود:
menu profile show-info
همانطور که در این عکسها هم مشاهده میکنید، منوی Collection برای نشان دادن گیاهان، زامبیهایی که کسب کردهاید، استفاده میشوند. در این قسمت، با کلیک کردن روی هر گیاه یا زامبی باید جزئیات آن مشاهده کنیم. هر زامبی را تا زمانی که داخل فضای بازی ندیده باشیم، داخل این قسمت وجود ندارند و قاب مربوط به آنها خالی هست.
در این فاز، باید جزئیات هر آیتم خواسته شده به صورت متنی چاپ شود.
menu collection show-plants
menu collection show-all-plants
menu collection show-zombies
menu collection show-all-zombies
menu collection show-plant -p <plant_name>
menu collection show-zombie -z <zombie_name>
با دستور زیر میتوان گیاهان را ارتقا داد. اگر برای ارتقای گیاه سکه یا seed packet کافی از آن گیاه نداریم، باید خطای مناسب نمایش داده شود.
menu collection upgrade-plant -p <plant_name>
نکته: در ادامه، بیشتر دربارهی ارتقای گیاهان توضیح داده میشود.
با دستور زیر میتوان یک گیاه جدید خرید. اگر برای خرید گیاه سکه کافی از آن گیاه نداریم، باید خطای مناسب نمایش داده شود. هزینهی خرید گیاه جدید 2 هزار سکه است.
menu collection purchase-plant -p <plant_name>
قبل از شروع بازی، باید یک تعداد از گیاهان را انتخاب کنید که در طول بازی میتوانید از آنها استفاده کنید. تعداد گیاهان قابل انتخاب داخل هر مرحله وابسته به خود آن مرحله است ولی در صورت عدم ذکر، ۸ جای خالی برای انتخب گیاهان در نظر گرفته میشود.
با دو دستور زیر، میتوان لیست تمام گیاهان و لیست گیاهانی که در این مرحله میتوان برداشت را مشاهده کرد:
show all plants
show available plants
add plant -t <type>
در صورت نبود گیاه، قفل بودن گیاه، یا از قبل انتخاب شدن گیاه، خطای مناسب چاپ شود.
remove plant -t <type>
در صورت وجود نداشتن گیاه یا انتخاب نشدن گیاه، خطای مناسب چاپ شود.
با زدن دستور زیر، میتوان با خرج کردن دو الماس، گیاهی را boost کرد. با بوست کردن گیاه، هرگاه آن گیاه را در این مرحله میکاریم، اثر غذای گیاه برای آن گیاه (در صورت وجود) بلافاصله فعال میشود. در ادامه در مورد غذای گیاه و اثر آن روی گیاهان بیشتر توضیح داده خواهد شد.
boost plant -t <type>
بعد از انتخاب گیاهان با دستور زیر وارد منوی بازی میشویم.
start game
با توجه به این مورد که در فاز نخست امکان پیادهسازی real-time بازی وجود ندارد، از مفهومی به نام tick استفاده خواهیم کرد. هر ۱۰ تیک معادل یک ثانیه درون بازی خواهد بود. به طور کلی در بازی کوچکترین واحد زمانی ما در بازی معادله 1tickخواهد بود. در هر قسمت از بازی میتوان با دستور زیر بازی را به جلو برد.
advance time -t <count> ticks
با جلو بردن زمان، تمامی مفهومهای داخل بازی معنا پیدا میکنند. هرگاه زمان جلو برود، زامبیها و گیاهان روند خود را طی میکنند و مفاهیمی از قیبل تولید خودکار خورشید هم انجام میشود.
برای تولید خورشید راههایی مختلفی وجود دارد.
این گیاهان به شیوههای مختلف خورشید تولید میکنند. توضیحات نحوهٔ تولید خروشید توسط این گیاهان، در قسمت مربوطه به گیاهان توضیح داده شده است. هرگاه گیاه یک خورشید تولید بکند پیام زیر در خروجی نمایش داده میشود و تا وقتی که خورشید گیاه برداشت نشود، گیاه نمیتواند فرایند تولید خورشید بعدی را شروع کند.
plant <plant-type> produced a sun at (<x>, <y>)
که plant-type اسم خورشیدزا و x,y مختصات خورشیدزا خواهد بود که منطقا اعدادی صحیح است.
برای برداشت خورشید از یک خورشیدزا نیاز است که از دستور زیر استفاده کنیم.
collect sun -l (<x>, <y>)
این خورشید به مدت زمان نامتناهی بر گیاه باقی میماند.
به طور خودکار، اگر محیط بازی توسط مورد دیگری (از قبیل فصل Dark Ages) منع نشود، هر x ثانیه یک خورشید از آسمان به زمین میفتد.
$$ x = \max(6 + 0.05t, 12) $$
که t معادل زمان گذشته شده از شروع بازی خواهد بود.
خورشیدهای سقوط کننده دو گونهاند:
خورشیدها از آسمان یک خانه را به صورت تصادفی انتخاب میکنند و ۵ ثانیه طول میکشد تا به زمین برسد. هنگام ظهور خورشید و برخورد به زمین به ترتیب پیامهای زیر نمایش داده میشود.
New <type> sun is dropping at position (<x>, <y>)
Sun reached the ground at position (<x>, <y>)
با دستور زیر میتوان میزان خورشیدی که بازیکن دارد را مشاهده کرد:
show sun amount
با استفاده از دستور زیر میتوان به میزان خورشید اضافه کرد.
cheat add -n <count> suns
زامبیها با توجه به مشخصات مختص به خودشان استراتژیهای مختلفی را برای حمله به گیاهان دارند. که سادهترین آنها حمله به جلوییترین گیاه در آن ردیف است. هنگامی که یک زامبی به یک گیاه حمله میکند، حرکت نمیکندتا آن گیاه از بین برود. هنگامی که گیاه از بین رفت متن زیر چاپ شود:
Plant <type> at (<x>, <y>) is destroyed.
هنگامی که گیاه نابود شود زامبی به مسیر خود ادامه میدهد.
در انتهای هر ردیف یک ماشین چمن زنی قرار داده شده است، برای بار اول که یک زامبی به آن میرسد فعال میشود و تمامی زامبیهای داخل آن ردیف را میکشد (مگر آن که آن زامبی از زامبیهای رئیس باشد). ماشین چمنزنی در هر ردیف یکبار مصرف است و دفعه دوم که یک زامبی به آن نقطه برسد میبازد. پیامی که در اثر رسیدن زامبی در مراتب اولیه و ثانویه به انتهای مسیر نمایش داده میشود:
The lawn mower in the row <r>is triggered and killed these zombies:
و در صورت دفعه دوم بودن:
The zombie ate your brain; LOSER!!!
و در حالت دوم بازی تمام میشود و به صفحهای که مرحله از آن انتخاب شد به عنوان یک بازنده باز میگردیم.
هر مرحله تعدادی موج حمله دارد. در هر موج، زامبیهایی که ظاهر میشوند باید تابع سختی هر موج باشند. سختی هر موج به گونهای خواهد بود که ۲۵ درصد سختتر از موج قبلی خواهد بود و موج آخر که موج flag نام دارد یک ابرموج است که دو برابر سختی مرحله قبلی را خواهد داشت. قابل توجه است اگر در هر مرحله صراحتا فرمول دیگری ذکر شده است باید آن فرمول اعمال شود. تعداد امواج یک مرحله نیز به مرحله بستگی دارد.
زامبیها همواره در راستای افقی به سمت چپ حرکت میکنند. مگر به دلایلی این مسیر عوض شود که در حالات مختلف در این پروژه بررسی میشود.
هر موج که شروع میشود متن زیر نمایش داده شود:
Wave <n> started.
یا اگر موج آخر باشد:
The final wave has come.
برای موج حمله باید به تعداد کافی زامبی تصادفی ظاهر شود به طوری که مجموع waveCost این زامبیها برابر سختی آن موج شود. و هر زامبی به صورت تصادفی باد در یکی از خطوط قرار بگیرد. هر زامبی که ظاهر میشود متن زیر چاپ میشود.
Zombie <type> spawned at wave <n> in lane <m> which costed <waveCost>.
همچنین، هر موج باید هنگامی شروع شود که ۷۵ درصد سلامتی زامبیهای موج قبلی از بین رفته باشد.
هرگاه سلامتی یک زامبی صفر شود از بین میرود و پیام زیر چاپ میشود.
Zombie of type <type> is dead at (<x>, y>)
release the nuke
کل زامبیهای داخل نقشه را میکشد.
اگر در تمامی موجها کاربر جان سالم به در ببرد و تمامی زامبیها بمیرند، بازیکن میبرد، متن زیر نمایش داده میشود و به عنوان برنده به صفحه اصلی برمیگردد.
Dear humanz, zis is not done yet; we will come back to eat your brainz, humanz.
بازی اصلی در پنج ردیف و ۹ ستون شکل میگیرد، مگر اینکه در تنظیمات مرحله طور دیگری گفته شده باشد. هر کدام از این خانهها میتواند انواع مختلفی داشته باشد (در ادامه توضیحات داک، دربارهی این فصلها بیشتر توضیح داده خواهد شد).
سنگ قبر به مقدار ۷۰۰، سلامتی دارد و وقتی که تیر میخورد آسیب میبیند و هنگامی که سلامتی آن صفر میشود به زمین معمولی تبدیل میشود. سنگ قبر غیرقابل کاشت است.
با دستور زیر میتوانید یک گیاه را از گیاهانی که در منوی انتخاب گیاه انتخاب کردهاید در مکان مربوطه بکارید. فقط درحالتی میتوان دو گیاه را بر روی هم کاشت که گیاه زیری یا رویی این قابلیت را داشته باشد. سایر خطاها نیز با توجه به خواستههای پروژه مورد انتظار است. همچنین کاشتن گیاه نیاز به مقداری خورشید دارد و این مقدار خورشید باید از حساب شخص کم بشود.
plant plant -t <type> -l (<x>, <y>)
قابل توجه است که هرگاه یک گیاه را میکارید باید صبر کنید تا دوباره از آن گیاه در دسترس شود و دوباره میتوانید آن را بکارید. یعنی در دو زمان خیلی نزدیک به هم نمیتوانید از یک نوع گیاه دوبار بکارید. در این مورد در بخش گیاهان بیشتر توضیح داده شده است.
cheat remove-cooldown
با این دستور تمام محدودیت cooldown ها حذف میشود.
به دستور زیر میتوانید گیاهی که در یک خانه قرار دارد بکنید. خطاهای مربوطه مورد توقع است.
pluck plant -l (<x>, <y>)
هر زامبی که ظاهر میشود به احتمال ۵ درصد درخشان است. اگر یک زامبی درخشان باشد موقع مرگش یه غذای گیاه به بازیکن میدهد. بازیکن به طور همزمان میتواند حداکثر ۳ غذای گیاه ذخیره کند. هرگاه یک زامبی که درخشان میمیرد متن زیر چاپ میشود.
The glowing zombie dropeed a plant food; you have <n> plant foods now.
میتوان با دستور زیر از یک غذای گیاه استفاده کرد. در بخش گیاهان در مورد اثر غذای گیاه روی هر گیاه توضیح داده شده است.
feed plant -l (<x>, <y>)
cheat add-plant-food
که یک غذای گیاه میدهد.
با دستور زیر شرایط کنونی بازی به صورت ترمینالی چاپ میشود. در هر خانه باید مشخص شود که آیا زامبی وجود دارد، گیاه وجود دارد و به طور کلی شرایط فعلی نشان داده شود. همچنین شکل زمینهای متفاوت (آب، قبر، کلاسیک یخزده) باید متمایز باشد. در ابتدای خروجی نیز باید ذکر شود که موج چندم هستیم، چند غذا داریم، چند خورشید داریم و ... همچنین باید مشخص شود که آیا در هر ردیف ماشین چمنزنی تا به حال استفاده شده است یا خیر. توجه کنید که چون حرکت زامبیها به صورت پیوسته است، مختصات زامبیها در راستای افقی میتواند عددی اعشاری باشد، اما مختصات گیاهان همواره عددی صحیح است.
show map
با دستور زیر میتوان وضعیت آن که برای کشت هرگیاه چه قدر خورشید لازم است و آیا قابل کاشت هست، و اگر نیست تا چند ثانیه دیگر قابل کشت میشود باید نشان داده شود.
show plants status
با دستور زیر میتوان اطلاعات گیاهی(هایی) که بر روی یک خانه هستند و یا زامبیهای که آنجا هستند مشخص میشود (اطلاعاتی از قبیل خصوصیات ذاتی، سلامتی و ...)
show tile status -l (<x>, <y>)
هر زامبی هنگام کشته شدن، با احتمال ده درصد ممکن است ۱ الماس یا ۵۰ سکه یا یک گلدان (مربوط به گلخانه) بیندازد. در این صورت، باید پیام مناسب به صورت زیر چاپ شود:
A zombie dropeed a <coin/diamond/pot>; you have <n> <coins/diamonds/pots> now.
۱. تولیدکنندههای خورشید (Sun Producers):
وظیفه اصلی این گیاهان تولید خورشید است.
۲. شلیککنندههای مستقیم (Shooters):
بزرگترین دسته گیاهان که مستقیماً به سمت جلو تیر پرتاب میکنند. تیرهای آنها میتواند ویژگیهای متفاوتی داشته باشد: تیرهای آتشین (که دمیج دوبرابر دارند و یخها را آب میکنند)، تیرهای یخی (که سرعت زامبیها را کم میکنند) و تیرهای سمی (که زره زامبیها را نادیده گرفته و مستقیم به خود زامبی آسیب میزنند).
۳. پرتابکنندههای هوایی (Lobbers):
این گیاهان تیر خود را مثل منجنیق پرتاب میکنند تا مستقیماً روی سر زامبیها فرود بیاید. این تیرها موانع را نادیده میگیرند.
۴. گیاهان انفجاری (Explosives):
گیاهانی که یا به محض کاشته شدن منفجر میشوند، و یا (مانند مینها) با نزدیک شدن زامبی منفجر میشوند. این گیاهان به صورت مساحتی آسیب وارد میکنند.
۵. مبارزان تنبهتن (Melee Attackers):
این گیاهان تیراندازی نمیکنند و مستقیماً به زامبیهایی که به آنها نزدیک میشوند ضربات فیزیکی (مثل مشت زدن یا قورت دادن) وارد میکنند.
۶. گیاهان مدافع (Wall-nuts):
این گیاهان جان (HP) بسیار بالایی دارند و وظیفهشان مسدود کردن راه زامبیهاست.
۷. گیاهان پشتیبان (Modifier):
این گیاهان معمولاً حمله مستقیم یا آسیب فیزیکی ندارند، بلکه شرایط میدان نبرد را به نفع شما تغییر میدهند.
۸. گیاهان نفوذکننده (Strike-through):
پرتابهها یا ضربات این خانواده قابلیت نفوذ دارند و از میان زامبیها عبور میکنند تا همزمان به چندین هدف که پشت سر هم در یک خط قرار دارند آسیب برسانند.
۹. گیاهان ردیاب (Homing):
این گیاهان میتوانند زامبیها را در هر جای نقشه شناسایی کرده و بهصورت خودکار روی آنها قفل کنند.
۱۰. نعناعها (Mints):
این گیاهان به محض کاشته شدن، تاثیری مشابه با دادن «غذای گیاه» روی تمامی گیاهان همخانوادهی خود در سراسر باغچه میگذارند و پس از مدت کوتاهی از بین میروند.
غذای گیاه (Plant Food): در طول بازی، درصد کمی از زامبیها هالهای سبز رنگ دارند. با از بین بردن آنها، یک «غذای گیاه» داده میشود. بازیکن میتواند این غذا را به هر یک از گیاهان داخل باغچه بدهد تا برای مدت کوتاهی،قابلیت ویژه گیاه را فعال کند.
ارتقاء گیاهان (Upgrades): بازیکن با جمعآوری بستههای جایزه (Seed Packets)، میتواند گیاهان خود را ارتقا دهد (Level Up). این ارتقا باعث قویتر شدن دائمی گیاه میشود؛ به عنوان مثال دمیج آن افزایش مییابد، جان بیشتری پیدا میکند، یا هزینه کاشت آن کاهش مییابد. برای جمعآوری بسته جایزه، کارهای مختلفی میتوان انجام داد که در هر بخش توضیح داده شده است. همچنین تعداد سکه ها و seed packet هایی که از یک گیاه نیاز داریم تا آن را ارتقا دهیم، با هربار ارتقای گیاه افزایش مییابد.
۱. (Day) روز: گیاهانی که مخصوص مراحل روز هستند یا بهترین عملکردشان در این مراحل است.
۲. (night) شب: گیاهانی که ذاتا برای مراحل تاریک طراحی شدهاند.
۳. (Shroom) قارچ: گیاهانی که از خانواده قارچها هستند.
۴. (wramp-up) رشد تدریجی: گیاهانی که قدرت، اندازه یا میزان تولید آنها بلافاصله پس از کاشت در بالاترین حد نیست و با گذشت زمان در زمین قویتر میشوند (مثل Sun-shroom یا Kiwibeast).
۵. (Pea) نخود: خانواده نخودها. پرتابههای این گیاهان از قوانین فیزیکی نخودها پیروی میکنند و با گیاهانی مانند Torchwood (که تیرها را آتشین میکند) تعامل مستقیم دارند.
۶. (Ice) یخ: دارای ویژگیهای انجماد یا سرما. این گیاهان سرعت حرکت و حمله زامبیها را کاهش میدهند. (توجه: حملات آتشی میتوانند اثر کندیِ این تگ را خنثی کنند).
۷. (Fire) آتش: دارای مکانیزم حرارتی و آتشین. آسیب بیشتری وارد میکنند، میتوانند اثرات یخزدگی را خنثی کنند و در مراحل سرد، محیط اطرافشان را گرم نگه دارند.
۸. (stack) انباشتهپذیر: گیاهانی که مکانیک کاشت لایهای دارند. یعنی میتوان آنها را روی سر یکدیگر (مثل Pea Pod) یا روی سایر گیاهان (مثل پوشش Pumpkin) کاشت.
۹. (charge) نیازمند شارژ: گیاهانی که برای شلیک یا فعال شدن قابلیت اصلیشان، به یک زمان انتظار یا شارژ اولیه نیاز دارند (مثل پر کردن توپ Citron).
۱۰. (Magic) جادویی: گیاهانی با تواناییهای غیرفیزیکی که معمولاً قوانین عادی حمله را دور میزنند، مانند هیپنوتیزم کردن، تغییر شکل زامبیها، یا نادیده گرفتن موانع.
۱۱. (Poison) سمی: ایجادکننده آسیب مستمر (Damage over Time). این گیاهان زامبیها را مسموم کرده و معمولاً زرهها (مثل سطل یا مخروط) را نادیده میگیرند و مستقیماً از جان اصلی زامبی کم میکنند.
۱۲. (Water) آبی: گیاهانی که مکانیک اصلی آنها مرتبط با آب است؛ یا قابلیت کاشت مستقیم درون آب را دارند و یا برای محیطهای آبی ضروری هستند (مثل Tangle Kelp یا Lily Pad).
۱۳. (AoE) مساحتی: گیاهانی که آسیب یا اثر مهارتشان فقط به یک هدف برخورد نمیکند، بلکه منطقهای (مثلاً ۳x۳) یا گروهی از زامبیها را همزمان تحت تأثیر قرار میدهد.
۱۴. (Trap) تله: گیاهانی که بلافاصله حمله نمیکنند، بلکه روی زمین کاشته میشوند و با نزدیک شدن یا تماس مستقیم زامبیها فعال شده و واکنش نشان میدهند (مثل Potato Mine).
۱۵. (moveZombies) جابجاکننده: گیاهانی که مسیر حرکت زامبیها را دستکاری میکنند و آنها را مجبور میکنند به لاینهای (ردیفهای) مجاور بروند یا به سمت لاین خاصی کشیده شوند (مثل Garlic و Sweet Potato).
۱۶. (Sun) خورشید: تگی برای گیاهانی که با وجود اینکه دستهبندی اصلیشان «تولیدکننده» نیست، اما مکانیکهایی دارند که منجر به تولید یا رهاسازی خورشید میشود (مثل Sun Bean پس از خورده شدن).
۱۷. (Explosive) انفجاری: گیاهانی که ویژگی یا واکنش ثانویه آنها ایجاد یک انفجار مخرب است (مثل وقتی که Explode-o-nut پس از تمام شدن جانش منفجر میشود).
در جدول زیر لیست گیاهانی که از شما میخواهیم پیاده کنید آمده است. دقت کنید که ردیفهای آبی گیاهان امتیازی هستند. همچنین در ریپوی پروژه نیز این فایل موجود است. در آدرس
phase1/assets/Data/plants.csv
میتوانید در این جا مشخصات کل زامبیها را مشاهده کنید. جزئیات هرکدام در بخش زیر آمده است. زمابیهای دارای رنگ آبی، امتیازی هستند.
سادهترین نوع زامبی. با سرعت مشخصی راه میرود و در صورت رسیدن به گیاهان شروع به خوردنشان میکند. همچنین دارای انواع زرهپوش نیز میشود. در زامبیهای زرهپوش، ابتدا باید زره از بین برود و سپس میتوان به زامبی آسیب رساند. همچنین در صورت برخورد تیر سمی به این زامبیها، آسیب مستقیماً به زامبی وارد میشود.
همچنین دبه خالی نیز بدین شکل است:
زامبیهای این بخش، برخلاف بخشهای قبل، در صورت برخورد با تیرهای یخی، یخ نمیزنند.
همانطور که در بخشهای قبل گفته شد، در حین بازی، برای زامبیها یکسری دستور وجود دارد.
در حین بازی، با این دستور میتوان اطلاعات تمام زامبیهای روی زمین را دید. این اطلاعات شامل موقعیت زامبی، نوع زامبی و همچنین جان زامبی میباشد. در صورتی که زامبی زرهپوش باشد، زرههای پوشیدهشده و میزان مقاومت باقیمانده از آنها نیز نمایش داده میشود. در صورتی که زامبی دارای افکت باشد، افکتها به همراه زمان باقیمانده از آنها نمایش داده میشوند. همچنین برای
zombies info
نمونه خروجی:
King:
position: 9, 4
health: 400
armor:
effects:
chilled: 3.2s
Knight:
position: 7, 5
health: 300
armor:
crown: 800
shoulderArmor: 700
effects:
ConeHead:
position: 5, 5
health: 200
armor:
cone: 400
effects:
frozen: 2s
ConeHead:
position: 3, 3
health: 100
armor:
effects:
با این دستور، زامبی از نوع موردنظر در سطر y ام و ستون x ام ظاهر میشود
cheat spawn-zombie -t <zombie-type> -l <x, y>
بخش adventure شامل چهار فصل میباشد که هر فصل دارای ۴ مرحله است. مرحلهی اول هر فصل یک مرحلهی معمولی است که توضیحات آن در بخشهای قبل داده شده. دو مرحلهی بعدی فصل، مراحل ویژه هستند که در ادامه دربارهشان توضیح داده خواهد شد (توجه شود که ۸ نوع مرحلهی ویژه داریم، پس هر یک از مراحل ویژه باید یک بار در adventure دیده شوند). مرحله آخر هر فصل هم مرحلهی رئیس است که در فاز بعدی باید پیاده سازی کنید.
هر فصل ویژگیهای خاص خود را دارد. همچنین تعدادی از زامبیها فقط در فصلهای خاصی دیده میشوند که در بخش زامبیها در این مورد توضیح داده شده است. در بخش زیر، هر یک از چهار فصل و ویژگیهای آن توضیح داده شده اند:
این فصل نقش معرفی بازیکن به محیط بازی را دارد و فقط دارای دو ویژگی خاص است:
قبر: در ابتدای هر مرحله، تعدادی قبر وجود دارد که مانع تیرهای مستقیم گیاهان میشوند. دارای جان 700 هستند و باید نابود شوند تا تیرهای مستقیم گیاهان بتوانند از آن خانه رد شوند.
گردباد: زامبیها ممکن است به جای اینکه به صورت عادی وارد نقشه شوند، با گردباد وارد شوند از لحظه ورود، بین 1 تا 4 ستون، جلوتر از چیزی که در حالت عادی رخ میدهد وارد شوند (فقط در موج آخر).
در این فصل زامبیها با تیر یخی گیاهان یخ نمیزنند. همچنین موارد زیر در این فصل وجود دارند:
باد یخی: در هر موج از زامبی، ممکن است باد یخی به تعدادی از ردیف ها برخورد کند و کلیه گیاهان (به جز گیاهانی که تگ آتشین دارند) آن ردیفها، یکی به سطح یخزدگیشان اضافه میشود. در کل سه سطح یخ زدگی وجود دارد که دو سطح اول هیچ کاری نمیکنند، و در سطح سوم گیاه به طور کامل یخ میزند. گیاهان یخ زده تا زمانی که یخشان از بین نرود، هیچ کاری نمیکنند. یخ روی گیاهان 600 تا سلامتی دارد و باید با تیر گیاهان نابود شود، یا با تیری آتشین بلافاصله از بین برود. همچنین اگر در یکی از 8 خانه اطراف گیاه یخ زده، گیاه آتشینی باشد، با نرخ 60 سلامتی بر ثانیه یخ آسیب میبیند. توجه شود که زامبی شکارچی نیز مانند باد یخی، سطح یخ زدگی گیاهان را یکی بالا میرود و اثر هردو یکی است.
زمین یخی: در بعضی مراحل این فصل، تعداد زمین لیز روی نقشه وجود دارد که دارای جهت هستند. این جهت از پیش تعیین شده است و در وسط مرحله تغییر نمیکند. زامبیها با راه رفتن روی آن به ردیف بالایی یا پایینی (بسته به جهت زمین لیز) میروند. توجه شود که زامبی دودو سوار که از موانع پرواز میکرد، از زمین لیز نیز فرار میکند.
زامبی یخزده در ابتدای بعضی مراحل، تعدادی زامبی یخ زده وجود دارد که مانند گیاهان یخ زده هیچ کاری نمیکنند، و وقتی یخشان از بین برود به صورت عادی به حرکت خود ادامه میدهند.
موج آب: در مراحل این فصل، تعدادی از ستونهای سمت راست صفحه دریا است. برای کاشت گیاه روی آن، ابتدا باید یک lily pad روی آب قرار داد. البته تعدادی از گیاهان را میتوان به طور مستقیم روی آب کاشت که در بخش گیاهان ذکر شده است.
سطح آب در طول مرحله میتواند تغییر کند. برای مثال ممکن است در یک زمان فقط سه ستون سمت راست باشد، و در چند ثانیه بعد پنج ستون سمت راست را شامل شود. هرگاه که موجی از زامبی میآید، سطح آب نیز تغییر میکند. یک خط افقی در هر مرحله وجود دارد که مشخص میکند سطح آب فقط تا این ستون بالا میآید. اگر سطح آب بالا بیاید و گیاهی که در حالت عادی نمیتوان در آب کاشت روی آب قرار بگیرد، آن گیاه از بین میرود.
ساحلهای پست: تعدادی از خانههای زمین بازی، ممکن است ساحل پست باشند. در این صورت اگر آب روی آنها باشد، ممکن است زامبیهایی از زیر آن بیرون بیایند.
اصلیترین ویژگی این مراحل این است که شب است و از آسمان خورشید پایین نمیآید. پس تنها راه تولید خورشید، از گیاهان است.
قبر: در این فصل نیز قبر نیز وجود دارد. یک تفاوت اصلی با این قبرها با قبرهای مصر باستان این است که در ابتدای هر موج زامبی ممکن است تعدادی قبر به صورت تصادفی به وجود بیاید (مگر آنکه در آن خانه گیاهی کاشته شده باشد). همچنین بعضی از قبرهای قرون وسطی دارای 50 خورشید یا یک غذای گیاه هستند. هنگام تشکیل هر قبر باید به بازیکن اطلاع داده شود و هنگام چاپ کردن نقشه، نوع این قبرها نیز مشخص شود.
نکرومنسی: بعضی از خانههای نقشه، پتناسیل آن را دارند که در صورتی که قبر رویشان باشند، در ابتدای هر موج زامبی، یک زامبی از زیر آن قبر به وجود بیاورند.
به جز مراحل عادی بازی، بعضی مراحل ویژه نیز باید پیادهسازی شوند. این مراحل به صورت خاص بازیکن را محدود میکنند تا با انجام یک سری وظیفه مشخص، مرحله را به پایان برساند.
در این مرحله به جای قسمت انتخاب گیاه، بازیکن مستقیم وارد بازی میشود و نوار (تسمه نقالهای) را در گوشه صفحه مشاهده میکند. این نوار هر ۱۲ ثانیه یک گیاه را به صورت تصادفی (از بین گیاههای مخصوصی که بازیکن موفق به دریافت آن شده، بدون نیاز به انتخاب آنها) بالا میآورد. دقت شود که اولین گیاه در لحظه ورود بازیکن به مرحله تولید میشود.
در این نوع مرحله، تعدادی از اسلاتهای انتخاب گیاه از ابتدا قفل شدهاند یا بعضی گیاهان خاص به طور کلی در این مرحله در دسترس نیستند.
چندین گیاه خاص از قبل روی نقشه قرار دارند. هر زامبی که موفق شود یکی از آن گیاهان را بخورد، بازیکن بلافاصله مرحله را میبازد. به طور کلی یک خط قرمز یا علامت هشدار روی ردیف آن گیاه وجود دارد که بازیکن باید تمام تمرکز خود را روی دفاع از آن نقاط خاص بگذارید.
در این مرحله یک تایمر در بالای صفحه نمایش داده میشود. بازیکن باید تا پایان تایمر تعداد مشخصشدهای از زامبیها را از بین ببرد؛ مثلا ۱۲ زامبی در ۵ ثانیه. در نوع دیگر بازیکن باید در زمان معلوم شده، تعدادی مشخص خورشید تولید کند.
مشابه شب در PVZ کلاسیک، هیچ آفتابی از آسمان نمیبارد. بازیکن فقط با آفتاب تولیدشده توسط گیاهان (مثل گل آفتابگردان) میتواند زنده بماند.
در این مراحل، یک خط عمودی در جای مشخصی از نقشه بازی وجود دارد. بازیکن به محض عبور هر زامبی از این خط، بلافاصله بازی را میبازد.
اگر تعداد مشخصی از گیاهان، مثلا ۵ عدد، از بین بروند یا توسط زامبیها خورده شوند، بازیکن بازی را میبازد.
بازی با مقدار مشخصی آفتاب اولیه (مثلاً ۵۰۰ یا ۸۰۰) شروع میشود و دیگر هیچ آفتابی از آسمان نمیبارد. همچنین بازیکن امکان انتخاب گلهای آفتابگردان را ندارد. بازیکن فقط با همان آفتاب اولیه باید تمام زامبیهای مرحله را شکست دهد.
در ابتدای مرحله، زامبیای وارد باغ نمیشود و بازیکن میتواند بدون اینکه از زمان recharge گیاهان استفاده شود، هرچقدر که بخواهد گیاه بکارد، سپس میتواند با دستور
start zombie waves
کاری کند که زامبیها بیایند و بازی به روند عادی شروع شود. البته میتوانید مکانیزم شروع مرحله و باقی جزئیات را به انتخاب خودتان تغییر دهید، اما فرایند کلی باید به همین صورت باشد.
در گلخانه، 20 گلدان (در 4 ردیف و 5 ستون) داریم که میتوان در آن گل کاشت. گلدانهای ردیف 2 تا 4 در ابتدای بازی قفل هستند و با پرداخت سکه میتوان قفل هر گلدان را باز کرد. هر گلدان یک اسلات ثابت است که پس از دریافت، برای همیشه آزاد میشود. مختصات هر گلدان به صورت (<x>,<y>) با x از 1 تا 5 و y از 1 تا 4 در نظر گرفته میشود. در صورتی که به هر دلیلی نمیتوان در آنجا گیاه کاشت (قفل بودن گلدان، اشغال بودن خانه یا نداشتن گلدان آزاد)، خطای مربوطه چاپ شود.
برای مشاهده جدول گلخانه و وضعیت هر گلدان از دستور زیر استفاده میشود:
show greenhouse
در خروجی باید برای هر خانه مشخص شود که قفل است یا خالی است، و اگر گیاهی در حال رشد دارد، نوع گیاه و زمان باقیمانده تا رشد کامل نمایش داده شود. گلدانهای آماده برداشت باید با برچسب ready مشخص شوند.
در صورتی که گلدان آزاد باشد، با دستور زیر یک گیاه به صورت تصادفی کاشته میشود:
plant pot at (<x>, <y>)
هر بار کاشت، با احتمال 50 درصد یک گل معمولی (marigold) و با احتمال 50 درصد یکی از گیاهانی که بازیکن تا به حال آنلاک کرده است و قابلیت غذای گیاه دارد (به صورت تصادفی) میکارد.
وقتی گیاه گل معمولی است، پس از گذشت 2 ساعت به طور کامل رشد میکند، و اگر گیاه تصادفی باشد، بعد از گذشت 8 ساعت به طور کامل رشد میکند. زمان رشد در این فاز بر اساس ساعت سیستم محاسبه میشود.
وقتی گیاه به طور کامل رشد کرد، میتوان آن را برداشت کرد:
collect (<x>, <y>)
اگر گیاه برداشته شده گل معمولی باشد، 500 سکه به بازیکن میدهد. اگر گیاه برداشته شده از گیاهان آنلاکشده باشد، یک بوست ذخیرهای برای همان گیاه ایجاد میشود؛ در اولین دفعهای که بازیکن در مرحلهای از آن گیاه استفاده کند، آن گیاه boost میشود و این بوست مصرف میشود. برای هر گیاه همزمان فقط یک بوست ذخیره میشود؛ اگر بوست آن گیاه از قبل ذخیره شده باشد، برداشت جدید هیچ بوست اضافهای نمیدهد و تنها گلدان را خالی میکند. برداشت marigold همیشه 500 سکه میدهد.
بازیکن میتواند با خرج 1 الماس به ازای هر ساعت باقی مانده تا رشد کامل گیاه، آن را تسریع ببخشد تا بلافاصله به طور کامل رشد کند.
grow (<x>, <y>)
هزینه تسریع برابر با سقف ساعتهای باقیمانده است (مثلاً 2.5 ساعت = 3 الماس) و اگر گیاه آماده برداشت باشد، باید خطای مناسب نمایش داده شود.
فروشگاه از داخل گلخانه قابل دسترسی است:
enter shop
فروشگاه دو بخش دارد:
shop list
shop daily
در ادامه منظور از «بسته بذر» همان Seed Packet بازی اصلی است.
| آیتم | قیمت | واحد خرید | توضیح |
|---|---|---|---|
| گلدان (Pot) | 2000 سکه | 1 | باز کردن یک اسلات گلخانه (حداکثر 20 عدد) |
| غذای گیاه (Plant Food) در ابتدای مرحله بعد | 3 الماس | 1 | حداکثر تعداد ذخیره همزمان 3 عدد است |
| بسته بذر تصادفی | 1000 سکه | 5 بسته بذر | برای یک گیاه تصادفی از گیاهان آنلاکشده |
| بسته بذر انتخابی | 5 الماس | 10 بسته بذر | برای یک گیاه انتخابی از بین گیاهان آنلاکشده |
| تبدیل ارز | 5 الماس | 500 سکه | تبدیل الماس به سکه |
هر روز یک بسته بذر ویژه برای یک گیاه تصادفی (از بین گیاهان آنلاکشده) ارائه میشود. این بسته شامل 10 بسته بذر است که قیمت پایه آن 2000 سکه است و با 20٪ تخفیف، با قیمت 1600 سکه فروخته میشود. شناسه و تاریخ پیشنهاد روزانه باید ذخیره شود تا در هر روز فقط یکبار قابل خرید باشد.
shop buy -i <item_id> -n <count> [-t <plant_type>]
-t
اجباری است و تنها گیاهانی که قبلاً آنلاک شدهاند قابل انتخاب هستند.منابع اصلی درآمد سکه و الماس از مراحل، کوئستها، لیدربورد و گلخانه تأمین میشوند. فروشگاه نقش اصلی در مصرف سکه و الماس دارد و باید تعادل اقتصادی بازی را حفظ کند؛ بهویژه:
در این بخش مأموریتهای مختلف بازی برای درگیر شدن بیشتر کاربر با بازی و هدایت کاربر در روند بازی است. کوئستها به چهار دستهی کلی تقسیم میشوند که هر کدام شرط کامل شدن و پاداش مخصوص به خودشان را دارند که در جدول زیر قید شدهاند.
همانطور که در تصویر بالا میتواند دید، کوئستها در منوی travel log قرار دارند، و با توجه به دستهبندیشان، در یک صفحه متفاوت در travel log قرار میگیرند. برای تغییر در صفحه travel log از دستور زیر استفاده میشود:
travel log page <page_name>
همچنین صفحه مینیگیم در travel log وجود دارد که در آن مینیگیمهایی که در ادامه توضیح داده میشوند وجود دارند.
برای بالا بردن User Engagement، سیستم کوئستها بر اساس اولویتهای زیر نمایش داده میشوند:
پاداش ها در بازی به سه صورت زیر هستند:
بخش امتیازی
این بخش مانند مراحل معمولی در adventure است. با این تفاوت که آنچه اهمیت دارد، امتیازاتی است که در لحظه اتمام بازی، بازیکن به دست آورده است. نحوهٔ امتیازدهی بازی امتیازی با فرمول یا قواعد دقیق مشخص میشود. میوپوینت در این بازی همان امتیاز است.
برای این بخش شما باید 5 الگوی امتیازگیری تعریف کنید که با استراتژیهای مختلف بتوان میزان میوپوینت متفاوتی بدست آورد. چند مثال از این الگوها میتواند موارد زیر باشد:
این بازی در هر روز برای همهی کاربران با الگوریتم یکسانی زامبی تولید میکند. در فازهای آینده نیز بخشهای امتیازی سوار بر این بخش خواهیم داشت.
در جدول امتیازات، نام کاربری تمام بازیکنانی که ثبت نام کرده اند به همراه موارد زیر نمایش داده میشود:
کاربر باید بتواند با کلیک بر روی هر یک از این ستونها، بازیکنها را به صورت افزایشی و کاهشی مرتب کند.
توجه کنید که این جدول امتیازات مربوط به کل بازی است و صرفا به امتیازات بازی امتیازی محدود نیست.
صفحه جدول امتیازات و بازی امتیازی باید از منوی اصلی قابل دسترسی باشد.
مینیگیمها مراحل اضافهتر هستند که از طریق travel log قابل دسترسیاند. در travel log یک صفحه مانند تصویر زیر وجود دارد که در آنها مینیگیمها قرار میگیرند. از هر مینیگیم ۳ مرحله باید پیادهسازی شود که هر یک از قبلی سختتر است.
در این مینیگیم، هدف بازیکن این است که تمامی کوزههای چیدهشده روی حیاط خودش را بشکند و همزمان مراقب باشد که زامبیهایی که ممکن است درون کوزه بوده باشند، مغز او را نخورند.
در این مینیگیم، بازیکن گیاهان خودش را انتخاب نمیکند، همچنین خورشید از آسمان نمیافتد و تنها منبع تولید زامبیها و گیاهان از کوزههاست. هر کوزه میتواند یا خالی باشد، یا حاوی یک زامبی باشد و یا دارای یک Seed Packet یکبارمصرف برای یک گیاه باشد. لازم به ذکر است که Seed Packetهای انداختهشده روی زمین پس از مدتی ناپدید میشوند و بازیکن باید سریعتر برای کاشتن آنها اقدام نماید.
علاوه بر کوزه های عادی که صرفا دارای یک نماد علامت سوال هستند، دو نوع کوزه خاص هم داریم.
دستورات مربوط به این مینیگیم (مانند شکستن کوزه یا برداشتن seed packet افتاده از یک کوزه) را خودتان انتخاب کنید.
در این مینیگیم، بازیکن حق انتخاب گیاهان خودش را ندارد و گیاهان از طریق نوار (Conveyor Belt) به بازیکن داده میشود. این گیاهان گردوهایی هستند که پس از کاشته شدن مانند توپ بولینگ به سمت زامبیها میروند و به آنها برخورد میکنند (برخوردها باعث توقف گردوها نمیشود و صرفاً مسیرشان عوض میشود) و به زامبیها صدمه میزنند (میزان آسیب به اندازه میزان سلامتی زامبی عادی است). بازیکن باید به کمک این گردوها از پیشروی زامبیها جلوگیری کند.
در این مینیگیم خورشید از آسمان نمیافتد و دو نوع گیاه خاص به بازیکن داده میشود. یک خط قرمز رنگ بر روی حیاط کشیده شده و بازیکن از درب خانهاش تا این خط قرمز حق کاشتن گیاه دارد.
در این مینیگیم، تعدادی گیاه به صورت تصادفی در تعدادی از ستونهای سمت چپ صفحه کاشته شده است و جلوی آن گیاهان، یک خط قرمز وجود دارد. بازیکن باید در این مینیگیم، به جای گیاهان، طرف زامبیها باشد و باید با گذاشتن زامبیها، گیاهان را شکست دهد. در تصویر زیر میتوانید نمونهای از آن را مشاهده کنید (توجه کنید که این اسکرینشات از plants vs. zombies 1 گرفته شده است و برای این است که ایده حدودی از خواسته پروژه داشته باشید، برای همین ممکن است بعضی گیاهان یا زامبیهای این تصویر در پروژه وجود نداشته باشند)
بازیکن با خرج کردن خورشید (که در ابتدای مرحله ۱۵۰ تا از آن را دارد) زامبیها را در سمت راست خط قرمز میگذارد تا به گیاهان حمله کنند.
در این مراحل یک نوع زامبی خاص وجود دارد که به اندازه زامبی سطل دار سلامتی دارد و برای زامبیها خورشید تولید میکند. در ابتدا نرخ تولید خورشیدشان خیلی پایین است، ولی با گذر زمان، نرخ تولید خورشیدشان (با فرمول دلخواه خودتان) بیشتر میشود. در ابتدای مرحله در هر ردیف، یکی از این زامبیها وجود دارد، و بازیکن نمیتواند از این نوع زامبی در زمین بگذارد (پس اگر هرکدام از این زامبی کشته شود، دیگر بازیکن نمیتواند دوباره آن را بگذارد). تعامل گیاهان با زامبیها در این مینیگیم فرقی با بازی عادی ندارد. در انتهای هر ردیف از باغچه، یک مغز به جای lawn mower وجود دارد که زامبیها با رسیدن به آن مغز، آن را میتوانند بخورند. هرگاه تمام مغزهای هر 5 ردیف خورده شدند، بازیکن برنده میشود. اگر بازیکن خورشید کافی برای گذاشتن زامبی بیشتری نداشته باشد و تمام زامبیهای موجود در صفحه از بین رفته باشند، بازیکن میبازد.
در هر مرحله، 5 زامبی برای بازیکن وجود دارد که با آنها مرحله را بازی کند. انتخاب اینکه کدام زامبیها و با چه قیمتی برای بازیکن وجود داشته باشد به سلیقه خودتان است، ولی لازم است که مجموعا در تمام مراحل، 10 زامبی مختلف وجود داشته باشد. یعنی 5 زامبی موجود در هر مرحله نباید با 5 زامبی مرحلهای دیگر کاملا یکسان باشد.
بخش امتیازی
در این مینیگیم، از ابتدای بازی، در کل زمین به صورت رندوم، پنج نوع گیاه کاشته شده است و زامبیها مثل یک مرحله عادی وارد زمین میشوند، فقط با این تفاوت که هیچگاه موجهای زامبیها تمام نمیشود.
در این مرحله، بازیکن باید گیاهان را طوری جابهجا کند که یک ترکیب سهتایی (یا بیشتر) از گیاه یکسان در یک ستون یا یک ردیف تشکیل شود (تا حدی شبیه به بازی candy crush).
نکته: فقط در صورتی میتوان گیاهی را جابهجا کرد که با جابهجایی آن یک ترکیب سهتایی ایجاد شود.

هرگاه ترکیبی ساخته شود، گیاهان آن ترکیب از بین میروند و گیاهان بالای آنها پایین میآیند و هرجا لازم باشد، گیاه به صورت تصادفی از بالا ساخته میشود. بازیکن وقتی برنده میشود که تعداد معینی ترکیب سهتایی (یا بیشتر) بسازد.
هرگاه که بازیکن یک ترکیب سهتایی ایجاد کند، یک خورشید ۵۰ تایی میگیرد. با این خورشیدها، میتواند گیاهان موجود در زمین را ارتقا دهد (که دربارهی جزئیات ارتقا در ادامه توضیح داده شده است). اگر بتواند ترکیب را بیشتر از 3 تا کند، به ازای هر چه ترکیب بزرگتر است، یک خورشید بیشتر میگیرد (برای مثال ترکیب چهارتایی، دو خورشید میدهد و ترکیب پنجتایی، 3 خورشید میدهد). همچنین اگر بازیکن حرکتی را انجام دهد و بعد از حرکت او، به خاطر تشکیل تصادفی گیاهان ترکیب 3 تایی جدیدی ایجاد شود، این ترکیبها یکی خورشید بیشتر از حالت عادی خود میدهند.
نکته: در صورتی که در زمین بازی نتوان ترکیب سهتایی دیگری ایجاد کرد، باید کل زمین reset شده و به جای هر گیاهی که در باغ است، گیاهی تصادفی تشکیل شود.
هرگاه یک زامبی گیاهی را بخورد، در آنجا یک crater یا زمین خاکی ایجاد میشود و دیگر در آنجا گیاهی نمیتواند قرار بگیرد، چه به صورت عادی، و چه با جابهجایی گیاهان.
همانطور که در بالا گفته شد، شرط برد، ساخت تعدادی معین شده ترکیب سه تایی یا بیشتر است. این تعداد در هر مرحله بیشتر میشود. پس از رسیدن به تعداد مورد نظر ترکیب، تمام زامبیهای موجود در باغ از بین رفته و بازیکن برنده میشود.
دستورات مربوط به جابجایی گیاهان و انتخاب ارتقا را به دلخواه خودتان انتخاب کنید.
همانطور که در بالا گفته شد، میتوان گیاهان را ارتقا داد. برای مثال، با خرج کردن 500 خورشید، باید بتوان تمام peashooter های موجود در باغ را به repeater تبدیل کرد. در پایین تعدادی ارتقای پیشنهادی را آوردهایم:
| هزینه (خورشید) | تبدیل به | تبدیل از |
|---|---|---|
| 500 | repeater | peashooter |
| 1500 | mega gatling-pea | repeater |
| 500 | tall-nut | wall-nut |
| 250 | fume-shroome | puff-shroom |
| 1000 | melon-pult | cabbage-pult |
| 750 | winter melon | melon-pult |
شما میتوانید ارتقاهای بیشتر یا متفاوتی بگذارید، ولی لازم است حداقل یک ارتقای دو مرحلهای (مانند cabbage-pult به melon-pult و ارتقای melon-pult به winter melon) و ارتقا برای سه گیاه متفاوت را پیاده سازی کنید. انتخاب اینکه چه گیاهان و چه ارتقاهایی در هر مرحله وجود دارد نیز به عهده خودتان است، اما لازم است گیاهان هر مرحله و ارتقاهایشان کمی تفاوت داشته باشند.
بخش امتیازی
این مینی گیم به این صورت است که زامبیها خاصیت بعضی از گیاهان را دارند، برای مثال بعضی از زامبیها مانند peashooter به جلو تیر پرتاب میکنند که به گیاهان خورده و به آنها آسیب میزند. بقیه اجزای مرحله (از فرایند انتخاب گیاهان تا پیروزی/باخت) مانند یک مرحله عادی است.
لازم است که زامبیهایی که خواص گیاهان زیر را دارند را پیاده سازی کنید (زامبیهای زیر، به جز خواص گفته شده، کاملا مانند زامبی عادی هستند):
بقیهی اجزای مرحله مانند یک مرحله معمولی است.