هجوم المستنسخين: تقنيات القيادة الحديثة

"الآن تكتب أصعب برنامج في حياتك ، والذي سيضيف ببساطة رقمين"
إيرينا ريجوفا


ألعاب المقامرة الذكية على الإنترنت هي خطوة مبهمة في الروبوتات. حتى إذا كان مطورو برامج الألعاب ينفقون الكثير من المال على اصطياد الروبوتات ، كما هو الحال في غرف البوكر عبر الإنترنت ، على سبيل المثال ، لا يزال هناك احتمال كبير للتعثر على "روبوت ذكي" ، اللعبة التي ستكون فيها واحد لواحد. خاصة إذا كان البوت غير محصن على الإطلاق ... لأن لا أموال ستحمي النظام الذي يمر من خلاله الكثير من الأموال.


التين. 1. يأتي Botovody


التهديد الخفي


ألعاب المقامرة الفكرية عبر الإنترنت غير آمنة. غير الآمنة بشكل خاص هي تلك التي تدور فيها الأموال الحقيقية. يتجلى انعدام الأمن في المقام الأول في حقيقة أنه من المستحيل أن تعرف على وجه اليقين مع من تلعب: مع شخص حي ، أو مع روبوت. في الحالة الثانية ، ستكون المباراة في هدف واحد. في ألعاب "الفائدة" ، - الشطرنج والشيكرز على mail.ru ، على سبيل المثال ، - ينظر أصحاب الألعاب عبر الإنترنت إلى botovotirovanie من خلال أصابعهم. في الألعاب متعددة اللاعبين عبر الإنترنت ، والتي تتميز إلى حد ما بالأموال الحية ، يتم إيلاء المزيد من الاهتمام لالتقاط الروبوتات. ومع ذلك ، حتى إذا كان نهج قمع botswood شديد الخطورة - كما حدث على سبيل المثال في غرف البوكر عبر الإنترنت - فلا يزال هناك احتمال كبير للتعثر في الروبوت.

ينفق مطورو برامج البوكر الكثير من المال لفضح الروبوتات ، ومع ذلك ، فإن بوتسوانا البوكر عبر الإنترنت تزدهر. لأنه لا يمكن للمال أن يحمي النظام الذي يمر من خلاله الكثير من المال. بوتوفودوف والصيدون من البوتات ، - تحليل حيل المعارضين واتخاذ الإجراءات المضادة المناسبة - يفوز بالتناوب. قد يعتقد شخص ما أن المعركة بينهما لن تنتهي أبدًا. ومع ذلك ، هناك مخطط قيادة آمن للبوت يمر أمامه صائدو الروبوتات. من المثير للاهتمام أنه حتى لو كان "المقاتلون من أجل العدالة" سيكونون في أيديهم بالتفصيل رموز المصدر المعلقة للبوت ، فلن يتمكنوا من إثبات حقيقة استخدامه. يعد تنفيذ هذا المخطط حدثًا مكلفًا ، ومع ذلك ، نظرًا لأن الفائدة المحتملة كبيرة ، فإن الخطة ذات صلة تمامًا.

#

– , . – , . ( , ), «-» ( , - ). , , , , -, . , . , , , - ( ); , .. - . - , . - (3, , , , ..). . . . – - -- ( , ). -, , , , , – . - – - , - ( . « »).




: , .أولاً ، يلتقط البوت صورًا للحالة الحالية للعبة - إما عن طريق لقطة شاشة أو عن طريق اعتراض حركة مرور الشبكة. ثانيًا ، يقرر البوت ما يجب فعله في هذه الظروف ، ويلجأ أحيانًا إلى برامج الطرف الثالث (على سبيل المثال ، في حالة الشطرنج ، يمكنه التفاعل مع نوع من محركات الشطرنج). أخيرًا ، ثالثًا ، يحاكي البوت تفاعل المستخدم مع لوحة المفاتيح والماوس. علاوة على ذلك ، فإن هذه الدورة الثلاثية - التي يسعى متعقبو الروبوتات إلى تتبعها وكسرها - تكرر نفسها. وبناءً على ذلك ، تدور المعركة بين بوتوفودوف و "مقاتلون من أجل العدالة" على ثلاث جبهات. هذه المعركة لها تاريخ طويل ومثير ، ومع ذلك ، سنركز فقط على مبارتها النهائية ، حيث عانى "المقاتلون من أجل العدالة" ، في مواجهة روبوت منيع تمامًا ، من إخفاق غير مشروط.

يتم تحقيق التكنولوجيا المعطلة من خلال التصوير غير المرئي والتحليل غير المرئي والمضاهاة غير المرئية. من المستحيل القيام بذلك على جهاز كمبيوتر واحد. بادئ ذي بدء ، لأن برنامج البوكر الحديث يحتوي على عناصر مجموعة الجذر.

#

. , , , , - : « , ». - « » « » . , , – .

, . , . , – , , -. – .

, , , : «» , . , – , – , «- ».

– . , « », « » . , – , – . , , – .

, , . , , . , , , , - , . – «».


, .. , .الحل هو إطلاق البوت ليس على محطة العمل التي يتم لعب اللعبة منها ، ولكن على جهاز كمبيوتر منفصل - محاكي. بعد ذلك ، مع مراعاة ثلاثة شروط بجنون العظمة ، لن تتاح لبرنامج البوكر فرصة التعرف على حقيقة المحاكاة: 1) يجب ألا تتمكن محطة العمل والمحاكي من الاتصال عبر الشبكة ؛ 2) لتصوير الحالة الحالية للعبة ، يجب عليك استخدام الإخراج التناظري لبطاقة الفيديو ، - متصل بـ "كمبيوتر الشاشة" باستخدام بطاقة التقاط الفيديو ؛ 3) لمحاكاة لوحة المفاتيح والماوس ، يجب عليك استخدام أداة برامج الأجهزة ، والتي يتم توصيل إدخالها بجهاز كمبيوتر المحاكي ، والإخراج - إلى محطتي عمل PS / 2 يتم تشغيل اللعبة منه. إنه إخراج الفيديو التمثيلي و PS / 2 الذي لا يعرفه برنامج البوكر أن بعض المعدات الإضافية متصلة بالكمبيوتر.



عند محاكاة لوحة المفاتيح والماوس ، يجب أن تأخذ في الاعتبار الظروف البيومترية والتقنية ذات الصلة ، والتي يمكن مراقبتها أيضًا بواسطة برنامج البوكر. أما بالنسبة للقياسات الحيوية ، عند محاكاة لوحة المفاتيح والماوس ، يجب توخي الحذر لمحاكاة حركات الجسم مثل الحقيقة. يجب أن يوضع في الاعتبار أنه ، أولاً ، لا يمكن لشخص حي أن يلعب في وتيرة عالية بشكل ثابت لفترة طويلة مباشرة على 16 طاولة في وقت واحد - خاصة على شاشة مقاس 8 بوصات. ثانياً ، لا يمكن للشخص الحي اللعب 28 ساعة في اليوم ، 6 أيام في الأسبوع. أخيرًا ، ثالثًا ، يمكن أن تتغير حركات الشخص الحي - اعتمادًا على مقدار الوقت الذي يقضيه في الكمبيوتر. لمحاكاة الظروف البيومترية المعقولة ، ستحتاج إلى: 1) "PS / 2-sniffer" - غسول البرامج والأجهزة ،والتي ستستمع إلى تدفق البيانات المرسلة بواسطة لوحة المفاتيح والماوس إلى منفذ PS / 2 ، وحفظ كل شيء مسموع في ملف منفصل ، والذي سيتم استخدامه لاحقًا لمحاكاة الظروف البيومترية المعقولة ؛ 2) شخص حي سيلعب البوكر عبر الإنترنت حقًا طالما كان من المقرر تضمين البوت - فإن أفعاله هي التي سيتم تسجيلها بواسطة "PS / 2-sniffer".

أما بالنسبة للتقنية ، فإن كل لوحة مفاتيح وماوس لها "خط يد" فريد خاص بها. يمكن تتبعها من خلال تحليل التدفق الخام للإشارات التي تأتي منها إلى الكمبيوتر على مستوى منخفض. لذلك ، إذا شاركت العديد من محطات العمل في قيادة الروبوتات دفعة واحدة ، فعندئذٍ في التحضير لمضاهاة البيومترية ، من الضروري لكل منها: 1) تنظيم التنصت على الهاتف ، - مع لوحات مفاتيح مختلفة وفئران مختلفة ، 2) لزراعة أشخاص مختلفين لكل محطة عمل ستكون إجراءاتها يمكن إصلاحه باستخدام "الشم PS / 2". ترجع الحاجة إلى الفقرة الثانية إلى حقيقة أن كل شخص يستخدم الماوس ولوحة المفاتيح بشكل فردي. مع وجود مادة إحصائية واسعة النطاق ، من الممكن أن تحدد بدرجة كافية من اليقين من يجلس على الكمبيوتر ، حتى لو لم يكن المستخدم مصدقًا.

# -

, , « »: , – , « ». , - « », , . , . , – «-» «-» – . -, , – , : , , , , . , , - , , .


لذلك ، يتم التحضير للمضاهاة بمعلمات بيومترية وتقنية معقولة. الآن يبقى أن نتذكر أي لوحة مفاتيح وماوس يتوافق مع أي مستخدم - ولا تكسر هذه المراسلات أبدًا. يمكن أن يؤدي تجاهل القياسات الحيوية والتقنيات أو مضاهاة غير معقولة إلى حظر الحساب دون تفسير. مع مراعاة جميع الاحتياطات ، بغض النظر عن مدى جنون العظمة التي قد تبدو عليها ، يمكن للمرء أن يعتمد على التعبئة المعادية.


عناصر البوت المحصن



التين. 2. الروبوت المجهول الروبوت المائي

هو مجمع برمجيات أجهزة يضم أسطولًا كاملاً من أجهزة الكمبيوتر التي ستحل 6 مهام مختلفة بشكل أساسي. بالإضافة إلى عدد قليل من المستحضرات والأجهزة. بالإضافة إلى شخصين على قيد الحياة ، لمراقبة حالات الطوارئ والاستجابة لها.

1. محطة عمل (مع IP مخصص أو PROXY عالي الجودة) ، حيث يتم إطلاق 9 غرف بوكر في نفس الوقت. يجب أن يحتوي على بطاقة فيديو مع إخراج فيديو تمثيلي عالي الدقة وشاشة كبيرة ، لأن العديد من الغرف على شاشة صغيرة تبدو مريبة. من الناحية الاقتصادية ، لا تستخدم محطة عمل واحدة من حيث التكلفة - أكثر من عشرة في وقت واحد. في هذه الحالة ، يمكن إطلاق البوت في وقت واحد في 90 غرفة في آن واحد.

2. Screener - جهاز كمبيوتر قوي مزود ببطاقة التقاط فيديو ، وهو متصل عبر مقسم الفيديو إلى جميع محطات العمل. تتمثل مهمة الفحص في التعرف على الإشارات المستلمة وترجمتها إلى شكل هيكلي. سيتم استخدام هذه البيانات لاحقًا لـ 1) الكتابة إلى قاعدة البيانات ، 2) التحليلات و 3) اتخاذ قرارات للعمل.

3. محلل - كمبيوتر قوي يعمل على مبدأ خادم الأرصاد الجوية ، ولكن بدلاً من الظواهر الطبيعية يتراكم جميع بيانات البوكر الممكنة - يقول. في الواقع ، هناك الكثير من الإخبار في لعبة البوكر على الكمبيوتر أكثر من لعبة البوكر الحية. لكن المشكلة هي أنه بدون البرامج المساعدة يكاد يكون من المستحيل تتبعها. ويتم إيقاف استخدام هذه البرامج بكل طريقة ممكنة - يمكنك الحصول على حظر إذا كنت تستخدمها على محطة عمل.

4. التجسس - حسابات منفصلة لا يتم لعب اللعبة منها ، ولكن مجرد مجموعة متتابعة من جميع المعلومات المتاحة من جميع الغرف المتاحة. يجب أن يكون هناك العديد من الجواسيس ، لأنه إذا قام نفس الحساب بتسجيل الدخول جنبًا إلى جنب مع لعبتنا وخرجنا في نهاية الأمر ، يمكن أن يلقي عملة منهجية في البنك المشكوك فيه ، وعندما يمتلئ هذا البنك ، سنقوم ببساطة بإغلاق الحساب دون إبداء أي سبب. يجب أن يعمل "الجاسوس" على نفس مبدأ "محطة العمل". قد يبدو أن هناك ما يكفي من شاشة البرنامج ومضاهاة البرمجيات للماوس مع لوحة المفاتيح. ومع ذلك ، نظرًا لأن برنامج البوكر يمكن أن يرتبط بالأجهزة وحسابات الأرنب اللاحقة ، يجب إجراء فحص الأجهزة والمضاهاة للتجسس - وكذلك لمحطة العمل.

5. المحاكي - جهاز كمبيوتر قوته ليست أساسية. وهي متصلة بالعديد من الفواصل للماوس ولوحة المفاتيح. من هذه الفواصل ، تنتقل الأسلاك إلى مدخلات PS / 2 للماوس ولوحة المفاتيح لكل من محطات العمل والجواسيس. يتلقى هذا الكمبيوتر أوامر من المحلل ويرسلها إلى محطات العمل. مع مراعاة ميزات الأجهزة الخاصة بالماوس ولوحة المفاتيح ، والخصائص الفسيولوجية لسلوك الشخص الذي يعمل خلفها (القياسات الحيوية والتقنية).

6. مراقبان حيان. هذه لم تعد أجهزة كمبيوتر ، أي الأحياء. إنها ضرورية ، لأن مطوري برامج البوكر ليسوا نائمين ، وفي أي وقت يمكنهم إجراء بعض الاختبارات الفريدة ، لتحديد محركات الروبوت. شخص واحد لا يكفي - لأنه يمكن أن يغادر حسب الحاجة أو مسحوق أنفه ، وفي هذا الوقت ستظهر بعض الحالات الطارئة. هناك حالات يتم فيها تحديد كل شيء بالثواني. لذلك ، من المهم أن يكون شخص ما دائمًا بالقرب من الآلات. لذلك عندما "يضيء الزر الأحمر" (عندما يواجه المحلل سلوكًا غير مألوف) ، يمكن للشخص أن يخبره بما يجب عليه فعله (اكتب شيئًا في الدردشة أو أغلق النافذة). ولا يمكنك بأي حال من الأحوال الانتقال مباشرة إلى محطة العمل ، حتى لا تكسر النموذج السلوكي المقابل للوحة المفاتيح والماوس.يجب تنفيذ الإجراءات فقط من خلال "مركز القيادة".

7. مركز القيادة - جهاز كمبيوتر تكون قوته أيضًا غير أساسية. يجب توصيله فقط بالمحاكي. هذا هو بالضبط الجهاز الذي يجلس فيه مراقبان حيان ، ومن خلالهما ، إذا لزم الأمر ، يقومان بالتعديلات اللازمة على سلوك الروبوت.


اللمسات الأخيرة


إذًا ، هذه 7 عناصر من برنامج الروبوت الذي لا يُعرض للخطر. عند توصيلها ، تجدر الإشارة إلى أن العارض والمحلل والمحاكي يتبادلان البيانات عبر الشبكة. يتم التفاعل مع محطات العمل والجواسيس بدقة من خلال الإخراج التناظري لبطاقة الفيديو و PS / 2. علاوة على ذلك ، يجب فصل أجهزة الكمبيوتر هذه فعليًا عن أي شخص آخر. لا يمكن أن يكون هناك حديث عن التواصل بينهما عبر الشبكة. نظرًا لتعقيد مثل هذا البرنامج والأجهزة المعقدة ، من المهم أيضًا الاهتمام بتقليل الأخطاء المرتبطة بالعامل البشري. للقيام بذلك ، يهتم المحاكي ، من بين أمور أخرى ، بإطلاق جميع البرامج الضرورية على محطات العمل وعلى الجاسوس. يجب أن يكون المنبه والمحلل والمحاكي في حالة تأهب فورًا بعد تشغيله - يجب أن يكون البرنامج المقابل ببساطة عند بدء التشغيل.


أمل جديد



التين. 3. أمل جديد

المخطط الموصوف لقيادة الروبوت ، حتى مع معرفة سطحية به ، ليس لضعاف القلب. لكن ما ورد أعلاه ، على الرغم من التفاصيل ، ولكن لا يزال - وصفه السطحي. من أجل تنفيذه ، يجب ألا يكون لدى الشخص مؤهل تقني ضخم ، سواء في البرمجة أو في الإلكترونيات. عند البرمجة ، سيحتاج المطور إلى المعرفة من مجالات مثل الرياضيات المنفصلة ، وتقريب الشريحة ، وتحويل المويجات ، والشبكات العصبية ، وأجهزة الحالة ، والمنطق الضبابي ، والبرمجة متعددة الخيوط ، ومعالجة الإشارات الرقمية. عند تنفيذ أجهزة الروبوت ، سيحتاج المطور إلى معرفة من مجالات مثل أنظمة المعالجات الدقيقة ، وتكنولوجيا المعالجات الرقمية والمعالجات الدقيقة ، والعمل مع وحدات التحكم الدقيقة و FPGAs ، وأساسيات الهندسة الكهربائية ، وبرمجة برامج التشغيل منخفضة المستوى ، وبنية نظام التشغيل ، وبنية المعالج.

#

– , « ». , – , , – , . , . , – SetWindowsHookEx, CreateToolHelpSnapshot32, EnumProcessModules, – . . , : , PokerStars , Visual Studio.


لذا ، هذا مخطط قيادة آلي آمن. كما قيل في البداية ، من المثير للاهتمام أنه حتى لو كان "المقاتلون من أجل العدالة" سيحصلون في أيديهم على كود مفصل للتعليق على البوت ، فلن يتمكنوا من إثبات حقيقة استخدامه. في حين أن البوت العادي - بدون وظيفة الخفي - يمكن أن يتعقب "مقاتلو من أجل العدالة" ، حتى بدون مصدرها. التقنيات الحديثة ، خاصة الجذور الخفية ، التي يعلق عليها مطورو برامج البوكر آمالًا كبيرة ، تسمح لهم بالتعمق في نظام التشغيل ، وما إلى ذلك. يتصرف على مبدأ "الجلوس عاليا ، والنظر بعيدا". مع تطور الجذور الخفية وتقنيات الحماية الأخرى ، أصبح لدى "المقاتلين من أجل العدالة" أمل جديد في انتصار غير مشروط. ومع ذلك ، فإن المخطط أعلاه لقيادة الروبوت الآمن يقلل من كل هذه الآمال إلى لا شيء.يعد تنفيذ هذا المخطط حدثًا مكلفًا ، ومع ذلك ، نظرًا لأن الفائدة المحتملة كبيرة ، فإن الخطة ذات صلة تمامًا. لذا فمن المنطقي أن تجرؤ.


الانتقام من السيث


لم يقل من فعله. تجرأ! ولكن هل يستحق الأمر قضاء بعض الوقت في بقية المقالة؟ من المؤكد أن مهندس تكنولوجيا المعلومات من الدرجة الأولى ، الذي يؤكد انتمائه إلى الدوري الأعلى في المشهد X من خلال شيء أكثر أهمية من مجرد ختم جميل في الدبلوم ، لا يستحق ذلك بالتأكيد. في ترسانة X الخاصة به ، هناك بالفعل حيل غامضة كافية "للانتقام" من البوتات القديمة دون مساعدة شخص آخر ، والذي قام في السابق بحظر الأكسجين على "الجانب المشرق من القوة".

يجب على المطورين المتقدمين ، الذين ينخرطون في X- المشهد فقط بسبب إتقانهم المبتكر لـ C ++ والمجمع ، ألا يضيعوا الوقت ، ولكن لسبب مختلف ، لن يفعلوا ذلك. درجة تفاصيل المواد المقدمة غير كافية بالنسبة لهم ، لأنه في هذه المقالة لا يتم ترك العديد من مهام البرمجة التافهة بشكل متعمد (يتعامل معها المطور المتقدم واحد أو اثنين أو ثلاثة) ، ولكن أيضًا بعض المفاهيم الهندسية الأساسية. أما بالنسبة للنصوص النصية ، التي لا تتحدث حتى محادثة C ++ والمجمع ، فلا شك في فوائد هذه المقالة لهم.

ومع ذلك ، فإن المهندس العادي ، الذي ترك بالفعل تطوير المراهقين (الذي طور القليل من براعة الهندسة) ، لكنه لم يدخل بعد في عصر هندسة الكبار ، سيجد هنا أفكارًا مثيرة للاهتمام ستساعده على تحقيق روبوت غير محصن. بقدر ما هو قادر بالفعل على إيجاد حلول بسيطة للمهام التي تبدو معقدة ، باستخدام الموارد المتاحة. وهذه بالتحديد هي القوة الغامضة التي يتم تقييمها في المشهد X ، سواء على النور أو الجوانب المظلمة منه. القدرة على امتلاكها هي ما يميز المهندس عن المطور. لذا ، دعونا نضع حرارة "المقاتلين من أجل العدالة" ، مبينين ما يستطيع الجانب المظلم للسلطة أن يفعله.


ضربات الإمبراطورية



التين. 4. الإمبراطورية تعيد الضرب

الأخبار الجيدة: الجزء الأصعب قد انتهى. إن خطة العمل الاستراتيجية ، التي هي أيضا بيان غير رسمي للمشكلة ، جاهزة. الآن يبقى فقط التحديد والتفصيل قليلاً - لوصف الإجراءات التكتيكية. في مرحلة التفصيل ، أهم شيء هو المشي بهدوء "من الجنرال إلى الخاص" ، وهكذا. لتشكيل إطار المشروع المستقبلي. في الوقت نفسه ، دون الخوض في تفاصيل تنفيذ وحدات وظيفية محددة ، ولكن ببساطة إصلاحها. سنهتم بتفاصيلها لاحقًا ، عندما يكون الإطار جاهزًا بالفعل.

#

, – . , – . 99- . 10- , , , , : « , ». , IDE .


لمزيد من الوضوح ، سنستخدم صيغة لغة Fort (لا يجب الخلط بينها وبين Fortran). هذه لغة فريدة تفضل بشكل طبيعي الحركة العقلانية للهندسة. جمال مثل هذا النهج "المقترض" هو أن جميع العيوب المفاهيمية للمشروع يتم الكشف عنها حتى على الشاطئ ، وليس في منتصف تنفيذه ، مما يساهم منذ البداية في تطوير عالي الجودة. دون الحاجة لإعادة الهيكلة اللاحقة. لذا فإن الإطار "من العام إلى الخاص":
الإطار "من عام إلى خاص"
: -
  - -
  - -
  - --
  -
;

: --
  - !!!!!!
  - !!!!!!
  - !!!!!!
  - 
  - -
;

: -
   --
  - -
  --
;

: -
  - --
  - -
  --
;

: !!!!!!
  --- -
  -- -
  --
;

: -
  ---
  -----
  --
;

: --
  -- -
  - -
  - -
  - -
  - -
  ---
  - 
;

: !!!!!!
  -- --
  -- -
  -- -
  -- --
  -
  --
  ---
  --
;

: !!!!!!
  ---
  --
  -
  -
  --
;

: !!!!!!
  --
  ---
;

: !!!-!!!
  --
  ---
;

: --
  --
  ---
  ---
;


ميزة أخرى لاستخدام صيغة لغة Fort عند وضع الإطار العام للمشروع هي القدرة على تجميع النص المكتوب على الفور. لأن هذا النص بحد ذاته برنامج. من حيث المبدأ ، إذا قمت بتطبيق جميع العقد الوظيفية المفقودة باستخدام لغة Fort وقمت بإضافتها إلى الإطار أعلاه ، فستحصل على نفس الروبوت القابل للتأثر الذي نعمل عليه. سوف تتحول بإيجاز شديد. ومع ذلك ، ستتم كتابة مقتطفات الشفرة أدناه بلغات أكثر تقليدية - C ++ و المجمع. العرض "المقترض من الحصن" في هذه الحالة مثير للاهتمام فقط للأغراض التوضيحية للإطار العام للمشروع. لذلك ، "بهدوء من عام إلى خاص" مرت ، الآن سننظر بمزيد من التفصيل في تفاصيل تنفيذ بعض العقد الوظيفية للبوت.


التصوير غير المرئي


هنا لدينا ثلاث مهام أساسية: 1) العثور على حل مقبول للأجهزة ، 2) تطوير بنية بيانات سيتم قراءتها من الصور ، 3) تنفيذ وظيفة التعرف. يجب أن تكون نتيجة مرحلة التصوير عبارة عن بنية بيانات كاملة وفائضة ، بناءً على ذلك يمكن لأداة المنطق أن تحدد بشكل فريد الحالة الحالية للعبة - لأصغر عدد ممكن من اللقطات المتتالية.

1. بالنسبة لحل الأجهزة ، فإن الخيار المثالي (من وجهة نظر اقتصادية ومن وجهة نظر سهولة البرمجة اللاحقة) هو أن جميع إشارات الفيديو تتلاقى على مقسم فيديو واحد ، والذي يمكن تبديله من جهاز كمبيوتر. في هذه الحالة ، يمكن تنفيذ مهمة الفحص بواسطة جهاز كمبيوتر واحد مع بطاقة التقاط فيديو واحدة. لكل جاسوس ومحطة عمل في هذه الحالة سيكون من الضروري إنشاء مجلد واحد - سيتم حفظ لقطات الشاشة المقابلة هناك. إذا كان هذا الخيار لا يمكن تنفيذه (بسبب عدم إمكانية الوصول إلى المعدات المناسبة و / أو بسبب المؤهلات التقنية غير الكافية لتكييف المعدات الحالية مع احتياجاتك الخاصة) ، فيمكنك استخدام العديد من أجهزة الكمبيوتر المتصلة بشبكة محلية ،في كل منها سيكون هناك العديد من بطاقات التقاط الفيديو - واحدة لكل "جاسوس" و "محطة عمل". في هذه الحالة ، ستحتاج إما إلى إضافة جميع الصور النقطية الممسوحة ضوئيًا إلى مجلد شبكة مشترك ، أو الكتابة على مآخذ تطبيق خادم العميل ، والتي ستجمع كل الصور النقطية في مكان واحد. لتنزيل الصور النقطية ، لغرض التعرف عليها لاحقًا ، يمكنك استخدام الكود التالي:
تنزيل الصور النقطية
void LoadRamaFromFile(LPCSTR lpcszFileName, HDC *lphdcRama)
{
  HANDLE hBitmap = LoadImage(0, lpcszFileName, IMAGE_BITMAP, 0, 0, LR_LOADFROMFILE);
  *lphdcRama = CreateCompatibleDC(NULL); //    
  SelectObject(*lphdcRama, hBitmap);   //    
  DeleteObject(hBitmap);         //  
}


2. أما هيكل البيانات فيمكن أن يكون على النحو التالي:
هيكل البيانات
// 
typedef enum ROUND
{
  RES_WAITINGBLINDS, //   ( )
  RES_FLOPHIDDEN,  //  ,      ()
  PREFLOP,      // 
  FLOP,       // 
  TURN,       // 
  RIVER,       // 
  UNKNOWN,      // 
  ZSTATE
} *LPROUND;

//                         //
typedef enum ACTION
{
  AC_POSTSB,   //   
  AC_POSTBB,   //   
  AC_POSTSBANDBB,
  AC_CHECK,    //    
  AC_BET,     //   
  AC_RAISE,    //   
  AC_CALL,    //   
  AC_FOLD,    //  
  AC_ALLIN,    //  
  AC_SITOUT,   //            
  AC_MUCK,    //   
  AC_SHOWCARDS,  //   
  AC_NONE,    //  ,     (  )
  AC_TNB,     //    ( )
  AC_ZSTATE
} *LPACTION;

//    
typedef struct tagSITA_UVACHA
{
  char  szNickname[STR_SIZE_NICKNAME];  // 
  char  szStack[STR_SIZE_STACK];     //  
  char  szHoleCards[STR_SIZE_HOLECARDS]; //     ( )
  ACTION  action;
} SITA_UVACHA, *LPSITA_UVACHA;

//    
typedef struct tagRAMA_UVACHA
{
  SITA_UVACHA  sita[MAX_COUNT_SITA];   //    
  DWORD  dwCountSita;           //    
  DWORD  dwBUPos;             //  
  char  szPOT[STR_SIZE_POT];       //  
  char  szBoardCards[STR_SIZE_HOLECARDS]; // ,    
  ROUND  round;              //  
} RAMA_UVACHA, *LPRAMA_UVACHA;

////////////////////////////

typedef struct tagKRISHNA_UVACHA
{
  RAMA_UVACHA  rama;
  DWORD    dwFirstSaid;    //      
  DWORD    dwLastSaid;     //      
  ACTION    last_action;    //     
} KRISHNA_UVACHA, *LPKRISHNA_UVACHA;


3. أحد الخيارات الممكنة لوظيفة التعرف هو تكوين شبكة عصبية لهذا الغرض. يستحق هذا الموضوع مناقشة منفصلة ، لذلك لن نتحدث عن نهج الشبكة العصبية في هذه المقالة. خيار أبسط هو إرفاق الصور النقطية المقابلة. إليك ما قد يبدو عليه هيكل البيانات المطابق:

هيكل بيانات الاعتراف
typedef struct tagSURJA_CRAPH_DATA
{
  BYTE  PATTERN_LETTER[COUNT_LETTERS][SIZE_PATTERN_LETTER];       //  
  BYTE  LETTER_CODE[COUNT_LETTERS];                   //  
  BYTE  LETTER_SIZE[COUNT_LETTERS];                   //  

  BYTE  PATTERN_INSCRIPT[COUNT_INSCRIPTIONS][SIZE_PATTERN_INSCRIPTION]; //   
  char  INSCRIPTION_TEXT[COUNT_INSCRIPTIONS][SIZE_INSCRIPTION_TEXT];  //  
  BYTE  PATTERN_CARD[COUNT_CARDS][SIZE_PATTERN_CARD];          //  
  char  CARD_TEXT[COUNT_CARDS][SIZE_CARD_TEXT];             //  
  BYTE  PATTERN_HOLEHIDDEN[COUNT_HOLEHIDDEN][SIZE_PATTERN_HOLEHIDDEN]; //    
  char  HOLEHIDDEN_TEXT[COUNT_HOLEHIDDEN][SIZE_HOLEHIDDEN_TEXT];    //     
} SURJA_CRAPH_DATA, *LPSURJA_GRAPH_DATA;


أسهل طريقة لملئه هي يدوي. ما عليك سوى التقاط لقطة شاشة وفتحها في Photoshop وتنشيط أداة القطارة وإعادة كتابة الأرقام من المناطق التي تهمنا. لا يمكن وصف هذا القرار بأنه موجز حتى مع امتداد كبير. بالإضافة إلى ذلك ، هناك قيود كبيرة - حتى التغييرات الطفيفة في جدول برنامج البوكر ستتسبب في توقف البوت عن العمل. ومع ذلك ، إذا كان المؤهل الفني لا يسمح لك بالخروج بشيء أكثر قيمة ، فإليك ما قد يبدو عليه الإعداد "التعرف اليدوي" (فيما يلي مجموعة صغيرة فقط من رمز ما يقرب من 2000 سطر):
التعرف اليدوي
BOOL LoadGraphData()
{
//=====================     ================
  memset(m_BramaGraphData.ptRamaCoords,  0,  sizeof(POINT)*COUNT_VARRIOUS_RAMA*COUNT_RAMA_VALUES);
  memset(m_BramaGraphData.ptSitaCoords,  0,  sizeof(POINT)*COUNT_VARRIOUS_RAMA*MAX_COUNT_SITA*COUNT_SITA_VALUES);
  memset(m_BramaGraphData.ptRecognizeSize,0,  sizeof(POINT)*COUNT_VAL_SIZE);
//=====================  9-  ===============
  m_BramaGraphData.ptRamaCoords[INDEX_RAMA_AT_9_SITA][INDEX_VAL_RAMA_POT].x  = 210;
  m_BramaGraphData.ptRamaCoords[INDEX_RAMA_AT_9_SITA][INDEX_VAL_RAMA_POT].y  = 34;
  m_BramaGraphData.ptSitaCoords[INDEX_RAMA_AT_9_SITA][0][INDEX_VAL_SITA_NICKNAME].x    = 340;
  m_BramaGraphData.ptSitaCoords[INDEX_RAMA_AT_9_SITA][0][INDEX_VAL_SITA_NICKNAME].y    = 44;
  m_BramaGraphData.ptSitaCoords[INDEX_RAMA_AT_9_SITA][1][INDEX_VAL_SITA_NICKNAME].x    = 423;
  m_BramaGraphData.ptSitaCoords[INDEX_RAMA_AT_9_SITA][1][INDEX_VAL_SITA_NICKNAME].y    = 77;
  m_BramaGraphData.ptSitaCoords[INDEX_RAMA_AT_9_SITA][2][INDEX_VAL_SITA_INSCRIPTION].x  = 438;
  m_BramaGraphData.ptSitaCoords[INDEX_RAMA_AT_9_SITA][2][INDEX_VAL_SITA_INSCRIPTION].y  = 165;
//=====================  10-  ==============
//=====================    ==================
  m_BramaGraphData.PATTERN_LETTER[PAT_0][0] = b01111000;
  m_BramaGraphData.PATTERN_LETTER[PAT_0][1] = b10000100;
  m_BramaGraphData.PATTERN_LETTER[PAT_8][2] = b10100100;
  m_BramaGraphData.PATTERN_LETTER[PAT_8][3] = b01011000;
  m_BramaGraphData.LETTER_CODE[PAT_0] = '0';
  m_BramaGraphData.LETTER_CODE[PAT_1] = '1';
  m_BramaGraphData.LETTER_CODE[PAT_2] = '2';
//=====================     ================
  m_BramaGraphData.PATTERN_INSCRIPT[PAT_INSCRIPTION_SEATOPEN][0]  = 55;
  m_BramaGraphData.PATTERN_INSCRIPT[PAT_INSCRIPTION_SEATOPEN][1]  = 56;
  m_BramaGraphData.PATTERN_INSCRIPT[PAT_INSCRIPTION_SEATOPEN][2]  = 124;
  m_BramaGraphData.PATTERN_INSCRIPT[PAT_INSCRIPTION_SEATOPEN][3]  = 215;
//=====================     ==================
  lstrcpy(m_BramaGraphData.INSCRIPTION_TEXT[PAT_INSCRIPTION_SEATOPEN],  "SEATOPEN");
  lstrcpy(m_BramaGraphData.INSCRIPTION_TEXT[PAT_INSCRIPTION_EMPTYSEAT],  "EMPTYSEAT");
  lstrcpy(m_BramaGraphData.INSCRIPTION_TEXT[PAT_INSCRIPTION_CALL],    "CALL");
  lstrcpy(m_BramaGraphData.INSCRIPTION_TEXT[PAT_INSCRIPTION_BET],      "BET");
//=====================    =======================
  m_BramaGraphData.PATTERN_CARD[PAT_CARD_EMPTY][0] = 30;
  m_BramaGraphData.PATTERN_CARD[PAT_CARD_EMPTY][1] = 30;
  m_BramaGraphData.PATTERN_CARD[PAT_CARD_EMPTY][2] = 30;
  m_BramaGraphData.PATTERN_CARD[PAT_CARD_HIDE][6] = 188;
  m_BramaGraphData.PATTERN_CARD[PAT_CARD_HIDE][7] = 151;
//=====================    ==================
  lstrcpy(m_BramaGraphData.CARD_TEXT[PAT_CARD_EMPTY],  "");
  lstrcpy(m_BramaGraphData.CARD_TEXT[PAT_CARD_HIDE],  "hid");
  lstrcpy(m_BramaGraphData.CARD_TEXT[PAT_CARD_2C],  "2C");
  lstrcpy(m_BramaGraphData.CARD_TEXT[PAT_CARD_4H],  "4H");
//=====================     =================
//=====================      ===
  lstrcpy(m_BramaGraphData.HOLEHIDDEN_TEXT[PAT_HOLEHIDDEN_EMPTY],  "");
  lstrcpy(m_BramaGraphData.HOLEHIDDEN_TEXT[PAT_HOLEHIDDEN_ONE],  "one-hidden");
  lstrcpy(m_BramaGraphData.HOLEHIDDEN_TEXT[PAT_HOLEHIDDEN_TWO],  "hidden");
//=====================   ===========================
  m_BramaGraphData.PATTERN_MISC[PAT_MISC_BUTTON][0] = 216;
  m_BramaGraphData.PATTERN_MISC[PAT_MISC_BUTTON][1] = 72;
  m_BramaGraphData.PATTERN_MISC[PAT_MISC_BUTTON][2] = 8;
  m_BramaGraphData.PATTERN_MISC[PAT_MISC_BUTTON][3] = 151;
  m_BramaGraphData.PATTERN_MISC[PAT_MISC_BUTTON][4] = 221;
  m_BramaGraphData.PATTERN_MISC[PAT_MISC_BUTTON][5] = 194;
  m_BramaGraphData.PATTERN_MISC[PAT_MISC_BUTTON][6] = 231;

  return TRUE;
}


وإليك مثال على التعليمات البرمجية التي تستخدم مثل هذه الصور النقطية للتعرف عليها:
مثال كود الاعتراف
typedef struct tagSURJA_CRAPH_DATA
{
  BYTE  PATTERN_LETTER[COUNT_LETTERS][SIZE_PATTERN_LETTER];       //  
  BYTE  LETTER_CODE[COUNT_LETTERS];                   //  
  BYTE  LETTER_SIZE[COUNT_LETTERS];                   //  

  BYTE  PATTERN_INSCRIPT[COUNT_INSCRIPTIONS][SIZE_PATTERN_INSCRIPTION]; //   
  char  INSCRIPTION_TEXT[COUNT_INSCRIPTIONS][SIZE_INSCRIPTION_TEXT];  //  
  BYTE  PATTERN_CARD[COUNT_CARDS][SIZE_PATTERN_CARD];          //  
  char  CARD_TEXT[COUNT_CARDS][SIZE_CARD_TEXT];             //  
  BYTE  PATTERN_HOLEHIDDEN[COUNT_HOLEHIDDEN][SIZE_PATTERN_HOLEHIDDEN]; //    
  char  HOLEHIDDEN_TEXT[COUNT_HOLEHIDDEN][SIZE_HOLEHIDDEN_TEXT];    //     
} SURJA_CRAPH_DATA, *LPSURJA_GRAPH_DATA;



بطريقة أو بأخرى - على الرغم من أننا نستخدم شبكة عصبية ، على الأقل بأيدينا ، على الأقل بشيء ثالث - في الاعتراف ، يجب مراعاة أربعة مجالات مختلفة بشكل أساسي: 1) ثابتة (تلك التي ، وفقًا للنظرية ، لا يحدث أي شيء على الإطلاق) ؛ بما في ذلك خارجي لبرامج البوكر (على سبيل المثال ، ينشأ نوع من الإجراءات خارج عميل البوكر ، من المفترض أن يكون من نظام Windows ، ولكن في الواقع - يتحقق من إمكانية العمل) ؛ 2) ديناميكية غنية بالمعلومات (حجم المكدس ، اللاعب الحالي ، البطاقات على الطاولة ، إلخ) ؛ 3) ديناميكية بالمعلومات ضعيفة (الأماكن التي نادرا ما تظهر الرسائل والدردشة) ؛ 4) ديناميكية غير إعلامية (على سبيل المثال ، المناطق التي تحدث فيها الرسوم المتحركة لتوزيع البطاقات).


تحليل غير مرئي


الجزء التحليلي من البوت ، في حالة البوكر ، هو آلية للتفاعل مع قاعدة البيانات - نظرًا لأن جميع "الإخبار" تقريبًا المتعلقة بوكر الإنترنت تعتمد على تحليل النموذج السلوكي لمعارضي الألعاب. الخيار المثالي هنا هو Oracle المنزل الخاص بك ، والذي لا غنى عنه في العمل المكثف مع قاعدة بيانات كبيرة تتضمن مئات الآلاف من السجلات. وبالتحديد ، سيكون هناك الكثير منهم إذا كنت تخطط للانخراط في الزراعة النباتية على محمل الجد ولفترة طويلة. إذا كنت بحاجة فقط إلى روبوت لتنغمس ، فلا يمكنك إنفاق المال على Oracle. يعد MS Access DBMS مناسبًا تمامًا - يمكنك الاتصال به بسهولة من برنامجك ، على سبيل المثال من خلال ODBC. إليك ما قد يبدو عليه:
التفاعل مع MS Access
BOOL InitODBC()
{
  SQLRETURN    ret;
  SQLSMALLINT    Length;

  ret = SQLAllocHandle(SQL_HANDLE_ENV, SQL_HANDLE_NULL, &hEnv);
  if (SQL_SUCCESS != ret && SQL_SUCCESS_WITH_INFO != ret)
    return FALSE;

  ret = SQLSetEnvAttr(hEnv, SQL_ATTR_ODBC_VERSION, (SQLPOINTER) SQL_OV_ODBC3, NULL);
  if (SQL_SUCCESS != ret && SQL_SUCCESS_WITH_INFO != ret)
    return FALSE;

  ret = SQLAllocHandle(SQL_HANDLE_DBC, hEnv, &hConn);
  if (SQL_SUCCESS != ret && SQL_SUCCESS_WITH_INFO != ret)
    return FALSE;

  lstrcpyn(szConnect, STR_CONNECT, MAXSIZE_CONNECTSTR);
  ret = SQLDriverConnect(hConn, NULL, (SQLTCHAR *) szConnect, lstrlen(szConnect), (SQLTCHAR *) szConnect, MAXSIZE_CONNECTSTR, &Length, SQL_DRIVER_COMPLETE);
  if (SQL_SUCCESS != ret && SQL_SUCCESS_WITH_INFO != ret)
    return FALSE;

  return TRUE;
}

void DoneODBC()
{
  SQLDisconnect(hConn);
  SQLFreeHandle(SQL_HANDLE_DBC, hConn);
  SQLFreeHandle(SQL_HANDLE_ENV, hEnv);
}



BOOL InsertInDB(LPCSTR lpcszText, LPCSTR lpcszTitle, DWORD dwLocale)
{
  SQLHANDLE  hStmt;
  SQLRETURN  ret;
  char    szTitle[SIZE_TITLE];
  char    szQuery[MAXSIZE_QUERYSTR];


  //          //
  ret = SQLAllocHandle(SQL_HANDLE_STMT, hConn, &hStmt);
  if (SQL_SUCCESS != ret && SQL_SUCCESS_WITH_INFO != ret)
    return FALSE;

  wsprintf(szQuery, "INSERT INTO index (text, title, locale) VALUES ('%s', '%s', %d)", lpcszText, szTitle, dwLocale);

  ret = SQLExecDirect(hStmt, (SQLTCHAR *) szQuery, lstrlen(szQuery));

  if (SQL_SUCCESS != ret && SQL_SUCCESS_WITH_INFO != ret)
    return FALSE;
  SQLFreeHandle(SQL_HANDLE_STMT, hStmt);

  return TRUE;
}


إذا لم يكن الأمر يتعلق بلعبة البوكر ، ولكن الشطرنج ، على سبيل المثال ، فيمكن تنفيذ التبادل مع محرك شطرنج تابع لجهة خارجية كجزء تحليلي. على سبيل المثال ، إليك كيفية التفاعل مع Fritz:
التفاعل مع المحرك التحليلي
BOOL SendData2Fritz(char szFritz[100])
//    //
{
  if (!FritzStr2Clipboard(szFritz))
    return FALSE;
  SendMessage(m_hwndFritz, WM_COMMAND, MAKELONG(IDM_PASTE_POSITION, 0), 0); 
  Sleep(2);
  SendMessage(m_hwndFritz, WM_COMMAND, MAKELONG(IDM_MOVE_NOW, 0), 0); 

  return TRUE;
}


BOOL ReceiveDataFromFritz(int busy[8][8], LPBOOL lpbEndGame)
//     //
{
  char szFritz[100];

  *lpbEndGame = FALSE;

  SendMessage(m_hwndFritz, WM_COMMAND, MAKELONG(IDM_COPY_POSITION, 0), 0);
  if (!Clipboard2FritzStr(szFritz))
    return FALSE;
  return TRUE;
}

BOOL FritzStr2Clipboard(LPCSTR lpcszFritz)
//         //
{
  HGLOBAL hGlobalMemory;    //   
  LPVOID pGlobalMemory;     //   

  hGlobalMemory = GlobalAlloc(GHND, lstrlen(lpcszFritz)+1);
  if (hGlobalMemory == NULL)
    return FALSE;
  pGlobalMemory = GlobalLock(hGlobalMemory);
  lstrcpy((LPSTR) pGlobalMemory, lpcszFritz);
  GlobalUnlock(hGlobalMemory);

  if (!OpenClipboard(NULL))
    return FALSE;
  if (!EmptyClipboard())
    return FALSE;
  SetClipboardData(CF_TEXT, hGlobalMemory);
  CloseClipboard();

  return TRUE;
}

BOOL Clipboard2FritzStr(LPSTR lpszFritz)
//        //
{
  HANDLE hClipMemory;    //   
  LPVOID pClipMemory;    //     

  if (IsClipboardFormatAvailable(CF_TEXT))
  {
    if (!OpenClipboard(NULL))
      return FALSE;
    hClipMemory = GetClipboardData(CF_TEXT);
    if (hClipMemory == NULL)
      return FALSE;
    pClipMemory = GlobalLock(hClipMemory);
    lstrcpyn(lpszFritz, (LPSTR) pClipMemory, 100);
    GlobalUnlock(hClipMemory);
    CloseClipboard();
  }
  return TRUE;
}



أداة أخرى يمكن أن تكون مفيدة عند برمجة التحليلات هي ما يسمى. "آلات الحالة المحدودة". إليك كيفية استخدامها في ألعاب متعددة اللاعبين عبر الإنترنت (هذا جزء من برنامج الروبوت للعبة "Keepers of Power"):
مثال آلة الدولة
typedef enum AUTOMATA_BATLE
{
  //  
  AS_BATLE_BEGIN,
  AS_BATLE_END,
  AS_BATLE_ERROR,

  AS_BATLE_TEST2MOB,     // ,    
  AS_BATLE_WAIT2NICK,    //    
  AS_BATLE_WAIT2MOB,     //   
  AS_BATLE_PROCESS,     //   ,    
  AS_BATLE_CLICK2OK_1,    //  OK
  AS_BATLE_WAITCHANGE,    //   
  AS_BATLE_CLICK2MONEY,   //    ""
  AS_BATLE_TEST2DROP,    //     (  "")
  AS_BATLE_CLICK2DROP,    //    ""
  AS_BATLE_CLICK2CLOSE,   //    ""
  AS_BATLE_WAIT2DROP,    //     
  AS_BATLE_CLICK2TAKEALL,  //  " "
  AS_BATLE_WAIT2CONFIRM,   //  
  AS_BATLE_CLICK2OK_2,    //  
  AS_BATLE_WAIT2BACK,    //   
  AS_BATLE_CLICK2BACK,    //  ""
  AS_BATLE_WAIT2STARTWINDOW, //    
  AS_BATLE_WAIT2NEXT     //  30 
};



AUTOMATA_BATLE CAutomataBatle::GoStep(HDC hdc)
{
  char szMessage[255];

  switch (m_automata_batle)
  {
  //        //
  case AS_BATLE_BEGIN:
    m_automata_batle = AS_BATLE_WAIT2STARTWINDOW;
    SetWindowText(m_hwndControl, "  ");
    break;
  case AS_BATLE_WAIT2STARTWINDOW:
    if (IsStartPresent(hdc))
    {
      SetWindowText(m_hwndControl, " ");
      m_automata_batle = AS_BATLE_TEST2MOB;
    }
    break;
  case AS_BATLE_TEST2MOB:
    if (IsMechPresent(hdc))
      if (!ClickMenuItem(INDEX_GOBATLE))
        return AS_BATLE_ERROR;
    if (IsCellEmpty(hdc))
    {
      SetWindowText(m_hwndControl, "  ");
      m_automata_batle = AS_BATLE_END;
    }
    else
    {
      hwndBatle = NULL;
      EnumChildWindows(m_hwndMain, EnumWindowsProcBatle, NULL);

      if (NULL != hwndBatle)
      {
        SetWindowText(m_hwndControl, "  ");
        m_automata_batle = AS_BATLE_WAIT2NICK;
      }
    }
    break;
  case AS_BATLE_WAIT2NICK:
    if (IsNickPresent(hdc))
    {
      SetWindowText(m_hwndControl, "  ");
      m_automata_batle = AS_BATLE_WAIT2MOB;
    }
    break;
  case AS_BATLE_WAIT2MOB:
    if (!IsNickOpEmpty(hdc))
    {
      SetWindowText(m_hwndControl, " ");
      m_automata_batle = AS_BATLE_PROCESS;
    }
    break;
  case AS_BATLE_PROCESS:
    if (!IsBatleEnd(hdc))
    {
      if (!ClickMenuItem2Window(hwndBatle, INDEX_STRIKE))
        return AS_BATLE_ERROR;
    }
    else
    {
      SetWindowText(m_hwndControl, "  ");
      m_automata_batle = AS_BATLE_CLICK2OK_1;
    }
    break;
  case AS_BATLE_CLICK2OK_1:
    if (!ClickMenuItem2Window(hwndBatle, INDEX_OK2BATLEEND))
      return AS_BATLE_ERROR;
    SetWindowText(m_hwndControl, "  ");
    m_automata_batle = AS_BATLE_WAITCHANGE;
    break;
  case AS_BATLE_WAITCHANGE:
    if (IsChangePresent(hdc))
    {
      SetWindowText(m_hwndControl, " ");
      m_automata_batle = AS_BATLE_CLICK2MONEY;
    }
    break;
  case AS_BATLE_CLICK2MONEY:
    if (!ClickMenuItem(INDEX_MONEY))
      return AS_BATLE_ERROR;
      SetWindowText(m_hwndControl, " ");
    m_automata_batle = AS_BATLE_TEST2DROP;
    break;
  case AS_BATLE_TEST2DROP:
    if (IsButtonDropPresent(hdc))
    {
      SetWindowText(m_hwndControl, "  \"\"");
      m_automata_batle = AS_BATLE_CLICK2DROP;
    }
    else if (IsButtonClosePresent(hdc))
    {
      SetWindowText(m_hwndControl, " ,   \"\"");
      m_automata_batle = AS_BATLE_CLICK2CLOSE;
    }
    break;
  case AS_BATLE_CLICK2DROP:
    if (IsButtonDropPresent(hdc))
    {
      if (!ClickMenuItem(INDEX_DROP))
        return AS_BATLE_ERROR;
    }
    else
    if (IsDropPresent(hdc))
    {
      SetWindowText(m_hwndControl, "  ");
      m_automata_batle = AS_BATLE_WAIT2DROP;
    }
    else if (IsStartPresent(hdc))
      m_automata_batle = AS_BATLE_WAIT2STARTWINDOW;
    break;
  case AS_BATLE_CLICK2CLOSE:
    if (!ClickMenuItem(INDEX_CLOSE))
      return AS_BATLE_ERROR;
    if (IsStartPresent(hdc))
    {
      SetWindowText(m_hwndControl, "  ");
      m_dwWait = 0;
      m_automata_batle = AS_BATLE_WAIT2NEXT;
    }
    break;
  case AS_BATLE_WAIT2DROP:
    if (IsDropPresent(hdc))
    {
      SetWindowText(m_hwndControl, "  ");
      m_automata_batle = AS_BATLE_CLICK2TAKEALL;
    }
    break;
  case AS_BATLE_CLICK2TAKEALL:
    if (!ClickMenuItem(INDEX_TAKEALL))
      return AS_BATLE_ERROR;
    SetWindowText(m_hwndControl, "  ");
    m_automata_batle = AS_BATLE_WAIT2CONFIRM;
    break;
  case AS_BATLE_WAIT2CONFIRM:
    if (IsConfirmPresent(hdc))
    {
      SetWindowText(m_hwndControl, "");
      m_automata_batle = AS_BATLE_CLICK2OK_2;
    }
    break;
  case AS_BATLE_CLICK2OK_2:
    if (!ClickMenuItem(INDEX_OK2TAKEALL))
      return AS_BATLE_ERROR;
    if (!IsConfirmPresent(hdc))
    {
      SetWindowText(m_hwndControl, "  \"\"");
      m_automata_batle = AS_BATLE_WAIT2BACK;
    }
    break;
  case AS_BATLE_WAIT2BACK:
    if (IsBackPresent(hdc))
    {
      SetWindowText(m_hwndControl, "  \"\"");
      m_automata_batle = AS_BATLE_CLICK2BACK;
    }
    break;
  case AS_BATLE_CLICK2BACK:
    if (!ClickMenuItem(INDEX_BACK))
      return AS_BATLE_ERROR;
    if (IsStartPresent(hdc))
    {
      SetWindowText(m_hwndControl, "  ");
      m_dwWait = 0;
      m_automata_batle = AS_BATLE_WAIT2NEXT;
    }
    break;
  case AS_BATLE_WAIT2NEXT:
    if (m_dwWait >= WAIT_2NEXTBATTLE)
    {
      SetWindowText(m_hwndControl, "  ");
      m_automata_batle = AS_BATLE_WAIT2STARTWINDOW;
    }
    else
    {
      wsprintf(szMessage, "(%d  %d) ...", m_dwWait/2, WAIT_2NEXTBATTLE/2);
      SetWindowText(m_hwndControl, szMessage);
      m_dwWait++;
    }
    break;
  case AS_BATLE_END:
    m_automata_batle = AS_BATLE_BEGIN;
    break;
  }




مضاهاة غير مرئية


هناك مرحلتان - الإعدادية والتشغيلية. لا يعني كلاهما والآخر كتابة البرامج المناسبة فحسب ، بل أيضًا العمل مع الحديد. هنا لا يمكنك الاستغناء عن الميكروكونترولر. لحسن الحظ ، ليست هناك حاجة إلى إعادة اختراع العجلة - فهناك حلول جاهزة للأجهزة والبرامج يمكن العثور عليها بسهولة على الإنترنت. بما في ذلك التعليمات البرمجية المصدر للبرنامج لوحدة التحكم الدقيقة ، والتي يمكن تكييفها بسهولة مع احتياجاتك.

بالنسبة للمرحلة التحضيرية (تسجيل ساعات العمل باستخدام الماوس ولوحة المفاتيح) ، هنا ، إذا كنت ترغب في ذلك ، يمكنك الاستغناء عن أدوات الأجهزة. يمكنك كتابة فلتر برنامج تشغيل يلتقط المكالمات إلى IOCTL_INTERNAL_I8042_HOOK_KEYBOARD. كأساس ، يمكنك أن تأخذ برنامج ctrl2cap ، الكود المصدر متاح في DDK. ومع ذلك ، فإن هذا الحل ليس عالميًا - من الأفضل استخدام أداة الشم.

أما بالنسبة للمرحلة التشغيلية ، فلا توجد طريقة بالتأكيد للاستغناء عن أدوات الأجهزة. يمكن أن يكون أحد الحلول الممكنة هو الاتصال بجهاز متحكم دقيق (والذي سيكون أيضًا مجزأًا) من جهة من خلال RS-232 ، ومن ناحية أخرى من خلال باقة PS / 2. للعمل مع RS-232 ، هناك خياران - يمكنك إما استخدام أدوات Windows العادية والتواصل عبر CreateFile / ReadFile / WriteFile باستخدام منفذ RS-232 ، أو مباشرة من خلال منافذ الإدخال / الإخراج. في الحالة الثانية ، ستحتاج إلى كتابة برنامج تشغيل بسيط يفتح الوصول إلى منافذ الإدخال / الإخراج ، لأنه بشكل افتراضي في Windows يتم إغلاق الوصول إليها. الابتعاد عن الخطيئة. إذا كنت لا تزال قادرًا على الوصول إلى منافذ الإدخال / الإخراج ، فإليك رمز تبادل البيانات عبر RS-232:
كود RS-232
#define dataport  0x02F8   //   COM2
#define irport   0x02F9   //       
#define manager   0x02FB   //  
#define statline  0x02FD   //  
#define upr1    0x00BB      
#define upr2    0x003B
#define freq    0x000C   //    (9600 )

DWORD OpenPort()
/*  COM- */
{
  __asm
  {
    mov  eax, upr1    //   0  1    
    mov  edx, manager
    out  dx, al

    mov  eax, freq    //    
    mov  edx, dataport
    out  dx, al     //       

    mov  al, ah
    mov  edx, irport
    out  dx, al     //       

    mov  eax, upr2
    mov  edx, manager
    out  dx, al

    mov  al, 0      //  
    mov  edx, irport
    out  dx, al
  }
}

DWORD WriteByte(BYTE data)
/*    COM- */
{
  __asm
  {
    mov  al, data    //    
    mov  edx, dataport
    out  dx, al     //     
waitout:
    mov  edx, statline
    in   al, dx     //   
    mov  ah, al
    and  al, 0x40    // ,    
    jz   waitout     //   – 
  }
} // void WriteByte

BOOL ReadByte(BYTE data)
/*    COM- */
{
  int cntWait = 0;

  __asm
  {
    mov  edx, statline
    xor  ecx, ecx
waitread:
    add  cntWait, 1
    cmp  cntWait, 0xFFFF
    jz   error
    in   al, dx     //   
    mov  bl, al     // ,   
    and  eax, 1
    jz   waitread    //    –  
    mov  edx, dataport  //   –   
    xor  eax, eax
    in   al, dx     //     
    mov  data, al
error:
  }
  if (cntWait != 0xFFFF)
    return TRUE;
  else
    return FALSE;
} // BYTE ReadByte


لذا ، فإن آلية اعتراض ومحاكاة إشارات لوحة المفاتيح باستخدام الماوس مفهومة ، يبقى فقط لمعرفة كيفية إنشاء نموذج سلوك قابل للتصديق من وجهة نظر القياسات الحيوية من دفق مستمر من بيانات لوحة المفاتيح والماوس المستلمة من الشم. بالإضافة إلى ذلك ، تتمثل إحدى المهام الأكثر إثارة للاهتمام في هذه المرحلة في كيفية تحريك الماوس من نقطة البداية إلى أخرى ، على وجه التحديد.

يتضمن أحد الحلول الممكنة عنصرين: 1) تكوين الشبكة العصبية ، 2) لضبط الحركة وتعليم الشبكة العصبية للعمل جنبًا إلى جنب مع "الغربال". مع هذا النهج ، من الممكن تدريب شبكة عصبية بأقل مشاركة بشرية. قد تكون خوارزمية تدريب الشبكة العصبية كما يلي:
  1. نختار إحداثيات عشوائية حيث يجب تحريك الماوس.
  2. نطعمهم مع الإحداثيات الحالية للشبكة العصبية.
  3. ننظر إلى مدى خطأ الشبكة العصبية.
  4. نعدل الشبكة العصبية.
  5. كرر 1-4 حتى النصر. بالنظر إلى البيانات الواردة من جهاز الشم ، بحيث لا تقوم الشبكة العصبية بتحريك مؤشر الماوس بدقة فحسب ، بل تقوم أيضًا بتحقيقه بشكل معقول بيولوجيًا.



ما هي الخطوة التالية


إن تطبيق نظام الشبكة العصبية هذا ، بالإضافة إلى نظام التعرف على شاشة الشبكة العصبية المذكور أعلاه ، هو موضوع مناقشة منفصلة خارج نطاق هذه المقالة. هاتان المهمتان اللتان تجاوزتا نطاق المقالة هما "المفاهيم الهندسية الأساسية" التي تمت دعوة "مهندس الوسط" لحلها بشكل مستقل. أما بالنسبة لـ "مشاكل البرمجة التافهة" ، فإن تنفيذ معظمها لم يتم تضمينه في هذه المقالة. هذه القوائم العشرة المدرجة في المقالة هي مجرد بذرة ، مصممة للمساعدة في تعزيز الشهية الهندسية.

نقطة أخرى مهمة. باستخدام هذه المقالة عند تطوير برنامج الروبوت الخاص بك ، يجب أن تفهم: عندما يتم تقديم العديد من الخيارات البديلة (المثالية وبعض الحلول الوسط) لتنفيذ عقدة وظيفية معينة ، فإن الاختيار هو بلاغي. من المفهوم أنه سيتم استخدام الخيار المثالي. إذا قدمت تنازلات ، حتى لو كانت واحدة فقط ، فسيكون البوت عرضة لهجمات مضادة من "الجانب المشرق من القوة".


عودة الجيداي



التين. 5. عودة Jedi

So ، المخطط الموضح أعلاه لقيادة الروبوتات المحصنة ، والتي في مواجهة "المقاتلين من أجل العدالة" - تدعي أنها انتصار نهائي ولا رجعة فيه. ومع ذلك ، سيكون مملًا إذا لم تتح الفرصة لـ Jedi لـ "الجانب المشرق من السلطة" لمعارضة أي شيء ل botswomen. علاوة على ذلك ، إذا لم يكن ذلك ممكنًا ، فإن المؤلف - الذي يحاول الالتزام بـ "الجانب المشرق من القوة" - لن ينشر هذا المخطط. بالإضافة إلى ذلك ، أريد أن أصدق أن جزءًا كبيرًا من القراء يلتزم أيضًا بـ "الجانب المشرق من القوة" وأن مصلحتهم ليست في إساءة استخدام هذا المخطط ، ولكن في كيفية مقاومته. لا تقدم المقالة رموزًا تفصيلية للمصدر وتغفل بعض المفاهيم الهندسية الأساسية - على وجه التحديد لتجنب إساءة الاستخدام.

بضع كلمات حول كيف يمكنك مقاومة المخطط الموضح للإنتاج النباتي. إنها عرضة للخطر عمليا. ومع ذلك ، لا يزال الاحتمال النظري لاكتشافه. ترتبط هذه الميزة بتتبع سلوك الماوس غير النمطي الذي يمكن أن ينزلق ، حتى في حالة المحاكاة عالية الجودة. الحقيقة هي أن الماوس يحمل الكثير من "المقاييس الحيوية" على ذيله ، - يتم التعبير عنها بلغة البوكر. هي الأقرب إلى الشخص. أدنى حركة عضلية ناتجة عن تغيير في الخلفية العاطفية - كل هذا يؤثر على كيفية حمل الماوس في أيدينا.

في هذا الصدد ، فإن مؤلف المقالة لديه دراسة الكترونية أصلية ، تحت عنوان العمل "العمارة المتكاملة لل Homo Sapiens" ، والتي تتضمن وصفًا لفيزيولوجيا ونفسية الشخص - في نماذج مناسبة لتشغيل تكنولوجيا المعلومات. بفضل النتائج الإيجابية لهذه الدراسة ، أشعر بالحق الأخلاقي في الإعلان عن مخطط قيادة الروبوت "غير المحصن" ، لأن "الجانب المشرق من السلطة" لديه فرصة للفوز. من هذه الدراسة ، من بين أمور أخرى ، يمكن للمرء أن يفهم كيف يرتبط استخدامنا للماوس ، من خلال واجهة الحبل الشوكي ، بنشاطنا العقلي. إلى حد ما ، يسمح هذا ، من الناحية التصويرية ، بقراءة أفكار الشخص الذي وضع يده على الماوس. في هذه "قراءة الأفكار" يُرى ناقل محتمل للهجمات المضادة لـ "المقاتلين من أجل العدالة".

T.O. تستمر المعركة بين الجانبين المظلم والضوء للقوة. يحاول البعض التظاهر بأنهم أناس ، بينما يراقب البعض الآخر السلوك غير النمطي للماوس. إن إنشاء محاكي ماوس بارع يشبه إنشاء مصباح جدي. واكتشاف حقيقة محاكاة الموهوب هو نفس صد ضربة هذا السيف مع يغتسبر آخر. إذن من سيكون أقوى؟


صحوة السلطة



التين. 6. صحوة السلطة

بطريقة أو بأخرى ، بغض النظر عن الجانب الذي نتخذه - للبوتات أو ضدها - نحن بحاجة إلى تحسين تقنية امتلاك السيف الضوئي. بمعنى تنمية عضلة الإبداع الهندسي في النفس. المكون الرئيسي هو القدرة على التركيز على المهمة ، لتكون "هنا والآن". بشكل أساسي ، هذا الكمال اليوغي هو السمادهي. السمادي في اللغة السنسكريتية يعني - التركيز الكامل على موضوع واحد. تركيز كامل! إذا التقطت شعاعًا شمسيًا بعدسة ، فسيشتعل السطح الذي أشرت إليه. وبالمثل ، في الهندسة. كل الطاقة التي نمتلكها ، يجب علينا التركيز كعدسة ، واستخدامها في الهندسة. ولكن لا تستخدم طاقتها على حساب الضرر ، مثل الأطفال الذين يأخذون عدسة ويبدأون في حرق النمل. يجب استخدام الطاقة الإبداعية للخير.

# #

-, – , – IDE , , : «#define QUESTION bb || !bb». « – », . – 5000 , – , : , – « ». , «-», «-». , , , , . . , « », 1880- , , . – - ,ما يمكن قراءته بالتفصيل على صفحات Srimad-Bhagavatam ، والتي تتوافق مع صوت OM بنفس الطريقة التي تتوافق بها لغات البرمجة الحديثة عالية المستوى مع المجمع (لمزيد من التفاصيل ، راجع "Code # code" ).


أساس التركيز هو جوهر روحي ، لشحذه يمكنك استخدام هذه الأداة ذات التقنية العالية مثل "كتاب". كتاب روحي جيد بالطبع. "الكتاب" هي الكلمة الأخيرة في التكنولوجيا: 1) يفتح بنقرة من الرسغ ، 2) مجهز بشاشة خالية من الوميض ، 3) لديه شحنة بطارية أبدية. بالنسبة لمؤلف المقالة ، هذه هي سريماد باجاجافاتام (ممنوع تمامًا في العصر السوفييتي). يمكنك أن تقرأ عنها في مقال "مهمة Bhagavatam" .

بالإضافة إلى ذلك ، للتركيز ، بغض النظر عن مدى شيوعه ، تحتاج إلى نغمة صحية للجسم والروح. هناك العديد من الطرق للتناغم. بالنسبة لمؤلف هذه المقالة ، على سبيل المثال ، هذا هو نظام غذائي نباتي (المطبخ الفيدي) ، ملابس رياضية (kmc للتزلج) والتأمل تعويذة (تلاوة Hare Krsna ، Hare Krsna ، Krsna Krsna ، Hare Hare / Hare Rama ، Hare Rama ، Rama Rama ، هير هير). يمكنك أن تقرأ عن هذا الشعار في مقال "مبدأ هير كريشنا تعويذة . " يمكنك استخدام تجربتي ، أو استخدام شيء خاص بك. ولعل القوة تأتي معنا.

Source: https://habr.com/ru/post/ar389433/


All Articles