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

مشكلة فى برمجة لعبة Tetris

بدأه mr.beshoy في 22 سبتمبر 2011 · 2 رد · 784 مشاهدة · في JavaSE
مشاركة: واتساب X فيسبوك تيليجرام
#1 صاحب الموضوع

أقوم بمحاولة لبرمجة هذه اللعبة Tetris ( و هى عبارة عن تساقط بلوكات لها الوان مختلفة و كل ما تكون صف من البلوكات يتمسح ) .

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

ستجد فى ال code 3 pakage

1- TetrisView >>>>>>> به classes 3 الخاصو بمنظر اللعبة و به class TetrisCell الذى به المشكلة

2- TetrisModel >>>>>>> به 5 classes الخاصة بمحتويات اللعبة .

3-Tetris Contoler >>>>>>>> به 2 classes الخاصة بالتحكم فى اللعبة

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

المشكلة بالتحديد فى ال class TetrisCell به method moveBlockVerticle() فى ال actionPerformed

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

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

فى حين أنى كل مرة بعمل شرط بيقول : لو ال nextRow - 2 == blockData.getPoint().getX()

حيث أن ال nextRow هى اول صف يُرسم فيه المكعب و بما انه مكون من صفين بعمل فحص لو nextRow - 2 - نفترض ان ال nextRow = 12 يبقى إذن 12- 2 = 10 - مشغولة بشكل سابق لو حصل كده يبقى بنقوله متتحركش و استقر مكانك

رغم ذلك هو بيتحرك خطوة يعنى بيتسقر على اول صف فى الشكل اسابق !!!

if (tetrisBlockShapesEnum == tetrisBlockShapesEnum.CUBE_BLOCK && nextRow - 2 == blockData.getPoint().getX()
                            || tetrisBlockShapesEnum == tetrisBlockShapesEnum.I_BOLCK && nextRow - 4 == blockData.getPoint().getX()) {
                        canDraw = false;
                    } else {
                        canDraw = true;
                    }

الكود مرفق :

و أتمنى حد يساعدنى فيها عملت debugging كتير و مش عارف المشكلة فين .

اعمل run للمشروع و سترى المشكلة . شكراً مقدماً

newTetrisGame1.rar

تم تعديل هذه المشاركة بواسطة mr.beshoy في 22 سبتمبر 2011 في 21:09

#2

تم حل المشكلة ..

فى ال code السابق كنا نفعل هكذا فى ال class TetrisCell بالتحديد فى ال method moveBlockVerticle()

 for (Iterator<BlockData> iterator = mylist.iterator(); iterator.hasNext();) {
                    BlockData blockData = iterator.next();
                    if (tetrisBlockShapesEnum == tetrisBlockShapesEnum.CUBE_BLOCK && nextRow - 2 == blockData.getPoint().getX()
                            || tetrisBlockShapesEnum == tetrisBlockShapesEnum.I_BOLCK && nextRow - 4 == blockData.getPoint().getX()) {
                        canDraw = false;
                    }

                     else {
                        canDraw = true;
                    }

بعمل كمية من ال depugging اكتشفت شئ و هو

فى البداية عندما يتحرك cube block مكون من صفين ، و عمودين و يستقر يكون ال blockData بها أربع نقط .

إذن ال mylist.iterator() = 4

تعالوا ننظر هنا nextRow - 2 == blockData.getPoint().getX()

عندما يبدأ مكعب آخر فى النزول نفترض أنه وصل للصف الرابع و طبعأ بيدخل فى ال for Loop

إذن اللفة الأولى : 4 - 2 = 2 و هى تساوى blockData.getPoint().getX() = 2 حيث أن الصف الثانى مشغول . إذن ال canDraw=false يعنى المكعب التانى مش هيتحرك .. و ده تمام كده

اللفة التانية : 4 - 2 = 2 و هى تساوى blockData.getPoint().getX() = 2 حيث أن الصف الثانى مشغول . إذن ال canDraw=false يعنى المكعب التانى مش هيتحرك .. و ده تمام كده

اللفة التالتة : 4- 2 = 2 و هى لا تساوى blockData.getPoint().getX() =1 حيث أنه دخل فى القيمة التالتة و هى 1 فى ال blockData . إذن ال can Draw=true . يعنى المكعب هيقدر يتحرك إذن هيعمل خلط مع المكعب الأول

اللفة الرابعة كما فى التالتة ..

الحل كان هكذا

  for (Iterator<BlockData> iterator = mylist.iterator(); iterator.hasNext();) {
                    BlockData blockData = iterator.next();
                    if (tetrisBlockShapesEnum == tetrisBlockShapesEnum.CUBE_BLOCK && nextRow - 2 == blockData.getPoint().getX()
                            || tetrisBlockShapesEnum == tetrisBlockShapesEnum.I_BOLCK && nextRow - 4 == blockData.getPoint().getX()) {
                        canDraw = false;
                    }
                }

لغينا جزء ال else بحيث أول ما يلاقى CanDraw= false من نفسه ميتحركش خطوة زيادة

الكود المعدل مرفق :

و مستمرين فى مرحلة التكويد لإستكمال اللعبة :lol:

شكراً

newTetrisGame1.rar

تم تعديل هذه المشاركة بواسطة mr.beshoy في 23 سبتمبر 2011 في 12:48

1
#3

بالتوفيق دايماً كان بدي اساعد :)

--

Mina Fouad

Computer & Systems Engineering Dpt.

Faculty of Engineering

Alexandria University

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