مشكل در يك پروژه ساده!!!

blue_rays

Member
سلام دوستان. من بعد از مدت ها دوري از MMB و مدت ها درگيري با درس دوباره برگشتم.:D
واسه شروع مجدد به كار با MMB يه برنامه نوشتم كه توضيحشو پايين تر مي نويسم.:rose:
نميدونم من MMB يادم رفته يا MMB منو يادش رفته. يه قسمت پروژه گير كردم كه هر كار ميكنم درست نميشه. خيلي عجيبه به نظر خيلي سادست ولي به طرز عجيبي جواب نميده! مطمئنم دوستان ميتونن كمك كنن.:)

اين پروژه به اين صورته كه هر چند ثانيه يكي از 4 كليد D R U H رو نشون ميده و ما چند لحظه وقت داريم كه اون كليد رو بزنيم وگرنه يه Error حساب ميشه و هر كليدي هم كه درست بزنيم به عنوان درست در نظر گرفته ميشه.
حالا من اين قسمت موندم: وقتي كليدي رو اشتباه مي زنيم يا نميزنيم يا حتي درست هم ميزنيم برنامه هيچيز حساب نميكنه:cry:. اگه پروژه رو دانلود كنين متوجه منظورم ميشين برنامه نويسيش در حد چند خطه ولي جالبه، شما هم بگيرين يه نگاهي بهش بندازين. اين چند روزه اعصابمو بهم ريخته.:sad:
حجمش 1 كيلوبايته.

ممنون
 

پیوست ها

  • key press.rar
    1 کیلوبایت · بازدیدها: 15

nevercom

کاربر متخصص انجمن مولتی مدیا بیلدر
البته من وقت نکردم برنامتون رو عیب یابی کنم، ولی چندتا نکته به ذهنم رسید که خدمتتون عرض میکنم

اول اینکه شما از تابع rnd استفاده کردین، برای چهار کلید، توجه کنید که این تابع مقداری بین 0 تا عدد مشخص شده باز میگردونه، در کد شما از (rnd(4 استفاده شده، یعنی 5 احتمال وجود داره: 0, 1, 2, 3, 4 که شما در کدتون فقط برای چهارتای اونها یعنی 1 تا 4 از شرط استفاده کردین، یعنی برای زمانی که تابع مقدار 0 رو بر میگردونه شرایطی رو تعیین نکردید

مورد دیگه اینکه شما باید تمام کلیدهای کیبورد رو کپچرکنید، تا نسبت به فشرده شدن اونها هم واکنش نشون بده
 

nevercom

کاربر متخصص انجمن مولتی مدیا بیلدر
خب من کمی پروژتون رو بررسی کردم، مشکلی که شما بهش اشاره کردین، ناشی از یک اشتباه فوق العاده ساده هست
شما در پروژتون از دوتا ScriptTimer استفاده کردین و درواقع قصد داشتین دوتا اسکریپت رو بصورت موازی اجرا کنید، ولی یک اشتباه نحوی کوچک مرتکب شدید؛ شما در اسکریپت تایمرتون فقط نام اسکریپت رو ذکر کردین، و قبلش از عبارت Timer استفاده نکردین، این باعث میشه که تنها یک اسکریپت اجرا بشه و یکی از اسکریپتها اجرا نمیشه، که اسکریپت Check هست
کدی که شما نوشتین بدین شکل هست:
کد:
[FONT=Courier New][SIZE=2][color=#000090][b]ScriptTimer[/b][/color]("Check","[color=#ff0000]5[/color]") 
 
[color=#000090][b]ScriptTimer[/b][/color]("Random","[color=#ff0000]850[/color]") [/SIZE][/FONT]
در صورتی که باید به شکل زیر اسکریپت تایمرها رو اجرا کنید تا هردو اسکریپت بصورت موازی اجرا بشن:
کد:
[FONT=Courier New][SIZE=2][color=#000090][b]ScriptTimer[/b][/color]("Timer1=Check","[color=#ff0000]5[/color]") 
 
[color=#000090][b]ScriptTimer[/b][/color]("Timer2=Random","[color=#ff0000]850[/color]") [/SIZE][/FONT]
البته با این وجود بازهم برنامتون بطور صحیح، اونطور که شما میخاید اجرا نمیشه، چون اسکریپت Check باید پس از هربار فشرده شدن کلیدها اجرا بشه، و یا از روشی استفاده کنید که فشرده شدن و نشدن کلیدها رو تشخیص بده و سپس اقدام به تعیین صحیح یا غلط بودن کلید فشرده شده کنه.
 

blue_rays

Member
سلام. با تشكر از راهنمايي كه كرديد. من ميگم ام ام بي رو يه جورايي يادم رفته سر همين موضوع همين حسابي قاطي كردم. اگه يه نفر بتونه اشكال پروژه رو بگيره و سورس رو بزاره خيلي ممنون ميشم.:sad:

در مورد rnd هم 0 رو در نظر گرفتم به اين صورت كه اي حالت وقفه بين كليد هايي كه ميزنيم باشه يعني يه فرجه باشه و زياد مهم نيستش.

براي اسكريپت Check هم اگر فقط بخواد با همون چهار تا دكمه اجرا بشه بقيه دكمه ها رو تشخيص نميده. من ميخام يه جور باشه كه اگه هر چيزي غير از اون چهار تا دكمه باشه تشخيص بده و همينطور اگه دكمه اشتباه زده بشه و بخاطر اين هم تو اسكريپت Check در خط آخر قبل از تايمر يه دستور گذاشتم كه هر دفعه عبارت كليد زده شده رو خالي ميزاره كه اينجوري اگه كليدي زده نشد در دفعه ي بعد اجراي اسكريپت برنامه از رو همون عبارت خالي بتونه اين مسآله رو تشخيص بده.

اگه سورس تصحيح شده بزاريد خيلي ممنون ميشم چون چند روزه درگيره همينم.
 

nevercom

کاربر متخصص انجمن مولتی مدیا بیلدر
من کمی پروژتون رو تغییر دادم
سوروس رو براتون پیوست میکنم
البته باید کمی روش بیشتر کار کنید تا دقیقاً اون چیزی بشه که میخاید
ضمناً یه مثال هم از شناسایی کلیدهای فشرده شده توسط پلاگین SmallPlugin براتون ساختم که اونهم پیوست کردم، بیشتر کلیدها رو ساپورت میکنه، برای کلیدهای خاص هم میتونید از پلاگین SysMetrics کمک بگیرید
با ادغام این دو میتونید پروژتون رو کاملتر کنید
 

پیوست ها

  • Key Press [Modified].rar
    936 بایت · بازدیدها: 15
  • Key Detection.rar
    12.1 کیلوبایت · بازدیدها: 16

blue_rays

Member
خيلي ممنون. همينو ميخواستم. شما دقيقآ همون چيزي كه ميگفتمو درست كرديد.:)
ولي آخر نفهميدم اشكال كارم كجا بود.

بازم تشكر:rose:
 

nevercom

کاربر متخصص انجمن مولتی مدیا بیلدر
خواهش میکنم :)

در پست شماره ی 3 براتون توضیح دادم، شما برای محاسبه ی تعداد خطاها و کلیدهای درست، از اسکریپتی بنام Check استفاده کرده بودید، که این اسکریپت و اسکریپت Random احتمالاً قرار بوده هردو بطور موازی اجرا بشن، چون میدونید که در MMB اگر ما دوتا دستور RunScript رو پشت سر هم بنویسیم، تا اسکریپت قبلی به اتمام نرسه، اسکریپت بعدی اجرا نمیشه، برای حل این معضل از اسکریپت تایمرها استفاده میشه که در نسخه ی 4.9.8.13 تعدادشون به 1000 عدد رسیده یعنی در تئوری میشه 1000 اسکریپت رو بصورت همزمان و موازی باهم به اجرا در آورد
حدس من این بود که قصد شما این بوده که این دو اسکریپت هردو با هم اجرا بشن، یکی هر 850 میلی ثانیه و دیگری هر 50 میلی ثانیه، ولی چون شما در کدهاتون فقط از دستور ScriptTimer استفاده کرده بودین، و برای هر اسکریپت یک تایمر (از 1000 تایمر موجود) مشخص نکرده بودین، عملاً بدلیل حلقه ای که در هر اسکریپت وجود داشت، که اسکریپت در انتها باز خودش رو صدا میزد، فقط یکی از اسکریپتها اجرا میشد، و دیگری فرصت اجرا پیدا نمیکرد، که اون اسکریپت، اسکریپت Check بود که وظیفه ی محاسبه ی امتیاز رو بر عهده داشت.
 

blue_rays

Member
خواهش میکنم :)

در پست شماره ی 3 براتون توضیح دادم، شما برای محاسبه ی تعداد خطاها و کلیدهای درست، از اسکریپتی بنام Check استفاده کرده بودید، که این اسکریپت و اسکریپت Random احتمالاً قرار بوده هردو بطور موازی اجرا بشن، چون میدونید که در MMB اگر ما دوتا دستور RunScript رو پشت سر هم بنویسیم، تا اسکریپت قبلی به اتمام نرسه، اسکریپت بعدی اجرا نمیشه، برای حل این معضل از اسکریپت تایمرها استفاده میشه که در نسخه ی 4.9.8.13 تعدادشون به 1000 عدد رسیده یعنی در تئوری میشه 1000 اسکریپت رو بصورت همزمان و موازی باهم به اجرا در آورد
حدس من این بود که قصد شما این بوده که این دو اسکریپت هردو با هم اجرا بشن، یکی هر 850 میلی ثانیه و دیگری هر 50 میلی ثانیه، ولی چون شما در کدهاتون فقط از دستور ScriptTimer استفاده کرده بودین، و برای هر اسکریپت یک تایمر (از 1000 تایمر موجود) مشخص نکرده بودین، عملاً بدلیل حلقه ای که در هر اسکریپت وجود داشت، که اسکریپت در انتها باز خودش رو صدا میزد، فقط یکی از اسکریپتها اجرا میشد، و دیگری فرصت اجرا پیدا نمیکرد، که اون اسکریپت، اسکریپت Check بود که وظیفه ی محاسبه ی امتیاز رو بر عهده داشت.

واي. عجب اشتباه تابلويي :D
بله درست ميگيد. بعضي وقتا تو برنامه نويسي همچين مشكلاتي پيش مياد كه آدم خودش نميفهمه و اعصابش خورد ميشه از اينكه چرا برنامه درست كار نميكنه.:there:
مرسي
دارم دوباره وارد دنياي ام ام بي ميشم!
راستش همش از يه ايده شروع شد فكر ميكنم از توي سورس يه قسمتش خودمو لو دادم:D. ولي وقتي برنامم كامل شد ميزامش!
 
آخرین ویرایش:

جدیدترین ارسال ها

بالا