کامپیوتر چگونه شطرنج بازی می کند

کامپیوتر چگونه شطرنج بازی می کند ؟
اگر تا بحال شطرنج بازی کرده باشید احتمالا اولین روزهایی که بازی شطرنج رو یاد گرفتید به خاطر میاورید . اگر هم به خاطر نمی آورید حتما تابحال نحوه یادگیری بازی شطرنج یک نفر را دیده اید .
برای یادگیری ابتدا نام مهره ها ، بعد نحوه حرکت و نحوه حمله مهره ها و در آخربعد از اینکه کاملا با مهره ها آشنا شدید شروع به بازی می کنید . ابتدا مهره سفید شروع به بازی می کند و بعد هم مهره سیاه اما نهایتا به راحتی می باختید و بعد از هر باخت یا بعد از هر از دست دادن مهره با جملاتی از قبیل "وای ! اصلا حواسم نبود " یا " عجب ! چه جالب " و جملاتی از این قبیل هیجان خودتون رو از این بازی نشون می دادید.
مغز انسان به گونه ای طراحی شده که با تمرین و ادامه کار مخصوصا در بازی شطرنج به مهارت ویژه ای می رسد . یعنی شما اگر یک هفته است که شطرنج بازی می کنید . بازی شما با روز اول قابل مقایسه نیست . چون مدام تکنیک های جدیدی با هر بازی یاد گرفته اید . شاید هم انقدر مشتاق شده اید که شروع به خواندن کتابهای شطرنج باز های حرفه ای کرده اید و تکنیک های حرفه ای تری یاد گرفته اید .
از جملات بالا نتیجه می گیریم که بازی شطرنج برای انسان به میزان زیادی از تفکر و تجزیه و تحلیل آن هم در سطح بالا نیاز دارد . اما نکته جالب اینجاست که کامپیوتر برای بازی شطرنج هیچ یک از اعمال فوق را انجام نمی دهد . شاید بعضی به اشتباه فکر کنند که کسی که بازی شطرنج کامپیوتری را نوشته است خود یک شطرنج باز حرفه ایست . اما باید بدانید که بهیچ وجه اینگونه نیست .
ظاهرا بازی شطرنج از آن دسته بازی هایی است که بسیار زیاد نیاز به تفکر و تجزیه و تحلیل و در نهایت تصمیم دارد و ظاهرا منحصر به بشر است . این درحالیستکه کامپیوتر بدون قدرت فکر کردن و تجزیه و تحلیل به قدری در بازی شطرنج مهارت دارد که بزرگترین شطرنج باز های دنیا هم از بردن آن عاجز هستند .
دراین مقاله متوجه می شویم که کامپیوترها بهیچ وجه مشابه بشر شطرنج بازی نمی کنند . یعنی برای بازی شطرنج اصلا فکر نمی کنند . بلکه با کمک توابع و فرمول های ریاضی شروع به انجام یک سری محاسبات می کنند و در نتیجه مهره مورد نظر را حرکت می دهند . حال هر چه سرعت کامپیوتر در انجام این گونه محاسبات بیشتر باشد قدرت کامپیوتر برای بازی کردن نیز بیشتر می شود . در این مقاله اشاره ای جهت آشنایی با یکی از الگوریتم های معروف و پرکاربرد بازی شطرنج می کنیم تا متوجه شوید که چه فرآیندی در پیروزی کامپیوتردرمقابل بشر موثر است .
برای شروع به یک تخته بازی با ابعاد 8*8 نیاز داریم . هر یک از طرفین 16 مهره در اختیار دارند . فرض را بر این بگیریم که مهره های سفید برای کامپیوتر و مهره های سیاه برای ما باشد .
همانطور که می دانید شروع بازی با مهره سفید است ، بنابراین کامپیوتر اقدام به حرکت مهره سفید می کند . اما اینکه کدام مهره را حرکت دهد جای بحث دارد . می دانیم که مهره سفید یا سیاه برای شروع بازی هر کدام می توانند 20 حرکت انجام دهند :
• 8 حرکت برای سربازها اگر یک خانه به جلو بروند ، 8 حرکت دیگر اگر همان سربازها دو خانه به جلو بروند .
• دو حرکت برای هر یک از اسب ها (دو اسب) که در جمع 4 حرکت می شود .
بنابراین هر مهره سفید یا سیاه برای شروع می تواند یکی از 20 حرکت ممکن را انتخاب کند .
حال فرض کنیم کامپیوتر بدون توجه به ارزش حرکات ؛ یکی از این 20 حرکت را انتخاب می کند و بازی را شروع می کند . بعد از این حرکت نوبت به مهره مشکی می رسد ، مهره مشکی هم می تواند یکی از 20 حرکت مورد نظر خود را انجام دهد .
دوباره نوبت به کامپیوتر می رسد تا مهره دوم خود را حرکت دهد . اما اینبار بسته به اینکه کدام یک از مهره ها را در حرکت قبل حرکت داده است می تواند به تعداد 20 حرکت یا کمتر یا بیشتر را انتخاب نماید . و دوباره مهره مشکی هم بسته به حرکت قبلی خودش می تواند مهره ها را تکان دهد .
نکته کار اینجاست که کامپیوتر از کجا بداند کدام یک از این 20 حرکت یا کمتر یا بیشتر را انجام دهد . کامپیوتر برای حل این مساله با درست کردن درختی در حافظه خود تمامی حرکات ممکن را انجام می دهد تا بهترین نتیجه را بدست بیاورد . فرض می کنیم به این ترتیب باشد که برای حرکت اول برای هر کدام از 20 حرکت یک بار بازی را تمام می کند باین ترتیب که بعد از حرکت دادن مهره در حافظه خود فرض را بر این می گیرد که طرف مقابل کدام مهره را حرکت خواهد داد و اگر حرکت داد خودش کدام مهره را حرکت بدهد تا در نهایت بازی را ببرد . یعنی اگر در مرحله اول امکان 20 انتخاب را دارد مهره مشکی می تواند بسته به حرکت مهره سفید 20*20 حرکت انجام دهد . بنابراین در حرکت دوم خود می تواند 400*20 حرکت را انتخاب کند و دوباره مشکی 8000*20 انتخاب و به همین ترتیب این تعداد حرکات ممکن پیش بینی می شود تا بازی تمام شود . عدد حاصل عدد یک بهمراه 120 عدد صفر در جلوی آن خواهد بود . این عدد 10120 در مقابل عددی مانند تعداد کل اتم های دنیا که معادل 1075 می باشد بسیار بزرگ است . بنابراین متوجه می شوید که بازی شطرنج تا چه حد می تواند پیچیده باشد .
اما واقعیت اینستکه هیچ کامپیوتری نمی تواند کل درخت مورد نظر را ایجاد کند . و تمام 10120 حرکت ممکن را انجام دهد . بلکه کامپیوتر به جای تمام کردن کل بازی می تواند 3 یا 5 یا حتی 10 تا 20 حرکت بعدی را انجام دهد (‌پیش بینی کند) . اگر فرض را بر این بگیریم که برای هر حرکت مهره در بازی تنها 20 انتخاب داریم برای ایجاد یک درخت 5 مرحله ای که بتواند 5 حرکت جلوتر را پیش بینی کند 320000 حرکت ممکن باید بررسی شود . همچنین اگر بتوان یک درخت 10 مرحله ای ایجاد کرد بنابراین می توان 10000000000000 ( 10 تریلیون) حرکت ممکن را بررسی کرد . بنابراین در اینجاست که سرعت کامپیوتر برای بازی شطرنج مشخص می شود . هرقدر سرعت کامپیوتر برای بازی بیشتر باشد حرکات اینده بهتری در نتیجه با قدرت بیشتری پیش بینی می شود . اما واقعیت اینجاست که پرسرعتترین کامپیوتر شطرنج باز دنیا تنها می تواند تا چند میلیون حرکت را در هر ثانیه پیش بینی کند .
اما کار به همین جا تمام نمی شود پس از تولید درخت کامپیوتر باید به ارزیابی موقعیت های درست شده بپردازد و اینکه تشخیص دهد که کدام حرکت را انجام دهد تا بهترین حرکت ممکن باشد .
اولین گام برای ارزیابی تعداد مهره هایی ست که کامپیوتر در صفحه شطرنج خواهد داشت . برای انجام این کار به کمک یک تابع ارزیابی می تواند تعداد مهره هایی که هر یک از طرفین بعد از حرکت مهره خواهند داشت را محاسبه کند . به کمک تابع ارزیابی می تواند تشخیص دهد که حرکتی که انجام دهد "خوب" است یا "بد" . اگر خوب است مهره را حرکت می دهد و اگر بد حرکت دیگری را انتخاب می کند . مثلا اگر کامپیوتر در انتهای حرکت 11 مهره خواهد داشت و حریف 9 مهره در نهایت دو مهره( 2=9-11 ) بیشترخواهد داشت که این نتیجه "خوب" دارد .
البته تابع فوق برای بازی شطرنج بسیار ساده است و تنها ملاک برای بازی تعداد مهره ها نیست . همانطور که همه می دانیم هر کدام از مهره ها برای خود ارزشی دارند . موقعیت و محل مهره ها نیز قابل توجه است . اینکه آیا شاه ما در خطر کیش هست یا خیر . وزیر ما در خطر از دست رفتن می باشد یا خیر و موارد دیگر . اینجا وظیفه برنامه نویس است که فرضا با ارزش گذاری روی مهره ها با اعداد بتواند ارزش مهره ها را مشخص کند مثلا قلعه معادل 5 سرباز است . فارغ از اینکه تابع ما چه پیچیدگی های دیگری می تواند داشته باشد . مهم اینستکه تابع ما در نهایت چه عددی بر می گرداند . که این تابع نشانگر میزان خوب یا بد بودن حرکتی است که قرار است انجام شود .
برای تشریح بیشتر مساله سعی می کنیم یک درخت سه مرحله ای که قابلیت درست کردن سه حرکت آینده را دارد را بکشیم و مساله را روی آن دنبال کنیم .
فرض را براین می گیریم که در هر حالت هر یک از مهره ها می توانند تنها سه حرکت انجام دهند .



کامپیوتر مهره سفید است و می تواند یکی از سه حرکت ممکن را انجام دهد . اگر هر یک از سه حرکت ممکن را انجام دهد مهره گردان مشکی هم میتواند سه حرکت انجام دهد ( در عمل تعداد حرکات بیشتر است که بدلیل بزرگ شدن درخت از کشیدن تمامی حالات صرف نظر می کنیم ) . بعد از حرکت مهره های سیاه مهره های سفید هم میتوانند دو حرکت انجام دهند . (پایین ترین مرحله درخت ) . parsx
اما برای تحلیل درخت کامپیوتر از پایین ترین گره ( برگ) شروع به محاسبه می کند از سمت چپ پایین عدد بین دو برگی که ارزش 8 و 2 دارند عدد 8 انتخاب می شود این بآن دلیل است که از آنجایی که مهره سیاه حریف است باید پرارزشترین حرکت را انتخاب کرد ( مهره سیاه = ماکسیمم) از بین برگ های 4 و 8 هم 8 را انتخاب می کند و بهمین ترتیب تا درخت به شکل زیر در می آید :


حال که به انتخاب حرکت مشکی رسیدیم باید مقادیر مینیمم را در مرحله دوم یعنی عمق 3 ( مهره های مشکی ) انتخاب کنیم یعنی بصورت قراردادی حرکات مهره های سفید که خودش می باشد باید کمترین ارزش را داشته باشند بنابراین از سمت چپ بین سه عدد 887 عدد 7 برای مهره سفید سمت راستی قرار می گیرد و برای بعدی عدد 5 و بعدی عدد 4 بنابراین شکل درخت به شکل زیر در می آید :


همانطور که از شکل پیداست نوبت به انتخاب برای حرکات سفید است بنابراین باید دوباره ماکسیموم مقادیر را انتخاب کنیم . اکنون کامپیوتر آماده انتخاب مقدار ماکسیموم از بین سه عدد 754 می باشد بنابراین کامپیوتر حرکتی که ارزش 7 دارد را انتخاب می کند ( ماکسیموم) . parsx
الگوریتم حل این مساله به الگوریتم minimax مشهور است که در این مساله ما مهره های سفید را ماکسیموم و مهره های سیاه را مینیموم نامیدیم و به صورت یک در میان از بین اعداد به ترتیب اعداد ماکسیموم و مینیموم را انتخاب می کنیم .
بعد از آنکه کامپیوتر حرکت به ارزش 7 را انجام داد . منتظر می ماند تا مهره سیاه نیز حرکت خود را انجام دهد . پس از آن دوباره درختی به شکل فوق درست می کند و به ادامه بازی می پردازد . البته این الگوریتم با روشهایی چون هرس آلفا بتا قابلیت های بالاتری از لحاظ سرعت و حجم حافظه مصرفی پیدا می کند که از تشریح جزئیات بیشتر خودداری می کنیم .
بنابراین به این نتیجه رسیدیم که کامپیوتر برای بازی شطرنج بهیچ وجه راجع به برد یا باخت فکرنمی کند بلکه با انجام عملیات محاسباتی از طریق تابعی که تشریح کردیم به حل مساله می پردازد . تا اینکه صفحه شطرنج را به نفع خودش در حالت "خوب" یا "بد" برساند . در این بین الگوریتم های دیگری نیز برای حل مساله صفحات شطرنج وجود دارند که علاقمندان می توانند برای اطلاعات بیشتر به جستجو در این زمینه بپردازند .

یک قفل سخت افزاری بسازیم

یک قفل سخت افزاری بسازیم . :
پورت موازی Parallel یکی از مفیدترین و پرکاربردترین پورتهای کامپیوتر است که کاربران و طراحان برای متصل کردن مداراتی که طراحی کرده اند از آن استفاده میکنند . در این مقاله سعی بر ان میکنم که نحوه استفاده از این پورت را فرا بگیرید . جالب است بدانید که حتی میتوانید با این پورت یک ربات را نیز کنترل کنید . اما در اینجا مبنای کار را در طراحی یک قفل سخت افزاری میگذاریم .
حتما شده است که قفلهای سخت افزاری نرم افزارهای مختلف را در هنگام خرید نرم افزار نیز خریده باشید . شاید برایتان جالب باشد بدانید این قفل چگونه طراحی شده است و اساس کار ان چیست ؟
اگر این مقاله را بخوانید بزودی متوجه خواهید شد که درون تراشه ای که به شما بعنوان قفل سخت افزاری داده شده است چیزی چندان پیچیده نخواهد بود ...
در ابتدا چند تذکر میدهم اینکه :‌
پورت موازی PC ها بسیار حساس هستند کافیست با کمی اشتباه در کار کردن با این پورت کل این پورت را از بین ببرید . اکثرا هم تعمیر این پورت پرهزینه است و شاید بصرفه تر باشد تا یک مادربرد جدید بخرید . بنابراین پیشنهاد میکنم اگر از صحت عملکرد خود و یا مداری که قرار است به این پورت متصل شود اطمینان ندارید یک کارت I/O بخرید و با ان پورت کار کنید . که اگر هم قرار شد ان را خراب کنید . فقط همان کارت را تعویض کنید . این کارت شما میتواند روی اسلات PCI/ISA باشد .
تشریح پورت موازی Parallel
یک پورت موازی 25 پین ماده دارد که عموما برای اتصال پرینتر به کامپیوتر مورد استفاده قرار میگیرد . اما خیلی از سخت افزار ها میتوانند از این پورت اتصال برقرار کنند .
تمام این 25 پین همیشه مورد استفاده نیستند . شاید گاهی تنها یک پین را بخواهید استفاده کنید . parsx
ابتدا به معرفی پین های این پورت میپردازیم :

در شکل فوق شمایی از یک پورت موازی را میبینید که اصولا این پینها از راست به چپ و از بالا به پایین شماره گذاری میشوند . یعنی بالایی ترین و سمت راست ترین پین ، پین شماره 1 و سمت چپ ترین و بالاترین پین شماره 13 و پایین ترین و سمت چپ ترین پین شماره 25 است .
این 25 پین به چهار گروه تقسیم بندی میشوند :

دوازده پین از 25 پین فوق نقش خروجی را دارند و اطلاعات را از کامپیوتر به خارج میفرستند . که هشت پین از این دوازده پین از پین شماره 2 تا 9 هستند که روی هم یک بایت را تشکیل میدهند و به این هشت پین پینهای Data گویند.
پین های 18 تا 25 که در شکل سبز رنگ هستند پینهای GND زمین هستند . از لحاظ منطقی مقدار ارزشی صفر و از لحاظ مفهومی انگار که به زمین متصل هستند .که در این مبحث کاری به آنها نداریم .
پینهای 10 و 11 و 12 و 13 و 15 که به رنگ قرمز رنگ هستند به عنوان ورودی کاربرد دارند . که مقادیر پیشفرض آنها یک است و پین شماره 11 مقدار پیشفرض صفر دارد. بنابراین بایت ورودی که متشکل از پینهای 10 تا 15 هست ( در شکل با S7 تا S3 نمایش داده شده اند) مقدار پیشفرض 127 دارد که معادل دودویی آن 01111111 می باشد .
پینهای شماره 1 و 14 و 16 و 17 نیز بیتهای خروجی هستند که به این چهار پین پینهای STATUS گویند ، که در این مبحث کاری با این پین ها نداریم .parsx
بنابراین نتیجه می گیریم اگر قرار باشد این پورت به پرینتر متصل باشد از طریق پین های شماره 2 تا 9 اطلاعات را به پرینتر می فرستد . و اگر قرار باشد اطلاعاتی را به کامپیوتر از طریق این پورت وارد کنیم م تنها از طریق پینهای شماره 10 تا 13 و 15 می توانیم این کار را انجام دهیم .


حال که با پورت Parallel آشنا شدید نوبت به مقدار دهی پین های این پورت میرسد . همانطور که گفتیم برای قفلمان تنها از دو قسمت ورودی و خروجی این پورت استفاده می کنیم .
عملکرد یک قفل سخت افزاری به این صورت میتواند باشد که هرلحظه یا در زمان معینی برنامه شما ورودی پورت Parallel را چک کند اگر برابر مقداریست که شما در برنامه خود تعیین کرده اید انگاه قفل به پورت متصل است . اما اگر قفل شما به پورت متصل نیست یعنی قفل از پورت جدا شده است یا اتفاقی افتاده است که قفل درست کار نمیکند .
پس باید بتوانیم مقدار را از پورت بخوانیم . (پینهای ورودی) اما چطور می توان اطلاعات را به این پورت وارد کرد . برای انجام این کار میتوانید از قسمت خروجی پورت استفاده کنید . در ساده ترین حالت یعنی مقداری را به خروجی بفرستید و آنگاه همان مقدار را در ورودی بخوانید . اگر این اتفاق ساده در طول اجرای برنامه بیفتد قفل درست کار می کند .
بنابراین باید پینهای خروجی را به پین های ورودی متصل کنید . یک رشته سیم تلفن را بردارید و پین شماره 2 را به پین شماره 15 متصل کنید . بنابراین از این پس هروقت ما پین شماره 2 را صفر کنیم پین شماره 15 هم بصورت خودکار 0 می شود و اگر این سیم را قطع کنیم این پین همان مقدار پیشفرض خود یعنی یک باقی می ماند . که در این مثال این مقدار را صفر می کنیم در نتیجه خروجی ما به صورت 01110111 در می آید که معادل 119 می باشد .
در این مثال ساده ترین حالت ممکن را بیان کردیم می توانید از 5 رشته سیم هم برای ارتباط پین های خروجی به ورودی هم استفاده کنید . مثلا پینهای شماره 2و4و5و6و7 را به پینهای شماره 11و12و13و15و10 متصل کنید یا میتوانید پینهای شماره 9و8و2و3و4 را به پین های شماره 12و13و11و10و15 متصل کنید . و صدها حالت مختلف دیگر . این بستگی به سلیقه خود شما دارد . چرا که مهم این است که در ورودی چه مقداری می خوانید . همانطور که می بینید می توانید از یک رشته سیم یا حداکثر از 5 رشته سیم ( چون حداکثر 5 پین ورودی داریم ) برای ارتباط پین ها استفاده کنید .
پس از ارتباط پین ها می توانید باز هم به دلخواه خودتان هرکدام را که می خواهید روشن یا خاموش کنید ( یعنی مقدار 1 یا 0 بدهید ) . برای خاموش یا روشن کردن این پین ها باید فرآیندی را طی کنید به این صورت که هر مقدار دلخواه بین 0 تا 255 ( چون تنها هشت بیت خروجی داریم پس می توانیم تنها یک بایت اطلاعات بفرستیم ) را به خروجی بفرستید و آنگاه ببینید در ورودی چه مقداری حاصل می شود که این مقدار ورودی دقیقا بستگی به این دارد که چه تعداد از پینهای خروجی را به پین های ورودی متصل کرده اید ؟ آیا مثل ما از یک رشته سیم استفاده کرده اید یا 3 رشته یا از هر 5 رشته استفاده کرده اید ؟ آیا پین شماره 2 را به پین شماره 10 متصل کرده اید یا به پین شماره 11 ؟‌
همانطور که می بینید مقدار ورودی شما بستگی به این دارد که پین ها را چگونه به هم متصل کرده اید و هم اینکه چه مقداری را در خروجی فرستاده اید .
برای اینکه متوجه شویم چه مقداری در ورودی خوانده شده است باید برنامه ای بنویسید که این مقدار ورودی را به شما نمایش دهد . یااگر کمی مهارت در trace کردن برنامه داشته باشید می توانید بدون نوشتن این برنامه اضافی برای خواندن پورت مقدار خوانده شده از پورت ورودی را بخوانید .


ارتباط Visual Basic با پورت موازی :
Microsoft Visual Basic6 را از آن جهت انتخاب کردیم که یادگیری آن نسبت به باقی نرم افزارهای برنامه نویسی ساده ترو همچنین در بین کاربران عمومی تر می باشد . ضمنا بحث های پیچیده سخت افزاری را نیز ندارد .
اما Visual Basic از انجایی که سطح بالاست . قدرت ارتباط با سخت افزار کامپیوتر را مانند زبانهای برنامه نویسی C و مخصوصا اسمبلی را ندارد . هرچند QBasic این قابلیت را دارد !!!
اما این نقطه ضعف این نرم افزار نیست بلکه این برنامه با استفاده از Dynamic Linked Library یا DLL ها میتواند این نقصان را برطرف کند .
بنابراین برای ارتباط با پورت موازی یا هر قطعه سخت افزاری شما میتوانید با زبان برنامه نویسی دیگری برنامه ای بصورت DLL بنویسید و انرا وارد VB کنید .
بنابراین برای نوشتن این قفل به یک فایل Dll نیاز داریم تا بتوانیم با قفل ارتباط برقرار کنیم . این فایل را می توانید به راحتی با جستجوی iodll در اینترنت به صورت رایگان دانلود کنید .
پس از دانلود فایل io.dll آن را در شاخه سیستم خود کپی کنید :

%systemroot%\system32


برای استفاده از فایل در پروژه باید انرا در بخش module استفاده کنید تا برای کل پروژه قابل تعریف شده باشد . ( برای اضافه کردن ماژول به پروژه روی نام پروژه در پنجره project کلیک راست کنید و گزینه add module را انتخاب کنید . )
بنابراین در ماژول یک کد زیر را وارد کنید :

Public Declare Sub PortOut Lib "io.dll" (ByVal Port As Integer, ByVal value As Byte)
Public Declare Function PortIn Lib "io.dll" (ByVal Port As Integer) As Byte
دکلریشن اولی برای ساب پراسیجر portout ‌ میباشد . که دو ارگومان دارد اولی ادرس پورت است بصورت int که ادرس انرا باید از systeminfo یا از device manager پیدا کنید . اما بیشتر در اکثر کامپیوتر ها ادرسهای 378H برای بخش خروجی پورت پرینتر LPT1 و ادرس 379H برای ورودی می باشد .
که برای استفاده انها در portout برنامه ما باید انها رابه دسیمال تبدیل کنید یعنی بترتیب 888 ، 889 در این قسمت مقدار 888 را میفرستید . پس آدرس پورت موازی ما طبق استاندارد گفته شده برای قسمت خروجی 888 می باشد . اما آرگومان دوم PortOut مقداریست که به خروجی می فرستید . این مقدار همانطور که قبلا هم گفتیم می تواند بین 0 تا 255 باشد . ما بدلخواه عدد 0 را می فرستیم .
در تابع PortIn ادرس پورت ورودی را وارد میکنید 889 . این تابع مقدار خوانده شده از پین های ورودی را بر می گرداند .
همانطور که گفتیم ما در قفلمان پین شماره 2 را به پین شماره 15 توسط تنها یک رشته متصل می کنیم. آنگاه عدد دلخواهمان که 0 بود را به خروجی می فرستیم . حال باید ببینیم در ورودی چه مقداری خوانده می شود .
از یک برنامه کمکی برای خواندن مقدار ورودی استفاده می کنیم بنابراین برنامه دیگری موقتا می نویسیم و در آن با تعریف ماژول گفته شده مقدار ورودی را چاپ می کنیم . تا بدانیم در برنامه اصلی که قرار است قفل برای آن باشد چه مقداری خوانده شود .
یک دکمه در فرم برنامه موقتتان قرار دهید و در کد دکمه کد زیر را وارد کنید :

Call PortOut(888,0)
lckTemp = PortIn(889)
 label1.text = lckTemp

در label1 که در فرم برنامه تان قرار داده اید مقدار خوانده شده چاپ می شود . که در مثال ما عدد 119 خوانده می شود .
حال که مقدار ورودی را می دانیم شروع به نوشتن برنامه اصلی می کنیم .

نحوه عملکرد برنامه در ارتباط با قفل :
قرار بر این است که برنامه به شرطی اجرا شود که این قفل ساده ما (یک رشته سیم گفته شده ) به پورت متصل باشد بنابراین مداما در طول اجرای برنامه باید مقدار ورودی پورت موازی را با عددی که در برنامه فوق بدست آوردیم چک کنیم . عدد بدست آمده در برنامه گفته شده مقدار 119 بود .
در ویژوال بیسیک کنترلی به نام تایمر میتواند بصورت مداوم عملیات مورد نظر شما را تکرار کند . عملیات مورد نظر ما خواندن مقدار پورت موازی و چک کردن مقدار آن با مقدار مورد نظرمان که 119 می باشد است . در صورتیکه این مقدار خوانده نشود برنامه باید از کار بیفتد یا حداقل با پیغامی به کاربر بگوید که قفل را سر جایش قرار دهید .
حال می خواهیم توسط یک تایمر همیشه این مقدار ورودی را چک کنیم . بمحض اینکه این مقدار تغییر کند یا از بین برود ( قفل از جایش در بیاید )‌ برنامه بحالت معلق در بیاید و درخواست قفل کند .
کد تایمر شما می تواند به این صورت باشد :
Private Sub lcktmr_Timer()
Dim lckTemp As Integer
Call PortOut(888, 0)
lckTemp = PortIn(889)
If lckTemp <> 119 Then
 Call MsgBox("Insert Hardware-Lock in Parallel Port" _
    , vbOKCancel, "Warning...")
End
   End If
تشریح کد :
Call PortOut(888, 0)
lckTemp = PortIn(889)

در این خط عدد 0 را به خروجی ارسال کرده ایم که پینهای 2 تا 9 را مقدار دهی میکند .
If lckTemp <> 119 Then

در اینجاست که بودن یا نبودن قفل مشخص میشود . چون مقدار 0 را ارسال کرده ایم انتظار داریم مقدار 119 خوانده شود وگرنه قفل یا خراب است یا نیست . بنابراین مقدار خوانده شده در lckTemp چک میشود که مخالف 119 است .

Call MsgBox("Insert Hardware-Lock in Parallel Port" _
    , vbOKCancel, "Warning...")
End

پس بعد از دادن اخطار از برنامه خارج می شود .


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