الخميس، 13 مايو، 2010

Code of the Week:Random Choice 2

السلام عليكم

 

انتهينا في الفقرة السابقة من كتابة برنامج بسيط يتيح لنا اجراء قرعة لعدة ارقام ويظهر الرقم الذي اختاره ويعرضها على الشاشة

 

ثم توقفنا عند السؤال التالي

2-طلب منا تصميم برنامج لعمل قرعة للفائزين في احدى المسابقات بحيث يقوم بعرض قرعة باسمائهم ويختار اسما معينا

كيف نقوم بذلك؟

 

هنا الجواب باذن الله تعالى

 

قم بتشغيل المشروع السابق وقم باضافة فورم جديد ولنقم بتسميته frmWinners

 

هذه هي الادوات التي نحتاج اليها  بالاضافة الى اداة المؤقت او Timer

image

 

Label>>>>>lblWinner

Button>>>>>btnChoose

Timer>>>>>tmrLuckyGuest

Textbox>>>>txtMyChoose

combobox>>>>>cboWinners

 

سنعرف فائدة كل من مربع النص ومربع القائمة لاحقا

 

اما الان فهناك حلان

اما ان يكون مربع النص ومربع القائمة خلف الزر  او ان يكونا في اي مكان وتكون الخاصية

visible=false

وذلك لاننا لانريد اظهارها للمستخدم

image

وبالتالي هذا الشكل النهائي

 

نفترض ان الاسماء عندك جاهزة وكل ماعلى المستخدم القيام به هو اجراء القرعة

اذن هذا ماسنقوم به

1-قم بادخال الاسماء في مربع القائمة مستخدما الخاصية Items

image

2-سنقوم الان بادخال الكود اللازم طبعا خصائص المؤقت مثل المشروع السابق

الان سنقوم بالجزء المفضل الا وهو كتابة الكود ولكن قبل كتابة الكود سنقوم ببعض التغييرات للاداة tmrLuckyGuest

قم بتغيير الخاصية interval ألى 50 وهنا الرقم يحدد سرعة القرعة حيث اننا نريد عرض الارقام عند اجراء القرعة وهي تتغير بشكل سريع فالسرعة هنا نحددها من خلال هذه الخاصية

نقوم بتغيير الخاصية Enabled الى False وهذه نقطة مهمة جدا حيث انها تقوم بايقاف المؤقت حتى يتم تشغيله بواسطتنا او بواسطة المستخدم

نقوم بادخال الكود الخاص بالزر

Timer1.Enabled = True
i = 0

 

نفس المثال السابق ولا يحتاج الى شرح

نقوم الان بادخال كود المؤقت

image

Dim m As Boolean = False
   Dim i As Integer = 0
   Private Sub Timer1_Tick(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Timer1.Tick
       i += 1
       Dim s As Integer
       Dim si As New Random
       s = si.Next(0, ComboBox1.Items.Count - 1)
       Label1.Text = ComboBox1.Items(s)
       If i = 80 Then
           Try
               Label1.Text = ComboBox1.Items(s)
           Catch ex As Exception
           End Try
           Timer1.Enabled = False
       End If
   End Sub

لاحظ باننا في هذا المثال اضفنا متغير جديد من نوع boolean وذلك لسبب سأقوم بتوضيحه لاحقا

وعرفنا المتغير من نوع integer تماما مثل المشرو السابق

في حدث المؤقت

تقريبا مثل المشروع السابق حيث اضفنا القيمة 1 الى المتغير i في اشارة الى عدد المرات التي تم تنفيذ الكود

وهنا الجديد قمنا بتعريف متغير s من نوع integer حتى يتنسى لنا استخدامه في مربع القائمة

قمنا بتعريف متغير من نوع random حتى يقوم باختيار رقم عشوائي مثل المشروع السابقة

وهنا قمنا باسناد الرقم العشوائي الى المتغير s مع ملاحظة مايلي

قمنا بتحديد اصغر رقم 0 واكبر رقم ComboBox1.Items.Count – 1

ولكن لماذا

الفكرة هنا باننا سنقوم باختيار رقم عشوائي يمثل عدد الفائزين وعدد الفائزين حقيقة هو عدد العناصر الموجودة في مربع القائمة وجيث ان اول عنصر في القائمة يمثل بالرقم 0 وليس 1 فاذن يفترض بان يكون اكبر قيمة هي عدد العناصر-1 لاننا سنقوم باستخدام هذا الرقم في جلب العنصر من مربع القائمة

لاننا لو افترضنا ان عدد الفائزين 5 وقمنا بجعل اكبر قيمة ComboBox1.Items.Count اي 5 ومن ثم قمنا باستدعاء العنصر رقم 5 من مربع القائمة سيحدث خطا ولن يعمل البرنامج لماذا؟

 

لان العنصر 5 غير موجودين لان الموجود فقط

0

1

2

3

4

 

نعود للكود وعرفنا السر في اختيار اكبر واصغر قيمة للرقم العشوائي

طبعا مثل المشروع السابق في كل مرة نقوم باضهار العنصر في Label حتى تظهر تاثير القرعة

Label1.Text = ComboBox1.Items(s)

وفي الاخير عند الوصول لعدد المرات المطلوب نضع نفس الكود السابق حتى يتوقف عن الاكمال ونوقف عمل المؤقت بالكود

Timer1.Enabled = False

 

الى هنا المفترض ان البرنامج كامل ولكن خذ هذا السؤال

 

لماذا يقوز في القرعة دائما احد المقربين لاصحاب الجائزة؟او بمعنى اخر كيف ممكن اخلي القرعة لصالحي بحيث اني انا احدد الفائظ مسبقا بحيث انه فقط اظهر لهم تاثير القرعة بينما المسابقة محسومة مسبقا والفائز معروف مسبقا

 

هنا ياتي دور مربع النص

حيث يمكننا تعديل الكود قليلا ليتماشى مع رغباتنا

 

قم باضافة حدث doubleclick للفورم وقم باضافة الكود التالي

TextBox1.Text = InputBox("")

 

في هذا الكود نقوم باظهار inputbox يقوم بالسؤال عن قيمة مربع النص

سنفترض في هذا المثال باننا سندخل رقم العنصر للفائز الموجود في مربع القائمة

 

الان كود المؤقت كما هو ولكن عند انتهاء تاثير القرعة –في داخل التعليمة  if then- لانجعلها نفس ماقبلها

Label1.Text = ComboBox1.Items(s)

وانما في المقابل نقوم بتغيير القيمة s الى مربع النص فتصبح كالتالي

Label1.Text = ComboBox1.Items(Val(CInt(TextBox1.Text)) - 1)

 

 

ممتاز اذن عرفنا السر الان كيف يمكن تزوير القرعة

 

 

تحياتي

ليست هناك تعليقات:

إرسال تعليق