الفريق العربي للبرمجةأرشيف المنتديات · 2000 – 2023
نسخة أرشيفية للقراءة فقط — التسجيل والمشاركة مغلقان، والمحتوى محفوظ كما كان.

(-) لعبة السودوكو المشهورة بلغة السي C (-)

بدأه the inventor habib في 23 أغسطس 2012 · 17 رد · 5,513 مشاهدة · في مشاريع ومسابقات القسم
مشاركة: واتساب X فيسبوك تيليجرام
#1 صاحب الموضوع

إنَّ الحَمْدَ لِلَّهِ نَحْمَدُهُ وَنَسْتَعِيُنُهُ وَنَسْتَغْفِرُهُ وَنَسْتَهْدِيهِ وَنَعُوذَ بِاللهِ مِن شُرُورِ أَنفُسِنَا وَسَيئَاتِ أَعْمَاِلَنَا،

مَن يَهْدهِ اللهُ فَلا مُضلَّ لَه، وَمَن يُضْلِل فَلا هَادِي لَه، وَأَشْهَدُ أَنَّ لاَ إِلهَ إلا اللهُ وَحدَهُ لاَ شَريكَ لَهُ،

وَأَشْهدُ أنَّ مُحَمَّداً عَبدُهُ وَرَسُولُهُ .

sdfsdfsdf.gif

السلام عليكم

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

بدون اطالة.

304790_451627504869239_289294981_n.jpg

هدا مشروع للعبة السودوكو بالسي وبالواجهة GDI.

هده بعض الصور من البرنامج.

1345710352743.jpg

1345710352234.jpg

1345710352315.jpg

1345710352756.jpg

1345710352467.jpg

.

.

.

.

sdfsdfsdf.gif

تحميل البرنامج التنفيدي .exe

تحميل الكود سورس Code Source in c.

المرفقات.

أتمني أن تستفيدو من العبة.بالتوفيق+

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

تحميل الكود سورس Code Source in c.

SODK sOURCE.zip

SODK%20Release.zip

تم تعديل هذه المشاركة بواسطة أحمد الشنقيطي في 23 أغسطس 2012 في 13:17 — السبب: يُمنع توجيه السؤال إلى شخص مُحدد.

1
#2

السلام عليكم

مرحبا أخي TheInventorHabib :)

برنامج جميل و عمل متعوب عليه, شكرا لك على طرح مثل هذه المواضيع الجيدة.

اقتباس
بانتضار ردك أخي أحمد الشنقيطي

لا تُوجه السؤال إلى شخص محدد لأن هذا قد يمنع بقية الإخوة من المشاركة.

لي عودة.

#4

السلام عليكم

نظرا لضيق الوقت, لم أدقق النظر في الكود, لكنه جيد على العموم.

هذه ملاحظاتي بشكل سريع :

بداية, لا تنسى أن البرامج التي تكتبها على الـ GDI ستعمل على الــ Windows فقط, لذا أنصحك باستخدام إحدى المكتبات التي تعمل على أكثر من نظام تشغيل (Cross Platform GUI Libraries).

عند تشغيل البرنامج عدة مرات, لا يتم إغلاقه بشكل كامل :

post-219439-099810500 1345741415_thumb.p

بل تظل جميع الــ Processes قيد التشغيل :

post-219439-035083600 1345741425_thumb.p

و هذا خطير جدا خصوصا من ناحية الــ Memory Leaks !

عند اختيار مستوى الصعوبة (Difficulty Level), يُمكنك وضع كلمات أكثر دلالة من :

Lavel 1, Level 2, Level 3

مثل :

Beginner, Intermediate, Advanced

أيضا, الصورة الصغيرة الموجوة في أيمن النافذة, يُفضل أن تتغير بتغير الـ Level, قم بعمل Checking لمعرفة الــ RadioBox الذي اختاره المُستخدم ثم ضع الصورة المناسبة لمستوى الصعوبة المُختار.

بالإضافة إلى ذلك, يُفضل وجود خيارات أخرى متقدمة مثل Player Vs Player و Computer Vs Player و Computer Vs Computer.

الخيار Reset Game جيدا جدا, لكن لماذا لم تضع خيار Save/Load Game ؟ :)

كما فعلتَ مع Adding by one, يمكنك فعل نفس الشيء مع Reset, أضف الخيار Reset by one لكي يتمكن المستخدم من الرجوع خطوة واحدة إلى الخلف.

أيضا يُمكنك إضافة الزر Check by one الذي يسمح للمستخدم بالتأكد من الوضعية الصحيحة لإحدى خانات الجدول. (يمكنك تحديد الحد الأقصى لاستعمال هذا الزر, 3 مرات مثلا)

كما يُمكنك إضافة الزر Help by one الذي يعرض الإحتمالات الممكنة لخانة يُحددها المستخدم.

يُستحسن دائما أن يكون هناك جزء من البرنامج خاص بمراسلة المبرمج, لكي يستطيع المُستخدم أن يُرسل لك ملاحظاته على اللعبة.

كذلك, يُستحسن وضع خيار Update Game من أجل تنزيل آخر إصدار من اللعبة. (يُمكنك رفع اللعبة على سيرفر مجاني و التأكد من وجود تحديثات عند الضغط على الزر Updtae)

إذا أردتَ المغامرة فيمكنك إضافة خيار "دخول اللعبة عن طريق شبكة داخلية أو خارحية" حيث يُمكن لــ اللاعبين أن يدخلوا إلى اللعبة دون أن يتواجدوا في نفس المكان أو حتى في نفس الدولة.

أضف الخيار Print Result من أجل طباعة نتائج اللعبة إن أراد المُستخدم ذلك.

الــ Help و الــ About يؤديات نفس الدور تقريبا, يمكنك الإكتفاء بنافذة الــ About.

طريقة عرض نافذة الــ About ليس جيدة !, من الأفضل أن تضع النص في TextArea ثم تضع الصورة في Label في أعلى النافذة, هكذا, (كتبتُ لك هذا المثال في NetBeans باستخدام مكتبة JavaSwing) :

post-219439-082162200 1345741461_thumb.p

يُمكنك الإستفادة من هذه المسابقة التي نظمها موقع SiteDuZero لبرمجة لعبة Sudoku بــ C++/QT.

أرجو لك التوفيق.

المرفقات
1.png2.pngAbout Sudoku.png

تم تعديل هذه المشاركة بواسطة أحمد الشنقيطي في 23 أغسطس 2012 في 20:43 — السبب: تنسيق المشاركة.

1
#5

ماشاء الله عليك أخي أحمد هدا ما أريده من جميع الأعضاء

اقتباس
عند تشغيل البرنامج عدة مرات, لا يتم إغلاقه بشكل كامل :

هدا ما لاحضته للتو. المشكل في AnimateWindow().

بالنسبة للخيارات الأخري متل الرجوع خطوة خطوة سوف أعمل عليه ان شاء الله.

شكرا علي صبرك في التجربة.

#6
اقتباس
الإضافة إلى ذلك, يُفضل وجود خيارات أخرى متقدمة مثل Player Vs Player و Computer Vs Player و Computer Vs Computer.

لا يمكن لان اللعبة خاصة بلاعب واحد.

#7

وعليكم السلام أخ حبيب

كملاحظة أولية :

1-لا يتوقف البرنامج عندما يتم إدخال رقم خاطئ لسودوكو

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

جميع الخانات الفارغة المتبقية بعلامة x حمراء اللون كدليل على خسارة اللاعب و نهاية اللعبة

والعكس صحيح عندما يفوز المشارك تظهر له صورة وسط الشاشة تهنئه على فوزه

uploadad1a5726fc.jpg

2- لا يمكن تكبير شاشة البرنامج أو تصغيرها

uploada9e27c5a18.jpg

وبالتوفيق

i love you mama

#8
اقتباس
لا يمكن لان اللعبة خاصة بلاعب واحد.

لا يوجد شيء مستحيل أخي حبيب :)

بالنسبة للخيار Player Vs Player فيُمكنك إعطاء نفس اللعبة (نفس ترقيم الخانات) لــِ لاعبيْن أو أكثر و مقارنة الوقت الذي استغرقه كل لاعب ثم ترتيب اللاعبين على أساس الوقت المُستغرق للوصول إلى الحل الصحيح.

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

معلومات كل لاعب ستكون (مثلا) : الإسم, الرصيد, الوقت المُستغرق, عدد مرات الفوز - الخسارة, مستوى الصعوبة الذي وصل إليه اللاعب, ...

أما بالنسبة للخيار Computer Vs Player فيُمكنك كتابة كود صغير يقوم في كل مرة بتقدير المدة الزمنية الكافية للوصول إلى الحل ثم يقارنها بالمدة التي استغرقها المُستخدم و يكون تقييم اللاعب على أساس الفرق بين المدتين.

و هكذا بالنسبة للخيار الثالث.

@Momo

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

لا أرى هذا مُناسبا لأنه سيتم إقصاء اللاعب بمجرد أن يخطأ مرة واحدة في تقدير رقم الخانة الصحيح !

يُمكنك الإستعانة بالخيار Check by one في هذا الأمر أو ضع علامة x فقط في الخانة التي تحتوي على العدد الخاطئ لتنبيه المستخدم لكن لا تُنهي اللعبة.

#9

شكرا علي الملاحضات وجاري برمجت بعضها وقد غيرت شكله الأن ووضعت Toolbar و Status bar ويمكن للعاب أن يرجع الي الوراء .ويمكنه أن يتأكد من أن كل شي علي ما يرام.وجاري المتابعة.

#10

جيد :)

أظن أن المكان المناسب للموضوع هو قسم المشاريع, سأنقله إليه بعد إصدار نسخة جديدة من اللعبة إن شاء الله.

#11

السلام عليكم

ما رأيكم بحدف خاصية الرجوع الي الوراء وعندما يخطأ الاعب أسئله ان كان يريد أ، يلعب من جديد أو الخروج؟

#12

مرحبا أخي حبيب :happy:

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

أضف إلى هذا أن اللاعب يُمكنه اللعب من جديد باستخدام الزر New Game كما يمكنه الخروج من اللعبة باستخدام الزر Exit, إذا لماذا التكرار ؟ :)

#13

السلام عليك قمت بحدف خاصية الرجوع الي الوراء ولكني قمت بوضع check Button ادا تم اختياره يتم اضهار رسالة تقول أنه أخطأ في هدا الرقم المدخل تم يتم حدفه تم يواصل وادا لم يتم اختياره سوف يقوم بغلق اللعبة التي يلعبها ويمكنه فقط انشاء لعبة أخري New game وقمت بوضع نافدة تحميل التحديتات أحتاج فقط الي سرفر قد أستعمل المجاني وهده بعض الصور من البرنامج المشكل الأخر هو متي أعرف أن المؤشر موجود علي أي زر في Toolbar لكي أضع عمل الزر في statusbar؟

post-264970-027149500 1345928628_thumb.j

post-264970-068349700 1345928634_thumb.j

المرفقات
dddf.jpgSans titre.jpg
#14
اقتباس
متي أعرف أن المؤشر موجود علي أي زر في Toolbar لكي أضع عمل الزر في statusbar ؟

في Java-Swing, يمكنك استخدام الفئة JToolBar لتمثيل شريط الأدوات.

عند الضغط على زر معين يتم إطلاق حدث من نوع ActionEvent, استخدم الدالة actionPerformed التي تستقبل كائنا من نوع ActionEvent حيث تقوم بمعالجة الحدث (هذه الدالة موجودة في الواجهة ActionListener), انظر :

import java.awt.event.ActionEvent;

import java.awt.event.ActionListener;

ActionPerformed(ActionEvent event) est une méthode implémentée par ActionListener qui est une classe "Écouteur". Pour déclencher cette action, il vous faut placer cet écouteur sur un object GUI.

يُمكنك أيضا إطلاق حدث معين بمجرد مرور مؤشر الفأرة على أحد عناصر الشريط باستخدام الدالة doClick.

ابحث عن ما يُقابل تلك الدوال في الــ GDI :)

#15
اقتباس

متي أعرف أن المؤشر موجود علي أي زر في Toolbar لكي أضع عمل الزر في statusbar؟

استخدم Hooking او Subclassing

1- اكتب اجراء مشابه تماما لاجراء النافذة Window Procedure

2- قم بمعالجة الرسائل بداخله

مثال

BtnProc PROC hCtl:HWND,uMsg:UINT,wParam:WPARAM,lParam:LPARAM
		.IF uMsg==WM_MOUSEMOVE
			MOV EAX,hCtl
			.IF EAX==hOpen
				invoke SendMessage,hStatus,WM_SETTEXT,0,ADDR MSG_TIP_OPEN
			.ELSEIF EAX==hSave
				invoke SendMessage,hStatus,WM_SETTEXT,0,ADDR MSG_TIP_SAVE
			.ELSEIF EAX==hFont
				invoke SendMessage,hStatus,WM_SETTEXT,0,ADDR MSG_TIP_FONT
			.ELSEIF EAX==hColor
				invoke SendMessage,hStatus,WM_SETTEXT,0,ADDR MSG_TIP_COLOR
			.ENDIF
		.ENDIF

		invoke CallWindowProc,lpPrevWndProc,hCtl,uMsg,wParam,lParam
	Ret
	BtnProc endp

3- استخدم الدالة SetWindowLong مع ارسال مقبض الزر كمرسل اول و الثابت GWL_WNDPROC كمرسل ثانى ومؤشر للدالة كمرسل ثالث

مثال

invoke SetWindowLong,hOpen,GWL_WNDPROC,BtnProc
			MOV lpPrevWndProc,EAX

هذه الدالة تعيد long وهو عنوان اجراء النافذة القديم ويجب حفظه حتى تستخدمه فى اعادة توجيه الاحداث الى النافذة (انظر السطر الاخير فى الاجراء BtnProc )

invoke CallWindowProc,lpPrevWndProc,hCtl,uMsg,wParam,lParam

4- لاتنسى ان تعيد اجراء النافذة الى العنوان الاصلى قبل اغلاق البرنامج مثلا اثناء معالجة الرسالة WM_DESTROY

مثال

invoke SetWindowLong,hOpen,GWL_WNDPROC,lpPrevWndProc

حيث lpPrevWndProc هو عنوان الاجراء القديم للنافذة

اظن الموضوع سهل جدا :)

تحياتى


﴿وَمَا كَانَ اللَّهُ لِيُعَذِّبَهُمْ وَأَنْتَ فِيهِمْ ۚ وَمَا كَانَ اللَّهُ مُعَذِّبَهُمْ وَهُمْ يَسْتَغْفِرُونَ﴾

الأنفال ۳۳                                  
 

#16

MOHAMED FATHEI user_popup.png

شكرا لك أخي لكن أنا لا أستعمل أزرار عادية وانما Toolbar لدلك سوف أستخدم Status bar لأشياء أخري كعداد للتوقيت و وحالة اللعبة بدأت أم لا وكم بقي من الأرقام...

شكرا أخي أحمد علي المحاولة.

#17
اقتباس

شكرا لك أخي لكن أنا لا أستعمل أزرار عادية وانما Toolbar

معذرة اخى حبيب :)

اذا استخدم Tooltip Control

http://win32assembly.programminghorizon.com/tut27.html

بالتوفيق


﴿وَمَا كَانَ اللَّهُ لِيُعَذِّبَهُمْ وَأَنْتَ فِيهِمْ ۚ وَمَا كَانَ اللَّهُ مُعَذِّبَهُمْ وَهُمْ يَسْتَغْفِرُونَ﴾

الأنفال ۳۳                                  
 

#18

شكرا لك..<br>

مواضيع مشابهة