تبلیغات
Pro4 programming - (شبیه سازی مسابقه ی لاک پشت و خرگوش)

نویسنده :Pourya Alinezhad
تاریخ:1388/07/20-19:10

(شبیه سازی مسابقه ی لاک پشت و خرگوش)

در این مسابقه از نو مسابقه ی کلاسیک لاک پشت و خرگوش را طراحی می کنیم.

برای طراحی این بازی به یاد ماندنی،از مولد اعداد تصادفی استفاده می کنیم.

کار یکی از حیوانات شرکت کننده در مسابقه از "خانه 1"از 70 خانه ی موجود شروع می شود.

هر خانه،یک مکان احتمالی را در طول مسابقه نشان می دهد. خط پایان مسابقه خانه ی 70 است.

به اولین شرکت کننده ای که به خانه ی 70 رسیده باشد یک دسته هویج یا کاهو جایزه داده می شود.

ساعتی وجود دارد که هر ثانیه ،یک تیک می کند.با هر تیک ساعت ،برنامه باید موقعیت حیوانات را

 طبق قانون زیر تنظیم کند.

حیوان

نوع حرکت

درصد زمان

حرکت واقعی

لاک پشت

راه پیمایی سریع

%50

3 خانه به راست

لاک پشت

راه پیمایی نسبتا اهسته

%20

6 خانه به چپ

لاک پشت

راه پیمایی آهسته

%30

1 خانه به راست

خرگوش

خواب

%20

هیچ حرکتی ندارد

خرگوش

جست بزرگ

%20

9 خانه به راست

خرگوش

جست بزرگ

%10

12 خانه به چپ

خرگوش

جست کوچک

%30

1 خانه به راست

خرگوش

جست کوچک

%20

2 خانه به چپ


"راه حل:کد این برنامه را به 3 زبان C++,Visual basic,Qbasicنوشته ام که می توانید آنها را دانلود کنید.

اما الگوریتم حل این مساله در هر 3 زبان تقریبا یکسان است.

خوب از چند متغیر برای ذخیره ی موقعیت حیوانات استفاده می کنیم.هر حیوان از شماره ی 1 (یعنی دروازه اول) شروع به حرکت می کند.اگر راه پیمایی حیوانی قبل از خانه ی یک نسبتا کند باشد حرکت را مجدداً از خانه ی یک شروع می کنیم.

با تولید یک عدد تصادفی صحیح یعنی temp در فاصله ی  1<=temp<=10  در صد های جدول بالا را تولید می کنیم.

توجه:روش تولید اعداد تصادفی در سه زبان:

1-c++ : temp= a +rand() % length

که در آن a’ مقدار انتقال(که برابر اولین عدد در دامنه ی متوالی از اعداد صحیح مورد نظر است) و ‘length’ ضریب تغییر مقیاس است(که برابر طول دامنه ی متوالی از اعداد صحیح مورد نظر است).

2-Visual basic : temp=INT(RND*length)+a

که در آن ‘a’  و’length’ همانند زبان c++   هستند ولی نکته ی مهم استفاده ازتابع INT( )   در اینجا است.در c++   به دلیل تبدیل انواع (type conversion)  نیازی به استفاده از این نوع توابع نیست  ،اما در VB  ما باید قبل از ذخیره کردن این مقدار در temp  آن را به نوع صحیح تبدیل کنیم.

3-در Qbasic  تقریبا تفاوتی با VB ندارد به جز این که در هنگام مقدار دهی اولیه به تابع RANDOMIZE هسته (seed ) را در درون پرانتز قرار نمی دهیم ، پس در Q basic به این صورت

 می نویسیم:RANDOMIZE TIMER

اما در VB  به این شکل RANDOMIZE (TIMER)

خوب البته باید به این نکته توجه کنیم که در C++  به جای این عبارت از  srand(time(0))استفاده خواهیم کرد و همچنین باید سرفایل "stdlib.h " را نیز include  کنیم.

مسابقه را با پیغام زیر شروع می کنیم.

BANG!!!!AND THEY’RE OFF NOW!!!!!

برای هر تیک از ساعت (یعنی هر تکرار حلقه)خطی با 70 مکان چاپ می کنیم که حرف ‘T’ را برای مکان لاک پشت (Tortoise ) و حرف ‘H’  را برای مکان خرگوش (Hare ) انتخاب می کنیم.

گاه گاهی هر دو حیوان به یک خانه می رسند.در این حالت ،لاک پشت ،خرگوش را گاز می گیرد. و برنامه باید پیغام ‘OUCH’ را در آن مکان چاپ کند.تمام مکان های چاپ، غیر از ‘T’ و ‘H’ و یا ‘OUCH’باید فضای خالی باشند.

پس از چاپ هر خط تحقیق میکنیم که آیا حیوانی به خانه ی 70 رسیده یا از آن رد شدهاست یا خیر.در صورت مثبت بودن جواب برنده را چاپ می کنیم و به شبیه سازی پایان می دهیم.

اگر لاک پشت برنده بود پیغام Tortoise wins!!!YAY!!! را چاپ می کنیم.اگر خرگوش برنده شد پیغام Hare wins !!!!YAY!!! را در خروجی چاپ می کنیم.اگر هر دو حیوان در یک تیک ساعت به خط پایان برسند پیغام ‘It’s a tie’ (مساوی کردند) را چاپ می کنیم.

توجه : این مساله با این که بسیار ساده به نظر می رسد اما با کمی دقت متوجه خواهیم شد که این مساله در دام  "تعویف نامعین " (Indefinite postponement ) گرفتار است.به این معنی که به هیچ عنوان از قبل معلوم نیست که چه هنگام از حلقه خارج خوهیم شد.(در چه زمانی و کدام حیوان برنده است؟)


 از اینجا دانلود کنید....