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

Little Bomber Man Game (problem )

بدأه mr.beshoy في 17 أكتوبر 2008 · 31 رد · 2,668 مشاهدة · في JavaSE
مشاركة: واتساب X فيسبوك تيليجرام
#1 صاحب الموضوع

سلام يا شباب

انا الترم ده شغال فى لعبة pomber man

و الى مش عارف اللعبة ادى لينك ممكن يحملها مساحتها صغيرة

http://www.astatix.com/little-bombers.php

المهم بعد ما تتفرجوا عليها هتفهموا سوالى

انا اول حاجة بعملها فى اللعبة انى ارسم الحواجز الى مش ببتفجر

فانا هنا فى الكود رسمت اول 8 مربعات و لازم بين اللمربع و الاخر يكون فى مساحة

لكن هما بيظروا لازقين فى بعض

انا فى الاول عملت متغير square_x=70

& square_y=100

&square_size=80

المهم

لما حبيت ارسم اول صف من المربعات

طبقت المعادلة دى

 for (int i = 1; i <= 8; ++i) {
			int square_size = 80;
			g.setColor(Color.BLUE);
			g.fillRect(square_x, square_y, (square_size+(square_x+square_size))*i , square_size);
			//square_size++;
		}

فى الfor loop:

فى دالة fillrect()

أول متغير قاصد بيه يترك مسافة 70 فى اتجاه x

و تانى متغير قاصد بيه يترك مسافة 100 فى اتجاه y

و ثالث متغير قاصد بيه لما يجى يعنى يرسم المربع التانى يروح يضيف على الsquare_size قيمة (square_x+square_size(السابق) )

و يضرب فى i عشان تشتغل اللوب

هل غلط تفسيرى ولو غلط ايه الصح

و ادى الكود بالكامل

import java.awt.Color;
import java.awt.Dimension;
import java.awt.Graphics;
import javax.swing.JFrame;
import javax.swing.JPanel;

public class Divider extends JFrame {

	private JPanel divider_panel;
	private int square_x = 70,  square_y = 100;

	public Divider() {
		divider_panel = new JPanel();
		divider_panel.setBackground(Color.GREEN);
		getContentPane().add(divider_panel);
	}

	@Override
	public void paint(Graphics g) {
		super.paint(g);
		for (int i = 1; i <= 8; ++i) {
			int square_size = 80;
			g.setColor(Color.BLUE);
			g.fillRect(square_x, square_y, (square_size+(square_x+square_size))*i , square_size);
			//square_size++;
		}
	}

	public static void main(String[] args) {
		JFrame frame = new Divider();
		frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
		frame.setLocationRelativeTo(null);
		frame.setTitle("Bombar man game");
		frame.setVisible(true);
		frame.setSize(new Dimension(200, 100));
	}
}

منتظر ردكم

و شكرا

بيشوى عاطف

#2

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

#3

سلام

ايش رايك لو ترتب البرنامج بشكل افضل.

مثلا لو تمثل البورد الي تتم فية اللعبة با مصفوفة ثنائية 14 * 14 مثلا و تمثل كل جزء من اللعبة برقم معين مثلا 1 لللاعب و 0 لل فراغ و 3 للجدار الي ما ينفجر و 2 للجدار الي ينفجر و -1 للحائط و 4 للمخرج واي شي تحب تضيفة اعطية رقم معين مثل الوحوش اواي شي.

و هذا الكود ممكن يعطيك فكرة


import java.awt.Dimension;
import java.awt.Graphics;
import javax.swing.JFrame;
import javax.swing.JPanel;

public class Divider extends JFrame {

private JPanel divider_panel;
private int square_x = 70, square_y = 100;

private int board [][] =
{{-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1},
{-1,1,0,2,0,0,0,0,0,0,0,0,-1},
{-1,0,0,2,0,0,0,0,0,0,0,0,-1},
{-1,2,2,2,0,0,0,0,0,0,0,0,-1},
{-1,0,0,0,0,2,0,0,0,0,0,0,-1},
{-1,0,0,0,0,3,0,0,0,0,0,0,-1},
{-1,0,0,0,0,2,0,0,0,0,0,0,-1},
{-1,0,0,0,0,0,0,0,0,0,0,0,-1},
{-1,0,0,0,0,0,0,0,0,0,0,0,-1},
{-1,0,0,0,0,0,0,0,0,0,0,0,-1},
{-1,0,0,0,0,0,0,0,4,0,0,0,-1},
{-1,0,0,0,0,0,0,0,0,0,0,0,-1},
{-1,0,0,0,0,0,0,0,0,0,0,0,-1},
{-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1},
};

public Divider() {
divider_panel = new JPanel();
divider_panel.setBackground(Color.white);
getContentPane().add(divider_panel);
}


public void update(Graphics g)
{
paint(g);
}

@Override
public void paint(Graphics g) {
super.paint(g);



for ( int i = 0; i < board.length; i++){

for ( int j = 0; j < board.length; j++){



switch( board[j]){
case -1:
g.setColor(Color.black);
break;

case 0:
g.setColor(Color.white);
break;

case 1:
g.setColor(Color.yellow);
break;

case 2:
g.setColor(Color.orange);
break;

case 3:
g.setColor(Color.gray);
break;

case 4:
g.setColor(Color.red);
break;
}

g.fillRect(40 * i , 40 * j, 39 , 39);

}
}

}

public static void main(String[] args) {
JFrame frame = new Divider();
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.setLocationRelativeTo(null);
frame.setTitle("Bombar man game");
frame.setBounds(0 , 0 , 600, 600);
frame.setVisible(true);

}
}
	 import java.awt.Color;

بتحتاج بعدين انك تعمل ال KeyListener عشان يتحكم بالاعب و تحسن الواجهه وترسم صور بدل الالوان وشوية threading

#4

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

تفهمنى يعنى ايه الجزء ده

  {{-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1},
				 {-1,1,0,2,0,0,0,0,0,0,0,0,-1},
				 {-1,0,0,2,0,0,0,0,0,0,0,0,-1},
				 {-1,2,2,2,0,0,0,0,0,0,0,0,-1},
				 {-1,0,0,0,0,2,0,0,0,0,0,0,-1},
				 {-1,0,0,0,0,3,0,0,0,0,0,0,-1},
				 {-1,0,0,0,0,2,0,0,0,0,0,0,-1},
				 {-1,0,0,0,0,0,0,0,0,0,0,0,-1},
				 {-1,0,0,0,0,0,0,0,0,0,0,0,-1},
				 {-1,0,0,0,0,0,0,0,0,0,0,0,-1},
				 {-1,0,0,0,0,0,0,0,4,0,0,0,-1},
				 {-1,0,0,0,0,0,0,0,0,0,0,0,-1},
				 {-1,0,0,0,0,0,0,0,0,0,0,0,-1},
				 {-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1},
				 };
#5

أخ بيشوي هذه مصفوفة ثنائية الأبعاد

كل صف موجود بين {} ويفصل بين الصف والآخر الفاصلة comma

والأخ java يقصد أنها تمثل لوحة المربعات

لو سمحت ممكن شرح بسيط للعبة

لأني لست رائق المزاج لأطلع عليها

اعذرني فأنا أعاني حالة كآبة هذه الأيام

تحياتي

حزمة المحرك الإصدارة 0.8

أي أحد يجد أني ظلمته فليراسلني

وبإذن الله لو كان له حق سيأخذه

728x90.png

#6

فهمت فهمت مكنتش مركز فيها فى الاول سورى

وشكرا اخ java

و شكرا مستر علاء ربنا يعوضكم كل خير

بيشوى عاطف

#7

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

و لكى احاول انا ارسم 8 صفوف

كتبت حتة الكود دى :

   if (bord[j] == bord)[15] {
					bord[j] = 0;
					y += 2 * square_size;
				}

و اقصد بها انك عندماتصل إلى اخر الصف

ابدا من صف جديد من خلال السطر ده bord[j] = 0;

مع زيادة قيمة x

و مع ذللك لم يؤثر

ياريت تشوفوا الجزئية دى و تساعدونى فيها

و لل مش يعرف اللعبة ادى لينك اللعبة

http://www.astatix.com/little-bombers.php

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

import java.awt.Color;
import java.awt.Graphics;
import javax.swing.JFrame;
import javax.swing.JPanel;

public class Divider extends JFrame {

	private JPanel divider_panel;
	private int x = 70,  y = 70,  square_size = 50;
	private int bord[][] = {{1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1},
		{1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1},
		{1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1},
		{1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1},
		{1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, },
	 {1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1},
		{1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1},
		{1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1}};

	public Divider() {
		divider_panel = new JPanel();
		divider_panel.setBackground(Color.ORANGE);
		getContentPane().add(divider_panel);
	}

	@Override
	public void update(Graphics g) {
		paint(g);
	}

	@Override
	public void paint(Graphics g) {
		super.paint(g);

		for (int i = 0; i < bord.length; ++i) {

			for (int j = 0; j < bord.length; ++j) {
				switch (bord[j]) {
					case 1:
						g.setColor(Color.BLUE);
						break;
					case 0:
						g.setColor(Color.ORANGE);
						break;
				}
				g.fillRect(x + (x * j), y, square_size, square_size);
				if (bord[j] == 15) {
					bord[j] = 0;
					y += 2 * square_size;
				}


			}
		}
	}

	public static void main(String[] args) {
		JFrame frame = new Divider();
		frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
		frame.setLocationRelativeTo(null);
		frame.setTitle("Bombar man game");
		frame.setBounds(0, 0, 600, 600);
		frame.setVisible(true);

	}
}

منتظر ردكم

بيشوى عاطف

#8

احذف هذا المقطع من الشيفرة

				if (bord[j] == 15) {
					bord[j] = 0;
					y += 2 * square_size;
				}

وأضف الجملة

	  y += 2 * square_size;

بعد انتهاء التكرار الخاص بالمتغير j

تحياتي

حزمة المحرك الإصدارة 0.8

أي أحد يجد أني ظلمته فليراسلني

وبإذن الله لو كان له حق سيأخذه

728x90.png

#9

ضفتها بعد انتهاء لفة ال j

لم تفعل اى شئ

 for (int i = 0; i < bord.length; ++i) {

			for (int j = 0; j < bord.length; ++j) {
				switch (bord[j]) {
					case 1:
						g.setColor(Color.BLUE);
						break;
					case 0:
						g.setColor(Color.ORANGE);
						break;
				}
				y += 2 * square_size;
				g.fillRect(x + (x * j), y, square_size, square_size);
//				if (bord[j] == 15) {
//					bord[j] = 0;
//					y += 2 * square_size;
//				}


			}
		}
#10

أخ بيشوي

هكذا أنتا أضفتها بعد switch وليس بعد for

تحياتي

حزمة المحرك الإصدارة 0.8

أي أحد يجد أني ظلمته فليراسلني

وبإذن الله لو كان له حق سيأخذه

728x90.png

#11

سلام للجميع

و ايضا إضافتها بعد الfor لا تعمل اى شئ

  @Override
	public void paint(Graphics g) {
		super.paint(g);
		for (int i = 0; i < bord.length; ++i) {
			for (int j = 0; j < bord.length; ++j) {
				y += 2 * square_size;
				switch (bord[j]) {
					case 1:
						g.setColor(Color.BLUE);
						break;
					case 0:
						g.setColor(Color.ORANGE);
						break;
				}
				g.fillRect(x + (x * j), y, square_size, square_size);
			}
		}
	}

منتظر ردك

#12

السلام عليكم

يا بني بعد مش قبل

زي كده

	@Override
	public void paint(Graphics g) {
		super.paint(g);

		for (int i = 0; i < bord.length; ++i) {

			for (int j = 0; j < bord.length; ++j) {
				switch (bord[j]) {
					case 1:
						g.setColor(Color.BLUE);
						break;
					case 0:
						g.setColor(Color.ORANGE);
						break;
				}
				g.fillRect(x + (x * j), y, square_size, square_size);
			}
			y += 2 * square_size;
		}
	}

تحياتي

حزمة المحرك الإصدارة 0.8

أي أحد يجد أني ظلمته فليراسلني

وبإذن الله لو كان له حق سيأخذه

728x90.png

#13

تمام يا اخ علاء فهمتك

أعذرنى على ضيق فهمى

بس هناك مشكلة و هى انى عندما أكبر الشاشة تختفى كل الrectangles

لماذا

؟؟؟ و كيف يتم تظبيطها

#14

السلام عليكم

المشكلة أخ بيشوي أنك تستخدم المتغير y

وتضيف عليه

وهو متغير يحتفظ بقيمته بعد إنتهاء تنفيذ الدالة

عملية الرسم صحيحة ولا مشاكل فيها

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

ستجد أن قيمة y أصبحت غير القيمة التي بدأت فيها

وبالتالي عند الرسم المرة القادمة

سيتم الرسم لكنك لن تراه

لهذا لديك حلين

الحل الأول أن تقوم بإعادة قيمة y إلى قيمتها الأصلية قبل تنفيذ الدالة paint

الحل الثاني أن تتستخدم متغير لحظي temp بدلاً من y

تحياتي

حزمة المحرك الإصدارة 0.8

أي أحد يجد أني ظلمته فليراسلني

وبإذن الله لو كان له حق سيأخذه

728x90.png

#15

تقصد هكذا :

  for (int i = 0; i < bord.length; ++i) {
			for (int j = 0; j < bord.length; ++j) {
				switch (bord[j]) {
					case 1:
						g.setColor(Color.BLUE);
						break;
					case 0:
						g.setColor(Color.ORANGE);
						break;
				}
				g.fillRect(x + (x * j), y, square_size, square_size);
				if (y == y + (2 * square_size)) {
					y = 70;
				}
			}
			y += 2 * square_size;
		}

أنا هنا قولت لو كانت y = آخر قيمة ( اقصد القيمة التى تتغير ) روح رجعها لأول قيمة

بس مش مظبوطة بردو

اقتباس
ستجد أن قيمة y أصبحت غير القيمة التي بدأت فيها

وبالتالي عند الرسم المرة القادمة

سيتم الرسم لكنك لن تراه

سوال غلس لو سمحت أيه المشكلة لما تكون قيمة y بتتغير ( ده طبيعى جدا ) و لا يعتبر سبب لإخفاء الrect

وضح معلش

واستحمل غباوتى ( المهم نتعلم من اخطائنا و لو حتى هنطول شوية لكن مش مشكلة )

شكرا

#16

أقصد هكذا

y = 70;
 for (int i = 0; i < bord.length; ++i) {
			for (int j = 0; j < bord.length; ++j) {
				switch (bord[j]) {
					case 1:
						g.setColor(Color.BLUE);
						break;
					case 0:
						g.setColor(Color.ORANGE);
						break;
				}
				g.fillRect(x + (x * j), y, square_size, square_size);
			}
			y += 2 * square_size;
		}

قيمة Y عندما تخرج من الدالة لا ترجع إلى قيمتها الأصلية وهي 70

وإنما ستكون أكبر من ذلك بكثير

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

أخيراً لي عتب عليك

لا تقول عن نفسك غبي أياً كانت الظروف

كل ما في الموضوع أنك مبتدئ

وستصبح محترف بإذن الله

تحياتي

حزمة المحرك الإصدارة 0.8

أي أحد يجد أني ظلمته فليراسلني

وبإذن الله لو كان له حق سيأخذه

728x90.png

#17

وضحت

بس بردو حضرتك مش اجبت على السوال انى لما بكبر الشاشة كل المربعات بتتمسح لماذا ؟؟؟

و كيف أتغلب عليها

#18

عند تكبير الشاشة

سيتم استدعاء الدالة paint

وبالتالي سيحدث ما قد ذكرته آنفاً

تحياتي

حزمة المحرك الإصدارة 0.8

أي أحد يجد أني ظلمته فليراسلني

وبإذن الله لو كان له حق سيأخذه

728x90.png

#19

طب منا عارف كده

لكن ايه الحل للمشكلة دى ؟؟

#20
y = 70;

قبل التكرار الأول

تحياتي

حزمة المحرك الإصدارة 0.8

أي أحد يجد أني ظلمته فليراسلني

وبإذن الله لو كان له حق سيأخذه

728x90.png

#21

اوكى ...

بس هناك مشكلة أخرى موجهانى :

أن قررت بدل ما برسم على panel ارسم على bufferedImage

و بدل ما يكون شكل الحاجز عبارة عن rect حبيت اجعله يكون الصورة الحقيقة الى فى اللعبة

و ها هو لينك تحميل الصورة http://www.0zz0.com]%7Boption%7Dhttp://www6.0zz0.com/2008/10/23/02/138841891.gif

و ها هو الكود المعدل

	public Divider() {
		image=new BufferedImage(1000, 1000, BufferedImage.TYPE_INT_RGB);
		g=image.getGraphics();
		g.fillRect(0,0, image.getWidth(),image.getHeight());
		g.setColor(Color.BLUE);
//		divider_panel = new JPanel();
//		divider_panel.setBackground(Color.ORANGE);
//		getContentPane().add(divider_panel);
	}

	@Override
	public void update(Graphics g) {
		paint(g);
	}

	@Override
	public void paint(Graphics g) {
		super.paint(g);
		g.drawImage(image, 0,0, null);
		y = 90;
		for (int i = 0; i < bord.length; ++i) {

			for (int j = 0; j < bord.length; ++j) {
				switch (bord[j]) {
					case 1:
						g.drawImage(new ImageIcon("divider1.gif").getImage(), x + (x * j), y, null);
						break;
					case 0:
						g.setColor(Color.ORANGE);
						break;
				}
			  //  g.fillRect(x + (x * j), y, square_size, square_size);


			}
			y += 2 * square_size;
		}
	}

و مع ذلك تظهر الشاشة فارغة و لا يوجد بها الصفوف و الأعمدة على شكل القالب الحاجز الموضح فى اللينك

لماذا

؟؟؟

#22
public Divider() {
		image=new BufferedImage(1000, 1000, BufferedImage.TYPE_INT_RGB);
		g=image.getGraphics();
		g.fillRect(0,0, image.getWidth(),image.getHeight());
		g.setColor(Color.BLUE);
//		divider_panel = new JPanel();
//		divider_panel.setBackground(Color.ORANGE);
//		getContentPane().add(divider_panel);
	}

	@Override
	public void update(Graphics g) {
		paint(g);
	}

	@Override
	public void paint(Graphics g) {
		super.paint(g);
		g.drawImage(image, 0,0, null);
		y = 90;
		for (int i = 0; i < bord.length; ++i) {

			for (int j = 0; j < bord.length; ++j) {
				switch (bord[j]) {
					case 1:
						g.drawImage(new ImageIcon("divider1.gif").getImage(), x + (x * j), y, null);
						break;
					case 0:
						g.setColor(Color.ORANGE);
g.fillRect(x + (x * j), y, square_size, square_size);
						break;
				}
			  //  g.fillRect(x + (x * j), y, square_size, square_size);


			}
			y += 2 * square_size;
		}
	}

هل يظهر أي خطأ في الصورة؟؟

تحياتي

حزمة المحرك الإصدارة 0.8

أي أحد يجد أني ظلمته فليراسلني

وبإذن الله لو كان له حق سيأخذه

728x90.png

#23

أولا حضرتك مردتش على سوالى

ثانيا مش فاهم ماذ تقصد ب ( هل يقصد أى خطا فى الصورة)

و لو حضرتم مش فاهم مشكلتى قول و اوضحلك قصدى

شكرا

بيشوى عاطف

#24

هل تحصل على أي خطأ عند الرسم؟

هل الصورة موجودة في نفس المكان الموجود فيه الكلاس؟

بصراحة شرحك للموضوع سيء جداً

تحياتي

حزمة المحرك الإصدارة 0.8

أي أحد يجد أني ظلمته فليراسلني

وبإذن الله لو كان له حق سيأخذه

728x90.png

#25

اه الصورة موجود فى نس المكان الى فيه الكلاس

و لما بعمل run للبرنامج مش بيدينى اى خطا

ورغم انى قايل له انه يرسم بلون

g.setColor(Color.BLUE);

الى بيظهرلى بيبقى لون ابيض

و حكاية شرحلى للموضوع سئ للغاية

انا واضح فى اول الموضوع لينك اللعبة فممكن تشوفه و هتفهمها

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

المهم خلينا فى مشكلتنا ايه الحل من وجهة نظرك

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