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

مشروع لعبة الشطرنج

بدأه mr.beshoy في 7 أكتوبر 2009 · 22 رد · 5,955 مشاهدة · في JavaSE
مشاركة: واتساب X فيسبوك تيليجرام
#1 صاحب الموضوع

سلام يا حلوين

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

فاكرينى أنا مين ,ده أن حبيب الملايين

وحشتنى الكتابة فى هذا القسم (( اه ليا ذكريات معاه و مع ناسه )) أيام بقى

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

فى اواخر شهر 6 و شهر 7 الماضى كان ليَّ منقاشات حادة جداً

فى تصميم برنامج simple word

و لسة مخلصش طبعا

فى شهر 8 بدات فى موضوع الرسام و هنا حصلت مشكلة بسيطة لا أريد تذكرها

على إثرها لم يكتمل وجودى هنا و تغيب الشهر الثامن و التاسع

لكن ليَّ ذكريات طيبة جدا جدا

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

الجزئية المهة جداً فى الموضوع

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

أقدم خالص شكرى لكل من تعبوا مع

و أقدم لهم خالص اعتذارى إن كنت ضايقتهم

أولاً مستر علاء باشا خلال فترة اقامتى فى مشروع الword

كان له مساعدات يُشكر جداً عليها و ربنا يعوضه و مش ال word فى حاجات تانى حلوة بردو فقط

علاء راجل زى السكر ربنا يزيد حلاوته .......... بس وحياتك أهدى عليا المرة دى :D

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

ثانياً مستر عصام : كثيرا ما احتمل اسئلتى الغبية و كان يصحح لى مفاهيمى الخاطئة بجد راجل عسل بجد

و كان ليا معاه حوارات برمجية كثيرة فى الرسام هضع كل ذلك حتى تعم الإفادة

و بدأت معاه فى بداية بسيطة فى موضوع الشطرنج :D

ربنا يكرمه و يزيد يارب

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

ثالثاً : مش هقدر أنسى الأخ وجدى هو الى شجعنى انزل فكرة الشطرنج

و زاد من حنينى لقسمى الحبيب و أحبائى

و ليا معاه بردو محادثات علمية شيقة

ربنا يساعده و يزيده يارب

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

من الآخر الثلاثة مبرمجين تركوا بصمة فى عقلى و فى حياتى

عن جد مش بهزر و بتمنى ليهم كل بركة و خير

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

القسم الثانى

طبعاً أنا من النوع الى بحب اخاطر بعمرى فى التعامل مع البرمجيات

ففكرت فى فكرة عمل لعبة الشطرنج

حقيقى مشروع جبار و فكرة حلوة جدا جدا .

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

:D

و شكراً لتعبه

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

أولاً أتكلم ببساطة عن تحليل اللعبة

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

1- نريد رسم اللوحة ( 8*8) و تم عملها

3-نريد عمل الجورزم لكل قطعة

( pawn عسكرى -rockطبية -knight حصان -bishop الفيل - queen الوزير-king الملك)

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

أولاً: العسكرى

-----------

أولا فكر العسكرى

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

فى بداية اللعبة بيتحرك حركة او حركتين للأمام

و بعد كده لآخر اللعبة يتحرك حركة واحدة فقط للأمام

و لما بيأكل قطعة من الفرق الأخر بيمشى بالقطر و أيضاً حركة واحدة أى مربع واحد بالقطر

معلومة لإخذها فى الإعتبار أثناء البرمجة : العسكرى لا يرجع للوراء . لو تصادف امام العسكرى قطعة ما لا يستطيع الحركة -------------------------------------------------------------------------

فى الأول أعرض لكم الشفيرة المتعلقة برسم اللوحة و وضع القطع :

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

ال classالأول ---------------

import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.Dimension;
import javax.swing.BorderFactory;
import javax.swing.JFrame;
import javax.swing.JPanel;

public class BoardGame extends JFrame {

	private JPanel boardPanel;
	private DrawingBoard drawBoard;

	public BoardGame() {
		boardPanel = new JPanel();
		boardPanel.setLayout(null);
		boardPanel.setBackground(Color.BLUE);

		drawBoard = new DrawingBoard();
		drawBoard.setBounds(boardPanel.getWidth() / 2, boardPanel.getHeight() / 2, 1000, 1000);
		drawBoard.setBorder(BorderFactory.createLineBorder(Color.BLACK, 5));
		boardPanel.add(drawBoard, BorderLayout.CENTER);

		getContentPane().add(boardPanel);
	}

	public static void main(String[] args) {
		BoardGame boardGame = new BoardGame();
		boardGame.setDefaultCloseOperation(BoardGame.EXIT_ON_CLOSE);
		boardGame.setSize(new Dimension(600, 300));
		BoardGame.setDefaultLookAndFeelDecorated(true);
		boardGame.setVisible(true);
		boardGame.setExtendedState(MAXIMIZED_HORIZ | MAXIMIZED_VERT);
	}
}

ال class الثانى

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

 import java.awt.Color;
import java.awt.Graphics;
import java.awt.Graphics2D;
import javax.swing.ImageIcon;
import javax.swing.JPanel;

class DrawingBoard extends JPanel {

	private int x = 100, y = 60;
	private final int WIDTH_SQUARE = 100, HEIGHT_SQUARE = 60, ROW_SQUARES = 8, COL_SQUARES = 8;
	private Color firstColor, secondColor;
	private ImageIcon[] imagesBlue, imagesRed;
	private String[] imageBlueNames = {"blueRock.gif", "blueKnight.gif", "blueBishop.gif",
		"blueQueen.gif", "blueKing.gif",
		"blueBishop.gif", "blueKnight.gif", "blueRock.gif", "bluePawn.gif"};
	private String[] imageRedNames = {"redRock.gif", "redKnight.gif", "redBishop.gif",
		"redQueen.gif", "redKing.gif",
		"redBishop.gif", "redKnight.gif", "redRock.gif", "redPawn.gif"
	};

	public DrawingBoard() {
	}

	@Override
	protected void paintComponent(Graphics g) {
		super.paintComponent(g);
		Graphics2D g2d = (Graphics2D) g;
		drawBoard(g2d);
	}

	private void drawBoard(Graphics2D g2d) {
		drawRows(g2d);
		drawColumns(g2d);
		colorBord(g2d);
		drawPieces(g2d);
	}

	private void drawRows(Graphics2D g2d) {
		for (int i = 0; i < 8; ++i) {
			g2d.drawLine(x, (y * i) + HEIGHT_SQUARE, x + 800, (y * i) + HEIGHT_SQUARE);
		}
	}

	private void drawColumns(Graphics2D g2d) {
		for (int j = 0; j < 8; ++j) {
			g2d.drawLine((x * j) + WIDTH_SQUARE, y, (x * j) + WIDTH_SQUARE, y + 480);
		}
	}

	private void colorBord(Graphics2D g2d) {
		int yy = y;
		for (int i = 0; i < ROW_SQUARES; i++) {
			if (i % 2 != 0) {
				firstColor = Color.WHITE;
				secondColor = Color.BLACK;
			} else {
				firstColor = Color.BLACK;
				secondColor = Color.WHITE;
			}

			for (int j = 0; j < COL_SQUARES; ++j) {
				if (j % 2 != 0) {
					g2d.setColor(firstColor);
					g2d.fillRect((WIDTH_SQUARE * j) + 100, yy, WIDTH_SQUARE, HEIGHT_SQUARE);
				} else {
					g2d.setColor(secondColor);
					g2d.fillRect((WIDTH_SQUARE * j) + 100, yy, WIDTH_SQUARE, HEIGHT_SQUARE);
				}

				if (j == 7) {
					yy += HEIGHT_SQUARE;
				}
			}
		}
	}

	private void drawPieces(Graphics2D g2d) {
		int x1 = (ROW_SQUARES * WIDTH_SQUARE), y1 = (COL_SQUARES * HEIGHT_SQUARE);
		int x2 = (ROW_SQUARES * WIDTH_SQUARE), y2 = HEIGHT_SQUARE;
		imagesBlue = new ImageIcon[imageBlueNames.length];
		imagesRed = new ImageIcon[imageRedNames.length];
		for (int i = 0; i < imageBlueNames.length; ++i) {
			imagesBlue = new ImageIcon(getClass().getResource(imageBlueNames));
			if (imagesBlue != imagesBlue[8]) {
				g2d.drawImage(imagesBlue.getImage(), x1, y1, this);
			} else if (imagesBlue == imagesBlue[8]) {
				int xBluePawn = ROW_SQUARES * WIDTH_SQUARE;
				for (i = 0; i < 8; ++i) {
					g2d.drawImage(imagesBlue[8].getImage(), xBluePawn, y1 - HEIGHT_SQUARE, this);
					xBluePawn -= WIDTH_SQUARE;
				}
			}
			imagesRed = new ImageIcon(getClass().getResource(imageRedNames));
			if (imagesRed != imagesRed[8]) {
				g2d.drawImage(imagesRed.getImage(), x2, y2, this);
			} else if (imagesRed == imagesRed[8]) {
				int xRedPawn = ROW_SQUARES * WIDTH_SQUARE;
				int yRedPawn = HEIGHT_SQUARE;
				for (i = 0; i < 8; ++i) {
					g2d.drawImage(imagesRed[8].getImage(), xRedPawn, yRedPawn + HEIGHT_SQUARE, this);
					xRedPawn -= WIDTH_SQUARE;
				}
			}
			x1 -= WIDTH_SQUARE;
			x2 -= WIDTH_SQUARE;
		}
	}
}

هذه هى الخطوة الاولى

فى لعبتنا

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

ChessBoard.rar

2-نريد وضع قطع الفريقين على اللوحة

#2

سلام يا حلوين

-----------

المفروض تكونوا شفتم النتيجة الخاصة بالكود السابق

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

هنبدا نشنتعل على العسكرى

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

الفكرة المبدايئة ال عاوزين نعملها حينما نضع ال mouse

على اى عسكرى أزرق يتحرك خطوة واحدة للأمام

معنى ذلك أن قيمة Y الخاصة

بالعسكرى الأزرق هتقل بمقدار 60 (انظر الكود السابق و هتلاحظوا أن المسافة بين كل مربع و الآخر 60

و بعد ذلك نعمل repaint للعسكرى فى المربع الجديد

و نحذفه من المربع القديم

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

انا قبل كل ذلك

قولت فى بالى فى الاول أان عاوز لما أضغط بالماوس على أى مريع يطبع لى قيم

x و y

عملت 2 classes

زيادة على ال فاتوا

class pieces

class pawn

كلاس pieces خاص بكل القطع

عامل فيه switch

بقوله لو عسكرى نادم على

new pawn();

بحيث ينفذ هذا ال class

الclass pawn

الى بيقوم به حالياً - مش الوظيف الأساسية وهى حركة العسكرى - ان يطبع قيمة x,y

حينما أضغط بالماوس على اللوحة

لكن للأسف الشديد حاولت مراراً أنه يطبع لكن مش بتطبع

(( هبدأ أدخل فى المشاكسات استحملنى يا علاء أرجوك :D و طول بالك عليا

هنستفيد كلنا من القصة دى صدقنى ...

((

الشفيرة الجديدة

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

يبقى اطلعوا على الكلاس DrawingBoard

هتلاحظوا إضافة جديدة فى الconstructor

سطرين زيادة

مش أكتر بقوله لو ال القطعة بتعتك عسكرى ادخل فى mode العسكرى

الشفيرة كلها فى المرفقات

مش طبعتها عشان مش لسة داخلنا فى الخاصية الأساسية

معلش يا جدعان هنتعبكم معنا

سلام

و لنا لقاء

BoardGame1.rar

تم تعديل هذه المشاركة بواسطة mr.beshoy في 7 أكتوبر 2009 في 11:14

#3

سلام للجميع

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

بصراحة أنا عملت محاولات و مع ذلك فشلت كلها

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

الى توصلت له

فى ال class DrawingBoard

أضفت متغير

	private Pieces pawn;

و الconstructor

أصبح كالتالى :

	public DrawingBoard() {
		pawn = new Pieces();
		if (pawn.getChessPieces() == ChessPieces.PAWN) {
			pawn.setChessPieces(ChessPieces.PAWN);
		}
	}

عاوز أقول لو كان القطعة المختارة عسكرى

إذن من خلال الكلاس pieces يدخل ال switch و يدخل mode ال Pawn

لكن لم يعطى قيم ال x, y

و لكى اعرف اذا كان يدخل ال switch أم لا

قولت نطبع كلمة pawn

فلم يطبعها فاستنتجت أنه لم يدخل ال switch بالمرة

لا أدرى لماذا ذاك

عن جد أن تعبت من المشكلة هذه

شكراً

#4

بيشوي يا حبيبي ..

أقترح عليك انشاء مصفوفة [8][8] تمثل لوحة اللعب.

وبعد ذلك يتم تحريك العناصر على أساس ما تحتويه الخلية داخل المصفوفة .

انظر الصورة

مشاهدة الصور

52xonsuqa.jpg

فمثلا احتمالات انتقال الحصان هي 3 احتمالات , هي إلى الخلية [5.5] و [5.4] و [5.7] .وعلى هذا الأساس قم ببناء باقي خطوط و مسارات العناصر الأخرى.

بالتوفيق.

تم تعديل هذه المشاركة بواسطة MKSoft في 7 أكتوبر 2009 في 22:41

#5

سلام

أعتقد انة من الأفضل انك تفكر في المشروع بطريقة أكثر

Object Oriented

يعني ممكن تفكر بال

interfaces & classes

الي تحاكي اللعبة و العلاقة بينهم وراثة, بوليمورفيزم ..

مثلا

interface

يمثل قطعة شطرنج بشكل عام ممكن تسمية

Piece

ويحتوي على دوال مثل

boolean canMove()

boolean moveTo(int col, int row)

وكلاسات تمثل كل قطعة على حدة و ممكن ترث من بعضها البعض مثلا الوزير ممكن يرث من القلعة و الضابط عبر كلاس وسيط لان حركتة هي مجموع حركة القطعتين

وكلاس يمثل ال

Board

ممكن يحتوي على مصفوفة 8*8 من نوع

Piece

وكلاس يدير القطع و اللوحة ممكن تسمية

Chess

وتعمل كلاس عملة رسم كلاس ال

Board

والتعامل مع اللعبين

تم تعديل هذه المشاركة بواسطة javaRocks&Rolls في 7 أكتوبر 2009 في 23:27

#6

أغلب الى تقوله موجد !!!

يا شباب حرام عليكم انتم بتحكوا فى قصة و انا فى قصة تانى.

أنا لسة لم أتطرق لموضوع تحريك القطع

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

بجد انا فعلا تعبت

ياريت تتكرموا و تقولولى ايش الى مانع قيمة x , y تظهر لما بضغط بالماوس فى اى مكان على اللوحة

شكرا لكم

تم تعديل هذه المشاركة بواسطة mr.beshoy في 8 أكتوبر 2009 في 01:51

#7

فكرة الاخ MKSoft ممتازة , ياريت تجربها

تم تعديل هذه المشاركة بواسطة sameh mahmoud في 8 أكتوبر 2009 في 13:09

سبـــــحــــان الله و بحمده سبحان الله العظيم

403100468.gif

#8

ما المشكلة أن كلكم الى رديتم

مش عارفين انا عاوز ايه ؟!

أنا بقول (( فى الشفيرة التانية )) المشاركة التانية بتعتى

عاوز لما أضغط بالماوس على أى مكان يعطينى قيمة x,y

مش عاوز احرك اى قطعة مش عاوز اعمل اى حاجة على القطع دلوقتى

شكراً

تم تعديل هذه المشاركة بواسطة mr.beshoy في 8 أكتوبر 2009 في 13:37

#9
اقتباس
سلام يا حلوين

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

فاكرينى أنا مين ,ده أن حبيب الملايين

وحشتنى الكتابة فى هذا القسم (( اه ليا ذكريات معاه و مع ناسه )) أيام بقى

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

فى اواخر شهر 6 و شهر 7 الماضى كان ليَّ منقاشات حادة جداً

فى تصميم برنامج simple word

و لسة مخلصش طبعا

فى شهر 8 بدات فى موضوع الرسام و هنا حصلت مشكلة بسيطة لا أريد تذكرها

على إثرها لم يكتمل وجودى هنا و تغيب الشهر الثامن و التاسع

لكن ليَّ ذكريات طيبة جدا جدا

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

الجزئية المهة جداً فى الموضوع

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

أقدم خالص شكرى لكل من تعبوا مع

و أقدم لهم خالص اعتذارى إن كنت ضايقتهم

أولاً مستر علاء باشا خلال فترة اقامتى فى مشروع الword

كان له مساعدات يُشكر جداً عليها و ربنا يعوضه و مش ال word فى حاجات تانى حلوة بردو فقط

علاء راجل زى السكر ربنا يزيد حلاوته .......... بس وحياتك أهدى عليا المرة دى biggrin.gif

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

ثانياً مستر عصام : كثيرا ما احتمل اسئلتى الغبية و كان يصحح لى مفاهيمى الخاطئة بجد راجل عسل بجد

و كان ليا معاه حوارات برمجية كثيرة فى الرسام هضع كل ذلك حتى تعم الإفادة

و بدأت معاه فى بداية بسيطة فى موضوع الشطرنج biggrin.gif

ربنا يكرمه و يزيد يارب

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

ثالثاً : مش هقدر أنسى الأخ وجدى هو الى شجعنى انزل فكرة الشطرنج

و زاد من حنينى لقسمى الحبيب و أحبائى

و ليا معاه بردو محادثات علمية شيقة

ربنا يساعده و يزيده يارب

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

من الآخر الثلاثة مبرمجين تركوا بصمة فى عقلى و فى حياتى

عن جد مش بهزر و بتمنى ليهم كل بركة و خير

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

يا أخ بيشوي, أولا فينك يا عم من زمان, ليك وحشه,

ثانيا, ليك كل المقدمات اللي فوق دي, حاول يا أخي تختصر عشان متضيعش وقتك و وقت غيرك في قرايتها

شكرا

#10

بعتذر لو ضايقتك يا مستر هويدى :lol:

بس بما انى جيت بعد فترة طويلة

بقدم شكر بسيط و قبل ما أدخل فى السخن على طول عملنا خمسة فرفشة :lol:

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

و لو تعرف لحل لمشكلتى قول

انا اتجننت منها بصراحة

شكرا

#11

يا عم ولا يهمك, إحنا إخوات يا بيشوي, بس ياريت متندهليش ب مستر دي, أنا إسمي هويدي

اقتباس
مستر هويدى
#12

يا بويا وحياتك كلمنى فى المشكلة :lol:

انا عمال اعمل debug من الصبح و احول اظبط

و مش عارف

اتكلم فى المشكلة يا با انا بموت بجد

تم تعديل هذه المشاركة بواسطة mr.beshoy في 8 أكتوبر 2009 في 18:32

#13
اقتباس
يا بويا وحياتك كلمنى فى المشكلة laugh.gif

اتكلم فى المشكلة يا با انا بموت بجد

يا هداك الله أنا لست بأبيك, أنا زيي زيك,,

كن واثق أني لو عندي حل ليك هقولهولك على طول,,

#14

ماشى ياعم هويدى

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

شوفوا يا جدعان انا عمال احول من بدرى فى قصة عبيطة جدا مدوا ايديكم و ساعدونى بقى

اولا انا هنا مش بحاول احرك اى قطعة

انا كل الى عاوز اعمله (( هتلاقوا كلاس اسمه Pieces)) بداخله switch

عاوزه ينفذ ما بداخل كل case

اول case

يطبعلى قيمة x ,y حينما اضغط بالماوس على الللوحة فى اى مكان

و يطبع كلمة pawn

و تانى case

عاوزه يطبع كلمة rock

بجد انا حاولت و عدلت بمساعدة الأخ ال debug لكن دون فائدة

انسوا الى فات و ادى الشفيرة كاملة

شكرا

BoardGame1.rar

#15

السلام عليكم

أخ بيشوي الواجهه اللي تتعامل معاها هي ال

DrawingBoard

ما فيهاش اي

mouse listener

و الكلاس

Pawn

لم تستخدمة في الواجهه

وبتالي من الطبيعي انه مايكنش في اي تفاعل

كما أن الكود يحتوي على أخطاء منطقي أخرى

ولكن أكرر النصيحة االافضل ان تكون الكلاسات التي تمثل محرك اللعبة منفصلة عن الرسم

وتكون طريقه التفكير أكثر

object oriented

هذا بيخلي البرنامج سهل القراءة و الصيانة والتعديل

إن شاء الله في اقرب وقت ممكن أطرح بداية بسيطه تشوفها وإذا حبيت تكمل عليها

سلام

#16

يا بيشوي الأمر أكثر بساطة مما تتصور .

قم بعمل MouseListener

بحيث عند الضغط click على الماوس يظهر المكان باستخدام الدالتين getX , getY الناتجتان من event الخاص بعملية الضغط.

	public void mouseClicked(MouseEvent e) {
	System.out.println("[x,y] := ["+e.getX()+","+e.getY()+"]");
	}

هذا كود بسيطة يوضح العملية.

#17

يا شباب أنا سوالى واضح :

ليه مش بيدخل فى ال case الخاصة بال pawn

ويطبع كلمة pawn

و ليه مش بيدخل فى ال case الخاصة بال rock

و يطبع ال كلمة ال rock

المشكلة دلوقتى فى ال switch

يا جماعة ناا ليا يومين كاملين بالظبط كده

ساعدونى بصراحة

انا تعبت

شكرا لكل الى بيتفاعل

استحملونى

سلام

تم تعديل هذه المشاركة بواسطة mr.beshoy في 9 أكتوبر 2009 في 02:52

#18

السلام عليكم

اذا كنت تريد ان تستفيد من شئ جديد .. بمعنى انه ليس مطلوب منك حل واجب او عمل مشروع بالشطرنج

فاقترح حل اللعبه بخوارزميات الذكاء الاصطناعي ..

ولعلك تبدا بلعبه بسيطه في الاول

#19

mr.beshoy كتب:
يا شباب أنا سوالى واضح

ال switch داخل if وهذه ال if بتكوم دائما false

لان الكائنات في المتغيرات العامة تاخذ قية null by default

وبتالي التنفيذ مايوصلش لل switch

وأنت طارح هذا الكود داخل الconstructor تبع الكلاس يعني مالوش علاقة بالتفاعل مع الmouse

#20

اخ عيسى لا أريد الدخول فى مجال عمل العاب بالذكاء الإصطناعى الآن .....

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

اخ javaRock&Rolls

ممكن توضح اجابت ك بالكود لانى مشتت فى طريقة عملها (( وشكرا لك))

شكرا للجميع

#21

خلاص يا جماعة عرفت ادخل بداخل ال switch

معرفش استعمل ال set & get كويس هنا

فلجأت لطريقة أخرى

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

بس كنت أتمنى أرى برمجة أفكار الإخوة الأفاضل من ناحية برمجة هذه الجزئية و يكون فى تبادل أفكار

لخدمة الجميع ....لكن عادى مفيش مشاكل

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

دلوقتى هبدا فى تحريك العسكرى

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

الكود مرفق

شكراً

BoardGame1.rar

#22

أستاذي الأخ عيسي موجود بيننا, مرحبا بك و أهلا وسلا, المنتدي منور بوجودك

#23

لا يا حبيبى مش هنفتح شات و سلامات هنا

:lol:

كل واحد يدخل أفكره كتب شئ يفدينا فى الى بتكلم فيه

الاقى العكس

يلا زى بعضه

بس السلامات مش هنا

شكرا

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