كود لعبة اكس او - tic tac toe بلغة الجافا
في هذه التدوينه سوف تكون اول تطبيق على قاعدة Java Swing في موقعنا ولكي تنشأ العاب وتطبيقات احترافيه بلغة الجافا يجب عليك ان تكون متقن OOP وهي اختصار الى Object-oriented programming او البرمجه الشيئيه لانها تحتوي على مفاهيم مهمه جدا لكل مبرمج او يمكنني ان اقول لك انها بداية البرمجه وبعد تعلمك لها تعلم Java Swing وستكون جاهز للبدء في برمجة بشكل احترافي .
واحد من اكثر لغات البرمجة التي عليها طلب كبير وهي لغة جافا ولذلك لان مبرمج جافا يستطيع تطوير تطبيقات الموبايل وخصوصا تطوير تطبيقات الاندرويد وايضا تمنك لغة جافا من برمجة تطبيقات سطح المكتب ويبحث كثير من الاباء عن تعليم البرمجة للاطفال مجانا وذلك لاهمية البرمجة في عصرنا الحالي ولانها واحد من اكثر الوظائف التي عليها طلب كبير في سوق العمل ونقدم في موقعنا دورة جافا بسيطة تساعدك على فهم اللغة وكيف تبدء في كتابة اول كود برمجي لك في لغة جافا وبعدها انتقل الى قسم تطوير تطبيقات الاندرويد ومن هذا القسم نقدم فيه بحر من الشروحات التي سوف تجعلك قادر على انشاء تطبيقات اندرويد احترافية .
تستطيع تطوير تطبيقات الهواتف الذكية وبيعها او نشرها على متجر جوجل بلاي والربح منها وايضا تعلمك لمهارة برمجة وتطوير التطبيقات وطريقة كتابة الكود بشكل جيد يساعدك في البحث عن شركة تطوير تطبيقات الجوال والعمل فيها وفرص العمل في مجالات البرمجة كبيره جدا ولا يقضر موقعنا فقط على لغة جافا بل يوجد اكواد لغة بايثون وسي بلس وغيرها من الاكواد , فاذا كنت تبحث عن تعليم البرمجة للاطفال بالعربي فبكل بساطة تستطيع هذا من خلال موقعنا حيث نقوم بشرح اللغة ببساطة وايضا تقديم اكواد كثيره فيها لكي تفهم الفكرة ونقوم بشرح الاكواد التي تقدم في بعض الاحيان ونحن في جي كودرس geecoders نحاول دائما ان نوفر لكم كل ما تحتاجونه في عالم البرمجة .
التطبيقات والالعاب ولكن لا هذا يعني انه لا يوجد اشياء اخرى تتعلمها ولكن هذه المفاهيم مهمه ان تتعلمها لكي تبدأ وفي تدوينة اليوم سوف اضع لكم مثال على لعبة مشهور لدى الجميع وهي X vs O او بالانجليزيه Tic Tac Toe ولكن قبل ان ابدء اريد ان انوه الى ان هذا الكود منقول
كيفية تعلم لغة برمجة الجافا ببساطة ؟
اللغة سهلة وغير معقدة كما يشاع ولكن ايضا ليست صعبة فهي متوسطة المميز ان البرنامج الذي يتم لبرمجة امر معين والذي يكتب بالجافا يمكن ان يعمل على مختلف انظمة التشغيل سواء كان نظام التشغيل ويندوز او ماك و غيرة وايضا يمكن خلالها تطوير تطبيقات الاندرويد وهذا ما يميز البرنامج المكتوب باستخدام جافا وايضا نحن نقدم مشاريع جاهزة للتعديل في موقعنا ، لكتابة اول كود برمجي لك وتعلم اللغة يمكنك التوجة الى مقالة هنا ( java tutorial ) الموجودة في موقعنا حيث تم شرح فيها كتابة اول كود برمجي و ماهي البيانات التي يمكن ان تدخلها في اللغة و أساسيات اللغة ونساعدك على كتابة اول برنامج لك بلغه الجافا وبعد ذلك يمكنك اخذ كورسات او قراءة كتاب متخصص او كتب في اللغة سواء pdf اوغيرة وهذا ما ننصح لة والجافا تعد افضل من السي بلس ، بالنسبة الى التطبيقات التي تريد تطويرها بالاندرويد انصحك بتعلم الجافا ثم بعدها تعلم الكوتلن لان اللغة الرسمة حاليا هي الكوتلن أي جافا ثم كوتلن . لان بيئة العمل مختلفة والجافا اكبر الكوتلن ماهي الى تطوير للغة وهي ابسط من الجافا بكثير جدا ، وسوف نقدم شرح مكتوب للكوتلن قريبا في موقعنا
افضل البرنامج و المحررات للكتابة بالجافا ؟
يوجد مقالة سابقة عن تحميل افضل البرنامج التي تساعدك في كتابة اكواد بلغة الجافا بسهولة ومن تلك البرامج وافضلها للمبتدئين netbeans يمكنك بناء و عمل برامج كبيرة عن طريق عن البرنامج البسيط ، ارجع الى المصدر وهو ( java compiler ) لتجد مجموعة منوعة من البرامج اللازمة مع ذكر عيوب و مميزات كل برنامج ملاحظة هذة البرامج تعمل على جهاز الكمبيوتر ، أو يتم استخدام مواقع اونلاين لكتابة ألاكواد عن طريق هذة المقالة ( java online compiler ) وستجد افضل محرر بداخل هذة المقالة ، ويوجد تطبيق او مجموعة تطبيقات للهاتف المحمول للاندرويد والايفون للكتابة بالجافا و يمكنك صناعه و تنفيذ من خلالها program يعمل على جهازك
اين يكتب الكود بداخل المحرر ؟
الاكواد المكتوبة بلغة الجافا او اي لغة نقوم بكتابتها داخل class ويمكنك ربط مجموعة methods داخل الكلاس و تعمل مع بعضها البعض عند استدعائها ملاحظة : عند استدعاء اي شيئ في الجافا يجب ان تستخدم او تقوم بي إنشاء مكتبة مخصصة ( معينة ) لهذا الشيئ مثل Scanner نستدعي المكتبة المخصصة لة لعدم حدوث مشاكل والمكتبة عبارة عن مجموعة من النصوص وهذة من قواعد الجافا ، اذا كان المحرر الذي تعمل علية بسيط لا يوجد بة مكتبات سوف تجدة لا يقبل اي عملية داخلة ويجب عليك ان تقوم بعمل تنزيل الواجهات المخصصة لكل مكتبة في المحرر ليعمل وهذة المكتبات يمكنك تحميلها مجانا وانصحك بقراءة الجزء الاعلى والذي اقدم لكم فية افضل برامج لكتابة الاكواد ، اذا حدث معك مشكلة او ظهر Error في مشروع الجافا الذي تعمل علية يمكنك ترجمة الكلام ومحاولة حله ليعمل البرنامج في بيئة متكاملة بدون اخطاء
المتطلبات التي يحتاج ان تكتب في كل كود جافا
يجب ان يحتوي كل كود مكتوب ببرمجة جافا الى مجموعة أدوات معرفة داخل البرنامج لكي يعمل معك بدون اي مشاكل ، ليس الا ان تقم بكتابة الاوامر التالية :
قبل جملة
package ###;
### : هو اسم الباكج الذي قمت بانشاه
ضغط هذا الكود
import java.util.Scanner;
فقط كل ما عليك هو تغيير
GC الى اسم الباكج الذي قمت بانشاه
طريقة عمل الكود ؟
قم بإنشاء ملف جافا بإسم tic_tac_toe
قم بإنشاء كلاس بإسم Main
قم بإنشاء package داخل ملف الجافا بإسم images وضع بداخله الصور
قم بكتابة الكود التالي داخل tic_tac_toe
Main n = new Main ();
كود العبة بالجافا
قم بلصق الكود التالي داخل Main
tic_tac_toe موجود بداخل المجلد Main.java هنا ذكرنا أن الملف
package tic_tac_toe;
import java.awt.CardLayout;
import java.awt.Font;
import java.awt.Color;
import java.awt.Container;
import java.awt.event.ActionListener;
import java.awt.GridLayout;
import java.awt.event.ActionEvent;
import java.awt.event.MouseEvent;
import java.awt.event.ItemEvent;
import java.awt.event.ItemListener;
import javax.swing.JButton;
import java.awt.event.MouseListener;
import java.util.Random;
import javax.swing.JOptionPane;
import javax.swing.ImageIcon;
import javax.swing.JComboBox;
import javax.swing.JLabel;
import javax.swing.JFrame;
import javax.swing.JPanel;
// و بالتالي أصبح إنشاء كائن منه يمثل إنشاء نافذة JFrame يرث من الكلاس Main هنا جعلنا الكلاس
import javax.swing.JTextField;
import javax.swing.SwingUtilities;
public class Main extends JFrame {
JButton startPage_multiPlayer;
// و الأشياء التي سنضعها فيها startPage هنا قمنا بتعريف الـ
JPanel startPage;
JButton startPage_singlePlayer;
JLabel singlePlayerPage_label;
JButton startPage_settings;
JButton startPage_about;
JButton startPage_exit;
// و الأشياء التي سنضعها فيها singlePlayerPage هنا قمنا بتعريف الـ
JPanel singlePlayerPage;
// و الأشياء التي سنضعها فيها multiPlayerPage هنا قمنا بتعريف الـ
JTextField singlePlayerPage_playerName;
JButton singlePlayerPage_start;
JPanel multiPlayerPage;
JButton singlePlayerPage_back;
JButton multiPlayerPage_back;
JLabel multiPlayerPage_firstLabel;
JLabel multiPlayerPage_secondLabel;
JTextField multiPlayerPage_firstPlayerName;
JTextField multiPlayerPage_secondPlayerName;
JButton multiPlayerPage_start;
JLabel settingsPage_selectedFontSizeLabel;
// و الأشياء التي سنضعها فيها settingsPage هنا قمنا بتعريف الـ
JPanel settingsPage;
JComboBox settingsPage_selectedBoardValue;
JLabel settingsPage_selectedBoardLabel;
JLabel gamePage_boardBackground;
JComboBox settingsPage_selectedFontSizeValue;
JButton settingsPage_reset;
JButton settingsPage_back;
JPanel gamePage;
// و الأشياء التي سنضعها فيها gamePage هنا قمنا بتعريف الـ
JLabel gamePage_firstPlayerName;
JPanel gamePage_boardPanel;
JLabel[] gamePage_boardLabels;
// هنا قمنا بتعريف نوع الخط و حجم الخط و الألوان التي سنستخدمها في اللعبة
JLabel gamePage_secondPlayerName;
JLabel gamePage_firstPlayerScore;
JLabel gamePage_secondPlayerScore;
JLabel gamePage_currentPlayerIcon;
JButton gamePage_back;
Font defaultFont = new Font("Arial", Font.BOLD, 16);
JButton gamePage_restart;
// سنستخدم هذا المتغير لتحديد ما إذا كان شخص واحد سيلعب اللعبة أو إثنين
Color defaultButtonBackgroundColor = Color.lightGray;
Color defaultButtonTextColor = Color.black;
Color oForeground = Color.red;
Color xForeground = Color.blue;
boolean challengeComputer = false;
Color winnerSquaresBackground = Color.yellow;
// randomNumber لتوليد أرقام عشوائية عند اللعب ضد الكمبيوتر. و سنخزن الرقم في المتغير random سنستخدم الكائن
// سنستخدم هذا المتغير لتحديد دور من في اللعب
boolean isFirstPlayerTurn = true;
// سنستخدم هذا المتغير لحساب عدد النقرات و بالتالي لتحديد ما إذا كان سيتم إيقاف اللعبة أم لا
int XOCounter = 0;
// سنستخدم هذا المتغير أيضاً لتحديد ما إذا كان سيتم إيقاف اللعبة بسبب فوز أحد اللاعبين
boolean isGameEnds = false;
Random random = new Random();
int randomNumber;
singlePlayerPage_label.setFont(font);
// سنستخدم هذه الدالة كلما أردنا تغيير حجم خط جميع الأزرار و النصوص الموجودة في اللعبة دفعة واحدة
private void setNewFont(Font font) {
startPage_singlePlayer.setFont(font);
startPage_about.setFont(font);
startPage_multiPlayer.setFont(font);
startPage_settings.setFont(font);
settingsPage_selectedBoardValue.setFont(font);
startPage_exit.setFont(font);
singlePlayerPage_playerName.setFont(font);
singlePlayerPage_start.setFont(font);
multiPlayerPage_firstLabel.setFont(font);
singlePlayerPage_back.setFont(font);
multiPlayerPage_firstPlayerName.setFont(font);
multiPlayerPage_secondLabel.setFont(font);
multiPlayerPage_start.setFont(font);
multiPlayerPage_secondPlayerName.setFont(font);
multiPlayerPage_back.setFont(font);
gamePage_back.setFont(font);
settingsPage_selectedBoardLabel.setFont(font);
settingsPage_selectedFontSizeLabel.setFont(font);
settingsPage_reset.setFont(font);
settingsPage_selectedFontSizeValue.setFont(font);
settingsPage_back.setFont(font);
gamePage_secondPlayerName.setFont(font);
gamePage_boardPanel.setFont(font);
gamePage_firstPlayerName.setFont(font);
gamePage_firstPlayerScore.setFont(font);
startPage_multiPlayer.setBackground(backgroundColor);
gamePage_secondPlayerScore.setFont(font);
gamePage_restart.setFont(font);
}
// سنستخدم هذه الدالة كلما أردنا تغيير ألوان أزرار التطبيق
private void setThemeColors(Color textColor, Color backgroundColor) {
startPage_singlePlayer.setForeground(textColor);
startPage_settings.setForeground(textColor);
startPage_multiPlayer.setForeground(textColor);
startPage_about.setForeground(textColor);
startPage_settings.setBackground(backgroundColor);
startPage_exit.setForeground(textColor);
startPage_singlePlayer.setBackground(backgroundColor);
multiPlayerPage_firstPlayerName.setForeground(textColor);
startPage_about.setBackground(backgroundColor);
startPage_exit.setBackground(backgroundColor);
singlePlayerPage_label.setForeground(textColor);
singlePlayerPage_playerName.setForeground(textColor);
singlePlayerPage_start.setForeground(textColor);
singlePlayerPage_start.setBackground(backgroundColor);
singlePlayerPage_back.setForeground(textColor);
multiPlayerPage_firstLabel.setForeground(textColor);
singlePlayerPage_back.setBackground(backgroundColor);
gamePage_secondPlayerScore.setForeground(textColor);
multiPlayerPage_secondLabel.setForeground(textColor);
multiPlayerPage_secondPlayerName.setForeground(textColor);
multiPlayerPage_start.setForeground(textColor);
multiPlayerPage_start.setBackground(backgroundColor);
multiPlayerPage_back.setForeground(textColor);
gamePage_firstPlayerName.setForeground(textColor);
multiPlayerPage_back.setBackground(backgroundColor);
gamePage_firstPlayerScore.setForeground(textColor);
gamePage_secondPlayerName.setForeground(textColor);
gamePage_back.setForeground(textColor);
settingsPage_reset.setBackground(backgroundColor);
gamePage_restart.setForeground(textColor);
gamePage_restart.setBackground(backgroundColor);
gamePage_back.setBackground(backgroundColor);
settingsPage_selectedBoardLabel.setForeground(textColor);
settingsPage_selectedBoardValue.setForeground(textColor);
settingsPage_selectedFontSizeValue.setForeground(textColor);
settingsPage_selectedFontSizeLabel.setForeground(textColor);
settingsPage_reset.setForeground(textColor);
startPage.add(startPage_settings);
settingsPage_back.setForeground(textColor);
settingsPage_back.setBackground(backgroundColor);
}
// startPage سنستخدم هذه الدالة لخلق محتوى الصفحة
private void createStartPage() {
// هنا أنشأنا الحاوية الأساسية و الأشياء التي سنضعها فيها
startPage = new JPanel(null);
startPage_singlePlayer = new JButton("Single Player");
startPage_settings = new JButton("Settings");
startPage_multiPlayer = new JButton("Multi Player");
startPage_about = new JButton("About");
startPage.add(startPage_about);
startPage_exit = new JButton("Exit");
// هنا وضعنا كل شيء بداخل الحاوية
startPage.add(startPage_singlePlayer);
startPage.add(startPage_multiPlayer);
singlePlayerPage_label = new JLabel("Player Name");
startPage.add(startPage_exit);
// هنا قمنا بتحديد حجم و موقع كل شيء أضفناه في الحاوية
startPage_singlePlayer.setBounds(80, 110, 240, 40);
startPage_settings.setBounds(80, 230, 240, 40);
startPage_multiPlayer.setBounds(80, 170, 240, 40);
startPage_about.setBounds(80, 290, 240, 40);
// singlePlayerPage سنستخدم هذه الدالة لخلق محتوى الصفحة
startPage_exit.setBounds(80, 350, 240, 40);
}
singlePlayerPage_playerName = new JTextField("player");
private void createSinglePlayerPage() {
// هنا أنشأنا الحاوية الأساسية و الأشياء التي سنضعها فيها
singlePlayerPage = new JPanel(null);
}
singlePlayerPage_start = new JButton("Start");
singlePlayerPage_back = new JButton("Back");
singlePlayerPage.add(singlePlayerPage_label);
// هنا وضعنا كل شيء بداخل الحاوية
singlePlayerPage.add(singlePlayerPage_start);
singlePlayerPage.add(singlePlayerPage_playerName);
// هنا قمنا بتحديد حجم و موقع كل شيء أضفناه في الحاوية
singlePlayerPage.add(singlePlayerPage_back);
singlePlayerPage_playerName.setBounds(190, 170, 130, 30);
singlePlayerPage_label.setBounds(80, 170, 100, 30);
singlePlayerPage_back.setBounds(80, 280, 240, 40);
singlePlayerPage_start.setBounds(80, 220, 240, 40);
multiPlayerPage.add(multiPlayerPage_secondLabel);
// multiPlayerPage سنستخدم هذه الدالة لخلق محتوى الصفحة
private void createMultiPlayerPage() {
// هنا أنشأنا الحاوية الأساسية و الأشياء التي سنضعها فيها
multiPlayerPage = new JPanel(null);
multiPlayerPage_firstLabel = new JLabel("Player X");
multiPlayerPage_firstPlayerName = new JTextField("player 1", 8);
multiPlayerPage_secondLabel = new JLabel("Player O");
multiPlayerPage_secondPlayerName = new JTextField("player 2", 8);
multiPlayerPage.add(multiPlayerPage_firstLabel);
multiPlayerPage_start = new JButton("Start");
multiPlayerPage_back = new JButton("Back");
private void createSettingsPage() {
// هنا وضعنا كل شيء بداخل الحاوية
multiPlayerPage.add(multiPlayerPage_firstPlayerName);
multiPlayerPage.add(multiPlayerPage_secondPlayerName);
multiPlayerPage.add(multiPlayerPage_start);
// هنا قمنا بتحديد حجم و موقع كل شيء أضفناه في الحاوية
multiPlayerPage.add(multiPlayerPage_back);
multiPlayerPage_firstPlayerName.setBounds(160, 130, 160, 30);
multiPlayerPage_firstLabel.setBounds(80, 130, 70, 30);
multiPlayerPage_secondPlayerName.setBounds(160, 190, 160, 30);
multiPlayerPage_secondLabel.setBounds(80, 190, 70, 30);
multiPlayerPage_start.setBounds(80, 250, 240, 40);
multiPlayerPage_back.setBounds(80, 310, 240, 40);
}
settingsPage.add(settingsPage_selectedBoardValue);
// settingsPage سنستخدم هذه الدالة لخلق محتوى الصفحة
// هنا أنشأنا الحاوية الأساسية و الأشياء التي سنضعها فيها
settingsPage = new JPanel(null);
settingsPage_selectedBoardLabel = new JLabel("Game Board");
settingsPage_selectedBoardValue = new JComboBox(new String[]{"Board 1", "Board 2", "Board 3", "Board 4"});
settingsPage_selectedFontSizeLabel = new JLabel("Font Size");
settingsPage_selectedFontSizeValue.setSelectedIndex(1);
settingsPage_selectedFontSizeValue = new JComboBox(new String[]{"Small", "Meduim", "Large"});
settingsPage_reset = new JButton("Reset Default Settings");
settingsPage.add(settingsPage_selectedFontSizeLabel);
settingsPage_back = new JButton("Back");
// هنا وضعنا كل شيء بداخل الحاوية
settingsPage.add(settingsPage_selectedBoardLabel);
gamePage = new JPanel(null);
settingsPage.add(settingsPage_selectedFontSizeValue);
settingsPage.add(settingsPage_reset);
// هنا قمنا بتحديد حجم و موقع كل شيء أضفناه في الحاوية
settingsPage.add(settingsPage_back);
settingsPage_selectedBoardValue.setBounds(200, 130, 120, 30);
settingsPage_selectedBoardLabel.setBounds(80, 130, 100, 30);
settingsPage_selectedFontSizeValue.setBounds(200, 190, 120, 30);
settingsPage_selectedFontSizeLabel.setBounds(80, 190, 100, 30);
settingsPage_reset.setBounds(80, 250, 240, 40);
private void createGamePage() {
settingsPage_back.setBounds(80, 310, 240, 40);
}
for (int i = 0; i < gamePage_boardLabels.length; i++) {
// gamePage سنستخدم هذه الدالة لخلق محتوى الصفحة
// هنا أنشأنا الحاوية الأساسية و الأشياء التي سنضعها فيها
gamePage_firstPlayerName = new JLabel("", JLabel.CENTER);
gamePage_secondPlayerName = new JLabel("", JLabel.CENTER);
gamePage_firstPlayerScore = new JLabel("0", JLabel.CENTER);
gamePage_secondPlayerScore = new JLabel("0", JLabel.CENTER);
gamePage_currentPlayerIcon = new JLabel("", JLabel.CENTER);
gamePage_boardPanel = new JPanel(new GridLayout(3, 3, 8, 8));
gamePage_boardLabels = new JLabel[9];
gamePage_back = new JButton("Back");
// JLabels التي سنضع فيها 9 gamePage_boardPanel فقط لوضع الصورة خلف الـ Label سنستخدم هذا الـ
gamePage_restart = new JButton("Restart");
gamePage_boardBackground = new JLabel();
// مع تحديد بعض خصائصهم gamePage_boardPanel في الحاوية JLabels هنا وضعنا الـ 9
gamePage_boardBackground.setIcon(new ImageIcon(this.getClass().getResource("/images/board_1.png")));
gamePage_boardLabels[i] = new JLabel("", JLabel.CENTER);
// هنا قمنا بتحديد حجم و موقع كل شيء أضفناه في الحاوية
gamePage_boardLabels[i].setFont(new Font("Arial", Font.BOLD, 40));
gamePage_boardLabels[i].setBackground(winnerSquaresBackground); // Opaque ملحوظة: هذا اللون لن يظهر إلى إذا جعلنا الخلفية صلبة
gamePage_boardPanel.add(gamePage_boardLabels[i]);
}
// هنا وضعنا كل شيء بداخل الحاوية
// هنا قمنا بمناداة هذه الدالة لتحديد رمز اللاعب الذي سيلعب الآن على حسب دوره
setCurrentPlayerIcon();
gamePage.add(gamePage_secondPlayerScore);
gamePage.add(gamePage_firstPlayerName);
gamePage.add(gamePage_secondPlayerName);
gamePage.add(gamePage_firstPlayerScore);
gamePage.add(gamePage_back);
gamePage.add(gamePage_currentPlayerIcon);
gamePage.add(gamePage_boardBackground);
gamePage.add(gamePage_restart);
gamePage.add(gamePage_boardPanel);
// لجعل لون خلفية المربعات التي كانت سبب فوز الاعب ملونة colorBackgroundWinnerLabels في حال كان يوجد فائز سيتم مناداة الدالة
gamePage_firstPlayerName.setBounds(0, 10, 150, 30);
gamePage_secondPlayerName.setBounds(250, 10, 150, 30);
gamePage_secondPlayerScore.setBounds(250, 40, 150, 30);
gamePage_firstPlayerScore.setBounds(0, 40, 150, 30);
gamePage_boardBackground.setBounds(45, 105, 300, 300);
gamePage_currentPlayerIcon.setBounds(120, 25, 150, 30);
gamePage_boardPanel.setBounds(45, 105, 300, 300);
// سنستخدم هذه الدالة لإظهار لون خلفية المربعات التي بسببها فاز اللاعب و لإيقاف اللعبة
gamePage_back.setBounds(20, 475, 140, 30);
gamePage_restart.setBounds(230, 475, 140, 30);
}
isGameEnds = true;
private void colorBackgroundWinnerLabels(JLabel l1, JLabel l2, JLabel l3) {
l1.setOpaque(true);
l2.setOpaque(true);
colorBackgroundWinnerLabels(gamePage_boardLabels[0], gamePage_boardLabels[1], gamePage_boardLabels[2]);
l3.setOpaque(true);
}
// سنستخدم هذه الدالة في كل مرة يلعب فيها اللاعبون للتأكد إذا كان هناك فائز أم لا
// لإيقاف اللعبة. و سيتم إضافة واحد في نتيجة اللاعب الفائز true إلى isGameEnds و لتغيير قيمة المتغير
private void checkIfThereIsAWinner() {
String c0 = gamePage_boardLabels[0].getText();
String c1 = gamePage_boardLabels[1].getText();
String c3 = gamePage_boardLabels[3].getText();
String c2 = gamePage_boardLabels[2].getText();
String c4 = gamePage_boardLabels[4].getText();
String c7 = gamePage_boardLabels[7].getText();
String c5 = gamePage_boardLabels[5].getText();
String c6 = gamePage_boardLabels[6].getText();
int secondPlayerScore = Integer.valueOf(gamePage_secondPlayerScore.getText());
String c8 = gamePage_boardLabels[8].getText();
int firstPlayerScore = Integer.valueOf(gamePage_firstPlayerScore.getText());
if (c0.equals(c1) && c0.equals(c2) && !c0.equals("")) {
gamePage_secondPlayerScore.setText((secondPlayerScore+1)+"");
if (c0.equals("X"))
gamePage_firstPlayerScore.setText((firstPlayerScore+1)+"");
else
}
gamePage_secondPlayerScore.setText((secondPlayerScore+1)+"");
if (c3.equals(c4) && c3.equals(c5) && !c3.equals("")) {
if (c3.equals("X"))
gamePage_firstPlayerScore.setText((firstPlayerScore+1)+"");
else
gamePage_secondPlayerScore.setText((secondPlayerScore+1)+"");
colorBackgroundWinnerLabels(gamePage_boardLabels[3], gamePage_boardLabels[4], gamePage_boardLabels[5]);
}
if (c6.equals(c7) && c6.equals(c8) && !c6.equals("")) {
if (c6.equals("X"))
gamePage_firstPlayerScore.setText((firstPlayerScore+1)+"");
else
if (c0.equals(c3) && c0.equals(c6) && !c0.equals("")) {
gamePage_secondPlayerScore.setText((secondPlayerScore+1)+"");
colorBackgroundWinnerLabels(gamePage_boardLabels[6], gamePage_boardLabels[7], gamePage_boardLabels[8]);
}
if (c0.equals("X"))
gamePage_firstPlayerScore.setText((firstPlayerScore+1)+"");
gamePage_firstPlayerScore.setText((firstPlayerScore+1)+"");
else
colorBackgroundWinnerLabels(gamePage_boardLabels[0], gamePage_boardLabels[3], gamePage_boardLabels[6]);
}
if (c1.equals(c4) && c1.equals(c7) && !c1.equals("")) {
if (c1.equals("X"))
gamePage_secondPlayerScore.setText((secondPlayerScore+1)+"");
gamePage_firstPlayerScore.setText((firstPlayerScore+1)+"");
else
if (c2.equals(c5) && c2.equals(c8) && !c2.equals("")) {
colorBackgroundWinnerLabels(gamePage_boardLabels[1], gamePage_boardLabels[4], gamePage_boardLabels[7]);
}
if (c2.equals("X"))
colorBackgroundWinnerLabels(gamePage_boardLabels[2], gamePage_boardLabels[5], gamePage_boardLabels[8]);
gamePage_firstPlayerScore.setText((firstPlayerScore+1)+"");
else
gamePage_secondPlayerScore.setText((secondPlayerScore+1)+"");
}
pressedLabel.setForeground(oForeground);
if (c0.equals(c4) && c0.equals(c8) && !c0.equals("")) {
if (c0.equals("X"))
else
gamePage_secondPlayerScore.setText((secondPlayerScore+1)+"");
colorBackgroundWinnerLabels(gamePage_boardLabels[0], gamePage_boardLabels[4], gamePage_boardLabels[8]);
}
if (c2.equals(c4) && c2.equals(c6) && !c2.equals("")) {
if (c2.equals("X"))
gamePage_secondPlayerScore.setText((secondPlayerScore+1)+"");
gamePage_firstPlayerScore.setText((firstPlayerScore+1)+"");
else
// نستخدم هذه الدالة لتحديد دور اللاعب الحالي في حال كان هناك شخصين يلعبان اللعبة
colorBackgroundWinnerLabels(gamePage_boardLabels[2], gamePage_boardLabels[4], gamePage_boardLabels[6]);
}
gamePage.repaint();
}
pressedLabel.setForeground(xForeground);
private boolean isTowPlayerGameEnds(JLabel pressedLabel) {
if (pressedLabel.getText().equals("")) {
pressedLabel.setText("X");
if (isFirstPlayerTurn == true) {
gamePage_boardLabels[randomNumber].setForeground(oForeground);
isFirstPlayerTurn = false;
} else {
isFirstPlayerTurn = true;
pressedLabel.setText("O");
}
checkIfThereIsAWinner();
gamePage.repaint();
if (XOCounter == 9 || isGameEnds == true) {
XOCounter++;
XOCounter = 0;
removeXOListener();
// نستخدم هذه الدالة لتحديد كيف سيلعب الكمبيوتر في حال كان شخص واحد يلعب اللعبة
}
}
return isGameEnds;
}
if (XOCounter < 9 && pressedLabel.getText().equals("")) {
private boolean isOnePlayerGameEnds(JLabel pressedLabel) {
XOCounter++;
pressedLabel.setText("X");
pressedLabel.setForeground(xForeground);
if (XOCounter < 9 && isGameEnds == false) {
repaint();
checkIfThereIsAWinner();
for (;;) {
if (gamePage_boardLabels[randomNumber].getText().equals("")) {
randomNumber = random.nextInt(9);
gamePage_boardLabels[randomNumber].setText("O");
// XOListener هنا قمنا بتحديد ما يحدث عندما يقوم المستخدم بالنقر على أزرار الفأرة في الكائن
gamePage.repaint();
XOCounter++;
checkIfThereIsAWinner();
break;
}
}
}
if (XOCounter >= 9 || isGameEnds == true) {
}
removeXOListener();
}
repaint();
return true;
// غير قابلين للنقر عند إيقاف اللعبة Label نستخدم هذه الدالة لجعل الـ
return false;
}
private void removeXOListener() {
gamePage_boardLabel.removeMouseListener(XOListener);
for (JLabel gamePage_boardLabel : gamePage_boardLabels) {
}
}
if (isFirstPlayerTurn == true) {
// سنستخدم هذه الدالة لتحديد رمز اللاعب الذي سيلعب الآن على حسب دوره
private void setCurrentPlayerIcon() {
gamePage_currentPlayerIcon.setText("O");
gamePage_currentPlayerIcon.setText("X");
gamePage_currentPlayerIcon.setForeground(xForeground);
}
else {
@Override
gamePage_currentPlayerIcon.setForeground(oForeground);
}
repaint();
}
public void mousePressed(MouseEvent e) {
MouseListener XOListener = new MouseListener() {
gamePage_boardLabels[6].setOpaque(false);
JLabel pressedLabel = (JLabel) e.getSource();
if (isGameEnds == false) {
isOnePlayerGameEnds(pressedLabel);
if (challengeComputer == true)
isTowPlayerGameEnds(pressedLabel);
else if (challengeComputer == false)
}
}
@Override
public void mouseReleased(MouseEvent e) { }
public void mouseClicked(MouseEvent e) { }
@Override
@Override
public void mouseEntered(MouseEvent e) { }
// XOListener نستخدم هذه الدالة عند بدء تحديد جديد لتصفير لوح اللعب و ربط الفأرة بالكائن
@Override
public void mouseExited(MouseEvent e) { }
};
private void startNewGame() {
gamePage_boardLabels[2].setOpaque(false);
isGameEnds = false;
XOCounter = 0;
setCurrentPlayerIcon();
gamePage_boardLabels[0].setOpaque(false);
gamePage_boardLabels[1].setOpaque(false);
gamePage_boardLabels[7].setOpaque(false);
gamePage_boardLabels[3].setOpaque(false);
gamePage_boardLabels[4].setOpaque(false);
// هذه الدالة تقوم ببناء كل شيء في اللعبة و تحدد ماذا سيحدث عندما يتفاعل المستخدم مع محتوى النافذة
gamePage_boardLabels[5].setOpaque(false);
gamePage_boardLabels[8].setOpaque(false);
gamePage_boardLabels[0].setText("");
gamePage_boardLabels[2].setText("");
gamePage_boardLabels[1].setText("");
gamePage_boardLabels[3].setText("");
gamePage_boardLabels[6].setText("");
gamePage_boardLabels[4].setText("");
gamePage_boardLabels[5].setText("");
gamePage_boardLabels[1].addMouseListener(XOListener);
gamePage_boardLabels[7].setText("");
gamePage_boardLabels[8].setText("");
gamePage_boardLabels[0].addMouseListener(XOListener);
repaint();
gamePage_boardLabels[4].addMouseListener(XOListener);
gamePage_boardLabels[2].addMouseListener(XOListener);
gamePage_boardLabels[3].addMouseListener(XOListener);
}
gamePage_boardLabels[5].addMouseListener(XOListener);
gamePage_boardLabels[6].addMouseListener(XOListener);
gamePage_boardLabels[8].addMouseListener(XOListener);
gamePage_boardLabels[7].addMouseListener(XOListener);
setNewFont(defaultFont);
// فقط createAndShowGUI() سيقوم الكونستركتور بإستدعاء الدالة Main عند إنشاء كائن من الكلاس
public Main() {
createAndShowGUI();
}
private void createAndShowGUI() {
// هنا قمن بإستدعاء الدوال التي ستخلق جميع الصفحات في البرنامج
createStartPage();
createSinglePlayerPage();
createGamePage();
createMultiPlayerPage();
createSettingsPage();
CardLayout card = new CardLayout();
// لجعل الصفحات موضوعة وراء بعضها البعض CardLayout هنا جعلنا النافذة تستخدم الـ
Container container = getContentPane();
add(multiPlayerPage);
container.setLayout(card);
// هنا أضفنا جميع الصفحات (الحاويات) في النافذة
add(startPage);
add(singlePlayerPage);
container.getLayout().addLayoutComponent("startPage", startPage);
add(settingsPage);
add(gamePage);
// هنا وضعنا إسم لكل صفحة (حاوية) لنصبح قادرين على تحديد الصفحة التي سيتم عرضها من خلال إسمها
container.getLayout().addLayoutComponent("settingsPage", settingsPage);
container.getLayout().addLayoutComponent("singlePlayerPage", singlePlayerPage);
container.getLayout().addLayoutComponent("multiPlayerPage", multiPlayerPage);
startPage_about.addActionListener(new ActionListener() {
container.getLayout().addLayoutComponent("gamePage", gamePage);
setThemeColors(defaultButtonTextColor, defaultButtonBackgroundColor);
// لجعلهم قابلين للنقر XOListener بالكائن Labels هنا ربطنا الـ 9
for (JLabel gamePage_boardLabel : gamePage_boardLabels) {
gamePage_boardLabel.addMouseListener(XOListener);
}
startPage_singlePlayer.addActionListener(new ActionListener() {
// تظهر كأول صفحة في النافذة startPage هنا جعلنا الحاوية
@Override
});
public void actionPerformed(ActionEvent e) {
card.show(container, "singlePlayerPage");
}
startPage_multiPlayer.addActionListener(new ActionListener() {
// ظاهرة multiPlayerPage يجعل الحاوية startPage_multiPlayer هنا جعلنا الزر
@Override
public void actionPerformed(ActionEvent e) {
public void actionPerformed(ActionEvent e) {
card.show(container, "multiPlayerPage");
}
});
// ظاهرة settingsPage يجعل الحاوية startPage_settings هنا جعلنا الزر
startPage_settings.addActionListener(new ActionListener() {
@Override
= "
card.show(container, "settingsPage");
}
});
// يعرض نافذة منبثقة فيها بعض المعلومات حول اللعبة startPage_about هنا جعلنا الزر
@Override
public void actionPerformed(ActionEvent e) {
String aboutGame
شاهد ايضا :
كود برنامج جافا يقوم بتحويل المللي ثانية إلى دقائق وثواني
كود برنامج بلغة جافا يقوم بعكس الجملة ( جافا بالعربي )
برنامج جافا لحساب الفرق بين فترتين زمنيتين
كود برنامج بلغة الجافا يقوم بعرض لعرض سلسلة فيبوناتشي
كود برنامج جافا لتحويل الرقم الثنائي الى عشري
برنامج بلغة الجافا يقوم بحساب متوسط درجات الطالب والنسبة المئوية
برنامج جافا لإيجاد مجموع الأرقام الطبيعية