PDA

View Full Version : سوال برای امکانات پاسکال برای نوشتن برنامه ی مار



aghooshebahar
شنبه 18 خرداد 1392, 18:58 عصر
سلام
من بابرنامه ی پاسکال دارم برنامه ی مار رو مینویسم...
الان یه مشکل پیش اومده برام و اون اینه که چجور میشه
توامان شرایطی که دکمه ای فشرده نشده و دکمه ای ای فشرده شده رو مدیریت کرد
(باتوجه به اینکه مار در حرکته در حالت عادی راه مستقیم رو باید بره اما در شرایطی که مثلا
دکمه ی راست رو فشار بدیم باید مسیر مار به سمت راست تغییر جهت پیدا کنه...
سوال اینه چه الگوریتمی بنویسیم که هر دو شرایطی رو که توضیح دادم رو تحت پوشش قرار بده)

یوسف زالی
یک شنبه 19 خرداد 1392, 00:23 صبح
این شد روش درست سوال کردن.

ببینید، در پاسکال رویداد نداریم، اصلا در هیچ یک از زبانهای کنسول فکر نکنم داشته باشیم.
شما باید به صورت Listening وضعیت سیستم رو بپایید. برای این کار از یک حلقه استفاده می کنید که فشرده شدن کلید رو هی چک کنه.
می تونید از توابع Interrupt مثل شماره 21H و سرویس های مختلفش استفاده کنید.
هم می تونید از یونیت CRT استفاده کنید.

در این یونیت تابعی وجود داره به نام KeyPressed که بدون این که شما رو منتظر فشردن یک کلید بگذاره (مثل ReadLn) تست می کنه ببینه کلیدی رو فشار دادید یا نه.
در صورت فشرده شدن، باید با تابع ReadKey از همون یونیت (برعکس ReadLn منتظر Enter نمی مونه) ببینید کد کلیدی که زده شد چی هست و بر مبنای اون تصمیم گیری کنید.
حالا نکته ای که وجود داره اینه که کد های کلید های کنترلی و یا F ها و جهت نما ها ترکیبی (اصطلاحا کد اسکن) هستند و همیشه با عدد صفر شروع می شن. یعنی مثل کاراکتر ها یک بایتی نیستند.
چک کردن فشرده شدن کلید توسط این تابع، بافر صفحه کلید رو هم خالی می کنه. یعنی بعد از خوندنش، تابع KeyPressed دیگه true نمی ده.
حالا چک می کنید اگر کد شما صفر بود باید یک بار دیگه ReadKey رو برای دیدن کد اسکن فراخوانی کنید. فکر کنم کدهای کلیدهای جهت نما این طوری بود:
#0 #72
#0 #75
#0 #78
#0 #80

نمونه کد سودو این شکلی می شه:


Repeat
if not KeyPressed then
begin
DoGameRoutinesStep;
continue;
end;

ch := ReadKey;
case ch of
#13: {Enter} if GamePaused then DoResume else DoPause;
#32: {Space} DoShootGun;
#0: case ReadKey of
#72: DoLeft;
#75: DoRight;
#78: DoUp;
#80: DoDown;
#97: {F1} DoHelp;
end;
end;

Until ch = #27 {Escape};


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