فى محاولة منى لتصميم لعبة كونيكت فور ( و هى ان تكون اربع دوائر سواء افقى أو رأسى أو بالقطر) و لكن هناك مشكلة واجهتنى فى هذا الكود
و حاولت أن احلها و لكن ما عرفت طريقة الحل
فأرجو من الأخوة الأفاضل تجريب الكود سوف يرون الخطأ واضحاً
( أنا مستخدم النتبينز فجربوه على النت بينز )
كود
package Game;
import java.awt.Color;
import java.awt.Dimension;
import java.awt.FlowLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import javax.swing.BorderFactory;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.JTextField;
public class Game extends JFrame {
private JPanel mainPlayer_panel;
private JPanel playerone_panel;
public static JButton play_one;
private JPanel scoreone_panel;
private JLabel score_one;
private static JTextField field_one;
private JPanel playertwo_panel;
public static JButton play_two;
private JPanel scoretwo_panel;
private JLabel score_two;
private static JTextField field_two;
public Game() {
mainPlayer_panel = new JPanel();
mainPlayer_panel.setPreferredSize(new Dimension(200, 200));
mainPlayer_panel.setBorder(BorderFactory.createTitledBorder("player"));
mainPlayer_panel.setBackground(Color.pink);
mainPlayer_panel.setBounds(900, 100, 300, 500);
playerone_panel = new JPanel();
playerone_panel.setPreferredSize(new Dimension(200, 200));
playerone_panel.setBorder(BorderFactory.createTitledBorder("player one"));
play_one = new JButton("playe");
play_one.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
CreateImage.play_oneActionListener();
repaint();
}
});
scoreone_panel = new JPanel(new FlowLayout());
score_one = new JLabel("score");
field_one = new JTextField(10);
scoreone_panel.add(score_one);
scoreone_panel.add(field_one);
playerone_panel.add(play_one);
playerone_panel.add(scoreone_panel);
playertwo_panel = new JPanel();
playertwo_panel.setPreferredSize(new Dimension(200, 200));
playertwo_panel.setBorder(BorderFactory.createTitledBorder("player one"));
play_two = new JButton("playe");
play_two.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
CreateImage.play_twoActionListener();
repaint();
}
});
scoretwo_panel = new JPanel(new FlowLayout());
score_two = new JLabel("score");
field_two = new JTextField(10);
scoretwo_panel.add(score_two);
scoretwo_panel.add(field_two);
playertwo_panel.add(play_two);
playertwo_panel.add(scoretwo_panel);
mainPlayer_panel.add(playerone_panel);
mainPlayer_panel.add(playertwo_panel);
getContentPane().add(mainPlayer_panel);
getContentPane().add(new CreateImage());
}
public static void main(String[] args) {
JFrame frame = new Game();
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.pack();
frame.setLocationRelativeTo(null);
frame.setSize(1000, 800);
frame.setLocationRelativeTo(null);
frame.setVisible(true);
}
}
package Game;
كود
import java.awt.BasicStroke;
import java.awt.Color;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
import java.awt.geom.Line2D;
import java.awt.image.BufferedImage;
import javax.swing.ImageIcon;
import javax.swing.JLabel;
import javax.swing.JPanel;
public class CreateImage extends JPanel {
private BufferedImage image;
private Graphics g;
private ImageIcon icon;
private JLabel image_label;
public static int squaresize = 80, line_x = 40, line_y = 120;
public static int oval1_x = line_x + (3 * squaresize), oval1_y = 120;
public static int oval2_x = line_x + (3 * squaresize), oval2_y = 120;
public static boolean ball1, ball2;
public CreateImage() {
image = new BufferedImage(700, 1000, BufferedImage.TYPE_INT_RGB);
g = image.getGraphics();
g.setColor(Color.white);
g.fillRect(0, 0, image.getWidth(), image.getHeight());
MymouseAdabter mouse = new MymouseAdabter();
addMouseListener(mouse);
addMouseMotionListener(mouse);
}
@Override
public void paintComponent(Graphics g) {
super.paintComponent(g);
Graphics2D g2 = (Graphics2D) g;
g.drawImage(image, 0, 0, null);
line_x = 40;
line_y = 120;
for (int row = 1; row <= 7; ++row) {
BasicStroke line = new BasicStroke(5);
g2.setStroke(line);
g2.setColor(Color.BLUE);
g2.draw(new Line2D.Double(line_x, line_y, line_x + (7 * squaresize), line_y));
line_y += squaresize;
}
line_x = 40;
line_y = 120;
for (int col = 0; col <= 7; col++) {
BasicStroke line = new BasicStroke(5);
g2.setStroke(line);
g2.setColor(Color.BLUE);
g2.draw(new Line2D.Double(line_x, line_y, line_x, line_y + (6 * squaresize)));
line_x += squaresize;
}
if (ball1) {
g.setColor(Color.BLACK);
g.fillOval(oval1_x, oval1_y - squaresize, squaresize, squaresize);
}
if (ball2) {
g.setColor(Color.BLUE);
g.fillOval(oval1_x, oval1_y - squaresize, squaresize, squaresize);
}
}
public static void play_oneActionListener() {
ball1 = true;
ball2 = false;
}
public static void play_twoActionListener() {
ball2 = true;
ball1 = false;
}
private class MymouseAdabter extends MouseAdapter {
@Override
public void mouseMoved(MouseEvent e) {
if (ball1) {
oval1_x = e.getX();
if (e.getX() > line_x + (7 * squaresize)) {
oval1_x = line_x + (7 * squaresize);
} else if (e.getX() >= line_x + (5 * squaresize)) {
oval1_x = line_x + (5 * squaresize);
} else if (e.getX() >= line_x + (4 * squaresize)) {
oval1_x = line_x + (4 * squaresize);
}
else if (e.getX() >=line_x + (3 * squaresize)) {
oval1_x = line_x + (3 * squaresize);
} else if (e.getX() >= line_x + (2 * squaresize)) {
oval1_x = line_x + (2 * squaresize);
} else if (e.getX() >= line_x + (1 * squaresize)) {
oval1_x = line_x + (1 * squaresize);
} else if (e.getX() >= line_x + (0 * squaresize)) {
oval1_x = line_x + (0 * squaresize);
}
repaint();
}
if (ball2) {
oval2_x = e.getX();
if (oval2_x >= line_x + (7 * squaresize)) {
oval2_x = line_x + (7 * squaresize);
repaint();
}
}
//repaint();
}
}
}
المشكلة هى انى لا استطيع التحكم فى مسار الكرة عندما أضغط على زرار اللاعب الاول فمن المفروض انها تتحرك على مسار الشبكة فقط و لكنها تخرج الى خارجها فا أتمنى منك المساعدة
و الجزئية المسئولة عن التحكم فى حركة الكرة على مسار الشبكة هى هذه
private class MymouseAdabter extends MouseAdapter {
@Override
public void mouseMoved(MouseEvent e) {
if (ball1) {
oval1_x = e.getX();
if (e.getX() > line_x + (7 * squaresize)) {
oval1_x = line_x + (7 * squaresize);
} else if (e.getX() >= line_x + (5 * squaresize)) {
oval1_x = line_x + (5 * squaresize);
} else if (e.getX() >= line_x + (4 * squaresize)) {
oval1_x = line_x + (4 * squaresize);
}
else if (e.getX() >=line_x + (3 * squaresize)) {
oval1_x = line_x + (3 * squaresize);
} else if (e.getX() >= line_x + (2 * squaresize)) {
oval1_x = line_x + (2 * squaresize);
} else if (e.getX() >= line_x + (1 * squaresize)) {
oval1_x = line_x + (1 * squaresize);
} else if (e.getX() >= line_x + (0 * squaresize)) {
oval1_x = line_x + (0 * squaresize);
}
repaint();
}
if (ball2) {
oval2_x = e.getX();
if (oval2_x >= line_x + (7 * squaresize)) {
oval2_x = line_x + (7 * squaresize);
repaint();
}