المساعد الشخصي الرقمي

مشاهدة النسخة كاملة : تصميم مسابقة باستعمال الاختيارات


عبد الهادي بهاب
10-01-2018, 06:19 PM
السلام عليكم

كثيرا ما نريد تصميم مسابقات بسيطة تعتمد على الاختيارات
درسنا اليوم حول استعمال الاوتويلاي من اجل ذلك
---------------
افتح مشروع جديد
الان في الصفحة في ONSHOW ضع الكود
Page.ClickObject("xButton1")

وهو كود خاص بشتغيل الاوامر الموجودة في زر XBUTTON
هذا xButton نجعله مخفيا

---------------------
نضع الاسئلة في ليسبوكس بحيث نضع في item السؤال
و نضع في data الاختيارات الثلاثة بحيث نفصل بينها بنقطة (.) و يكون الاختيار الصحيح هو الاول

مثال : في item نضع ( ما عاصمة الجزائر ؟ )
في data نضع ( الجزائر . بشار . اقلي )

http://u.damasgate.com/001/4/lkvyc8kh3wnbiza9re7z.png

--------------------
الان كيف نستدعي الاسئلة من اليستبوكس ؟
ضع في المشروع paragraph لعرض السؤال
ضع 3 من الازرار button واحد اسفل الاخر وهذا لعرض الاختيارات
------------------
الان سنتدعي سؤال من اليسبوكس بطريقة عشوائبة رقمه مثلا igli
اذن نستعمل الدالة math.rondom من 1 الى عدد عناصر اليسبوكس
فيضبح الكود هو :

igli = Math.Random(1,ListBox.GetCount("ListBox1"));

-----------------------
بعد اختيارانا العشوائي للعنصر من اليسبوكس .......نستعدي محتوى item في البارغراف و الاختيارات في الازار
الكود المناسب للسؤال ببساطة هو

qus = ListBox.GetItemText("ListBox1", igli);
Paragraph.SetText("Paragraph1", qus)


اما الاختيارات فيجب تفرقة المحتوى الى 3 بحيث نستعمل دالة البحث لتحديد موضع النقطة الاولى و بالتالي الاختيار الاول سيكون من بداية النص (1) الى موضع النقطة الاولى ناقصا 1 ...........
نحدد موضع التقطة الثانية فيكون الاختيار الثاني من موضع النقطة الاولى الى موضع النقطة الثانية
الاختيار الثالث سيكون من نهاية من موضع النقطة الثانية الى نهاية النص

نستدعي النص من data عبر الكود التالي
ala = ListBox.GetItemData("ListBox1", igli);


الان تبحث عن النقطة الاولى
f1 = String.Find(ala, ".", 1);

اما النقطة الثانية
f2 = String.Find(ala, ".", f1+1);

جميل ..........الان الاختيار الاةل يكون من بادية النص 1 الى f1
ثم نضع النص قس الزر الاول

v1 = String.Mid(ala, 1, f1-1);
Button.SetText("Button1", v1);

بالنسبة للاختيار الثاني
v2 = String.Mid(ala, f1+1, f2-f1-1);
Button.SetText("Button2", v2);

الان نحدد طول النص كله
long = String.Length(ala);


فيكون الاختيار الثالث من f2 الى اخر النص اي الى long
و نضعه في الزر الثالث

v3 = String.Mid(ala, f2+1, long-f2);
Button.SetText("Button3", v3);

--------------------------
الان كي لا يتكرر السؤال نمحيه من ليسبوكس
ListBox.DeleteItem("ListBox1",igli);

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

اولا نسجل مواقع الازار في مصفوفة نسميها مثلا pos

pos={};
for i=1,3 do
pos[i] = Button.GetPos("Button"..i);
end

الان نغير المواقع عشوائيا
وفي كل مرة تحذف الموقع من المصفوفة

for i=1,#pos do
ali = Math.Random(1,#pos);
Button.SetPos("Button"..i,pos[ali].X ,pos[ali].Y);
Table.Remove(pos,ali);
end

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

الان اذا وصل عدد الاسئلة اقل من 1 اي عدد عناصر اليسبوكس سيقوم الاكود بنسخ كل محتوى اليسبوكس 2 الى الليسبوكس 1
بالكودالتالي :

if ListBox.GetCount("ListBox1") < 1 then
ListBox.DeleteItem("ListBox1", LB_ALLITEMS);
for i = 1 , ListBox.GetCount("ListBox2") do
q = ListBox.GetItemText("ListBox2", i);
a = ListBox.GetItemData("ListBox2", i);
ListBox.AddItem("ListBox1", q, a)
end
end
------

------------------------------------------
نجمع كل ما سبق نضع كل الاكواد في زر xbutton

pos={};
for i=1,3 do
pos[i] = Button.GetPos("Button"..i);
end
---------------
if ListBox.GetCount("ListBox1") < 1 then
ListBox.DeleteItem("ListBox1", LB_ALLITEMS);
for i = 1 , ListBox.GetCount("ListBox2") do
q = ListBox.GetItemText("ListBox2", i);
a = ListBox.GetItemData("ListBox2", i);
ListBox.AddItem("ListBox1", q, a)
end
end
---------------------
igli = Math.Random(1,ListBox.GetCount("ListBox1"));
qus = ListBox.GetItemText("ListBox1", igli);
Paragraph.SetText("Paragraph1", qus)
-------------------------------------
ala = ListBox.GetItemData("ListBox1", igli);
f1 = String.Find(ala, ".", 1);
f2 = String.Find(ala, ".", f1+1);
long = String.Length(ala);
v1 = String.Mid(ala, 1, f1-1);
Button.SetText("Button1", v1);
v2 = String.Mid(ala, f1+1, f2-f1-1);
Button.SetText("Button2", v2);
v3 = String.Mid(ala, f2+1, long-f2);
Button.SetText("Button3", v3);
------------------------------------------
for i=1,#pos do
ali = Math.Random(1,#pos);
Button.SetPos("Button"..i,pos[ali].X ,pos[ali].Y);
Table.Remove(pos,ali);
end

ListBox.DeleteItem("ListBox1",igli);



---------------------------------------
التصحيح : نضع لبيال Label1 و الذي سيعرض فيه عدد الاجابات الصحيحة

الان في الازار الثلاثة :
الزر الاول وهو الذي يحمل الجواب الصح اذا ضغطه يصدر صوت التصفيق و يضاف الى عدد الاجابات الصحيحة
بعد فترة معينة سيقوم النبرنامج بعرض السوال الموالي بتفعيل الزر xButton
نضع في الزر الاول الكود التالي :

Label.SetText("Label1", tonumber(Label.GetText("Label1"))+1);
Audio.Load(CHANNEL_NARRATION, "AutoPlay\\Audio\\yes1.wav", true);
Application.Sleep(1000);
Page.ClickObject("xButton1")

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

نضع فيهما الكود

Audio.Load(CHANNEL_NARRATION, "AutoPlay\\Audio\\no1.wav", true);
Application.Sleep(1000);
Page.ClickObject("xButton1")


----------------------------------------------------------
بعد الانتهاء اضغط معاينة

http://u.damasgate.com/001/4/5msuiuybjhrxa7yp5qzv.gif

ننتظر مشاريعكم و نلتقي بعدها في الاصدار الثاني

تحياتي

عبد الهادي بهاب
10-01-2018, 06:21 PM
الاصدار الثاني :

الان نريد ادخال تعديلات على المشروع
---------------
اذا ضغط الزر الصح يصبح الزر اخضر ......................
و اذا ضغط على الخطأ يصبح لونه الزر احمر ............و يظهر الزر الصح بلونه الاخضر
في السؤال الموالي تعود الازار الى لونها الاول
------------------
نتفق على المسميات :
يلومنا ثلاثة ازرار الزر الاصلي يمون تسميته في محلد الازار buttons ....... باسم gris
http://u.damasgate.com/001/4/7chmsbrv2211ijrkl7zp.png

زر اخر بلون احمر باسم red
http://u.damasgate.com/001/4/i78xa1j97rt6b0fqo8e1.png
زر اخر اخضر باسم green
http://u.damasgate.com/001/4/c1bxcvfuf3i5683pchqu.png
------------
الان في الزر الاول نستبدل الكود الموحود بالتالي :

Label.SetText("Label1", tonumber(Label.GetText("Label1"))+1);
Audio.Load(CHANNEL_NARRATION, "AutoPlay\\Audio\\yes1.wav", true);
Button.SetProperties(this,{ButtonFile = "AutoPlay\\Buttons\\green.btn"});
Application.Sleep(1000);
Page.ClickObject("xButton1")

في الزر الثاني و الثالث نضع الكود التالي :
Audio.Load(CHANNEL_NARRATION, "AutoPlay\\Audio\\no1.wav", true);
Button.SetProperties(this,{ButtonFile = "AutoPlay\\Buttons\\red.btn"});
Button.SetProperties("Button1",{ButtonFile = "AutoPlay\\Buttons\\green.btn"});
Application.Sleep(1000);
Page.ClickObject("xButton1")

---------------------------
في زر عرض الاسئلة في xButoon نضيف في الاعلى

for i=1,3 do
Button.SetProperties("Button"..i,{ButtonFile = "AutoPlay\\Buttons\\gris.btn"});
end

-----------------------------
ثم بالمعاينة

http://u.damasgate.com/001/4/8jo7d82wp5ljjxkqcw9d.gif

بالتوفيق

يوسف البراهيم
10-01-2018, 08:42 PM
الله يعطيك العافية
استفدت كثيرا من هذا المضوع