تمام كوجان

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

9 ردود في هذا الموضوع

Su Doku

هذه المقالة تطبق على :

Microsoft Visual Basic 2005

مقدمة :

انا من الذين يؤمنون انه لتتعلم أي شيء يجب ان تستمتع فيما تتعلمه و في البرمجة بالذات المتعة في العمل هي الحافز للمتابعة و النشاط ( هذا ليس رأيك أنت ! حسنا انا اعبر عن رأيي الخاص و على فكرة من الذي اخذ رأيك )

لذا عندما قررت ان ابدا مع برمجة الكائنات في اطار عمل .NET Framework قررت ان ابرمج لعبة صغيرة حسنا فكرت ما هي اللعبة ؟ لا يوجد اية فكرة ... اه فكر مرة ثانية ! لا يوجد

عندها ضربت رأسي بالحائط فسقط فكرة صغيرة اه انها لعبة Su Doku

ما هي لعبة Su Doku هي لعبة يابانية يمكن ان نشبهها بالكلمات المتقاطعة لكن لا يوجد احرف و انما ارقام

كيف تلعب : عليك أن تضع في كل حقل فارغ أحد الأرقام من 1 إلى 9 بحيث لا تستخدم الرقم نفسه أكثر من مرة واحدة في كل

خلية مؤلفة من 3*3 مربعات و ألا تستخدم الرقم نفسه أكثر من مرة واحدة في نفس الصف العمودي أو الأفقي الممتد من طرف الشبكة

إلى طرفها المقابل .

ماذا ستستفيد من الدرس : اولا ستحصل على لعبة Su Doku مجانية ( و هو الاهم في رأيي )

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

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

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

اذا نحن نحتاج إلى كائن له الصفات التالية:

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

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

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

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

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

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

الان شغل 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

اذا كنت ترغب بمراسلتي [email protected]

ملاحظاتك و استفساراتك مرحب بها على الدوام .

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

تمام كوجان

‏الثلاثاء‏، 24‏ كانون الثاني‏، 2006

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

Su_Doku.zip

Su_Doku.doc

تم تعديل بواسطه Tammam Koujan
0

شارك هذا الرد


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

UP

للفائدة

0

شارك هذا الرد


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

خلال زيارتي لموقع Microsoft وجدت مثالا عن اللعبة ( اكيد سرقوا اللعبة مني انا طرحت الموضوع قبلهم بشهر :lol: :lol: ;) )

لكن لإجهزة التي تشغل Windows XP Tablet PC Edition

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

Microsoft Sudoku

تم تعديل بواسطه Tammam Koujan
0

شارك هذا الرد


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

iهذا موضوع وجدته اليوم على TheCodeProject يتحدث عن برمجة اللعبة على Smart Client

SudokuSmartClient.jpg

كنت أظن أن الموضوع جيد لكن لا حياة لمن تنادي

0

شارك هذا الرد


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

دائما اتي متأخر في هذا القسم

الله يعطيك العافية اخي تمام

يبدوا انّ اللعبة في موقع CodeProject اخذت منحى احترافي اكثر

فقد تم وضع درجات للصعوبة

سوف انظر الى الكود عندما اجد الوقت المناسب لذلك (لدي بعض الامتحانات الان)

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

0

شارك هذا الرد


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

عفوا نسيت ان اضع رابط الموضوع في The Code Project :unsure:

Sudoku and Smart Client techniques

أخي وائل شكرا على مشاركتك

من خلال نظرة أولية للمشروع في The Code Project اعلم ان اللعبة اخذت منحى احترافي اكثر على الأقل

لإنها شبه كاملة او منتهية

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

حتى اني قلت في نهاية مقالتي :

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

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

لكي يتفاعل الاعضاء و يعملوا

على اي حال سأحاول ان اكمل اللعبة حالما استطيع دون انظر إلى كود لعبة Microsoft أو لعبة The Code Project

لأني اريد ان اطورها بأسلوبي الخاص

0

شارك هذا الرد


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

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

0

شارك هذا الرد


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

Sudoku

قمت بعمل لعبة السودكو باستخدام فيجول بيسك 6

المشروع يقوم بعمل الاتى

1-حل اى لعبة للسودكو مهما كان مستوها ومهما كان عدد (الاعداد المعطاة) حتى لو كان هناك عدد واحد

2-انشاء لعبة السودكو مع ملاحظة ان اللعبة لها حل وحيد

3-لعب السودكو

0

شارك هذا الرد


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

Sudoku

قمت بعمل لعبة السودكو باستخدام فيجول بيسك 6

المشروع يقوم بعمل الاتى

1-حل اى لعبة للسودكو مهما كان مستوها ومهما كان عدد (الاعداد المعطاة) حتى لو كان هناك عدد واحد

2-انشاء لعبة السودكو مع ملاحظة ان اللعبة لها حل وحيد

3-لعب السودكو

يمكنك عمل

(save)

للعبة

أرجو تقيم المشروع

يمكنم مراسلتى عى الاميل

[email protected]

sudoku.rar

0

شارك هذا الرد


رابط المشاركة
شارك الرد من خلال المواقع ادناه
زوار
This topic is now closed to further replies.

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

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