
هذا جزء فقط من مشروع عبارة عن محاكي للعبة الورق Simulator. الغاية من البرنامج هو معرفة ما قد يحدث لنتائج لعبة اذا تم تغيير قوانين اللعبة . ما هي احتمالات الخسارة والربح. وما هي عددها . وكم نسبتها . هذا البرنامج مهمته اعطائنا نظرة مستقبلية وقدرة على تغيير قواعد اللعبة ومقارنة النتائج .
اول مهمة في المشروع هي خلط الأوراق . بالطبع خلط الأوراق يعتمد على العشوائية . لكن الرقم العشوائي الذي ينتجه الحاسب في الحقيقة ليس إلى ناتج عملية حسابة وهذا ما يجعله ليس عشوائيا ابدا ولا يناسب نهائيا مثل هذا النوع من التطبيقات . لذلك اصبحت المهمة الاولى هي انتاج ارقام عشوائية واقعية وهذا ما يدعى True Random Number
لتحقيق هذا كان من الواضح اننا بحاجة لدخال عامل طبيعي خارجي في عملية استنتاج هذه الارقام العشوائية
كان الاختيار الاول هو الضجيج باستخدام arduino ولكن مع الاسف لسبب تقني ( عطل في المايكرفون ) لم استطع الحصول على نتائج جيدة .
الخيار الثاني هو الحصول على العشوائية من محاور الهاتف الجوال . الفكرة تعتمد على قراءة ميول هذه المحاول اثناء الحركة وتسجيلها ضمن قاعدة بيانات لاستخدامها لاحقا
المرحلة الاولى :
DataSnap Server داتاسناب السيرفر :
وضعت اجراء واحد ودالة واحدة الاول هو NumberToDataBase و مهمته دمج القيمة القادمة عبر البرمتر ( Values ) بعبارة insert وتنفيذها . اما الدالة فيه فقط تعدي عدد الارقام العشوائية التي تم تسجيلها في قاعدة البيانات. ( label3 ) هي لعمل debuging ومتابعت لا اكثر
DataSnap Client داتاسناب الكلاينت :
![]()
![]()
الفكرة تعتمد على ابقى البرنامج مفتوح والتجول والتحرك وقراءة محاول ميول الهاتف واخد اخر ثلاث خانات . ( ثلاث خانات لاني احتاج لعدد عشوائي كبير لضرورات محاكي اللعبة لانه هناك احتمال ليكون عدد مجموعات الكروت اكثر من واحد .
MotionSenser1 : هو المكون TMotıonSenser الذي يعيد ميول محاور الهاتف الثلاثة
ولانه ليس من المنطقي ارسال كل رقم عشوائي لوحده لداتاسناب سيرفر واشغال الشبكة ومحرك قاعدة البيانات . قمت بارسال كل 100 رقم عشوائي مع بعض بعد تجهيزها للإضافة مباشرة في عبارة insert .
وهذا هو كامل الكود . ( الكود ليس متقن لسبب ان هذا البرنامج لن يتم استخدامه مرة اخرى ).
بقي فقط ان اقوم بتنفيذ برنامج داتاسناب سيرفر وبرنامج الموبايل واتجول واتحرك :)
المرحلة الثانية :
بعد الحصول على الكم الهائل من الارقام الحقيقية العشوائية محصورة بين 0 و 999 . تاتي المرحلة الثانية وهي عملية خلط الكروت shuffling .
الفكرة تعتمد على اعتماد ترقيم متسلسل للكروت من 1 حتى 52 . للمجموعة Deck الاولى و من 53 حتى نهاية الكروت في حال كان هناك اكثر من مجموعة مستخدمة .
كبداية قمت برسم الكروت وتوضعها في ImageList .
كبداية قمت بتحضير كلاس خاص لعرض كرت اللعب . مشتق من TRectangle . ( كان يمكن استخدام TImage .. )
ImageLit : لتحديد مكون ImageList الذي يحتوي على صور الكروت كلها.
ImageIndex : هو رقم الكرت محصور بين 1 و 52 .
Facing : خاصية لتحديد اذا كان الكرت سيظهر مقلوب أم على الوجه .
ولمعرفة رقم الكرت من الرقم العشوائي. سنقوم بترقيم الكروت المستخدمة ( قد تكون اكثر من مجموعة deck ) ابتداءا من 1 وحتى اخر كرت . اما معرفة imageindex من اصل 52 صورة نقوم بحساب وفق المعادلة :
(RandomNo % ((52*' + inttostr(Decks) + ') - rownumber + 1))
تم حسابها مباشرة من الكوري وليس من التطبيق عند جلب الارقام العشوائية من قاعدة البيانات . فلا داعي لحسابها ضمن التطبيق.
اصبح عندنا كل ارقام الكروت حقيقية العشوائية . الان سنحتاج ل array عدد 2 الاولى SortedCards فيها كل أرقام الكروت مرتبة والثانية shuffledCards سيتم نقل إليها العناصر من المصفوفة الأولى. لتشكيل المصفوفة النهائية التي تحتوي على كل الكروت حقيقية العشوائية. ( قد لا نحتاج المصفوفات في هذه المرحلة . لكن المشروع لم ينتهي بعد وهذه المصفوفات لها استخدام مستقبلي ).
واخيرا يبقى اظهار النتائج للمستخدم . يكفي انشاء Tcard بعدد عناصر المصفوفة ShuffledCards . واضافة مؤثر لعرض حركة لقلب الكرت لكلاس tcards.
وهذه هي النتيجة حتى الان .. فالعمل لم ينتهي بعد .