Я создал код для вашей игры. Вам нужно будет завершить код.
Вот GUI, который я создал.
Первое, что я сделал, было использовать шаблон модель / вид / контроллер . Разделяя логические функции игры, я мог сосредоточиться на одной части за раз.
Вот модель, которую я создал. Это не завершено, но я думаю, вы можете видеть, что я пытаюсь сделать стадо. Я поместил его класс в собственный пакет моделей.
package com.ggl.ludo.model;
import java.awt.image.BufferedImage;
import java.io.IOException;
import javax.imageio.ImageIO;
public class LudoModel {
private final BufferedImage gameBoard;
private final BufferedImage[] imageTokenBlue;
public LudoModel() {
imageTokenBlue = new BufferedImage[4];
imageTokenBlue[0] = getImage("blue1.png");
imageTokenBlue[1] = getImage("blue2.png");
imageTokenBlue[2] = getImage("blue3.png");
imageTokenBlue[3] = getImage("blue4.png");
gameBoard = getImage("ludoBoard.png");
}
public BufferedImage getGameBoard() {
return gameBoard;
}
public BufferedImage[] getImageTokenBlue() {
return imageTokenBlue;
}
private BufferedImage getImage(String fileName) {
try {
return ImageIO.read(getClass().getResourceAsStream("/" + fileName));
} catch (IOException e) {
return null;
}
}
}
Все, что делает этот код, - это чтение изображений и, в конечном итоге, создание логической модели вашей игры. Он вообще не касается представления или кода контроллера.
Следующим классом, который я создал, был класс DrawingPanel. Этот класс др aws игровое поле и в конце концов, др aws фигуры на доске. Расположение информации о деталях входит в модель.
package com.ggl.ludo.view;
import java.awt.Dimension;
import java.awt.Graphics;
import javax.swing.JPanel;
import com.ggl.ludo.model.LudoModel;
public class DrawingPanel extends JPanel {
private static final long serialVersionUID = 1L;
private LudoFrame frame;
private LudoModel model;
public DrawingPanel(LudoFrame frame, LudoModel model) {
this.frame = frame;
this.model = model;
int width = model.getGameBoard().getWidth();
int height = model.getGameBoard().getHeight();
this.setPreferredSize(new Dimension(width, height));
}
@Override
protected void paintComponent(Graphics g) {
super.paintComponent(g);
g.drawImage(model.getGameBoard(), 0, 0, this);
// Your piece drawing code goes here
}
}
Затем я создал класс для хранения JFrame. Код JScrollPane можно удалить. Мой старый ноутбук не может отображать игровую доску размером с вашу. О чем следует помнить, если вы хотите, чтобы другие играли в эту игру.
Я поместил код меню в свой собственный метод. Мне нравится хранить отдельные вещи отдельно. Мой слабый ум не может обрабатывать слишком много процессов одновременно.
package com.ggl.ludo.view;
import java.awt.Dimension;
import javax.swing.JFrame;
import javax.swing.JMenu;
import javax.swing.JMenuBar;
import javax.swing.JMenuItem;
import javax.swing.JScrollPane;
import com.ggl.ludo.model.LudoModel;
public class LudoFrame {
private DrawingPanel drawingPanel;
private LudoModel ludoModel;
public LudoFrame(LudoModel ludoModel) {
this.ludoModel = ludoModel;
generateGUIControl();
}
private void generateGUIControl() {
JFrame frame = new JFrame("Ludo");
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.setJMenuBar(createMenu());
drawingPanel = new DrawingPanel(this, ludoModel);
JScrollPane scrollPane = new JScrollPane(drawingPanel);
scrollPane.setPreferredSize(new Dimension(400, 400));
frame.add(scrollPane);
frame.pack();
frame.setLocationByPlatform(true);
frame.setVisible(true);
}
private JMenuBar createMenu() {
JMenuBar ludoMenuBar = new JMenuBar();
JMenu ludoMenuFirst = new JMenu("Information");
ludoMenuBar.add(ludoMenuFirst);
JMenuItem jmiDescription = new JMenuItem("Description");
JMenuItem jmiHelp = new JMenuItem("Help");
JMenuItem jmiRestart = new JMenuItem("Restart");
JMenuItem jmiExit = new JMenuItem("Exit");
ludoMenuFirst.add(jmiDescription);
ludoMenuFirst.add(jmiHelp);
ludoMenuFirst.add(jmiRestart);
ludoMenuFirst.add(jmiExit);
ludoMenuBar.add(ludoMenuFirst);
return ludoMenuBar;
}
}
Наконец, класс драйверов, который запускает весь процесс. Вы должны запустить приложение Swing в потоке рассылки событий (EDT). Вызов SwingUtilities invokeLater гарантирует, что ваше приложение запускается на EDT.
package com.ggl.ludo;
import javax.swing.SwingUtilities;
import com.ggl.ludo.model.LudoModel;
import com.ggl.ludo.view.LudoFrame;
public class Ludo implements Runnable {
public static void main(String[] args) {
SwingUtilities.invokeLater(new Ludo());
}
@Override
public void run() {
new LudoFrame(new LudoModel());
}
}
Я надеюсь, что это было полезно для вас. Что касается контроллеров, я предлагаю вам использовать слушателя мыши и рисовать игровые фигуры на игровом поле.
Помните, информация о расположении игровых фигур входит в модель. Вид чертежного кода dr aws из информации в модели.