View Full Version : سوالاتی در (++Maze (c
mahsmahs
جمعه 15 دی 1385, 22:54 عصر
با سلام
با مطالعه ی برنامه ی MAZE (در یک تاپیک در همین سایت قرار گرفته بود) به خطوطی از
برنامه برخورد کردم که متوجه عملکرد صحیح آنها نشدم دوستانی که به برنامه نویسی به
زبان C آشنایی کافی دارند،لطفا مرا راهنمایی کنند.
سورس برنامه روی سایت رو از اینجا دانلود کنید.
سورس برنامه (http://barnamenevis.org/forum/attachment.php?attachmentid=5531&d=1162409427)
1-چرا آرایه ی دو بعدی به صورت [16][16] تعریف شده ولی خانه ی انتهایی ماز [14][14] می باشد آیا دلیل خاصی دارد؟
2-در function1 در 4 خط
stack[*ptop].col=*j;
stack[*ptop].row=*i;
stack[*ptop].last_choice=`a`;
stack[*ptop].dir=l_dir; 1
row و col مربوط به سطر و ستون می شود ولی last_choice و dir مربوط به چه می شود؟وچرا مقدار a در last_choice ریخته شده است؟
3-در function5
if( (kol[(*i)-1][*j]==0)&&(!(*td)) ) 1
می دانیم که در جلوی if عبارت منطقی And قرار گرفته که تنها در صورتی که هر دو طرف آن صحیح باشد نتیجه ی آن صحیخ است در صورتی که طرف اول را صحیح فرض کنیم صحیح یا نادرست بودن طرف دوم یعنی (*td) را چطور مشخص می کنیم؟ یعنی چطور بفهمیم *td درست است یا غلط؟ مگر *td جزو اشاره گر ها در زبان C نیست که مقادیر موجود در آن را برمی گرداند و در این برنامه ممکن است صفر یا یک باشدو الزاما مقادیر درست یا غلط نباشد.
4-در function5
هر کدام از این 3خط دقیقا چه کاری را انجام می دهند؟
*i=stack[*ptop].row;
*j=stack[*ptop].col;
if (( stack[*ptop].dir==`t`)) {*dt=1; *td=0; *lr=0; rl=0;}
galaxy.ice
شنبه 16 دی 1385, 10:51 صبح
مهندس اگه لینک تاپیک بزاری ممنون میشم!
mahsmahs
شنبه 16 دی 1385, 16:33 عصر
سورس برنامه روی سایت رو از اینجا دانلود کنید
سورس برنامه (http://barnamenevis.org/forum/attachment.php?attachmentid=5531&d=1162409427)
mortez maya
شنبه 16 دی 1385, 23:39 عصر
شما باید این سوالات رو از برنامه نویس این برنامه بپرسی ما که نمیدونیم ایشون چه الگوریتمی رو به کار بردن ضمنا این برنامه رو میشه خیلی ساده تر و بدون تعریف این همه اشاره گر نوشت./
mahsmahs
یک شنبه 17 دی 1385, 19:13 عصر
شما باید این سوالات رو از برنامه نویس این برنامه بپرسی ما که نمیدونیم ایشون چه الگوریتمی رو به کار بردن ضمنا این برنامه رو میشه خیلی ساده تر و بدون تعریف این همه اشاره گر نوشت./
برای ایشون پیغام خصوصی گذاشتم ولی اشون مثل اینکه به سایت دیگه سر نمی زنند.
mahsmahs
یک شنبه 17 دی 1385, 19:15 عصر
با سلام
با مطالعه ی برنامه ی MAZE (در یک تاپیک در همین سایت قرار گرفته بود) به خطوطی از
برنامه برخورد کردم که متوجه عملکرد صحیح آنها نشدم دوستانی که به برنامه نویسی به
زبان C آشنایی کافی دارند،لطفا مرا راهنمایی کنند.
سورس برنامه روی سایت رو از اینجا دانلود کنید.
سورس برنامه (http://barnamenevis.org/forum/attachment.php?attachmentid=5531&d=1162409427)
1-چرا آرایه ی دو بعدی به صورت [16][16] تعریف شده ولی خانه ی انتهایی ماز [14][14] می باشد آیا دلیل خاصی دارد؟
2-در function1 در 4 خط
stack[*ptop].col=*j;
stack[*ptop].row=*i;
stack[*ptop].last_choice=`a`;
stack[*ptop].dir=l_dir; 1
row و col مربوط به سطر و ستون می شود ولی last_choice و dir مربوط به چه می شود؟وچرا مقدار a در last_choice ریخته شده است؟
3-در function5
if( (kol[(*i)-1][*j]==0)&&(!(*td)) ) 1
می دانیم که در جلوی if عبارت منطقی And قرار گرفته که تنها در صورتی که هر دو طرف آن صحیح باشد نتیجه ی آن صحیخ است در صورتی که طرف اول را صحیح فرض کنیم صحیح یا نادرست بودن طرف دوم یعنی (*td) را چطور مشخص می کنیم؟ یعنی چطور بفهمیم *td درست است یا غلط؟ مگر *td جزو اشاره گر ها در زبان C نیست که مقادیر موجود در آن را برمی گرداند و در این برنامه ممکن است صفر یا یک باشدو الزاما مقادیر درست یا غلط نباشد.
4-در function5
هر کدام از این 3خط دقیقا چه کاری را انجام می دهند؟
*i=stack[*ptop].row;
*j=stack[*ptop].col;
if (( stack[*ptop].dir==`t`)) {*dt=1; *td=0; *lr=0; rl=0;}
ممنون میشم اگه کسی کمکم کنه:چشمک:
mortez maya
سه شنبه 19 دی 1385, 13:02 عصر
باور کنید چنین پیغامی به دست من نرسیده؟!!
mahsmahs
سه شنبه 19 دی 1385, 13:53 عصر
باور کنید چنین پیغامی به دست من نرسیده؟!!
این برنامه رو شما نوشتید؟ فکر می کردم آقای soroush_vs (http://barnamenevis.org/forum/member.php?u=16481) نوشتند.ممنون میشم اگه به سوالاتم جواب بدید.
user addi
سه شنبه 19 دی 1385, 15:00 عصر
سلام
من دقیقا برنامه رو نگاه نکردم ولی جواب بعضی سوالات شما رو می دونم.
1. در این برنامه برای محیط بازی یک دیوار در نظر گرفته شده. یعنی سطر اول ( 0 ) و سطر اخر ( 15 ) و ستون اول ( 0 ) و ستون آخر ( 15 ) به عنوان دیوارهای محیط بازی در نظر گرفته شده اند.
2_ دقیقا نمی دونم چون فکر می کنم ایشون برنامه رو خیلی گیج کننده نوشته
3_ در باره این سوال باید این رو بگم که :
اگر هنگام تعریف متغیر یک * قبل اون بگذاریم اشاره گر ایجاد می شود. مثلا int *a
حالا تو برنامه هروقت بخوایم از خود اشاره گر استفاده کنیم باید فقط اسمشو بیاریم.
ولی اگه خواستیم مقداری که اشاره گر به اون اشاره می کنه رو برگردونیم باید یک * قبل از اسم اشاره گر بیاریم.
به مثال زیر دقت کن :
فرض کنید متغیر test در آدرس 142 در حافظه قرار دارد و متغیر ها به صورت زیر تعریف شده اند:
int test = 10;
int *s = &test;
اگه بنویسیم :
cout<< s;
جواب 142 است
ولی اگه بنویسیم
cout<< *s;
جواب 10 است.
تو اینجا هم منظور همون محتوای td است نه اشاره گر. و درصورتی که td که یک اشاره گر به اینیجر است مقداری که به آن اشاره می کنه غیر صفر باشه جواب true می شه.
4_ خط اول و دوم رو با توجه به توضیحات قبل قابل فهمیدن است. ولی خط آخر رو من خودم هم نمی دونم
در کل فکر می کنم این برنامه خیلی پیچیده نوشته شده.
من خودم یه برنامه مثل این نوشتم.
تحت داس کار می کنه و از توابع گرافیکی استفاده می کنه
تابع اصلیش findway() است و بقیه توابع فقط کارای گرافیکی رو انجام می دن
فکر کنم بد نباشه اگه نگاهش بکنی
موفق باشی
sjj
پنج شنبه 21 دی 1385, 19:27 عصر
اینم یه نمونه از Maze که دو ترم پیش نوشتم.آدرس شروع و آدرس پایان رو مختصاتی بدید که مقدارش 1 هست.(دیگه حوصله نداشتم کنترلش کنم!!!).اگه سوالی بود در خدمت تون هستم.
6378
soroush_vs
یک شنبه 24 دی 1385, 18:09 عصر
سلام ببخشید من خیلی وقت بود که فرصت نداشتم بیام به سایت
فکر میکنم مسایل حل شده
در غیر این صورت میتونید پی ام بدید یا با یاهو مسنجر پیغام بزارید
موفق باشید
soroush_vs
سه شنبه 26 دی 1385, 11:40 صبح
در مورد سوال اول همون طور که یکی از دوستان گفتند یک دیوار دور تا دور بازی در نظر گرفته شده
در مورد سوالات بعدب باید بگم که من در حال حاظر طراحی که برای برنامه کرده بودم در دسترسم نیست و همه چیز رو یادم نیست
ولی تا جایی که یادم میاد
من برای میز از استک استفاده کردم به اضافه متغیر های کمکی و اشاره گرهای کمکی
مثل
*rl که برای چک کردن اینه که قبلا حرکتوم Right To Left بوده.در صورتی که مقدارش در طول برنامه یک شود به معنی این هست که حرکت ما از راست به سمت چپ هست.
ئر مورد سوال 2 باید بگم که
last_choice مربوط هست به انتخاب قبلی ما وقتی که به یک گره (دو راهی یا چند راهی)برسیم.گره اون خانه ای از جدول ما است که در آن بیش از یک راه برای انتخاب وجود دارد مثلا در مثالی که گفتید بنده 4 حالت رو در نظر گرفتم حالت های t یعنی top به این معنی که انتخاب قبلی ما راه سمت بالا بوده و الان باید برای ادامه کار راه بالا را نرویم مثلا راه سمت راست را برویم.چون قبلا راه بالا را رفته بودیم و به بن بست رسیده ایم. به همین ترتیب d برای down و L برای left و r برای Right هستند. و a برای مشخص کردن این هست که قبلا هیچ راهی انتخاب نشده است. توجه کنید که مقدار متغیر last_choice در تابع Choose_choice تغییر میکند.
soroush_vs
سه شنبه 26 دی 1385, 11:58 صبح
در ادامه سوال 2
متغیر dir یا دستو قبل برای این استفاده شده که کمکی باشد برای یافتن مسیر.
یک مثال ببینید فرض کنید که شما در حال حرکت از سمت چپ به راست هستید و به یک گره میرسید این گره را باید در استک قرار دهید سپس چه خانه هایی را برای پیدا کردن مسیر انتخاب میکنید
فرض کنید شما هم اکنون در سلول [3][3] هستید و dir با توجه به اینکه شما از سمت چپ به راست اومدید مقدار r رو داشته باشه واین خانه یک گره باشد برای اینکه به مسر خودتون ادامه بدید باید خانه های اطراف رو برای دنبال کردن مسیر چک کنید چون ممکنه که دیوار باشند اگر خانه بالایی یعنی [2][3] دیوار نبود به راحتون ادامه میدید و به اون مسیر میرید وبه بن بست میخورید و سپس به خانه [3][3] بر میگردید و سمت راست رو انتخاب میکنید چون last_choice شما الان این رو به شما میگه که فبلا شما سمت بالا رو رفتید . اگه سمت راست رو هم رفتید و بن بست بود شما تنها یک راه برای رسیدن به پنیر یا خروج از بازی دارید اینکه به خانه ی [4][3] برید و این به این خاطر است که شما در متغیر dir تون مقدار r رو قرار دادید یعنی شما مسیری رو که قبلا از اونحا اومدید رو نمیتینید دو باره برگردید باید مسیر های دیگری رو انتخاب کنید.
soroush_vs
سه شنبه 26 دی 1385, 12:06 عصر
در مورد سوال 3
این قسمت چک میکنه که مسیری که میخاید انتخاب کنید اولا یوار نباشه یعنی مقدار صفر در اون جا نباشه وثانیا شما قبلا چه حرکتی رو کرده بودید. من الگوریتم رو در دو پست قبلی خوب شرح دادم بصورت شفاهی و گفتم که مثلا متغیر *rl برای چی هست همین هم برای *td صادق است .یعنی شما TopToDown بودید.
soroush_vs
سه شنبه 26 دی 1385, 12:08 عصر
در مورد سوال 4
دوخط اول برای پرش به خانه ای استفاده میشود که خانه ی گره است و هم اکنون در استک قرار دارد تا ما بتوانیم بعد از رسیدن به بن بست به آنها برگردیم.
خط سوم هم مقدار متغیر های درون {} ها را به مقادری که قبلا بوده اند و بایستی برای ادامه کار استفاده شوند بر میگرداند.
soroush_vs
سه شنبه 26 دی 1385, 12:12 عصر
در پایان این نکته وجود دارد که نوشتن این برنامه ها به زبان های که واسط گرافیکی در اختیاز کاربر قرار میدهند مانند #C ساده تر است.شما با استفاده از یک گرید و تایمر میدوتید برنامتون رو خیلی ساده تر وملموس تر دیباگ کنید و برنامتون تعداد خطوط کمتری داشته باشه.
نوشتن برنامه Maze در ++C باز هم ساده تر است . با سرچ توی انترنت میتونید برنامه با مثلا 70 خط هم برای Maze با زبان ++C پیدا کنید
mortez maya
سه شنبه 26 دی 1385, 23:36 عصر
جناب سروش در این برنامه مبدا و مقصد شما مشخص شده؟ آیا امکان تغییر مبدا و مقصد وجود داره یا نه؟ (ببخشید دیگه من حوصله نکردم مطالب رو بخونم)
soroush_vs
چهارشنبه 27 دی 1385, 00:27 صبح
نه این رو نزاشتم براش ولی اگه بخایم این کار رو بکنیم چند خط اول و یکی از شزط هامون عوض میشه
برنامه کلیتش همینه
zarnaz
سه شنبه 14 خرداد 1387, 23:34 عصر
سلام
من واقعا ممنونم از دوستانی که اینقدر به بقیه کمک می کنن.موفق باشید.خدانگهدار
bahar aryan
شنبه 12 بهمن 1387, 16:40 عصر
متشكر از همه بچه هاي با حال با اين كارتون واقعا" نجاتم دادين
molood
شنبه 29 آبان 1389, 22:54 عصر
سلام من از برنامه نویسی به زبان c++ زیاد سر در نمی یارم ولی یه قسمت از این برنامه maze رو نمی فهمم اونجا که تابع findway دوشته شده
لطفا هر کس می تونه
برام توضیح بده
اینم فایلش
mahdis806
پنج شنبه 25 آبان 1391, 16:16 عصر
توروخدا هر کسی mazz رو بازگشتی داره واسم بفرسته mahdis.evil@yahoo.com
o, خواااااااااااااااااااااهش میکنم
vBulletin® v4.2.5, Copyright ©2000-1404, Jelsoft Enterprises Ltd.