我对Java完全陌生,我想用Java创建一个单人棋盘游戏。
我已经有很多定义游戏的类,但是,对于我的问题,我将把问题限制为为棋盘游戏创建GUI板。
我的具体问题是基于以下代码的:
在此先感谢您体面的回答。因为我是Java的新手,所以请以清晰的方式说明您的答案。
这是下面代码的输出:
import javax.swing.SwingUtilities;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.BorderFactory;
import java.awt.Color;
import java.awt.Dimension;
import java.awt.Graphics;
import java.awt.event.MouseEvent;
import java.awt.event.MouseListener;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseMotionListener;
import java.awt.event.MouseMotionAdapter;
public class SwingPaintDemo3 {
public static void main(String[] args) {
SwingUtilities.invokeLater(new Runnable() {
public void run() {
createAndShowGUI();
}
});
}
private static void createAndShowGUI() {
System.out.println("Created GUI on EDT? "+
SwingUtilities.isEventDispatchThread());
JFrame f = new JFrame("Single Player Game");
f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
f.add(new MyPanel());
f.pack();
f.setVisible(true);
}
}
class MyPanel extends JPanel {
private int squareX = 50;
private int squareY = 50;
private int squareW = 20;
private int squareH = 20;
public MyPanel() {
setBorder(BorderFactory.createLineBorder(Color.black));
public Dimension getPreferredSize() {
return new Dimension(250,200);
}
protected void paintComponent(Graphics g) {
super.paintComponent(g);
g.drawString("This is the game board ",10,20);
g.setColor(Color.GREEN);
g.fillRect(squareX,squareY,squareW,squareH);
g.setColor(Color.BLACK);
g.drawRect(squareX,squareY,squareW,squareH);
g.drawRect(squareX+20,squareY,squareW,squareH);
g.drawRect(squareX+40,squareY,squareW,squareH);
g.drawRect(squareX+60,squareY,squareW,squareH);
g.drawRect(squareX+60,squareY,squareW,squareH);
g.drawRect(squareX+80,squareY,squareW,squareH);
g.drawRect(squareX,squareY+20,squareW,squareH);
g.drawRect(squareX+20,squareY+20,squareW,squareH);
g.drawRect(squareX+40,squareY+20,squareW,squareH);
g.drawRect(squareX+60,squareY+20,squareW,squareH);
g.drawRect(squareX+80,squareY+20,squareW,squareH);
g.drawRect(squareX,squareY+40,squareW,squareH);
g.drawRect(squareX+20,squareY+40,squareW,squareH);
g.drawRect(squareX+40,squareY+40,squareW,squareH);
g.drawRect(squareX+60,squareY+40,squareW,squareH);
g.drawRect(squareX+80,squareY+40,squareW,squareH);
}
}
答案 0 :(得分:1)
以下是mcve,演示了使用Model-View-Controller模式的游戏板和玩家的非常基本的实现。
此模式中的模型包含视图所需的所有信息(“我已经有一个单独的Class'Board.Java',具有包含坐标的棋盘游戏的矩阵表示形式”。)
视图就是这样,控制器将视图与模型链接起来,并编排显示:
import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.Dimension;
import java.awt.FlowLayout;
import java.awt.Graphics;
import java.awt.GridLayout;
import java.awt.Rectangle;
import java.util.Random;
import javax.swing.BorderFactory;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
public class GameControler {
private Model model;
private View view;
public GameControler() {
model = new Model();
view = new View(model);
view.getButton().addActionListener(e-> movePlayer());
}
//move player to a random position for demo purpose only
private void movePlayer() {
final Random rnd = new Random();
model.setPlayerX(rnd.nextInt(100));//arbitrary limit which maybe outside bounds
model.setPlayerY(rnd.nextInt(100));//arbitrary limit which maybe outside bounds
view.refresh();
}
public static void main(String[] args) {
new GameControler();
}
}
class View {
private final static int GAP = 2;
Model model;
private MainPanel mainPanel;
View(Model model){
this.model = model;
createAndShowGUI();
}
void refresh() {
mainPanel.repaint();
}
private void createAndShowGUI() {
JFrame f = new JFrame("Single Player Game");
f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
mainPanel = new MainPanel();
f.add(mainPanel);
f.pack();
f.setVisible(true);
}
JButton getButton() { return mainPanel.getButton(); }
class MainPanel extends JPanel {
private BottomPanel bPanel;
MainPanel() {
setLayout(new BorderLayout(GAP,GAP));
add(new TopPanel(), BorderLayout.PAGE_START);
add(new BoardPanel(), BorderLayout.CENTER);
bPanel = new BottomPanel();
add(bPanel, BorderLayout.PAGE_END);
}
JButton getButton() { return bPanel.getButton(); }
}
class TopPanel extends JPanel {
TopPanel() {
setLayout(new FlowLayout(FlowLayout.LEADING));
add(new JLabel("This is the game board "));
}
}
class BoardPanel extends JPanel {
Player player;
BoardPanel() {
setBorder(BorderFactory.createLineBorder(Color.BLACK, GAP));
GridLayout layout = new GridLayout(model.getBoardRows(),
model.getBoardCols());
setLayout(layout);
for (int i = 0; i <model.getBoardRows(); i++) {
for (int j = 0; j < model.getBoardCols(); j++) {
add(new Tile());
}
}
player = new Player();
player.setBounds(new Rectangle(100,100, 100, 100));
}
@Override
protected void paintComponent(Graphics g) {
super.paintComponent(g);
player.paint(g);
}
}
class Tile extends JLabel {
Tile() {
setPreferredSize(new Dimension(model.getSquareSize(), model.getSquareSize()));
setBorder(BorderFactory.createLineBorder(Color.BLACK, GAP));
}
}
class Player extends JLabel{
@Override
protected void paintComponent(Graphics g) {
super.paintComponent(g);
g.setColor(Color.BLUE);
g.fillRect(model.getPlayerX(), model.getPlayerY(), model.getPlayerSize(),model.getPlayerSize());
}
}
class BottomPanel extends JPanel {
JButton button = new JButton("Move Player");
BottomPanel(){
add(button);
}
JButton getButton() { return button; }
}
}
class Model{
private int boardRows = 3, boardCols = 5, squareSize = 50;
private int playerX = 0, playerY = 0, playerSize =15;
int getPlayerX() { return playerX; }
void setPlayerX(int playerX) { this.playerX = playerX; }
int getPlayerY() {return playerY; }
void setPlayerY(int playerY) { this.playerY = playerY; }
int getPlayerSize() {return playerSize; }
int getBoardRows() {return boardRows; }
int getBoardCols() {return boardCols; }
int getSquareSize() {return squareSize; }
}
可以将代码复制粘贴到一个文件(GameControler.java)中并运行。 请查看,修改您的需求,并询问您需要澄清的地方。
答案 1 :(得分:0)
对于几乎所有这些问题,您都需要创建一种方法来在板上绘制一个特定的位置。您应该将电路板与图形表示分开进行维护-例如,将其放置在坐标为(0,0)至(5,3)的位置。这些可以转换为实际的图形。现在,您可以遍历木板的每个坐标,确定上面的内容(玩家/自由/可见度范围外)并相应地绘制。
至于“是否有更好的方法”:我确定有,但是继续吧。既然您刚开始,那么这里就是一个好地方。