assignment3.pdf

‫برنامه سازی پیشرفته‬
‫نیمسال دوم ‪25-29‬‬
‫پیمان دودانگه‬
‫دانشکده مهندسی کامپیوتر‬
‫تمرین سوم‬
‫پ‬
‫زمان تحویل‪ 11:‬خرداد‬
‫‪ .1‬موعد ارسال تمرین ساعت ‪ 95:32‬روز جمعه مورخ ‪ 1525/5/11‬است‪.‬‬
‫‪ .9‬ت مرین باید به صورت حضوری تحویل داده شود و استفاده از کامنت‪ ،‬و ساختار کد نمره خواهد داشت‪ .‬بنابراین‬
‫نمره کامل از سیستم داوری به معنای نمره کامل نبوده و فقط بخشی از نمره شما خواهد بود‪.‬‬
‫نیست و تنها کالس ها و توابع خواسته شده را باید پیادهسازی کنید‪.‬‬
‫‪ .5‬در سوال ‪ 1‬نیازی به پیاده سازی تابع‬
‫باشند‪.‬‬
‫ها بقیه توابعی که استفاده میکنید باید‬
‫ها و‬
‫به غیر از توابع خواسته شده و‬
‫‪ .4‬در صورت داشتن هرگونه مشکل‪ ،‬سوال خود را با تگ مناسب در‬
‫‪ .3‬با هر گونه تقلب برخورد جدی خواهد شد‬
‫مطرح کنید‪.‬‬
‫سوال ‪ 1‬انبارداری نوین (‪ 35‬نمره)‬
‫در این تمرین میخواهیم یک سیستم انبار داری نوین را برای یک شرکت تولید کننده مواد غذایی پیاده سازی کنیم!‬
‫این شرکت محصوالت مختلفی تولید میکند و برای محصوالت مختلف انبار های مختلفی دارد (هر انبار فقط یک محصول‬
‫را در خود جای میدهد اما یک محصول ممکن است چند انبار داشته باشد)‪.‬‬
‫برای این که سیستم ما بتواند برای همهی انبارها‪ ،‬مورد استفاده قرارگیرد تصمیم گرفتهایم در طراحی آن از کالس‬
‫است استفاده کنیم‪ .‬شرح توابع این کالس در ادامه خواهد آمد‪.‬‬
‫که یک کالس‬
‫همهی کاالهایی که قرار است در انبار های این کارخانه نگهداری شوند از لحاظ طراحیهای نرم افزار ما از کالس‬
‫ارث ببرند را ذخیره خواهند کرد‪.‬‬
‫ارث خواهند برد‪ .‬بنابر این همهی انبارها فقط کاالهایی که از‬
‫شرح توابع و اجزای سیستم انبارداری نوین‪:‬‬
‫کالس‬
‫‪:‬‬
‫;‪abstract class Product‬‬
‫است که هر کاالی تولید کارخانه از این کالس ارث میبرد‪.‬‬
‫این کالس یک کالس‬
‫توابع کالس‬
‫‪:‬‬
‫‪public Product(int id, NovinDate productDate, NovinDate‬‬
‫(‪expiredDate‬‬
‫این کالس است که (این عدد برای هر کاال یکتا خواهد بود) و تاریخ تولید و تاریخ انقضای‬
‫این تابع‬
‫هستندکه توضیحاتش در ادامه میآید) را میگیرد و یک کاال با‬
‫کاالی تولید شده (تاریخ ها از کالس‬
‫قرار گیرد (در ادامه‬
‫این خصوصیات میسازد‪ .‬همچنین وضعیت این کاال در هنگام تولید باید‬
‫توضیحات مربوط به وضعیت خواهد آمد)‪.‬‬
‫هر کاال یک وضعیت از نوع‬
‫برمیگرداند‪.‬‬
‫این تابع وضعیت کاال را به وضعیت‬
‫;)(‪public State getState‬‬
‫(توضیحات آن در ادامه خواهد آمد) را داراست‪ .‬این تابع وضعیت کاال را‬
‫;)‪public void setState(State state‬‬
‫که به عنوان ورودی به آن داده میشود تغییر میدهد‪.‬‬
‫;)(‪Public int getId‬‬
‫این تابع‬
‫کاال را برمیگرداند‪.‬‬
‫;)(‪Public NovinDate getProductDate‬‬
‫این تابع تاریخ تولید کاال را برمیگرداند‪.‬‬
‫;)(‪public NovinDate getExpiredDate‬‬
‫این تابع تاریخ انقضای کاال را بر میگرداند‪.‬‬
‫وضعیت کاال‬
‫;‪enum State‬‬
‫وضعیت کاال را نشان میدهد‪ .‬هر کاال ‪ 4‬وضعیت متفاوت میتواند داشته باشد که هر کدام در ادامه خواهد‬
‫این‬
‫آمد‪:‬‬
‫‪‬‬
‫‪ :‬هر کاال از زمانی که تولید میشود تا زمانی که هنوز وارد انباری نشده این وضعیت را‬
‫داراست‬
‫‪‬‬
‫‪ :‬زمانی که کاالیی به یک انبار منتقل شد این وضعیت را میگیرد‪.‬‬
‫‪‬‬
‫‪ :‬زمانی که یک کاال تاریخ گذشته محسوب شد (ادر ادامه توضیحات آن خواهد آمد) این وضعیت‬
‫را میگیرد‪.‬‬
‫‪‬‬
‫‪ :‬زمانی که کاالیی از انبار برای فروش منتقل میشود این وضعیت را میگیرد‪.‬‬
‫کالس‬
‫;‪class NovinDate‬‬
‫توابع کالس‬
‫این تابع‬
‫‪:‬‬
‫;)‪public NovinDate(int year, int month, int day‬‬
‫این کالس است که با گرفتن روز و ماه و سال یک تاریخ با این خصوصیات تولید میکند‪.‬‬
‫;)(‪Public int getYear‬‬
‫این تابع سال را برمیگرداند‪.‬‬
‫;)(‪Public int getMonth‬‬
‫این تابع ماه را برمیگرداند‪.‬‬
‫;)(‪public int getDay‬‬
‫این تابع روز را بر میگرداند‪.‬‬
‫کالس‬
‫که محصوالت از نوع‬
‫را ذخیره میکند‪.‬‬
‫;>‪public class Warehouse <T extends Product‬‬
‫توابع کالس‬
‫‪:‬‬
‫;)‪public Warehouse(String name, int capacity‬‬
‫این تابع در واقع‬
‫ایجاد میکند‪.‬‬
‫این کالس است و یک انبار جدید با نام و ظرفیت که به عنوان ورودی به آن داده میشود‬
‫این تابع یک آرایه از محصوالت نوع‬
‫اضافه میکند‪.‬‬
‫قاعدتا تنها محصوالتی که وضعیت آن ها‬
‫باید یک اکسپشن از نوع‬
‫(که از کالس‬
‫‪public void add(T[] products):‬‬
‫ارث میبرد) میگیرد و این محصوالت را به این انبار‬
‫است میتوانند به انبار اضافه شوند و در غیر این صورت‬
‫شود‪.‬‬
‫تولید و‬
‫در صورتی که با اضافه شدن محصوالت جدید تعداد محصوالت از ظرفیت انبار بیشتر شود یک اکسپشن از نوع‬
‫شود‪.‬‬
‫تولید و‬
‫;)‪public int control(NovinDate date‬‬
‫این تابع یک تاریخ میگیرد و در این تاریخ همه محصوالت درون انبار را بررسی کرده و محصوالت تاریخ مصرف گذشته‬
‫(محصوالتی که تاریخ انقضایشان همان روز است هنوز منقضی نشده اند) را از انبار خارج میکند(دقت کنید وضعیت این‬
‫کاال ها باید بهروز شود)‪ .‬در انتها تعداد محصوالتی که در انبار باقی ماندهاند برگردانده میشوند‪.‬‬
‫;)‪public T[] sendForSale(int num, NovinDate date‬‬
‫این تابع با گرفتن تعداد و یک تاریخ ابتدا کاالهای تاریخ مصرف گذشته در این تاریخ را از انبار خارج میکند‪ .‬سپس به‬
‫) از محصوالت درون انبار به اولویت تاریخ انقضا (محصوالتی که تاریخ انقضای آن ها زود‬
‫تعداد آمده در ورودی (‬
‫تر است زود تر خارج میشوند) خارج میکند و به لیست محصوالت فروخته شده اضافه میکند‪ .‬در صورتی که تعداد‬
‫ساخته و‬
‫باشد باید یک اکسپشن از نوع‬
‫محصوالت مجاز کمتر از‬
‫شود‪.‬‬
‫;)(‪Public String getName‬‬
‫این تابع نام انبار را برمیگرداند‪.‬‬
‫;)(‪Public int getCapacity‬‬
‫این تابع ظرفیت انبار را برمیگرداند‪.‬‬
‫;)(‪Public static Product[] getExpiredProducts‬‬
‫این تابع همه کاالهای منقضی تولید شده تا آخرین عملیات را برمیگرداند‪.‬‬
‫;)(‪Public static product[] getSoldProducts‬‬
‫این تابع همه کاالی فروخته شده تا آخرین عملیات را بر میگرداند‬
‫تا کنون سیستم ما برای هیچ کاالی خاصی تعریف نشده بود و صرفا یک سیستم انبار داری بود که به هر کارخانهای‬
‫میتوانستیم بفروشیم و این خاصیت را از این به بعد هم باید سیستم حفظ کند و هر کاالیی بتواند به آن اضافه شود!‬
‫اما با توجه به درخواست یک کارخانه که از گفتن نام آن خودداری میکنیم قرار است دو کاالی شیر و ماست را درون‬
‫معرف کاالی شیر (هر شی از این کالس معادل یک بسته شیر است) و‬
‫سیستم به طور پیشفرض قرار دهیم‪ .‬کالس‬
‫معرف کاالی ماست (هر شی از این کالس معادل یک بسته ماست است) است!‬
‫کالس‬
‫بدیهی است که هر دو این کالس ها از کالس‬
‫ارث میبرند‪.‬‬
‫تنها فرقی که این کاال ها دارند این است که کارخانهی مورد نظر با متد جدید خود که خیلی هم مورد تایید استانداردهای‬
‫نظارتی نیست توانسته به مادهای دست یابد که میتواند حداکثر ‪ 9‬بار به هر بسته ماست اضافه شود‪ .‬پس از اضافه شدن این‬
‫ماده به هر بسته ماستٍ تاریخ مصرف گذشته‪ ،‬به مدت ‪ 7‬روز از تاریخ اضافه شدن این ماده آن بسته قابلیت مصرف مجدد‬
‫برای آن تغییر میکند و ‪ 7‬روز بعد از تاریخ اضافه شدن ماده خواهد شد)‪ .‬این‬
‫پیدا میکند(در واقع‬
‫شرکت زمانی که هر بستهی ماست‪ ،‬تاریخ گذشته تشخیص داده شد‪ ،‬از ماده فوق استفاده میکند و تاریخ انقضا را به ‪ 7‬روز‬
‫) و آن بسته را از انبار خارج نمیکند‪.‬‬
‫یا‬
‫بعد از آن تاریخ تغییر میدهد (در تابع‬
‫شما باید دو کالس‬
‫و‬
‫را با خصوصیات فوق پیاده سازی کنید‪.‬‬
‫توضیحات‪:‬‬
‫همه تاریخ ها در عملیات هایی که نیاز به تاریخ دارند به صورت صعودی خواهد بود‪.‬‬
‫اضافه کردن تابع به کالس ها مجاز است (حتی ممکن است مجبور به این کار شوید!)‪.‬‬
‫سوال ‪ 9‬بازی ‪35( 954۲‬نمره)‬
‫در این تمرین قرار است بازی ‪ 954۲‬را به صورت گرافیکی پیاده سازی کنید‪ .‬بازی به این صورت است‪:‬‬
‫است‪ .‬با‬
‫و خروج‬
‫در ابتدا یک صفحه باید باز شود که شامل دو گزینهی بازی جدید‬
‫زدن دکمه «خروج» باید از بازی خارج شویم و صفحه بسته شود‪ .‬با زدن دکمهی «بازی جدید» صفحه قبلی بسته‬
‫«‬
‫میشود صفحه دیگری باز میشود که تعداد سطر و ستون برد بازی را از کاربر میگیرد و با زدن کلید »‬
‫صفحه اصلی بازی باز میشود‪:‬‬
‫صفحه اصلی بازی شامل یک برد میباشد که شماره های بازی بر روی آن قرار دارند‪ .‬در ابتدای بازی در دو تا از‬
‫خانه های برد به طور تصادفی مقدار دو قرار میگیرد‪ .‬کاربر با زدن یکی از کلیدهای باال‪ ،‬پایین‪ ،‬چپ یا راست تمام‬
‫عدد های روی برد را به همان سمت هدایت میکند‪ .‬اگر در طی این عمل دو عدد یکسان در کنار یکدیگر و در‬
‫راستای حرکت کاربر قرار گرفتند‪ ،‬با هم جمع شده و مقدار عددی که بیشتر به جهت حرکت کاربر متمایل بوده به‬
‫جمع دو عدد تغییر پیدا میکند‪ .‬به طور مثال‪ ،‬اگر دو عدد ‪ 2‬در یک سطر قرار داشته باشند و در بازی عدد دیگری‬
‫نباشد‪ ،‬با زدن کلید راست‪ ،‬هر دو عدد به راست ترین جای صفحه هدایت میشوند و هنگامی که با هم برخورد‬
‫کردند‪ ،‬مقدار عددی که راست تر است به ‪ 4‬تغییر پیدا میکند و عدد چپ تر ناپدید میشود‪.‬‬
‫برای اطالعات بیشتر به‬
‫مراجعه کنید‪.‬‬
‫با جمع شدن هر دو عدد در این بازی مقدار جمع آنها به امتیاز کاربر اضافه میشود‪.‬‬
‫با زدن کلید های هدایت (در صورتی که منجر به تغییری در شکل یا جایگاه عدد ها شود) در سمت مقابل حرکت‬
‫اعداد‪ ،‬به صورت تصادفی یک عدد ‪ 2‬اضافه میشود‪.‬‬
‫در صورتی که برد بازی به طور کامل پر شود و امکان جمع شدن هیچ دو عددی با هم در هیچ جهتی نباشد‪ ،‬عبارت‬
‫» چاپ میشود و مانند صفحه اول بازی‪ ،‬امکان بازی مجدد و یا خروج از بازی برای کاربر‬
‫«‬
‫فراهم میشود‪.‬‬
‫اگر بازیکن نخواهد بازی را ادامه دهد میتواند با کلیک بر روی دکمه ضربدر در گوشه راست و باالی صفحه‪ ،‬بازی‬
‫را ببندد‪.‬‬
‫بازیکن میتواند به جای استفاده از کلید های هدایت‪ ،‬از موس برای تعیین جهات استفاده کند‪.‬‬
‫بازی امکان ذخیره دارد و با بستن بازی و باز شدن مجدد آن‪ ،‬بازی به حالت قبل در میآید‪.‬‬
‫رکورد امتیاز ذخیره میشود و با باز شدن بازی بر روی صفحه بازی نمایش داده میشود‪.‬‬
‫آنچه که باید روی صفحه اصلی بازی باشد‪:‬‬
‫امتیاز کاربر‬
‫رکورد امتیازات‬
‫دکمه بازی جدید‬
‫صفحه بازی (که شامل عددها میشود)‬
‫دکمه های هدایت (در جهات باال‪ ،‬پایین‪ ،‬راست و چپ) برای بازی با موس
‬
‫آنجه باید در بازی رعایت شود‪:‬‬
‫حرکت یکنواخت اعداد‬
‫اولویت جمع شدن با اعدادی است که بیشتر به جهت بازی کاربر متمایل اند‪ .‬به طور مثال‪ ،‬اگر در یک ردیف تنها‬
‫سه عدد وجود داشته باشد‪ ،‬با زدن کلید راست‪ ،‬بعد از این که اعداد به سمت راست برد هدایت میشوند و در کنار‬
‫هم قرار میگیرند‪ ،‬دو عدد سمت راست با یک دیگر جمع شده‪ ،‬مقدار عدد راست به تغییر پیدا میکند و عدد‬
‫چپ تر جای عدد وسط را میگیرد‪.‬‬
‫راهنمایی‪:‬‬
‫برای ساختن صفحه ها از‬
‫بسازید‪.‬‬
‫و‬
‫برای ساختن اعداد در برد بازی میتوانید از‬
‫در کتابخانه‬
‫در کتابخانه‬
‫استفاده کنید‪ ،‬دکمه ها را با‬
‫استفاده کنید‪.‬‬
‫;(”‪JFram frame = new JFrame(“2048 Game‬‬
‫;)‪frame.setBounds(int x, inty, int width, int height‬‬
‫;)‪frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE‬‬
‫;)(‪JLabel label = new JLabel‬‬
‫;)‪label.setBounds(int x, int y, int width, int height‬‬
‫;)‪frame.add(label‬‬
‫;)‪label.setVisible(true‬‬
‫;)‪frame.setVisible(true‬‬
‫استفاده کنید‪.‬‬
‫برای یکنواخت بودن حرکت اعداد از‬
‫میتوانید برای زیبای‪ ،‬بر روی‬
‫نامرئی کنید تا جلوهی زیبا تری داشته باشد‪.‬‬
‫یا‬
‫های خود تصاویری را قرار دهید ‪.‬و یا دکمه های خود را‬
‫;((”‪button.setIcon(new ImageIcon(“ax.jpg‬‬
‫استفاده کنید‪.‬‬
‫برای این که با زدن کلید های صفحه چه اتفاقی بیافتد از واسط‬
‫‪class GraphicBoard extends JPanel implements KeyListener‬‬
‫
;}…{‬
‫;)‪public void keyPressed(keyEvent e‬‬
‫توجه کنید که در این تمرین گرافیک پیاده سازی شده شما از ‪ 1‬تا ‪ 95‬نمره میتواند داشته باشد که بستگی به‬
‫چگونگی پیاده سازی و زیبایی آن دارد‪ ،‬انتخاب تصاویر و آرایش صفحات بازی را به سلیقه خودتان انجام دهید ‪.‬به‬
‫امکانات جدید دیگری که در بازی قرار میدهید بر طبق نظر تحویل گیرندگان تمرین نمره کسب خواهید کرد‪.‬‬
‫موفق باشید‬