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

سؤال في برمجة لعبة الثعبان الموجودة في الجوال

مغلق
بدأه sayedf1 في 16 أغسطس 2005 · 30 رد · 4,314 مشاهدة · في قسم برمجة الألعاب و الرسوميات العام
مشاركة: واتساب X فيسبوك تيليجرام
#1 صاحب الموضوع

اريد ان ابرمج لعبه مثل التى فى الجوال (الثعبان)

لكن كيف اجعل اجزاء الجسم تتبع رأس الثعبان

اعتقد انها بالمصفوفه لكن كيف :(

تم تعديل هذه المشاركة بواسطة sayedf1 في 16 أغسطس 2005 في 19:31

163374357.gif

#2

لاتنسى السلام :) ,,

فيه لعبة للاخ VB_ROCKET *** ان شاء الله اني كتت الاسم صح ***

ثعبان على البيسك ..

بمنتدى البيسك . .

يمكن تلقى الرابط في توقيعه .,,

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

logo1.png تطبيق طمأنينة ، نسخة بيتا على أندرويد

عبدالله الشمّري - Al-Shammari

CodingAlone.com

twitter @abshammeri

abshammeri AT gmail.com

github : abshammeri

#3

أخي الشمري .... الفكرة قد تكون بسيطة .... وخطرت ببالي للتو:

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

- يرسم رأس الثعبان وفقاً للمعطيات

- يبدأ التسارع في اتجاه مفتاح السهم المضغوط

- يبدأ رسم النقاط التالية على أن تأخذ الاحداثيات الجديدة للنقطة الحالية = الاحداثيات الحالية للنقطة السابقة

- تكرر الخطوات حتى يتم رسم كامل النقاط الضوئية

- وهكذا .... !!!!!

هذا في عجالة ..... أقترح استخدام الـ classes فهي مفيدة جداً في مثل هذه الحالات !!!!!! .... وبالتوفيق !!!!!!!

Live Free ... Die Well

The Scorpion King

#4

انا لو في مكانك

كنت استخدم هيكل البيانات LinkedList كهيكل للدودة و جسمها عقد و من الممكن إضافة اي عقدة Node في مكان من القائمة و في اي موضع ...

BEng , Electronics and communications.

Embedded systems engineer.

Graphics Programmer

عالم الكومبيوتر هو من لديه المعرفة في علوم الكومبيوتر ، الرياضيات ، هندسة الالكترونيات -احمد صالح

#5

يمكنك ان تعتبر الدودة LinkedList و كل Node تحتوي على الCurrent Direction و تأخذ الHead ال Current Direction من الUser و كل لحظة تتحرك كل نقطة في اتجاه الCurrent Direction ثم تنسخ الCurrent Direction الخاص بالNode التي تليها و هكذا

طبعا الCurrent Direction هو واحد من اربع قيم Right, Left, Up, Down

Sr. Software Development Engineer
Hulu, LLC
My Blogs

#6

أخواني .... بالتأكيد استخدام الـ Linked Lists هو المطلوب .... فهي عبارة عن طريقة في تمثيل المعطيات واستخدامها .... ولكني قصدت أن فعاليتها القصوى هي استخدامها مع الـ Classes .... عندها سيكون لديك بنائية برمجية أفضل في طريقة الوصول إلى معطياتك وإدارة الـ Linked List .... !!!!!

كتبت المثال المرفق .... وهو عبارة عن مكتبة مصغرة لإدارة Linked List باستخدام الـ Classes .... أرجو أن يكون مفيداً للجميع !!!!!!!!!!!!!!!

وبالتوفيق ،،،،،،،،،،،،،،،،،،،،

linklist.zip

Live Free ... Die Well

The Scorpion King

#7

اما انا فلا افكر ابدا بlinked list لسبب واحد وهو وجود نجوم كثيرة ,,,

احاول الان بطريقة مبسطة ,,, مثلا

for(int i=0;i<=point;i++)

CreateNewPart();

مثلا ... حيث Point رح تزيد عندما ياكل الثعبان نقطة .. لكن المشكلة تكمن عند زيادة عدد point عندها ومع الحلقة while رح تتاخر اللعبة ..

وهذه سبق ان جربتها ..

الفيجوال بيسك صممت العاب snake بدون linked list ... اعتقد فيه شيء يسمى dynamic arraysعلى ما اذكر ... معلوماتي قديمة شوي ...

اذا خطأ صححوا لي ..

logo1.png تطبيق طمأنينة ، نسخة بيتا على أندرويد

عبدالله الشمّري - Al-Shammari

CodingAlone.com

twitter @abshammeri

abshammeri AT gmail.com

github : abshammeri

#8

استخدام Linked List او غيره لتمثيل الدودة في الذاكرة ليست مشكلة و لكن ربما لأن الLinkedList تشبه الدودة :lol: فقد طرأت في أذهاننا فوراً و لكن يمكنك استخدام اي شئ تريده.

سأضع هنا خوارزمية أرجو ان تعمل فأنا لم أجربها و لكني أراها مناسبة

1- مثل الSnake كما يحلو لك و لكني هنا سأعتبر أنها LinkedList مكونة من مجموعة Nodes كل Node تشير الى ما بعدها و يوجود 2 Pointers واحد يشير للHead و الاخر يشير للTail و كل Node تحتوي على variable يخزن فيه ال NodeDirection و هو عبارة عن قيمة من اربعة قيم تمثل الاتجاهات الاربعة.

2- عند البداية تكون جميع الNodes لها الDirection المساوي الى UP (أو من الاخر كلها لها نفس الDirection)

3- عندما يضغط المستخدم على اتجاه معين فإن الSnake Head يتغير الDirection الخاص بها الى هذا الاتجاه.

4- عندما تتحرك الدودة فإن كل Node تتحرك في الاتجاه المخزن داخلها ثم تغير الDirection الخاص بها الى الDirection الخاص بالNode التي تسبقها (في اتجاه الHead ) و هنا ستصبح أول Node بدون Direction و هذا صحيح لأن أول Node تأخذ الDirection من المستخدم.

5- عندما تأكل الدودة فأنه يتم عمل Add في ال Linked List من ناحية الTail و تكون الNode الجديدة لها نفس الDirection الخاص بالNode التي كانت Tail أو ما سأسميها Old Tail

هذا بالنسبة للدودة

و ماذا عن الرقعة التي ستكون الدودة عليها؟؟؟؟؟؟

يمكننا ان نمثل الرقعة بأنها 2D Array من Pointers من نوع Node

و هكذا يجب علينا ان نجعل كل من الSnake Nodes و ال Food تقوم بعمل Inheritance من Node فيصبح لدينا FoodNode و SnakeNode .

و هكذا تكون الدودة عبارة عن List of Snake Nodes

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

ربما يكون هذا الDesign عقيما و لكن نتناقش فيه أو نقترح غيره أو نعدل فيه .

شكرا

Sr. Software Development Engineer
Hulu, LLC
My Blogs

#9

تعديل بسيط في الخوارزمية

في الخطوة 4

ستتحرك جميع الNodes أولا الى الDirection المخزن داخلها و بعد أن تنتهي جميع الNodes من الحركة فإن كل Node بدأُ من الTail الى الHead تأخذ قيمة الDirection الخاص بالNode التي تسبقها في اتجاه الHead و تظل الHead Node بنفس الDirection

Sr. Software Development Engineer
Hulu, LLC
My Blogs

#10

ما شاء الله عليك ياباشمهندس فكرك جميل جدا

والفكرة أكثر من رائعة

Muhammad Allam

Computer Science

@Resource(MappedURL="My Blog" )

#11

مع اعتبار أن العقدة Node هي عبارة عن صورة

BEng , Electronics and communications.

Embedded systems engineer.

Graphics Programmer

عالم الكومبيوتر هو من لديه المعرفة في علوم الكومبيوتر ، الرياضيات ، هندسة الالكترونيات -احمد صالح

#12

أحيانا لا أحبذ وضع ال Logic مع الInterface و لهذا ممكن ان ان نجعل اللعبة جزئين Logic أو Engine و GUI

و يكون الEngine مرتبطا مع ال GUI من خلال Events معينة مثل OnSnakeMove و OnCrash و OnEat و عكذا نعطي شكلا جيدا للكود

Sr. Software Development Engineer
Hulu, LLC
My Blogs

#13

ماهي مكتبة الجرافكس التي تحب ان تستخدمها ....

logo1.png تطبيق طمأنينة ، نسخة بيتا على أندرويد

عبدالله الشمّري - Al-Shammari

CodingAlone.com

twitter @abshammeri

abshammeri AT gmail.com

github : abshammeri

#14
الشـمري كتب:
ماهي مكتبة الجرافكس التي تحب ان تستخدمها ....

ديركت أكس

163374357.gif

#15

اشكركم جميعا على ردودكم وتفاعلك

163374357.gif

#16

شوفوا هذا بشكل مؤقت ...

http://www.pscode.com/vb/scripts/ShowCode....d=2575&lngWId=3

logo1.png تطبيق طمأنينة ، نسخة بيتا على أندرويد

عبدالله الشمّري - Al-Shammari

CodingAlone.com

twitter @abshammeri

abshammeri AT gmail.com

github : abshammeri

#17
الشمري كتب:

عند تجربه المثال ظهر هذا الخطأ

post-45582-1124539377_thumb.jpg

163374357.gif

#18

أخي غيرها إلى stdlib.h ..... لا يوجد ملف رأسي بهذا الاسم في ++C\C .... لاحظ أيضاً استخدام الـ Classes .... وبالتوفيق

Live Free ... Die Well

The Scorpion King

#19

المثال متعب ... لانه على البورلاند .. على ما اظن .

سأحوله الى فيجوال سي .

على فكره المبرمج عربي ..

كثير من امثلة pscode من ايدي عربية مسلمة ... مثل امثلة قرطبة .. وهو احدهم .. وغيره الكثير .

السؤال/

لماذا هجروا المواقع العربية .

اعتقد انهم على حق ..

تم تعديل هذه المشاركة بواسطة الشمري في 20 أغسطس 2005 في 16:21

logo1.png تطبيق طمأنينة ، نسخة بيتا على أندرويد

عبدالله الشمّري - Al-Shammari

CodingAlone.com

twitter @abshammeri

abshammeri AT gmail.com

github : abshammeri

#20

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

Live Free ... Die Well

The Scorpion King

#21

بركو لى لقد انتهيت من حركة الثعبان وها هو فى المرفقات. :D

snac.rar

163374357.gif

#22

ترى ما هي الطريقة التي استخدمتها يا سيد؟

أعتقد أن الطريقة المطروحة تستهلك الكثير من الحسابات والجمل التكرارية، لهذا أضع إليكم هذا الحل، وكما قال بعضكم، كلما زاد حجم الدودة سيزيد الوقت لحساب مواقع أجزاء الدودة!

فرضيات:

1- الدودة مكونة من فقرات.

2- كل فقرة من فقرات الدودة تحمل موقعا.

3- رأس الدودة هي أول فقرة!

4- الفقرات موزعة على مصفوفة، أو أي نوع من المجموعات، أما اختيار النوع فله حديث آخر!

طريقة حساب المواقع الجديدة:

1- إذا تحركت الدودة إلى اتجاه معين:

أ- نأخذ آخر فقرة ونحذفها من المصفوفة.

ب- نضيف هذه الفقرة إلى أول المصفوفة لتكون رأس الثعبان.

ج- نغير إحداثيات هذه الفقرة لتأخذ موقع الرأس الجديد.

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

2- إذا تناولت الدودة طعاما وبهذا ستزيد فقرة:

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

ملاحظة: هذا لن يضر منطق اللعبة أبدا!!

نلاحظ أنه إذا زاد حجم الدودة فلن تزيد الحسابات ولا زمن تحرك الدودة، ولا تتأثر سرعة البرنامج!

بالتوفيق!!

#23

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

السلام عليكم جميعا

الطريقه التى برمجت بها حركةالثعبان هى

- اعلنت عن خصائص (Type)

. Public Type snake_F

. X As Long

. Y As Long

. ax As Long

. aY As Long

. Used As Boolean

. End Type

-اعلنت عن مصفوفه ذات بعد واحد ولها الخصائص المعلن عنها

. Public snake(1 To 200) As snake_F

- العنصر الأول فى المصفوفه هو دماغ الثعبان

بعد رسم الدماغ انقل قيم الإحداثيات من العنصر الأول الى الثانى والثانى الى الثالث وهاكذا الى اخر عنصر فى المصفوفه

. For r = 1 To 200

. If snake®.Used = True then

. snake(r + 1).X = snake®.ax

. snake(r + 1).Y = snake®.aY

. End If

. next

هذه هى الطريقه التى استخدمتها ولو هناك اى نقطه غير واضحه انا جهاز للشرح

وشكرا لكم جميعا

163374357.gif

#24

ممكن اتحط كود حق حركات ثعبان وشكرا

#25

بعد أن أرفقت الطريقة السريعة السهلة السابقة في الرد رقم 22:

/index.ph...ndpost&p=383412

بقي أن نتكلم عن المصفوفة أو المجموعة التي ستحمل الفقرات:

وحتى أجعل الموضوع أكثر سخونة، السؤال هو: كيف ننفذ الطريقة السابقة على مصفوفة معينة أو مجموعة عمليا وليس نظريا؟

إذ كيف ستحذف الفقرة الأخيرة من المصفوفة وتضيفها وتجعلها الأولى في المصفوفة؟

تم تعديل هذه المشاركة بواسطة أبومازن في 11 سبتمبر 2005 في 02:15

هذا الموضوع مغلق.

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