برنامه سازی پیشرفته
نیمسال دوم 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نمره میتواند داشته باشد که بستگی به
چگونگی پیاده سازی و زیبایی آن دارد ،انتخاب تصاویر و آرایش صفحات بازی را به سلیقه خودتان انجام دهید .به
امکانات جدید دیگری که در بازی قرار میدهید بر طبق نظر تحویل گیرندگان تمرین نمره کسب خواهید کرد.
موفق باشید
© Copyright 2025 Paperzz