Tammam Koujan

Welcome to my world

We’ve moved!

Posted by tammamkoujan on October 5, 2007

We’ve moved!

moved.jpg

بسم الله الرحمن الرحيم

يسرني ان اعلمكم زوار مدونتي الكرام بأن المدونة قد انتقلت إلى استضافة جديدة خاصة بي
المدونة الجديدة ستكون ضمن نطاق موقعي الخاص TammamKoujan.com
هذه الخطوة ستعطيني حرية اكبر في ادارة وتطوير المدونة و انا واثق ان هذا سينعكس على اداء المدونة الذي اعدكم بأنه ستطور اكثر بكثير
عنوان المدونة الجديد:
www.blog.TammamKoujan.com
و عنوان موقعي الشخصي هو :
www.TammamKoujan.com
الموقع الشخصي ما يزال تحت الانشاء و قريبا سينتهي

Posted in حــيــاتــي | 13 Comments »

Hama – Syria 2007 – Video 5

Posted by tammamkoujan on October 4, 2007

Hama – Syria 2007 – Video 5

مجموعة من الصور التي ألتقطتها (ما عدا الصورة الاولى فلست انا الذي التقطتها)

Posted in أسفار و أماكن, حــيــاتــي, حماة, ٍسوريا | 3 Comments »

Hama – Syria 2007 – Video 4

Posted by tammamkoujan on October 2, 2007

Hama – Syria 2007 – Video 4

فيديو اخر من تصويري لمدينة حماة الرائعة

Posted in أسفار و أماكن, حــيــاتــي, حماة, ٍسوريا | 2 Comments »

Dubai Metro

Posted by tammamkoujan on October 1, 2007

Dubai Metro

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

Posted in أسفار و أماكن, حــيــاتــي | Leave a Comment »

Hama – Syria 2007 – Video 3

Posted by tammamkoujan on September 5, 2007

Hama – Syria 2007 – Video 3

فيديو أخر من تصويري

Posted in أسفار و أماكن, حــيــاتــي, حماة, ٍسوريا | Leave a Comment »

Hama – Syria 2007 – Video 2

Posted by tammamkoujan on August 28, 2007

Hama – Syria 2007 – Video 2

فيديو أخر من تصويري

Posted in أسفار و أماكن, حــيــاتــي, حماة, ٍسوريا | 2 Comments »

و مرت الايام

Posted by tammamkoujan on August 27, 2007

و مرت الايام

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

Posted in أسفار و أماكن, حــيــاتــي, حماة, ٍسوريا | 10 Comments »

أستودعكم الله

Posted by tammamkoujan on August 2, 2007

أستودعكم الله

في اللحظة التي تقرؤون فيها هذه الرسالة تكون طائرتي قد انطلقت باتجاه سوريا حيث سأقضي إجازة قصيرة
ستكون فرصة لأن أنعش نفسيتي و أجددها حيث سأقوم بالسياحة و التجول في كثير من المناطق السورية الجميلة
خلال هذه الفترة سأخذ أجازة من المدونة أيضا لكن عندما أعود سيكون في جعبتي الكثير
و قد تكون هذه الإجازة فرصة لأتحدث عما سيمر معي و ان اضع بعض المواضيع و الاخبار الحية عن سوري
و بالتالي ترقبوا مواضيع مدونتي من سوريا

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

ادعوا لي بالتوفيق

Posted in حــيــاتــي | 2 Comments »

أوبس!! هل حقا ما أراه؟

Posted by tammamkoujan on July 29, 2007

أوبس!! هل حقا ما أراه؟

بسم الله الرحمن الرحيم

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

for (float i = 0.5f; i < 1; i += 0.01f)
{
if (i == 0.6f)
{
Console.WriteLine(i);
}
}

في مقطع الشيفرة السابق أنشأت حلقة for و عرفت فيها المتحول i من النوع float و مهدته بالقيمة 0.5 و جعلت مقدار الزيادة على المتحول i في كل مرة تساوي 0.01 اي واحد بالمئة و جعلت الحلقة مستمرة طالما المتحول i اصغر من القيمة 1
حسنا كل شيء حتى الان طبيعي و صحيح
وضعت ضمن كتلة الحلقة عبارة if تقوم بطباعة قيمة المتحول i على الشاشة عندما تبلغ هذه القيمة 0.6
تبعا للشرح المنطقي السابق ستتوقع ان كل شيء صحيح و انه نتيجة تنفيذ مقطع الشيفرة السابق ستكون طباعة قيمة المتحول i عندما يصبح 0.6
اسف لان اخيب املك و اقول لك بأن شيئا لن يحدث و لن تطبع قيمة المتحول i ابدا
و للتأكد من هذا الامر قم بنسخ الشيفرة السابقة و ضعها في مشروع جديد و قم بالتنفيذ .
بعد أن تأكدنا من هذاالكلام دعنا نفسر ما الذي حدث و كيف نتجاوز هذه المشكلة
تكمن المشكلة السابقة في تعريفنا للمتحول i على انه من النوع float و الأنواع الخاصة بالفاصلة العائمة مثل float تتعامل مع الارقام و تجعلها تقوم بالعمليات الحسابية بطريقة خاصة و تحتفظ بقيمة تقريبية للناتج
للتأكد من هذا الكلام قم بتجربة الشيفرة التالية:

for (float i = 0.5f; i < 1; i += 0.01f)
{
Console.WriteLine(i);
}

سيكون الناتج كما في الصورة أدناه:

cmd.jpg

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

for (float i = 0.5f; i < 1; i += 0.01f)
{
if ((i > 0.59f)&&(i < 0.6f))
{
Console.WriteLine(”0.6″);
}
}

نلتقي في الجزء الثاني مع حالة مدهشة جديدة

تمام كوجان في 29/07/2007
ُEmail : TammamKoujan@Gmail.com
يجوز نشر هذه المقالة أو أجزاء منها بشرط المحافظة على اسم الكاتب و ذكر المصدر

Posted in C#, برمجة | 4 Comments »

Su Doku هيا بنا نبرمج لعبة

Posted by tammamkoujan on July 26, 2007

Su Doku هيا بنا نبرمج لعبة

بسم الله الرحمن الرحيم
Su Doku
ماذا ستتعلم من هذا الدرس :

اولا ستحصل على لعبة Su Doku مجانية ( و هو الاهم في رأيي )
كما انك ستتعلم كيفية انشاء اداتك اخاصة و برمجة خصائصها و احداثها و التعامل معها و التعامل مع الجموعات Collections إضافة إلى تعلمك كيفية انشاء الرسوم على النموذج كل هذا يتم من خلال تطبيق للـ Pocket Pc رغم انني راعيت ان يعمل التطبيق على Pc و Pocket Pc فلا داعي للقلق اذا لم يكن لديك Pocket Pc أو كانت هناك مشكلة مع المحاكي المتاح مع اللغة

هذا الدرس مطبق على :
- Microsoft Visual Studio .NET 2005
- Windows XP Professional SP2
مقدمة :

انا من الذين يؤمنون انه لتتعلم أي شيء يجب ان تستمتع فيما تتعلمه و في البرمجة بالذات المتعة في العمل هي الحافز للمتابعة و النشاط ( هذا ليس رأيك أنت ! حسنا انا اعبر عن رأيي الخاص و على فكرة من الذي اخذ رأيك )
لذا عندما قررت ان ابدا مع برمجة الكائنات في اطار عمل .NET Framework قررت ان ابرمج لعبة صغيرة حسنا فكرت ما هي اللعبة ؟ لا يوجد اية فكرة … اه فكر مرة ثانية ! لا يوجد
عندها ضربت رأسي بالحائط فسقط فكرة صغيرة اه انها لعبة Su Doku
ما هي لعبة Su Doku هي لعبة يابانية يمكن ان نشبهها بالكلمات المتقاطعة لكن لا يوجد احرف و انما ارقام
كيف تلعب : عليك أن تضع في كل حقل فارغ أحد الأرقام من 1 إلى 9 بحيث لا تستخدم الرقم نفسه أكثر من مرة واحدة في كل
خلية مؤلفة من 3*3 مربعات و ألا تستخدم الرقم نفسه أكثر من مرة واحدة في نفس الصف العمودي أو الأفقي الممتد من طرف الشبكة
إلى طرفها المقابل .

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

• عند تغيير قيمة الكائن يتم تفحص السطر الحاوي للكائن فيما اذا كان يحوي كائنات تمتلك قيما مشابهة : اذا الكائن يمتلك خاصية تجدد السطر الحاوي له من اجل عمليات المقارنة للكائنات في نفس السطر
• عند تغيير قيمة الكائن يتم تفحص العمود الحاوي للكائن فيما اذا كان يحوي كائنات تمتلك قيما مشابهة : اذا الكائن يمتلك خاصية تحدد العمود الحاوي للكائن من اجل عمليات المقارنة للكائنات في نفس السطر

هذا يكفي كبداية و من ثم سنتوسع في تفاصيل الكائن

الان شغل Visual Studio .NET و اذهب إلى القائمة File و انقر New تظهر نافذة كما في الصورة ادناه

قم باختيار مشاريع Visual Basic .NET و انتق من Smart Device ان تنشأ Device Application

سم المشروع Su-Duko و انقر موافق .

من النافذة Solution Eplorer انقر باليمين على المشروع و اختر ADD و من ثم انقر على User Control سم الكائن MyPanel و من ثم انقر موافق
سيضاف كائن إلى المشروع , بعد اضافة الكائن انتقل إلى محرر الشيفرة الخاص بالكائن

انسخ الشيفرة التالية و ضعها عوضا عن الشيفرة الموجودة في المحرر

Public Class MyPanel

Private m_X As Integer
Public Property X() As Integer
Get
Return m_X
End Get
Set(ByVal value As Integer)
m_X = value
End Set
End Property
Private m_Y As Integer
Public Property Y() As Integer
Get
Return m_Y
End Get
Set(ByVal value As Integer)
m_Y = value
End Set
End Property

Private m_IsSelected As Boolean = False
Public Property IsSelected() As Boolean
Get
Return m_IsSelected
End Get
Set(ByVal value As Boolean)
m_IsSelected = value
End Set
End Property

Private m_Hold As Boolean = False
Public Property Hold() As Boolean
Get
Return m_Hold
End Get
Set(ByVal value As Boolean)
m_Hold = value

End Set
End Property
Public m_BackColor As Color

‘ Public Overrides Property BackColor() As Color
‘ Get
‘ Return m_BackColor
‘ End Get
‘ Set(ByVal value As Color)
‘ m_BackColor = value
‘ End Set
‘End Property

Enum MyPanelValue
Null = 0
One = 1
Two = 2
Three = 3
Four = 4
Five = 5
Sex = 6
Seven = 7
Eight = 8
Nine = 9
End Enum

Private m_Value As MyPanelValue = MyPanelValue.Null
Public Property Value() As MyPanelValue
Get
Return m_Value
End Get
Set(ByVal value As MyPanelValue)
m_Value = value
End Set
End Property
Enum Group
Null = 0
One = 1
Two = 2
Three = 3
Four = 4
Five = 5
Sex = 6
Seven = 7
Eight = 8
Nine = 9
End Enum
Private m_MyGroup As Group
Public Property MyGroup() As Group
Get
Return m_MyGroup
End Get
Set(ByVal value As Group)
m_MyGroup = value
End Set
End Property

Public Sub New()

‘ This call is required by the Windows Form Designer.

InitializeComponent()

‘ Add any initialization after the InitializeComponent() call.

m_X = -1
m_Y = -1
m_MyGroup = Group.Null
End Sub
Public Sub New(ByVal ValueX As Integer, ByVal ValueY As Integer)

‘ This call is required by the Windows Form Designer.

InitializeComponent()

‘ Add any initialization after the InitializeComponent() call.

m_X = ValueX
m_Y = ValueY
m_MyGroup = Group.Null
End Sub

Private Sub IncreaseValue()
If m_IsSelected = True And (Hold = False) Then
If m_Value < 9 Then
m_Value += 1
Else
m_Value = 0
End If
Else
m_IsSelected = True
End If

Me.Refresh()
End Sub

Protected Overrides Sub OnPaint(ByVal e As PaintEventArgs)

‘ Dim FontFamily As New FontFamily(”Tahoma”)

Dim myFont As New Font(”Tahoma”, Me.Width / 3, FontStyle.Bold)
Dim myPoint As New Point(5, 70)
Dim solidBrush As New SolidBrush(Color.FromArgb(0, 0, 255))
Dim fs As SizeF = e.Graphics.MeasureString(m_Value, myFont)
If m_Value = MyPanelValue.Null Then
e.Graphics.DrawString(”", myFont, solidBrush, 4, 4)
Else

‘ e.Graphics.DrawString(m_Value, myFont, solidBrush, 4, 4)

e.Graphics.DrawString(m_Value, myFont, solidBrush, _
((Me.Width – fs.ToSize().Width) / 2), _
((Me.Height – fs.ToSize().Height) / 2) _
)

End If

End Sub

Private Shadows Sub MouseDown(ByVal sender As Object, ByVal e As System.Windows.Forms.MouseEventArgs) Handles MyBase.MouseDown
Me.Focus()
IncreaseValue()
Dim RowPanel As New MyPanels
Dim ColPanel As New MyPanels
Dim GroupPanel As New MyPanels
Dim h As MyPanel
Try

For Each h In Me.Parent.Controls
If Me.X = h.X Then
RowPanel.Add(h)
End If
If Me.Y = h.Y Then
ColPanel.Add(h)
End If
If (Me.MyGroup = h.MyGroup) Then
GroupPanel.Add(h)
End If
Next

Catch ex As Exception
MessageBox.Show(ex.Message)
End Try
RowPanel.Check(Me)
ColPanel.Check(Me)
GroupPanel.Check(Me)
End Sub
Private Shadows Sub GotFocus(ByVal sender As Object, ByVal e As System.EventArgs) Handles MyBase.GotFocus
m_BackColor = Me.BackColor
If m_Hold = False Then
Me.BackColor = Color.Fuchsia
End If

End Sub
Private Shadows Sub LostFocus(ByVal sender As Object, ByVal e As System.EventArgs) Handles MyBase.LostFocus
m_IsSelected = False

‘ Me.BackColor = Color.Coral

If m_Hold = False Then
Me.BackColor = m_BackColor ‘Color.Coral
Else
Me.BackColor = Color.LightGray
End If
End Sub

End Class
Public Class MyPanels
Inherits CollectionBase

Public Sub Add(ByVal PanelToAdd As MyPanel)
List.Add(PanelToAdd)
End Sub

Public Sub Remove(ByVal PanelToRemove As MyPanel)
List.Remove(PanelToRemove)
End Sub

‘ Indexer for MyPanels

Public Property MyPanel(ByVal Index As Byte) As MyPanel
Get
Return Me.List(Index)

End Get
Set(ByVal value As MyPanel)
Me.List(Index) = value
End Set
End Property

Public Sub Check(ByRef CheckPanel As MyPanel)

For i As Integer = 0 To Me.Count – 1
If (CheckPanel.Value Su_Doku.MyPanel.MyPanelValue.Null) And (Me.MyPanel(i).Value = CheckPanel.Value) Then
Me.MyPanel(i).BackColor = Color.Red
CheckPanel.BackColor = Color.Red
Else
Me.MyPanel(i).BackColor = Color.Coral
End If
Next

End Sub
End Class

الان إلى شرح الشيفرة السابقة
• المتحول m_X يخزن هذا المتحول قيمة تمثل السطر الذي يتواجد فيه الكائن
• الخاصية X يتم من خلالها اسناد و استرجاع قيمة المتحول m_X
نلاحظ ان المتحول من نوع Private لإننا لا نريد للمستخدم الوصول إليه إلا من خلال الخاصية و التي من نوع Public مما يتيح لنا القيام بعمليات معينة عند قراءة او كتابة قيمة في المتحول من خلال خاصيته عند الحاجة
• المتحول m_Y يخزن هذا المتحول قيمة تمثل العمود الذي يتواجد فيه الكائن
• الخاصية Y يتم من خلالها اسناد و استرجاع قيمة المتحول Y_m
• المتحول m_IsSelected متحول بولياني يحدد فيما اذا كان الكائن محددا او لا
لن أشرح الخاصيات لانها كما ذكرت فقط لاسناد القيم او الحصول عليها من المتحولات
• المتحول m_Hold متحول بولياني يحدد فيما اذا كانت قيمة الكائن مثبتة ام لا ( أي ان قيمة الكائن مجمدة لا يمكن تغييرها عندما يكون المتحول True يستفاد من ذلك من اجل تبيت قيم عند بدء اللعبة مما يحدد درجة صعوبتها
• البنية MyPanelValue التي تحوي القيم اتي يجب ان يأخذها الكائن فقط
• المتحول m_Value الذي يخزن قيمة الكائن و يأخذ قيمه من البنية السابقة
• البنية Group التي تحوي المجموعة التي ينتمي إليها الكائن في Su Doku هناك تسع مجموعات اما المجموعة العاشرة Null فهي قيمة تمهيدية تعطى للكائن عند انشاءه
• المتحول M_MyGroup الذي يخزن المجموعة التي ينتمي إليها الكائن و يأخذ قيمه من البنية السابقة
• الباني New يستخدم الباني لإنشاء الكائن مع تمهيده بالقيم المناسبة حيث يأخذ افتراضيا قيمة -1 للسطر و -1 للعمود أي انه لا ينتمي لأية سطر أو عمود كما يتم تمهيد المجموعة عند القيمة Null أي انه لا ينتمي لأي مجموعة
• الباني المحمل بشكل زائد New() يتم من خلال هذا الباني انشاء كائن يتم تمهيد سطره و عموده من خلال القيم الممررة له .
• الاجرائية IncreaseValue تقوم هذه الدالة بتغيير قيمة الكائن عند النقر عليه .
• الاجرائية OnPaint التي تقوم برسم الكائن نلاحظ ان الكلمة Overrides تجعل هذه الدالة تهيمن على الحدث OnPaint الخاص بالكائن كما ان عملية الرسم تجعل النص الذي يعرض قيمة الكائن يرسم في وسط الكائن و بحجم يتناسب مع تغير حجم الكائن .

قبل المتابعة في شرح بقية الأجرائيات دعونا ننتقل إلى الصنف MyPanels الذي تم التصريح عنه في القسم الاخير من الشيفرة
نلاحظ العبارة Inherits CollectionBase التي تشير إلى وراثة هذه الفئة للفئة CollectionBase
تستخدم الفئة MyPanels كمخزن لعناصر MyPanel حيث يتم تجميع العناصر ضمن كائن من هذه الفئة

تحتوي الفئة MyPanels على الطرائق التالية :
• الإجرائية Add : تقوم هذه الإجرائية بإضافة الوسيط المرر لها إلى الكائن الذي يستدعيها
• الإجرائية Remove : تقوم بحذف الوسيط المرر لها من العناصر المخزنة في الكائن الذي يستدعيها اذا كان موجودا
• الخاصية MyPanel : تعود هذه الخاصية بالعنصر المخزن بالكائن و الذي يوافق فهرسه القيمة المررة , كما انها تسند قيمة عنصر للعنصر الذي فهرسه يوافق القيمة المكررة
• الجرائية Check تقوم هذه الإجرائية بتفحص فيما اذا كان العنصر المرر لها موجودا ضمن العناصر المخزنة ضمن الكائن . تعتبر هذه الجرائية من أهم الإجرائيات فمن خلالها نتفحص تكرار الرقم ضمن مجموعته و ضمن سطره و ضمن عموده .

الان لنتابع شرح بقية طرائق الكائن MyPanel
* الإجرائية MouseDown : للتعامل مع حدث الضغط بالفأرة نلاحظ انه للربط مع هذا الحدث هناك امران الاول ان يكون للدالة نفس عدد الوسائط التي تملكها الإجرائية MousDown التقليدية إضافة إلى إضافة العبارة Handles MyBase.MouseDown إلى نهاية السطر الذي صرحت فيه الإجرائية .
نلاحظ أن مهمة هذه الدالة هي : عند الضغط على الكائن قم بتحديده و من ثم قم بزيادة قيمته ثم يتم تعريف ثلاث متحولات من نوع MyPanels الأول يستخدم لتجميع العناصر الموجودة في نفس سطر الكائن
الثاني يستخدم لتجميع العناصر الموجودة في نفس عمود الكائن أما الثالث فيستخدم لتجميع العناصر التي تنتمي لنفس المجموعة , بعد أن نقوم بملئ المتحولات السابقة بالعناصر المناسبة من خلال حلقة
نستدعي إجرائية Check لكل منها

و هكذا أكون قد شرحت الأجزاء المهمة من الفئة MyPanel و الفئة MyPanels

ننتقل الأن إلى النموذج الرئيسي للمشروع اسم هذا النموذج هو MainForm لا تسأل لماذا فهي عادة عندي , فلنذهب الان إلى الإجرائية DrawCells تقوم هذه الإجرائية برسم العناصر على النموذج مع تمهيد مجموعة كل عنصر و سطره و عموده .
تستدعى الإجرائية السابقة في الباني New الخاص بالنموذج
الان بقي لدينا الحدث Paint للنموذج يتم من خلال هذا الحدث رسم الخطوط التي تؤلف لوحة الـ Su Doku

و أخيرا أصبح لديك لعبة سودوكو التي طالما حلمت بها لكن هل هذا كل شيء لا طبعا يمكنك ان تطور هذه اللعبة كأن تضع عدادا يشير إلى المدة الزمنية التي تنقضي منذ بدأ اللعبة كما يمكنك ان تكتب خوارزمية الحل
و تضع زرا لحل اللعبة عند فشل اللاعب بالحل كما و يمكنك أن تضيف امكانية حفظ اللعبة الحالية و تحميل لعبة محفوظة من خلال ملفات XML الأمر ليس صعب انشأ حلقة تمر على كل عنصر Mypanel و تقوم بحفظ خواصه الاساسية

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

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

للمزيد من الدروس يمكنك زيارة مدونتي الإلكترونية http://www.enashir.com/blogs/TammamKoujan
أو يمكنك زيارة مندى المبرمجين العرب حيث اشارك في منتديات البرمجة هناك http://www.arabteam2000.com
اذا كنت ترغب بمراسلتي Tammam84@Yahoo.com
ملاحظاتك و استفساراتك مرحب بها على الدوام .

الشيفرة :

لتحميل شيفرة البرنامج :
SuDoku.zip
للتحميل هذه المقالة بصيغة ملفات word :
Su_Doku.doc

كلمة أخيرة :

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

للمزيد من الدروس يمكنك زيارة مدونتي الإلكترونية http://tammamkoujan.wordpress.com/

اذا كنت ترغب بمراسلتي tmmamkoujan@gmail.com
ملاحظاتك و استفساراتك مرحب بها على الدوام .
تمام كوجان
‏الثلاثاء‏، 24‏ كانون الثاني‏، 2006

يجوز نشر هذه المقالة أو أجزاء منها بشرط المحافظة على اسم الكاتب و عنوانه , أعلم أنه يمكنك ألا تفعل ذلك لكنها تبقى أمانة في عنقك .

ملاحظة : كتب هذا الموضوع بالاصل بتاريخ 28‏ كانون الثاني‏، 2006 كما ذكر في نص المقالة
و قد نشر في منتديات الفريق العربي للبرمجة على الرابط:
Su Doku هيا بنا نبرمج لعبة
تمام كوجان في 26/07/2007
ُEmail : TammamKoujan@Gmail.com
يجوز نشر هذه المقالة أو أجزاء منها بشرط المحافظة على اسم الكاتب و ذكر المصدر

Posted in الأجهزة الكفية Pocket PC | 3 Comments »