• 0
alaadiaa

لعبة الأربعة تربح

سؤال

السلام عليكم

يبدو لي أنكم مللتم من الأخ عبده

كما يبدو لي أنكم مللتم من المقدمات

على كل وكما أقولها لكم دائماً لا يعنيني راحتكم في شيء

بل ربما أكون أكثر سعادة لو نغصت حياتكم

لماذا؟

ببساطة أحب لقب علاء الشرير

لماذا؟

لأن عكس الشرير هو الطيب

والطيب في زمننا هذا له مكافئ آخر ألا وهو ...

وتجد أطناناً من الناس تحاول أن تستغلك

والكل يقول لك أنت طيب و so cute

بالطبع ستكون طيب وجميل وكل الصفات الجيدة ماداموا يستغلونك

على كل أنا أريد التغيير ولا شيء غير تغيير

أما ما الذي سأكلمكم عنه اليوم

أظنكم لاحظتم اسم الموضوع

اسم اللعبة: لعبة الأربعة تربح

إصدارة اللعبة: v1.00

قصة اللعبة:

في البداية كان الأخ بيشوي العظيم من منتديات الفريق العربي يحاول برمجة اللعبة

بالطبع لا أذكر الكثير عن الموضوع

يهيألي أنه مضى عليه سنة على أقل تقدير

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

في النهاية وصلت إلى أني برمجت وأعدت برمجة اللعبة كاملة

وتوقف الأخ بيشوي عن إكمال اللعبة

أعتقد لإنشغاله في امتحانات الجامعة

على العموم أنا لم أتوقف

أنهيت النسخة v1.00 beta لكنها لم ترى النور

بعدها دخلت في دوامة حزمة المحرك

فترة طويلة نسيت موضوع هذه اللعبة تماماً

بعد أن أنهيت الإصدارة v0.8 من المحرك

أتتني فكرت أن أستخدم المحرك في تحريك لعبة الأربعة تربح

على كل أنهيت العمل عليها منذ فترة طويلة

لكنها بقيت تقبع في الظلمات السحيقة لجهازي

لا أدري ما الذي ذكرني فيها

لكني تذكرتها ولا أدري هل هو من حسن حظكم أو من سوء حظكم :)

طريقة لعب اللعبة:

هذه اللعبة تقوم على أن هناك لاعبين

لاعب أزرق ولاعب أسود

كل لاعب من هذين اللاعبين يملك مجموعة من الكرات بلونه

وهناك مجموعة متجاورة من الأعمدة يقوم اللاعبان بوضع الكرات فيها

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

يبدأ اللاعب الأسود اللعبة ثم يتناوب اللاعبين على وضع الكرات في الأعمدة

اللاعب الذي يستطيع ترتيب أربع كرات من لونه على التوالي

في أحد الاتجاهات الأفقي ، العمودي أو القطري (القطر الرئيسي أو الفرعي)

يعتبر هو الفائز باللعبة

اللعبة من الناحية التقنية:

اللعبة تتكون من مجموعة من الفئات

1- الفئة TheFourthWinGame

وهي تمثل الأساس في بناء اللعبة كلها أو ما يعرف بطبقة Logic

حيث تحتوي على مصفوفتين ثنائيتي الأبعاد وتمثلان:

أ- مصفوفة اسمها exist وتخبرنا إذا كان المربع قد تم وضع كرة فيه من قبل

ب- مصفوفة اسمها playerIfExist وتحتوي على اللاعب الذي وضع الكرة في المربع

واضح أن المصفوفة الثانية لا معنى لها بدون المصفوفة الأولى

بمعنى آخر أنا لا أبحث من وضع الكرة في المربع في حال عدم وجود كرة أصلاً

تحتوي الفئة على مجموعة من الدوال وهي تنقسم إلى قسمين:

أ-دالة findFirstEmptyCellInColumn تساعدك في GUI لمعرفة المكان الذي سوف ترسم فيه الحلقةالجديدة

إذا كان العمود ممتلئ سترجع هذه الدالة -1

ب-دوال الفحص وهي على النحو التالي

* دالة testFair وهي مسؤولة عن معرفة التعادل حين يحصل

* دالة testWin وهي مسؤولة عن معرفة الفوز حين يحصل

وتعتمد هذه الدالة على مجموعة دوال داخلية private

والدوال هي:

-testColumnWin هذه الدالة مسؤولة عن فحص الفوز على مستوى العمود

-testRowWin هذه الدالة مسؤولة عن فحص الفوز على مستوى الصف

-testMainQuarterWin هذه الدالة مسؤولة عن فحص الفوز على مستوى القطر الرئيسي

(القطر الرئيسي هو القطر الذي تزيد فيه قيمة الإحداثي السيني مع قيمة الإحداثي الصادي)

بمعنى النقطة الأولى (0،1) النقطة التي تليها (1,2) وهكذا

-testSeconderyQuarterWin هذه الدالة مسؤولة عن فحص الفوز على مستوى القطر الفرعي

(القطر الفرعي هو القطر الذي تقل فيه قيمة الإحداثي السيني وتزيد فيه قيمة الإحداثي الصادي)

بمعنى النقطة الأولى (3،0) النقطة التي تليها (2،1) وهكذا

ملاحظة: يجب فحص الفوز قبل فحص التعادل لأن الدالة الخاصة بالتعادل تفحص إذا كانت الأعمدة ملئا فقط

وهناك بعض الحالات التي تكون فيها الأعمدة ملئا مع هذا يكون هناك فائز

وهو ما أسميه الفائز في اللحظة الأخيرة

(لم أسميه فلسفة لكن هذه النقطة بالذات كانت موجودة كـ bug ولكني انتبهت لها في المراجعات الأخيرة قبل نشر اللعبة)

-أعتقد أن هذه النقطة خرق صريح للعمل كطبقات لكني أعتقد أن عملية فحص الفائز عملية مكلفة لذا لا أريد أن أقوم بها مرتين-

هناك مجموعة أخرى من الدوال المساعدة من نوع خذ وهات

دعوكم منها

2- الفئة PlayPanel

هذه الفئة من اسمها تقوم بتنظيم عمليات العرض للعبة

كما أنها تحتوي على تنظيم الأحداث الخاصة بالفأرة والخاصة بحزمة المحرك

على كل لن أشرح الكثير هنا

أريد فقط أن أسلط الضوء على عملية التحريك للكرات

لماذا عملية التحريك فقط لأن باقي الفئة يتعامل مع swing ويهيألي أنه موضوع قتلناه دراسة وتمحيصاً

لماذا عملية التحريك وقد تكلمنا بما فيه الكفاية عن المحرك

لأن الكثير من الإخوة لام علي عدم كتابة documentaition

ولكي أكون صادق معكم ومع نفسي التوثيق شيء أنا سيء فيه

لذا أحاول أن أغطي هذه النقطة بالكثير من الأمثلة مع شرحها

لعل وعسى أن أغطي موضوع التوثيق

عملية التحريك تتلخص في الدالة moveOval الموجودة في الحدث mouse click

هذه الدالة تأخذ نقطة نهاية الحركة على صعيد الإحداثي الصادي

لماذا الإحداثي الصادي لأن الحركة وكما لاحظتم في اللعبة حركة عمودية

الدالة تبدأ بالسطرين التاليين


PointToPointAnimation animation=new PointToPointAnimation(ballPanel.getX(), line_y, ballPanel.getX(), end,step, time);
AnimationList list=animation.excute();

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

وتقوم بتحويل المسافة بين النقطتين هذا إلى مجموعة من الحركات AnimationList

واضح أن أول أربعة مدخلات على صانع الكائنات الخاص بهذه الفئة هم إحداثيات النقطتين

بالنسبة لآخر مدخلين يمثلان المسافة (step) التي يقطعها الكائن المتحرك في وحدة الزمن (time)

السطرين في الشيفرة السابقة لا يعتبران من عملية التحريك

يمكننا النظر إليها كأدوات مساعدة للحزمة الرئيسية

بالنسبة للتحريك الفعلي فهو في الجزء التالي


if (ani == null) {
obj = new AnimationObject(new Point(oval_x + 10, line_y),
ballPanel,list, false);
obj.addAnimationListner(new MyAnimationListener());
ani = new AnimationEngine(PlayPanel.this);
ani.addAnimationObject(obj);
Thread animationThread = new Thread(ani);
animationThread.start();
} else {
obj.setList(list);
}

في البداية نجد أني فحصت حالة المتغير ani

المتغير ani هو كائن من فئة المحرك

وأسلوب الفحص هذا يسمى تأجيل إعطاء القيم الابتدائية للكائنات lazy intialization

معنى أن يكون ani بـ null هو أن المحرك يعمل لأول مرة

ومعنى هذا أنه يتوجب علينا أن نقوم بإنشاء المحرك وكائن متحرك

في حال كون الكائن ani موجود مسبقاً

فلا حاجة لإنشاء الكائنات السابقة وإنما فقط نحتاج إلى تغيير قائمة الحركات الخاصة بالكائن

حزمة المحرك تتعامل مع تغيير قائمة الحركات على أساس أنها إضافة مجموعة من الحركات

بالتالي يتم تفعيل المحرك ليقوم بتنفيذ هذه الحركات

طيب لنتكلم عن ما هو بداخل if

في البداية سأتكلم عن الكائن المتحرك obj


obj = new AnimationObject(new Point(oval_x + 10, line_y),
ballPanel,list, false);

يتم إنشاء الكائن المتحرك عن طري صانع كائنات يحتوي على المدخلات التالية بالترتيب

-نقطة تواجد بدائية للكائن المتحرك

-كائن من الفئة Component أو أحد أبنائها

كما قلت مسبقاً الكائن المتحرك هو عبارة عن مكون Component يتحرك على حاوية Container

وظيفة المحرك أن يقوم بتحريك مجموعة من الكائنات المتحركة في آن واحد

ويصدر أحداث مختلفة تمكن المبرمج من تنفيذ أي شيفرة في أي وقت من عمل المحرك

-قائمة الحركات AnimationList

وهذه القائمة قد تكون خالية وقد تكون ملئا وقد تكون null

هذه القائمة تمثل خريطة الحركة الخاصة بالكائن المتحرك

هذه الخريطة توصف بالضبط آلية حركة المحرك

تتكون هذه الخريطة من حركة Animation أو أكثر

الحركة الواحدة تحتوي على وصف يخبر المحرك عن تفاصيل الحركة

هذا الوصف يتكون من

أ-نوع الحركة وينقسم إلى ثلاث أنواع أفقية ، عمودية و قطرية

ب-مقدار الحركة بالبكسيل

ج-المدة الزمنية لهذه الحركة

نلاحظ أننا لم نتعامل مع الفئة حركة Animation أبداً

بالطبع نحن مخطئون وإلا ما كنا رأينا شيئاً يتحرك

فعلياً قامت الأخت PointToPointAnimation بهذا الأمر بدلاً منا

-أخيراً قيمة منطقية boolean هذه القائمة هي جواب السؤال التالي

هل تريد تكرار الحركة بشكل لا متناهي؟

في حالتنا أنا وضعتها false بمعنى لا أريد

دعونا نتكلم عن السطر التالي


obj.addAnimationListner(new MyAnimationListener());

في حزمة المحرك لكي تستفيد من الأحداث الصادرة عن الحزمة

يجب أن يكون لدي مستمع listener يستمع لهذه الأحداث ويتفاعل معها

ما فائدة المستمع؟

المستمع يعمل على تلقي الأحداث من حزمة المحرك

ويقوم بتنفيذ شيفرة يحددها المبرمج

من الشيفرة السابقة نلاحظ أني ضفت كائن من المستمع MyAnimationListener

وهو مستمع قمت ببنائه كفئة داخلية inner class في الفئة PlayPanel

دعونا نلقي نظرة سريعة على الفئة MyAnimationListner

وهي المستمع الخاص بنا في هذه اللعبة

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

أن يتم فحص حالة اللعبة

هل هناك فائز؟

هل امتلأت اللعبة؟ (كل الأعمدة ممتلئة بالكرات)

بحيث أخرج رسالة للمستخدم تقول مبروك فزت

أو تعادلت وهكذا

(لا تلقوا بالاً للرسائل الموجودة فهي للدعابة فقط

أو ممكن أن تقولوا هي رسالة إلى أستاذ وصديق عزيز علي)

على كل لاحظوا أنا أقول عندما تنتهي حركة الكرة

وحركة الكرة تنتهي عندما تنتهي قائمة الحركات الخاصة بها

حزمة المحرك تصدر أحداثاً خاصة بالكائن المتحرك منها

beforeAnimationList و afterAnimationList و afterAnimation و beforeAnimation

واضح أننا سنستخدم الحدث afterAnimationList

على كل تحدثت كثيراً عن الأحداث في موضوع AAnimation package

لا أريد أن أكرر نفس الكلام مرة أخرى

لكن لا مانع لدي لو كان لديكم أسئلة أن أجيبها

نأتي إلى المقطع التالي من الشيفرة


ani = new AnimationEngine(PlayPanel.this);
ani.addAnimationObject(obj);

AnimationEngine فئة المحرك هي الفئة الأساسية في عملية التحريك

تقوم هذه الفئة بترتيب جدولة الكائنات المتحركة وإصدار الأحداث

تستطيع القول أنها هي الفئة الأساسية في الحزمة كلها

تعمدت أن لا أجعلها Thread مباشرة وإنما Runnable

تسألوني لماذا؟

أجيب ببساطة لا أريد أن أحد (بضم الحاء وتشديد الدال) المستخدم بأي شيء

ربما المستخدم لا يريد أن يستخدم Thread ربما يريد استخدام ThreadPool مثلاً

ربما يظهر شيء جديد غير Thread في المستقبل

صحيح ربما أنا أهذي لكنه احتمال ممكن جداً

على كل صانع الكائنات الخاص بها يأخذ مدخل واحد ألا وهو كائن من الفئة حاوية Container أو أحد أبنائها

ويقوم بتحريك المكونات components على هذه الحاوية

أخيراً وبما أن AnimationEngine ليست Thread فأنا محتاج إلى واحد

وهذا ما قمت به في المقطع التالي


Thread animationThread = new Thread(ani);
animationThread.start();

تحميل اللعبة:

1- تحميل الشيفرة المصدرية لآخر نسخة من حزمة المحرك

AAnimation_src_0.9.rar

2- تحميل الشيفرة المصدرية للعبة

TheFourthwin_src.rar

3- تحميل اللعبة جاهزة للتشغيل (اضغط على ملف RUN.bat وستعمل اللعبة)

FourthWin_bin.rar

أنهيت كلامي اليوم

أطلت عليكم كثيراً لكني أتمنى أن أكون قدمت شيئاً للإخوة الذين طالبوني بشرح AAnimation

وأعدهم بأني سأحاول من فترة إلى أخرى أن أقدم جديداً لهم

في النهاية لا يسعني إلا أن أشكر الإخوة:

1- بيشوي من منتديات الفريق العربي (بيشوي المشاكس اسم جيد يا عم بيشوي) فكما أخبرتكم هو صاحب الفكرة أصلاً

لم آخذ رأيه في موضوع النشر لأني برمجت كامل اللعبة

كما أنها لعبة مشهورة أصلاً فليست فكرته

لكني أعترف بأنه السبب في إكمالي البرمجة

لذا لو طلب مني إزالة المقال كله سأفعل

2- الشمري من منتديات الفريق العربي عبد الله متحمس جداً لبرمجة الألعاب

يعمل على محرك ألعاب أظن يسميه المحرك الذري كنت أريد المشاركة في هذا المحرك

لكن العمل يلتهم جل وقتي

على فكرة هو صاحب فكرة الفئة PointToPointAnimation

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

لكني لا يسعني إلا أن أقف احتراماً لعبدالله

3- عصام من منتديات الفريق العربي (herch)

ماذا لا تعرفون عصام؟

عصام الذي جعلني أكتب كيف تبني نظام أحداث خاص بحزمتك إطلالة على الأحداث في حزمة المحرك

لا بد أنكم تمزحون

على كل عصام هو الذي اقترح علي أن أكتب عن حزمة المحرك أكثر

وأنا أخذت كلامه على محمل الجد

المشكلة يا عصام أن برمجة الألعاب ليست بالأمر الهين

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

لكني أحاول

أخيراً معلومات عن المبرمج:

م.علاء محمد خليل الصالحي

خريج هندسة حاسوب

الجامعة الإسلامية بغزة

أعمل في وحدة البرمجة في الجامعة الإسلامية

تحياتي

1

شارك هذا الرد


رابط المشاركة
شارك الرد من خلال المواقع ادناه

9 إجابة على هذا السؤال .

  • 0

أكره المفاعلات البرمجية الشديدة ...لأنها تزد الضغط عليَّ لكن أحبها بشدة :lol:

----------------------------------------------------------------------------------------------

أولاً : كنت لازم تذكر أن فى جزء أنا كنت كاتب فيه و تحدده ( و لا أنكر أنك كنت تساعنى و بعض الإخوة هنا ) :lol:

ثانياً : لماذا أرجعت لذاكرتى ذكريات مضت من سنة و كام شهر ... :lol:

ثالثاً : الفكرة مازالت فى الخاطر و لم تذهب ( لكن هناك مشروع التخرج + مشروع آخر ) و مشروع آخر يداعب شهواتى البرمجية :lol:

و أكثر شئ بيتعبنى هو عنادى ، عندما اكتب شفيرة لا أحب أن أنظر كثيراً لشفيرة الأخريين أحب أن انفذ فكرتى لذا إذا رجعت لها توقع اسئلة منى و لا تقول انها موجودة انظر هناك :P

مبروك و مبروك و مبروك و شكراً لتعبك يا أستاذنا العظيم

تم تعديل بواسطه mr.beshoy
0

شارك هذا الرد


رابط المشاركة
شارك الرد من خلال المواقع ادناه
  • 0
والكل يقول لك أنت طيب و so cute

B)

0

شارك هذا الرد


رابط المشاركة
شارك الرد من خلال المواقع ادناه
  • 0

لقد اطلعت عن كثب على حزمة المحرك واللعبة ... لن أقوم بذكر مزايا الحزمة وحسناتها، لأنك تعرفها بالطبع! :happy: ، وهذه ملاحظاتي:

• أظن أنه من الأفضل الاستغناء عن الفئتين AnimationList و AnimationListEvent والاكتفاء بقائمة List منهما داخل الفئة التي تحتاجهما (كما هو الأمر في animationObjectsList في الصف AnimationEngine) وهذا من شأنه تبسيط الحزمة.

• الصف AnimationGroup غير مستخدم في الحزمة! لكنه موجود فيها

الفئة AnimationObject:

• طالما أن المبرمج سيسلم الحزمة مكون ذو حجم وإحداثيات معينة عند إنشاء غرض من AnimationObject بواسطة الباني:

public AnimationObject(Point start, Component component, AnimationList list, boolean repeatAnimation)

وأي تغيير على حجم أو موضع المكون قد يرغي بالقيام به يجب أن يتم على المكون من قبل مباشرة وليس على الـ AnimationObject .... بالتالي لا يوجد حاجة لـ setBounds داخل AnimationObject

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

List<Component>

• هذا أطول اسماء أراها في جافا :lol:

isAnimationObjectReachBoundsOfAnimationEngineContatinerFromLeft

WhenAnimationObjectReachBoundsOfAnimationEngineContainer

• في اللعبة في الـ PlayPanel قمت باستدعاء التابع paint وثم ناديت داخله على super.paintComponet ! (حسب توثيق الجافا يجب أن يتم استخدام paintComponet وليس paint)

وأخيراً هذه بعض الروابط الهامة التي تفسر لماذا الحركة ليست ناعمة ... مع حلول للمشكلة :)

http://today.java.net/pub/a/today/2006/02/23/smooth-moves-solutions.html

http://weblogs.java.net/blog/chet/archive/2006/02/make_your_anima.html

• قم بتعديل هذا السطر إلى ما يلي:

• PointToPointAnimation animation = new PointToPointAnimation(ballPanel.getX(), line_y, ballPanel.getX(), end, 3, 20);

ولاحظ الفرق !

بالمناسبة يا علاء:

أنت طيب و so cute

:lol:

0

شارك هذا الرد


رابط المشاركة
شارك الرد من خلال المواقع ادناه
  • 0

يا بيشوي حرام عليك يا أخي

أنت جعلتني أعيد كتابة الشيفرة كلها من أول وجديد ومع هذا أنا قلت بأنك صاحب فضل

بلاش تخليني أفتش في الدفاتر وطلعلك الموضوع القديم :)

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

منور يا محمد باشا

هذا أسلوبي في الكتابة دائماً أحب أن أنشر روح الفكاهة حتى لا يمل القارئ

بالمناسبة في الحياة العملية أنا أقل الناس كاريزما وخفة دم

بينما في فضاء الإنترنت فأنا أرى نفسي فاتناً :lol:

بالنسبة للأخ حسام باشا

لماذا استخدمت AnimationList ولم أستخدم <List<Animation الموضوع يتلخص في التالي

قواعد التكامل في الحزمة الخاصة بك تفرض عليك القيام بعملية تغليف wrapping للأشياء التي تستخدمها من حزم أخرى

ولماذا بالضبط؟

لأني سأضمن في حال أردت أن أغير بناء الحزمة من الداخل لن أحتاج إلى كثير

مثال List عندما أريد الإضافة عليها استخدم الدالة add

لا مشكلة حتى الآن لنفرض أني في المستقبل أردت أن أتأكد من كون الكائن المضاف يحتوي على حركة وقتها أكبر من الصفر مثلاً

سأضطر إلى تغيير البناء الخاص بالفئة التي سأضع فيها قائمة الحركات في AnimationObject وأضيف دالة جديدة

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

سأقول لك وهل هذه الدالة تنتمي فعلاً للكائن المتحرك عن نفسي أرى أنها فعلاً لا تنتمي

كما أني يمكنني ببساطة أن أرث الفئة AnaimtionList وأحولها لأي شيء أريده

مثال أريد عندما تضاف حركة جديدة على قائمة الحركات أن أزيد عداد ما على الشاشة بواحد (نمط المراقب Observer pattern)

بالنسبة للفئة AnimationListEvent فهذا نمط مشهور في برمجة الأحداث

راجع الفئة AnimationListner ستجد أني استخدمت كائن من الفئة AnimationListEvent لكي أعطي المستخدم القدرة على التعامل مع الكائن المتحرك المنتج للحدث والتحكم بالحدث وحتى المحرك نفسه

بالنسبة لـ AnimationGroup كنت قد بدأت فيها ولم أكمل العمل عليها على العموم نزلت في هذه الإصدارة بالخطأ

بالنسبة للفئة AnimationObject

لماذا وضعت setBounds كما هو معلوم لنا جميعاً أن الحزمة swing تعتبر thread unsafe

وبما أني استخدم الدالة setBounds في عملية التحريك فأريد أن أوفر لمستخدم الحزمة الخاصة بي مكان آمن يمكنه من تغيير مكان المكون الخاص بي مع ضمان عدم الإضرار بعمل الحزمة

بالنسبة لرأيك في كون AnimationObject غير مهم في الحزمة

فأنا أرى الموضوع من وجهة نظر Object oriented صافية

لدي محرك هذا المحرك يقوم بجدولة حركة الكائنات المتحركة هذه الكائنات تتحرك بناءاً على قائمة حركات خاصة بها

وهذا ما يبدو لي منطقياً جداً

بالعكس فهذه الفئات كما وضحت في AnimationList تسمح بمرونة عالية flexibility وقابلية عالية للتوسع extendability

أخيراً موضوع طول الأسماء أحب الأسماء المعبرة ولم أجد أسماء معبرة أقصر من هذه

طبعاً أقبل الاقتراحات

أووووووووووووووف أتعبتني يا حسام

بالطبع كلامي ليس نهائياً وقابل للتعديل في أي نقطة وأنت تعرف أني لا أصر على رأيي

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

وسأرد عليك في أقرب وقت

شكراً على وقتك الثمين وأتمنى أن تتحفني بأي تعليقات أو أراء حول الحزمة أو أي شيء آخر

تحياتي

1

شارك هذا الرد


رابط المشاركة
شارك الرد من خلال المواقع ادناه
  • 0

مش قصة مش بحب أشوف شفيرة الاخرين ..أقصد بكون مُصر اصلح الخطأ فى شفيرتنا مش أروح أخد شفيرة جاهزة و خلاص ..لكن و بكل تأكيد بنتعلم من الاخريين جدا جدا جدا و شفيرتك هتكون محل دراسة متقلقش :)

0

شارك هذا الرد


رابط المشاركة
شارك الرد من خلال المواقع ادناه
  • 0

جميل جدا يا علاء ..

موفق دائما , و إلى الأمام ..

0

شارك هذا الرد


رابط المشاركة
شارك الرد من خلال المواقع ادناه
  • 0
أووووووووووووووف أتعبتني يا حسام

:blush:

معلش ... إنت طيب وبتتحمل ! وأنا مستمتع جداً بالنقاش معك حول حزمة بهذا الحجم :happy: أتمنى أن تكون أنت كذلك

الموضوع بالفعل يدور التصميم الغرضي التوجه في الحزمة، والحديث حول أمر كهذا "مطاط" قليلاً ...

لاحظت التطبيق الصارم للمنهجية غرضية التوجه في تصميم حزمتك وهذا -بشكل عام- أمر رائع ويمنحك:

مرونة عالية flexibility وقابلية عالية للتوسع extendability

ولكن أظن أن الأمر مبالغ فيه قليلاً في بعض الأحيان ... وخاطئ في أحيان أخرى

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

هل ترغب في فتح نقاش "مفتوح" حول الحزمة؟

0

شارك هذا الرد


رابط المشاركة
شارك الرد من خلال المواقع ادناه
  • 0

لا يغرنك هدوئي

فهناك الجانب الآخر من شخصيتي

ألا وهي علاء الشرير

ادعوا الله أن لا تروا هذا الجانب من شخصيتي

بالطبع لا مانع لدي أخ حسام

بل سأكون سعيد بأن هناك من يجد أني لا أغرد خارج السرب

بالنسبة لغرضية التوجه هذا أمر أكتسبته من العمل على جافا

لكن لنتفق على شيء مهم لا تجزم بأن خاطئ في وقت أو آخر

مالم تسمع رأيي ربما يكون لدي أسباب دفعتني لما تظنه خطأ

بالنسبة للحوار بالطبع لا مانع لدي بل سأكون أكثر من سعيد

هل تريد أن نفتح موضوع للنقاش أم تريد أن نتناقش هنا

تحياتي

0

شارك هذا الرد


رابط المشاركة
شارك الرد من خلال المواقع ادناه
  • 0

منور يا محمد

نسيت أن أرد عليك مسبقاً

قمت بإخفاء باقي الردود التي لا تتعلق بالموضوع

تحياتي

تم تعديل بواسطه علاء الصالحي
1

شارك هذا الرد


رابط المشاركة
شارك الرد من خلال المواقع ادناه

من فضلك سجل دخول لتتمكن من التعليق

ستتمكن من اضافه تعليقات بعد التسجيل



سجل دخولك الان

  • يستعرض القسم حالياً   0 members

    لا يوجد أعضاء مسجلين يشاهدون هذه الصفحة .