مصدر المقال: عشاق الكمبيوتر الكاتب: تشانغ جيان
هل مازلت تتذكر Minicooper الذي كان يتنقل عبر حركة المرور في هوليوود مثل قزم في "اليوم الأخير"؟ قادها مارك والبيرغ وسالي ثيرون لنقل ذهب بقيمة عشرات الملايين تحت أنظار أعدائهم. ومع ذلك، إذا تم وضع أمامك الآن جسم Minicooper الذي لا يستطيع الجري بسرعة، فكيف ستفكر فيه؟ هل لا يزال القزم المتجول؟ اليوم، دعونا نجمع أجزاء Minicooper هذه قطعة قطعة ونتركها تعمل.
مقدمة
بدءًا من هذا العدد، نقدم لك الكود المصدري الكامل للعبة (انقر للتنزيل). يدعو Java Cafe إلى إيلاء اهتمام متساوٍ للنظرية والتطبيق، وسوف نقدم لك التقنيات الأساسية وأفكار التنفيذ في السلسلة. يمكن للأصدقاء قراءة الكود المصدري جنبًا إلى جنب مع المقالة، تمامًا مثل قراءة الصحيفة وشرب القهوة في نفس الوقت هذا هو المكان الذي لا يستنفد فيه عطر ديدي.
تخطيط اللعبة
"Lianliankan" هي لعبة شطرنج ثنائية الأبعاد، إذا كنت ترغب في تصميم لعبة شطرنج، فيجب أن يكون GridLayout هو الخيار الأفضل. الآن دعونا نلقي نظرة على مُنشئ GridLayout:
・GridLayout(): بشكل افتراضي، يتم تقسيم منطقة التخطيط إلى حجم 1*1
・GridLayout(introws,int cols): يحدد عدد الشبكات الأفقية والرأسية في منطقة التخطيط
・GridLayout(introws,int cols,int hgap,int vgap): كما هو مذكور أعلاه، ويحدد أيضًا التباعد الأفقي hgap والتباعد الرأسي vgap بين كل شبكة
لا تدع هذه المنشئات الثلاثة تخيفك، في الواقع، طالما كنت ترغب في ذلك، يمكنك استخدام أي منها بثقة، حتى لو استخدمت الأداة "الخاطئة" عن طريق الخطأ، فهناك طرق لتعديلها في المستقبل. الشيء الوحيد الذي يجب ملاحظته هو أنه عند إضافة عناصر تحكم إلى GridLayout، يكون الترتيب الافتراضي من أعلى اليسار إلى أسفل اليمين.
الآن دعونا نحدد عدد الشبكات الخاصة باللعبة. كم عدد الشبكات المناسبة؟ القليل جدًا سيجعل اللعبة أقل صعوبة، والكثير جدًا سيسبب تأثيرًا بصريًا. لذلك، يجب أن نعبر عنها من خلال زوج من الثوابت، حتى لو أردنا تعديلها في المستقبل، فسيكون ذلك سهلاً.
في Java، يجب كتابة تعريف الثوابت على شكل ثابت نهائي عام، إذا اشترطنا أن لوحة اللعبة تحتوي على 8 شبكات أفقيًا و8 شبكات رأسيًا، فيجب تعريفها على النحو التالي:
الصف النهائي العام الثابت = 8؛
العمود العام النهائي الثابت = 8؛
بعد ذلك، نستخدم المُنشئ الثاني لـ GridLayout لإنشاء التخطيط:
GridLayout GridLayout = new GridLayout(ROW, COLUMN);
أخيرًا، نحتاج أيضًا إلى تغيير تخطيط منطقة اللعبة (contentPanel) إلى التخطيط أعلاه:
contentPanel.setLayout(gridLayout);
إذا قمت بتجميع البرنامج وتشغيله في هذا الوقت، فقد تتساءل: لماذا لم يحدث أي تغيير في الواجهة، هل هناك خطأ ما؟ على الرغم من أننا حددنا التخطيط، لم تتم إضافة أي عناصر تحكم، لذلك بالطبع لا يمكن رؤية أي تغييرات. الآن دعونا نضيف أزرارًا إلى التخطيط:
for (int i = 0; i < ROW * COLUMN; i++) {
JButton Button = new JButton("Kyodai");
contentPanel.add(button);
}
حاول تشغيل البرنامج مرة أخرى هل هو نفس برنامجي (انظر الشكل 1)؟
الاستخدام الذكي لـ JButton لإثارة ضجة
JButton هو عنصر تحكم شائع جدًا في Swing، ومع ذلك، ما زلنا بحاجة إلى بذل القليل من الجهد لفهمه واستخدامه، لأنه عندما تتمكن من استخدام JButton بكفاءة، ستجد عناصر تحكم Swing أخرى أيضا مماثلة جدا.
إذا قمت بتشغيل البرنامج الذي كتبته للتو، فستجد أن الأزرار الموجودة في منطقة اللعبة ممتلئة دائمًا، وهو أمر غير مناسب جدًا لتشغيل اللعبة الفعلي، لذلك يتعين علينا إيجاد طريقة لتحرير بعض الشبكات. تخطيط GridLayout جيد تمامًا، لكن لا يمكنك تخطي شبكة معينة عند إضافة عناصر التحكم. ماذا علي أن أفعل الآن؟
في الواقع، هذا ليس بالأمر الصعب نظرًا لأن GridLayout لا يسمح بالتخطي، فإذا قمنا بدمج عناصر التحكم المضافة في شبكة معينة مع خلفية تخطيط GridLayout، فسنحقق تأثيرًا مرئيًا متسقًا. بالإضافة إلى ذلك، إذا نقر شخص آخر على هذه الشبكة عن طريق الخطأ، فسيظل الزر مكشوفًا، ويتعين علينا إيجاد طريقة لمنع النقر فوق الزر، الأمر الذي يتطلب استخدام طريقة setEnabled() الخاصة بـ JButton. أخيرًا، بالنسبة للأزرار القابلة للنقر عليها، عند النقر عليها، علينا أن نميز الزر الذي تم النقر عليه.
عندما قمنا بتطبيق وظيفة "حول" في المرة الأخيرة، استخدمنا طريقة e.getSource() لتحديد مصدر حدث النقر بالماوس، ومع ذلك، كان ذلك فعالاً فقط لعناصر التحكم المسماة. هنا، يعد استخدام المصفوفة لتمثيل الأزرار أفضل طريقة بلا شك. أولاً، دعونا نعدل الكود أعلاه:
JButton[] dots = new JButton[ROW * COLUMN];
for (int i = 0; i < ROW * COLUMN; i++) {
dots[i] = new JButton("Kyodai");
dots[i].setActionCommand("" + i);
contentPanel.add(dots[i]);
dots[i].addActionListener(this);
}
لا تنس كتابة dots[i] = new JButton("Kyodai") في نص الحلقة. على الرغم من أن رقم مجموعة النقاط قد تم تعريفه واستخدامه سابقًا، إلا أن هذا يخبر البرنامج فقط أننا بحاجة إلى استخدام بعض أزرار J، ولكن هذه. لم يتم بعد تهيئة JButtons. في الوقت نفسه، لا نستخدم setActionCommand() فقط لتحديد أسماء الأحداث للأزرار، بل نستخدم أيضًا طريقة addActionListener() لإضافة معالجة استجابة الحدث إلى كل زر.
فيما يتعلق بكود الاستجابة للحدث، يمكننا إضافته بعد كود الحدث actionPerformed() الأصلي:
إذا (e.getSource() مثيل JButton) {
زر JButton = (JButton) e.getSource();
int Offset = Integer.parseInt(button.getActionCommand());
الصف الدولي، العقيد؛
الصف = Math.round(offset / COLUMN);
col = Offset - Row * COLUMN؛
JOptionPane.showMessageDialog (هذا، "ROW = "+ صف +"، COL = "
+ عمود، "زر"، JOptionPane.INFORMATION_MESSAGE)؛
}
في الكود أعلاه، يتم استخدام مثيل e.getSource() لـ JButton لتحديد ما إذا كان الحدث الذي تم إنشاؤه قد تم إنشاؤه بواسطة عنصر تحكم نوع JButton، ثم يقوم بإجراء تحويل فئة إجباري على عنصر التحكم الذي ينشئ مصدر الحدث، ثم يستخدم Integer.parseInt( الزر تقوم الطريقة .getActionCommand()) بتحويل اسم الحدث الذي تم الحصول عليه إلى عدد صحيح، ويقوم التعليمة البرمجية التالية باستعادة هذا العدد الصحيح إلى معلومات الصف والعمود.
حسنًا، قم الآن بتشغيل البرنامج وانقر فوق كل زر لمعرفة ما إذا كان مربع الحوار مثل الذي على اليمين سيظهر؟
لاحظ أن المشتركين لدينا يبدأون من 0. الكود المصدري للبرنامج لهذه المشكلة (اضغط للتحميل).
استخدام الصور في التأرجح
في الوقت الحاضر، قمنا بحل مشكلة تشغيل المستخدم. لكي نجعل الواجهة جميلة، نحتاج إلى استخدام الصور بدلاً من النص. يمكن للأصدقاء الذين لديهم الوقت والصبر أن يصنعوا صورًا مخصصة بأنفسهم، ولكن كن حذرًا للحفاظ على حجم كل صورة ثابتًا، وإلا فإنها ستكون قبيحة للغاية. إذا كنت تريد حفظ المتاعب، يمكنك أيضًا استخدام الصور المتوفرة في حزمة التنزيل مباشرةً.
في Swing، يمكنك استخدام طريقة setIcon(Image image) لتعيين صورة لـ JButton. صورة المعلمة هي كائن الصورة الذي نريد تعيينه. هناك طرق عديدة للحصول على هذا الكائن:
・استخدم فئة Toolkit للحصول على:
image = Toolkit.getDefaultToolkit().getImage(url);
・ استخدم طريقة getImage() لفئة ImageIcon للحصول على:
image = new ImageIcon(getClass().getResource(filename)).getImage();
نختار الطريقة الأولى هنا. من أجل تسهيل الحصول على كائن الصورة مرة أخرى في المستقبل، يمكننا كتابة هذا كدالة:
صورة getImage(اسم ملف السلسلة){
URLClassLoader urlLoader = (URLClassLoader) this.getClass().getClassLoader();
عنوان URL = فارغ؛
صورة الصورة = فارغة؛
url = urlLoader.findResource(filename);
image = Toolkit.getDefaultToolkit().getImage(url);
صورة العودة؛
}
باستخدام هذه الوظيفة، سيكون استخدام الصور أكثر ملاءمة في المستقبل، أليس كذلك؟
الآن بعد أن أصبحت الصورة متاحة، يمكننا التعبير عن معلومات الخريطة في Map.Java في حزمة التعليمات البرمجية المصدر في شكل صورة. نظرًا لأن هذا الرمز يتعلق بكود الخوارزمية الخاص باللعبة، فلن أدرج الكود بعد الآن. في Map.Java، نستخدم خريطة مصفوفة ثنائية الأبعاد[]] لحفظ معلومات الصورة، وفي الوقت نفسه، نستخدم أيضًا مصفوفة صور أحادية البعد[] لحفظ كل كائن صورة قيمة. لا تشير هذه القيمة فقط إلى القيمة المقابلة للزر الموجود في واجهة اللعبة، ولكنها تشير أيضًا إلى عدد الصور في مصفوفة الصور[] التي يستخدمها هذا الزر، وستكون واجهة تشغيل البرنامج أكثر جمالًا.
ملخص
قدمنا اليوم عنصر التحكم JButton في Swing. بالنسبة لمعظم عناصر التحكم في التأرجح، يمكن نسخ استخدام JButton. لا تقلل من شأن JButton هذا عندما تتمكن من إتقانه جيدًا، سيتم تحسين مهاراتك في التأرجح إلى مستوى أعلى. بالإضافة إلى ذلك، تعلمنا أيضًا طريقتين لتحميل ملفات الصور في Java. أخيرًا، قمنا بدمج الجزأين المذكورين أعلاه لإنشاء واجهة لعبة جميلة. على الرغم من أنني لم أكتب الكود الكامل هنا، إلا أنني أعتقد أن الجميع سيتمكنون من تحقيق الهدف من خلال الرجوع إلى برنامجي المصدر ومن خلال جهودك الخاصة. إذا واجهت مشكلة لا يمكن حلها، يمكنك الاتصال بي من خلال [email protected].
لا أعرف إذا كنت راضيًا عن محتوى اليوم؟ الإثارة لم تأت بعد، يجب على الجميع الاستمرار في رعاية مقهىنا!