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

مشاهدة النسخة كاملة : [Advanced topics[Dark basic



The_source
18-09-2008, 10:58 PM
السلام عليكم ورحمة الله وبركاته




المُقدمــــــــــــــه






أعتقد إن البعض منكم قد طال صبره ويأس وأعتقد إنني لن أرفع دروس عن Dark basic pro
لكن اليوم وقد عدت لكي نكمل الدروس معاً
وإن شاء الله أعوض عليكم كثيراً في هذه المره لإننا سنتناول مواضيعاً متقدمه بالنسبه للمبتدئين وكذلك لكي تكون مرجعاً للكثيرين في أي وقت...للعلم إن هذه الدروس
ستكون كخاتمه ومكمله لدروس " بداية الطريق ".
بعدهــــا ســأقوم برفع بعض النُظــم المتّبعه في الألعاب وذلك لكي تكون كدفعه للمبرمج وتحفيز الكثيرين للــDark basic pro

هنــــــــاك شرط يجب إتباعه

# إن كنت لأول مره تعرف عن الــDark basic pro وهذا ما أستبعده أو إنك أردت أن تعمل عليها فيجب أن تبداء من " دروس الدارك بيسك بداية الطريق"
لا أن تقراء هذا الموضوع أولاً لإنه بيختص بالــ
*متوســــط
*متقــدم



الفهـــــــــــــــرس




في هذا الموضوع سنتناول التالي:-




* التعامـــــــــل مع المصفوفات الأحـــــــــاديه




* مـــــــاهو الــGlobal ؟




* التعامـــــــــل مع التعليمه Tybe وكيفية ربطها مع التصريح عنها بإستخدام المصفوفه أو Global




* ماهي الــSubroutine وكيفية التعامـــــــل معها




* ماهي الــFunction وكيفية التعامل معها(External function)




* إستخــــــــــدام الأمر Include#




* الخـــــــــاتمه


ملاحظه:-

*قبل أن نبداء... كل من الأمثله الذي سيتم شرحها سيكون لها مثال بهيئة ملف للدارك بيسك في المرفقات مشابه لإســم الموضوع
حتى لايتم الخلط في تسلسل الدرس

*إن وجدت عرقله في فهم بعض الأمور المتعلقه في الدرس فأنت تعرف إلى أين تتوجه بطلب ســــؤالك( موضوع الطلبات والمساعدات للدارك بيسك)
فهناك سيتم الرد على كافة أسئلتك منــــي أو من أحد الأشخاص الذي لديهم خبره في هذا المجال.

*يمكنك الرد في نفس الموضوع وذلك في حال وجد فيه أي هفوه أو أغفلت عن شيء يرجى تنبيهي أو نقـــاش بشكل عادي ....الأهم أن لايتم وضع الأسئله فيه

لنبــــــــــــــــــــــــــــــــــداء

التعـــــــــــــــــــــامل مع المصفوفات الأحاديه

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

Dim a(3) As Integer

Dim: من المعروف إن هذا المصطلح يستخدم للتصريح عن متغير...لاشيء جديد

(a(3: وهو المتغير المصرّح عنه ولكن هنا مع زيادة (3) بجانبه و محاط بقوسين...معناها إنه المتغير a سيتم التعامل معه ثلاث مرات في التطبيق وبمدخلات مختلفه لكل واحد...ستقول (لكن كيف ذلك؟
سيحصل خطاء في البرنامج ) سأرد عليك وأقول:كلامك صحيح إنه هذا في حالة التصريح عنه بشكل إعتيادي لكن بهذه الطريقه يمكنك التصريح عنه وخزن مدخلات ومتغيرات كثيره في نفس المتغير بزيادة الــIndex
شرط أن تكون المدخلات بتتوافق مع نوع متغير المصفوفه كما في المثال الثالي

ملاحظه:
الــIndex:هو العدد الذي يمثل تكرار المتغير في المصفوفه أي العدد الموجود بين القوسين




Dim a(3) As Integer
a(1)= 10
a(2)= 15
a(3)= 50


بهذا الشكل قد عملنا مصفوفه من نوع Integer ....لاحظ القيم المدخله لكل من المتغيرات a من النوع العددي أما إن كانت من نوع السلسله الحرفيه String فسنقوم بتعريفها كالتالي


Dim a(3) As String
"a(1)=" Hi
"a(2)="my name is
"a(3)="The_source


وهكذا ...

ملاحظه:-

بما إننا صرّحنا عن المتغير a إنه يحمل الرقم 3 محاط بقوسين فيجب أن تضع في الحسبان إنه يمكن إستخدام العنصر المحايد (صفر) ويمكن خزن قيمه فيه ,لاحــــــــظ




Dim a(3) As Integer
a(0)= 50
a(1)= 10
a(2)= 15
a(3)= 50



مثال بيوضح ميزتها






Dim a(2) As String
a(1) ="Wrong..make sure you`r exist or or you are not load it before"
a(2) ="Correct"
b=0
do
set cursor 10,10
print a(b)
if inkey$()="p"
cls
b=0
b=b+1
else
if inkey$()="u"
cls
b=0
b=b+2
endif
endif
loop



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

شرح الكــــــــــود السابق

أعتقد بإنك في بداية السطوار لاتواجه مشكله في فهمها(سبق أن ناقشنا التصريح عن المصفوفه)
سأبداء من بداية جملة الدوران نزولاً في الشرح

*السطر الأول: أستخدمنا الأمر Set cursor X,Y وأعطينا القيمه x 10 , y 10 ومعناه إننا حددنا أين سيظهر النص في الشاشه بطريقة المحور السيني والصادي(ليست جديده)

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

*السطر الثالث: نقوم بعمل شرط في حال إذ تم النقر على الزر P عن طريق دالة الأدخال "Inkey$()="P

*السطر الرابع: يقوم بمسح المخرجات أو محتوى الشاشه بعد كل شرط والغرض الرئيسي منها هو منع النصوص من التداخل مع بعضها البعض عند تنفيد الأحداث,لهذا نستخدمها لنظهر كل نتيجه يتم طبعها على حداً بحسب جملة الشرط

*السطر الخامس والسادس: نعطي المتغير b القيمه صفر ...لماذا برأيك؟...لاحظ إن كل من المتغيرات المصرّح عنها في المصفوفه قد تم أعطاء قيم للـIndex (الأرقام الذي يحتويها القوسين)وأستعضنا عنها بالمتغير b
أعطيناه القيمه صفر وعوضناه بدلاً من قيمة الــIndex لاحظ القيمه الذي سيتم طباعتها في الأمر
(print a(b , نلاحظ إنه سيطبع القيمه صفر أو لاشيء سيظهر عند التنفيذ ,لكن عند تحقق الشرط وتم الضغط على زر P سيتم إعطاء القيمه صفر في المتغير b(في نافذة الكود وليس عند التنفيذ) وذلك تجنباً في حالة كان هناك قيمه مخزنه سابقاً ..بعدها سيتم زيادة المتغير b بواحد كما في السطر السادس من الكود لاحظ b=b+1
الأن ستصير القيمه الذي يحتويها المتغير هي واحـــــــــــــد بدلاً من الصفر إذاً ماهي القيمه المدخله في المتغير a عندما يصير بهذه الصوره عند زيادة المتغير b بواحــــد (a(1 ...
هذا صحيح سيطبع النص المخزون في نفس المصفوفه
Wrong..make sure you`r exist or or you are not load it before

السطر السابع: هنا تتيح لنا Else إعطاء قيمه أخرى في حال توفر شرط أو حدث أخر
أما بالنسبه لبقية السطور فهي لاتختلف عن سابقاتها (منذ بداية الشرط) ماعدا إنه المتغير b سيتم زيادته ب2 عند التنفيذ لتظهر الجمله المخزن في المصفوفه الثانيه [Correct]

مثال أخر لاختلف كثيراً عن سابقه وإنما سأناقش فيه أمر بسيط ولكنه قوي جداً





dim a(5) as string
a(0)="Silent Hill"
a(1)="Resident Evil"
a(2)="Metal Gear"
a(3)="Clock Tower"
a(4)="Final Fantasy"
a(5)="Turok"
b=0
do
cls
set cursor 10,10
print a(b)
if spacekey()=1
b=b+1
wait 200
endif
if b>4
for a= 6 to 10
set cursor 10,40
print "hello world"
set cursor 10,50
print "Thats my best games "
next a
endif
if b>5 then
b=0
loop


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

ملاحظه :
1000= ثانيه في القيمه المدخله في الأمر Wait

تحدثنا عن المصفوفات ذات المخرجات الحرفيه...الأن سأعطي مثال نوضح فيه المصفوفات العدديه وهو مثال لعمل جدول الضرب(الذي مايفتهمله بيصير له ضرب)
لاتوجد صعوبه فيه ..الشيء المختلف هو زيادة عدد المصفوفه كما إنه فكرته لاتختلف عن سابقيه من الأمثله سوى إنه تم التصريح عن ثلاثه متغيرات خارج المصفوفه وعمل عليها عملية multi
كما هو في الكود
Result = x * a(Num)
للتوضيح أكثر جعلت المتغيرات أسمائها معبره عن وظيفتها

(a(Num :هذه المصفوفه عباره عن الأعداد الذي سيتم عملية الضرب بها
x :وهو المتغير المضروب فيه(الله يعينه)
Result :وهنا ناتـــج الدعس....عفواً,أقصد الضرب

ملاحظه:-
السطور الأولى من الكود ليست مهمه في العمل وإنما هي تعطي بعض الجماليات فيه(أنصح بعدم حذفها حتى يتسنى لك رؤية الناتج بوضوح أو يمكنك تعديل قيمها بحسب ماتريد)






dim a(13) as integer
set text size 40
set text to bolditalic
ink rgb(0,255,0),rgb(0,0,0)
a(0)=0
a(1)=1
a(2)=2
a(3)=3
a(4)=4
a(5)=5
a(6)=6
a(7)=7
a(8)=8
a(9)=9
a(10)=10
a(11)=11
a(12)=12
a(13)=13
Num=0
x=1
Result=0
do
cls
set cursor 200,250
print str$(Result)+" = "+str$(x)+" * " +str$(Num)
if spacekey()=1
Num=Num+1
Result = x * a(Num)
wait 200
if Num>12
Num=0
Result=0
x=x+1
endif
endif
loop




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






dim a(13) as integer
set text size 40
set text to bolditalic
ink rgb(0,255,0),rgb(0,0,0)
Num=0
x=1
Result=0
do
cls
set cursor 200,250
print str$(Result)+" = "+str$(x)+" * " +str$(Num)
if spacekey()=1
Num=Num+1
Result = x * Num
wait 200
if Num>12
Num=0
Result=0
x=x+1
endif
endif
loop




إلى هنا أنتهينا من موضــــــــــوع المصفوفات الأحاديه


مـــــــاهو الــGlobal ؟

هي تعليمه محجوزه ضمن ألاوامر الذي توفرها Dark basic ووظيفتها التصريح عن المتغيرات أي إنه مثلها مثل Dim ولكن الفرق بينهم إن dim يمكن من عبرها أن تصرح عن متغير وتحدد نوع القيمه الذي ستتعامل معها في مشروعك
أما بالنسبه لـــGlobal تعمل نفس عمل Dim إلا إنها تتفوق عليها بشيء وهو إن يمكن أن تتعامل مع المتغيرات المصرحه بها في كافة أرجاء المشروع


التعامـــــــــل مع التعليمه Tybe وكيفية ربطها مع التصريح عنها بإستخدام المصفوفه أو Global

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




Type Montada
x As integer
me As string
num as float
Endtype


*السطر الأول : قمنا بإنشاء التعليمه Type وأعطيناها إسم وهو Montada
*السطر الثاني إلى الرابع : قمنا بالتصريح عن متغيرات من أنواع مختلفه كما هو موضح
*السطر الأخير: أنهينا التعليمه ...يجب إنهائها وإلا لن يتم العمل بشكل صحيح(مثلها مثل جملة الشرط أو جملة الدوران While)
بعد أن عرفنا كيفية كتابتها والتصريح عن المتغيرات الذي فيها سأعطي مثال بسيط عنها بإستخدام المصفوفه وبعدها ركزوا معي لإننا سنتفرع بها بإستخدام المصفوفات





Type Montada
x As integer
me As string
num# as float
Endtype
dim a(3)as Montada
a(1).x=10
a(1).me="My name is The_source"
a(1).num#=50.10

do
set cursor 10,10
print a(1).me

Res= a(1).x+a(1).x
set cursor 10,30
print Res
v=int(a(1).num)
set cursor 10,50
print v
loop



شــــــــرح الكود

أول خمسه أسطر فيه قمنا بعمل متغيرات بأنواع مختلفه (Float,integer,string) في الــType
بعدها قمنا بإنشاء مصفوفه ولكن هنا ركزوا معي...ستلاحظون إختلاف كبير في التعامل معها بإستخدام الــType
قمنا بعمل مصفوفه من المتغير a وخزنّا فيه 3قيم لاحظوا إننا لم نختم تصريح المصفوفه بإستخدام نوع معين مثل
Dim a As integer أو Dim a As string .....وغيرها
وإنما ختمناها بأسم التعليمه Type وهو Montada ...لماذا؟
حتى يتم خزن القيم المعرفه في التعليمه Type بأنواعها داخل المصفوفه ويتم التعامل معها بمدخلات وأنواع مختلفه على عكس إستخدام المصفوفه بشكل منفرد(ناقشنا السبب لإنه مزاياها قليله إذ تقبل نوع واحد من التصريحات وبينطبق على كل المتغيرات)
لكن مع التعليمه Type كسرنا هذه القاعده(للعلم إن هذه أحدى مزاياها فقط).
إنظر إلى المصفوفه والمتغيرات الذي فيها فماذا تلاحظ؟
نلاحظ إنه كل متغير من المصفوفه متبوع بنقطه يليها إسم المتغير المخزون مسبقاً مع نوعه في التعليمه Type (الطريقه مشابهه للغة الفيجوال بيسك ..أي عند كتابة أسم الأداة تليها نقطه بعدها إسم الخاصيه)
بعد إضافتها في المصفوفه كل ماعلينا فعله هل إسناد قيم لكل متغير بحسب النوع المصرح به في التعليمه Type سابقاً
وللكود التالي بيوضح الفكره



dim a(3)as Montada
a(1).x=10


بعدها يمكنك التعامل معها في كافة التطبيق وأجراء العمليات عليها كما هو مبين في الكود أعلاه (Code5#).
إعـــــاده عما سبق شرحه مع بعض إضافات:
متغير المصفوفه (a(1 يتم خزن كل من المتغيرات الموجوده في type على حده للتعامل معها بشكل مستقل على حدى وهذا بينطبق على كل متغيرات المصفوفه

مثال:



dim a(3)as Montada
a(1).x =10
a(1).me ="My name is The_source"
a(1).num# =50.10

أنظر إلى الكود أعلاه ولاحظ المتغير a ومتغيرات الtype معه تليه بعد النقطه
وهذا بينطبق على كل متغيرات المصفوفه إن أردت ليكون الكود بالشكل التالي




dim a(3)as Montada
a(1).x =10
a(1).me ="My name is The_source"
a(1).num#=50.10
a(2).x =20
a(2).me ="My name is DBprog"
a(2).num# =200.52
a(3).x =30
a(3).me ="Dump"
a(3).num# =70.30



وهكذا...وهناك مثال بيوضح الفكره(في المرفقات)

مزايــــــــــــــا التعليمهType:

*تجعل عملك منظم حتى لاتخلط في التعامل مع المتغيرات في عملك (يمكنك جعل كل متغير تحت إسم معبر عن وظيفته)

*تساعد في تطوير المصفوفه عند التعامل بها معها وذلك بإنه يتم تعريف كل متغيرات الــtype مع متغير واحد في المصفوفه(تصور كم سيصير عدد متغيرات المصفوفه عند ربطعها مع الــType)
يعني الموضوع روعه
أما بالنسبه لربطها مع الـــGlobal فهي لاتختلف عن فكرة ربطها مع المصفوفه بإستثناء تفصيل واحد ...لاحــــظ الصيغه التاليه للكود




Type Guns
Handgun As String
Bullets As Integer
Endtybe

Global Weapons As Guns
Weapons.Handgun = "Desert eagle"
Weapons.Bullets = 18
load object "glock155.x",1
Do
if object exist(1)=1 then
set cursor 10,10
print Weapon.Handgun
.
.
.
.
loop




وهكذا ...تتعامل معها بعكس ربطها مع المصفوفه إذ إنك تربط كل متغير من الــtype في عنصر واحد من المصفوفه وهذا بينطبق على كل عناصرها لكن ليس مع الــGlobal لإنه لايحوي متغيرات للمصفوفه وإنما يتيح لك هذا النوع من التصاريح بالعمل معها من الدوال
أعتقد إنه المثال أعلاه بيوضح الفكره
بهذا هنا أنتهيــــــــنا...


ماهي الــSubroutine وكيفية التعامـــــــل معها

في لغات البرمجه الأخرى الــSubroutine وظيفتها أن تقوم بإحظار مجموعه من العمليات والمعادلات قد تم عملها من قبل المستخدم وإحظارها للتعامل معها في تطبيقه
هو نفس الموضوع في الـــDark basic لكن الطريقه مختلفه في كتابة الأستدعاء ووظيفتها مشابهه نوعاً ما لوظيفة Goto ولكن الفرق بينهم

Goto:تجعل الــCompiler يتخطى المنطقه الموجود فيها الأمر نفسه ويقفز إلى العنوان المراد إليه(ناقشنا هذا الموضوع في دروس الدارك بيسك بداية الطريق)
ومع هذا سأعيده بمثال بسيط





set cursor 10,10
print "Hello world";
wait 2000
set cursor 10,30
print "This is my best home page[WWW.Montada.COM]"
wait 2000
goto good:
set cursor 10,50
print "I hate every thing"
good:
set cursor 10,70
print "I like programming"
wait key




إن قمت بطباعة الكود أعلاه ونفذته ستلاحظ إنه كل ثانيتين سيتم طباعة الجُمــــل بالترتيب إلى عند الأمر[Goto[downهنا سيتخطى أ ي شيء يليها وسيبحث عن الكلمه down ليتم القرائه من السطر الذي يليها بالضبط
معنى أخر سيتم طباعة كل شيء عدا جملة


I hate every thing

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







set text size 24
set cursor 200,200
input "set you`r number here ...",num

do
gosub Code
loop

Code:
cls
set cursor 240,280
print "You`r old is .."+str$(num)
Return



لنتجاهل ماهو خارج حلقة الدوران ونلاحظ الكود المحصور فيها[Gosub[Code ...ماهو داخل القوس يمكن تغييره كيفما تشاء لإنه الأسم الذي سيتم القفز إليه مع مراعاة كتابته في المنطقه الذي سيواصل الـCompiler قرائة الكود وإحظار القيم بواسطة الأمر Return
إلى نفس المنطقه الذي قفز منها في البدايه ليتم قرائة الكود بشكل صحيح...

ملاحظه:
هنا مثال أخر ولكنه لايختلف عن الأخر لتصلكم الفكره بشكل أسرع(أعتقد إنكم فهمتم لإنها هي نفس الطريقه المقابله لها في العمل بالمثال السابق)




set text size 24
set cursor 200,200
input "set you`r number here ...",num

do

cls
set cursor 240,280
print "You`r old is .."+str$(num)
loop



إنتهـــــــــــــــــــــى...


ماهي الــFunction وكيفية التعامل معها(External function)

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

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

*يمكنك الأستعانه بالـFunctions في من مشاريعك وأخذها إلى مشروع أخر(نسخها وإنما معاينة المتغيرات الذي ستنقلها لمشروعك الأخر لتسير برمجتك بشكل أنسب)
أو عند عمل Function بتستفيد منه قوم بحفظه في ملف مستقل (أنا أتبع هذه الطريقه وأقوم بعمل أكبر عدد من الfunctions لتكون كمرجع لي عند ترك اللغه لفتره).

هنا بعض الأمثله فكرتها سهله لعمل function وسأقوم بشرح الأمثله سطراً سطراً حتى يتيح أن تفهم بسهوله كبيره
قبل كل شيء هناك طريقتين لكتابة الــFunction

الطريقه الأولى:

قوم بطباعة هذا الكود في نافذة الأكواد بالــDark basic



()Sum
wait key
()Function Sum
a=1
a=a+1
set cursor 200,200
print a
Endfunction



ملاحظه هامه:
*يفضل طباعة الكود أعلاه كما تشاهده بالضبط للتجربه ...ليس أن تنسخه مباشره لإنه سيختلف موضع الأقواس في الجهه الأخرى .
*لايجب عمل function داخل function أخرى.
*يجب عمل الــfunction خارج جملة الدوران.

شرح الكود السابق

نلاحظ في بداية السطر إسم Sum متبوع بقوسين(),فالأسم sum هو عباره عن إسم أو تعبير يستخدم ليدل على عمل الداله(أي أسم تريده)
أما بالنسبه للقوسين()الموجودين بجانبه فيجب أن تعرف شيىء وهو إنه سيتم إعادة قيم أو إدخال قيم وهذا ما سنأخذه في الطريقه الأخرى أيضاً
بمعنى أخر إنه سيتم تمرير وأدخال قيم في الــfunction
إنتبــــــــــــــــه هنا

بعدها نلاحظ السطر
()Function Sum :وهذه أول خطوى يتم بها عمل الداله...وإليك طريقة كتابه الداله أو مايُعرف بالــParameter.
إسم الداله متبوع بقوسين Function
()Function FunctionName
حالما ننشئها بهذا الشكل عندها يتيح لنا أن نكتب الأكواد اللازمه لعملنا وقد قمنا بكتابة الكود



a=1
a=a+1
set cursor 200,200
print a
Endfunction


ليس هناك صعوبه فيه...أنشئنا متغير a وأعطيناه القيمه واحد ومن ثم زايدناه بواحد كما في السطر الثاني من الكود وبعدها حددنا إين سيظهر في الشاشه عند التنفيذ
وعندها قمنا بوضع أمر الطباعه Print ليتم عرضه عند التنفيذ
وبعدها الخطوه الأهم وهي ختم الداله بــEndfunction حتى لايصير هناك خطاء لإنه سيتم التعامل مع القيم المحصوره فيها فإن لم تنهيها فسيظهر هناك خطاء قبل ظهور شاشة التنفيذ
بهذه الطريقه أنشئنا داله وكل ماعليك فعله لتستدعيها في عملك هو وضع إسمها فقط متبوع بقوسين طالما إنك عملتها مسبقاً ليصبح الكـــــود بهذا الشكل



()Sum
wait key
()Function Sum
a=1
a=a+1
set cursor 200,200
print a
Endfunction


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





Textposition(240,120,"The_source")
wait key
Function Textposition(X,Y,Name$)
set cursor X,Y
print Name$
Endfunction



شـــــــرح الكود :

السطر الأول:إسم الداله الذي أتخذناها للعمل هي Textposition وإسمها جعلته معبر عن وظيفتها لكن هذه المره نلاحظ إن الأقواس المتبوعه مع إسم الداله ليست خاليه وإنما فيها قيم (سنعرف لماذا)

السطر الثاني:لا أعتقد إنه فيه صعوبه وإنما يتم إنتظار نقرة أي زر في الـKeyboard لإلغاء عمل التنفيذ

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

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

السطر الخامس:قمنا بوضع أمر الطباعه لإظهار المدخلات المتغير Name$ عند التنفيذ (لاحظ ...ثالث متغير داخل القوس عند عمل الداله"السطر الثالث في الكود")

السطر السادس: أنهينا الداله
قبل الخوض أريد أن أتأكد من إنك فهمت الفكره حتى تكون معي في الصوره قبل أن أواصل الشرح
الأن بعد تكون الفكره في بالك لنعود إلى السطر الثالث من الكود سنلاحظ أسماء المتغيرات الذي عملناها في الداله(في القوسين)والسبب حتى نستعيض بها في مشروعنا بقيم وكل قيمه تمثل عملها بحسب موضعها فيصبح شكل الداله وكاإنها إحدى أوامر الدارك بيسك إذ إنه تكتب إسمها والقيم فيها
كما هو في السطر الأول من الكود سيطلب الأحداثي x,y ونقوم بوضع قيم تمثلهم ليتم عرض النص في أي مكان تريده بحسب مُدخلاتك أما بالنسبه للأسم الموجود في إشارة التنصيص "" داخل القوس(The_source)هو إننا عوضنا بدلاً من المتغير Name$ بأي أسم نريده ...فأنا أخترت The_source
هذه هي فكرة الموضوع فقط كل ماعليك فعله هو تغيير القيم داخل القوس لترى النتيجه بطرق أخرى...قد تواجه شوية عصلجه في البدايه ولكنك ستعتاد عليها وتصبح طريقتك المفضله إن شاء الله
وهناك مثال الكود فيه أكبر من الذي شرحته وهو موجود في المرفقات (الغرض منه لتختبر نفسك...بسيط جداً).
إلى هنا نكون أنهينا موضوع الــFunctions


إستخــــــــــدام الأمر Include#

الكثيرين سمع عن هذا الأسم من قبل في أسرة لغة C للتصريح عن نوع المكتبه الذي ستتعامل معها في تطبيقك ولكنها عباره عن أمر في لغة الدارك بيسك ووظيفتها ليست بهذه القوه
وإنما حبيت شرحها لإن البعض سيتعجب عن رؤيتها والأخر ليس عنده فكره عنها بالخالص فأنا عرفتها عندما كنت أقوم بقرائة بعض أمثلة الدارك بيسك في ملف الــHelp
ووظيفتها إستدعاء بعض من الدوال والقيم من ملف دارك بيسك أخر من نوع Dba وهي موجوده في مثال على المرفقات وإسم الملف على نفس إسم الأمر(إن واجهت صعوبه في فهمها فلابأس....يمكنني شرحها لك )
كل ماعليك فعله عند فك ضغط ملف الأمر include #هو تنفيذ الملف الذي يحمل نفس الأسم لمشاهدة النتيجه.
وهناك أمر أخر يدعى Const أي الثابت وهو إحدى الأوامر نادرة الأستخدام في الدارك بيسك ستجده هو وأمر #include في هذا المسار
C:\Program Files\Dark Basic Software\Dark Basic Professional\Help\examples\core
حظـــــــــــــاً موفقاً ...



الخاتمـــــــــــــه:


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


إنتهــــــــــــــــــى.......:biggthump

snake_x86
19-09-2008, 04:05 AM
انت رائع فعلا ... اعتقد ان هذا من أهم الدروس و هو الأساس اللذي اعتمد عليه في برمجة الأعداء
و هو استخدام الـ Type مع المصفوفات حيث يمكنك عمل تايب للأعداء و عمل منه مصفوفة للتحكم بمجموعة اعداء
باستخدام الـ For ... Next
انصح جميع من يريد اتقان الدارك بيزيك التركيز في هذا الدرس و خاصة مع التايب و المصفوفات
السب روتين استخدمه في التقليب بين القوائم مثلا الاعدادات و القائمة الرئيسية و كود اللعبة
اتمنى ان يكون درسك القادم عن استخدام المصفوفات و التايب مع الـ For ... Next
و قريبا سأضع كود مرتب للعبة كاملة كمثال حي لكيفية استخدام هذه الأدوات لتكوين لعبة كاملة

Game baker
19-09-2008, 04:41 AM
رائع جدا جدا
رغم أني مبتدئ الا انك درسك واضحك عليه الابداع والفائدة

شكرا لحرفك

hakkai
19-09-2008, 05:25 AM
شكرا
كنت انتظرك

kakarot
19-09-2008, 10:18 AM
والله إنك مبدع تسلم لي رجعة بعد إعادة قرأتها لأفهمه 100%

شبـح الليل
19-09-2008, 10:29 AM
مشكور يا اخي
مع اني ما بعرف الدارك بيسك منيح
الا انو مبين شرحك طويل ووافي
كامل والكمال لله طبعاً

towfieee
19-09-2008, 06:50 PM
جميل جداً ، فعلاً بعد ما بدأت استعمل ال Type سهلتلي أمور كثيرة.

سأحاول ضم الدرس اليوم للمجموعة

The_source
19-09-2008, 09:38 PM
انت رائع فعلا ... اعتقد ان هذا من أهم الدروس و هو الأساس اللذي اعتمد عليه في برمجة الأعداء
و هو استخدام الـ Type مع المصفوفات حيث يمكنك عمل تايب للأعداء و عمل منه مصفوفة للتحكم بمجموعة اعداء
باستخدام الـ For ... Next

والله نورت موضوعي...أصبحت مثل العمله الصعبه فينك ياراجل :D أما من ناحيه أخرى
نظامك لعمل الأعداء ممتاز حالما تضيف إليه كود حساب المسافه وأمر Point object ليكون على أفضل وجه :biggrin2:
هذا متوقع منك (كعادتك مبدع)...بهذه الطريقه يصير ذكاء أصطناعي بسيط ومناسب لألعاب الميني


انصح جميع من يريد اتقان الدارك بيزيك التركيز في هذا الدرس و خاصة مع التايب و المصفوفات
يُفترض الأخذ بهذه النصيحه القيمه وأوفقك الرأي وهذا السبب الرئيسي لرفع موضوعي بالأحرى كان موضوعي كامل بنسبة 95% وأنت أكملت 100% بهذه العباره فقط


اتمنى ان يكون درسك القادم عن استخدام المصفوفات و التايب مع الـ For ... Next

إن شاء الله أكتبه ولكنني سأرفع بعض المواضيع المتعلقه بالنُظم المتبعه في الألعاب بشكل موسع حالما أنتهي منها عندها طلبك مجاب


و قريبا سأضع كود مرتب للعبة كاملة كمثال حي لكيفية استخدام هذه الأدوات لتكوين لعبة كاملة

مممممممم...في هذه الحال أعتقد بإنك سترفع الطريقه الذي أردت مني شرحها في موضوع فالأختيار لك (أرفعها أنا أم أنت لكي نختصر الوقت ولايضيع الجهد)...
هههههههههه الأن سيلتفت الأعضاء إلى الدارك بيسك بسبب المواضيع القادمه لإنها ستكون جامده بمعنى الكلمه
وأعني مايقول بما إنها عباره عن لعبه open source
أربعه منك ياسنيك بيحكموا المنتدى خخخخخخخخخخ :D



رائع جدا جدا
رغم أني مبتدئ الا انك درسك واضحك عليه الابداع والفائدة

شكرا لحرفك



مشكور يا اخي
مع اني ما بعرف الدارك بيسك منيح
الا انو مبين شرحك طويل ووافي
كامل والكمال لله طبعاً

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



والله إنك مبدع تسلم لي رجعة بعد إعادة قرأتها لأفهمه 100%

أنت أكثر شخص أريده أن يستفيذ من الدروس لإنك أفضل من البعض (لاتتنقل من لغه إلى أخرى من دون هدف)
موفق أخي^^ :biggthump



جميل جداً ، فعلاً بعد ما بدأت استعمل ال Type سهلتلي أمور كثيرة.

سأحاول ضم الدرس اليوم للمجموعة


أكيد بيتسهل الموضوع معها ....وعاشت الرجال أمثالك:wink2: (ترتيب الدروس)

Kamuri-San
20-09-2008, 04:05 PM
الحمد لله
من زمااااااااااااااااان منتظر درس مثل هذا لأتعلم عليه مبادئ الدارك بيسك
انت رائع يا أخي
و شرحك ممتاز
^^
مشكور جدا جدا جدا

و بحاول اطبق درسك

في امان الله

The_source
21-09-2008, 08:43 PM
الحمد لله
من زمااااااااااااااااان منتظر درس مثل هذا لأتعلم عليه مبادئ الدارك بيسك
انت رائع يا أخي
و شرحك ممتاز
^^
مشكور جدا جدا جدا

و بحاول اطبق درسك

في امان الله




موفق أخي الكريم لكن أرجو إنك كونت فكره من درسي الأول قبل الخوض في هذا...



وملاحظه هامه للكل

عند الضغط على زر Code# ستلاحظون بعض الأكواد الأضافيه مثل
[left] و [color] بمعنى أخر أكواد مختصه بترتيب النصوص وليس لها علاقه في الدرس ....أرجو الأنتباه وشكراً

The_source
21-09-2008, 08:46 PM
الحمد لله
من زمااااااااااااااااان منتظر درس مثل هذا لأتعلم عليه مبادئ الدارك بيسك
انت رائع يا أخي
و شرحك ممتاز
^^
مشكور جدا جدا جدا


و بحاول اطبق درسك


في امان الله




موفق أخي الكريم لكن أرجو إنك كونت فكره من درسي الأول قبل الخوض في هذا...




وملاحظه هامه للكل


عند الضغط على زر Code# ستلاحظون بعض الأكواد الأضافيه مثل
[left] و [color] بمعنى أخر أكواد مختصه بترتيب النصوص وليس لها علاقه في الدرس ....أرجو الأنتباه وشكراً

العضو الخارق
22-09-2008, 09:43 PM
الابداع كلمة قليلة عليك :)
لى عودة وراح اقرء الموضوع مرة اخرى :) اكيد

محمد THE DARK K
22-09-2008, 10:52 PM
Great Topic & perfect lesson and i wish you to keep
the Good work and See your incredible games

with my
Best Wishes
to you

The_source
23-09-2008, 09:06 PM
الابداع كلمة قليلة عليك :)
لى عودة وراح اقرء الموضوع مرة اخرى :) اكيد


حياك الله أخي



Great Topic & perfect lesson and i wish you to keep
the Good work and See your incredible games

with my
Best Wishes
to you

It`s a nice words to say from you dud
keep going

Ahmedbna
03-01-2009, 11:21 AM
السلام عليكم ، تحياتى لك اولا ولشرحك المميز ثانيا ، اسمح لى بأول اسئلة لى متعلقة بالموضوع

- لماذا نعلن عن المتغير بعبارة dim مع اننا من الممكن الأعلان عن المتغير بدون كتابة dim
مثال : dim a as byte - ممن ان تكون a as byte

- اليس المتغير float هو نفسه long قديما ؟

The_source
04-01-2009, 09:16 AM
- لماذا نعلن عن المتغير بعبارة dim مع اننا من الممكن الأعلان عن المتغير بدون كتابة dim

السلام عليكم
نستخدم التعليمه dim عندما نقوم بعمل مصفوفه فقط
أما طريقتك يمكننا أن نتبعها في الفيجوال بيسك عندما نصرح عن متغير سواء كان بdim أو كما ذكرت


اليس المتغير float هو نفسه long

نعم .....هذا صحيح ولكن ليس قديما ً
فبض اللغات مازالت تحتفظ بهذه التسميات حتى الأن.....^^

Ahmedbna
07-01-2009, 06:24 PM
السلام عليكم - اخوك احمد البنا يسأل من جديد فى اطار نفس موضوعك ويصحح ايضا :) خطأ بسيط

اولا اليك التصحيح البسيط
- ارى انك نسيت علامة الشباك # فى هذا المثال اللذى عرضته فى احد السطور والخاص بدرس ال type وبالتحديد للمتغير العشرى sum وبالتالى لن يعمل المثال مع الأعضاء بشكل سليم ، واليك مثالك وسأوضح لك مكان الخطا فى السطر عن طريق تكبير النص



Type Montada
x As integer
me As string
num# as float
Endtype
dim a(3)as Montada
a(1).x=10
a(1).me="My name is The_source"
a(1).num#=50.10


do
set cursor 10,10
print a(1).me


Res= a(1).x+a(1).x
set cursor 10,30
print Res
v=int(a(1).num)

set cursor 10,50
print v
loop



- السؤال اثانى وهو الأهم /
لاحظت عن التنفيذ انه طبع النتيجة الخاصة بالمتغير sum#
= 50 فقط مع انه من المفروض طباعة الناتج 50.10 ،،، فلما هذا . وشكرا لك .