Java 棋盘游戏的GUI操作
我对java完全陌生,我想用java创建一个单人棋盘游戏 我已经有很多类定义了这个游戏,但是,对于我的问题,我将把问题限制在为我的棋盘游戏创建GUI板上Java 棋盘游戏的GUI操作,java,swing,user-interface,model-view-controller,Java,Swing,User Interface,Model View Controller,我对java完全陌生,我想用java创建一个单人棋盘游戏 我已经有很多类定义了这个游戏,但是,对于我的问题,我将把问题限制在为我的棋盘游戏创建GUI板上 我非常具体的问题是,基于下面的代码: 如何在棋盘游戏中移动玩家?(存在类玩家) 这是用GUI创建Java板的正确方法吗?有更好的替代方法吗 如何仅将棋盘游戏的特定部分设置为可见?(当玩家移动时,这需要改变!) 提前感谢您的得体回答。因为我对java非常陌生,请清楚地解释您的答案 这是下面代码的输出: 对于几乎所有这些问题,您需要创建一个方法来
我非常具体的问题是,基于下面的代码:
对于几乎所有这些问题,您需要创建一个方法来在黑板上绘制特定位置。您应该将电路板与图形表示分开,例如坐标从(0,0)到(5,3)的位置。这些可以转换为实际的图形。现在,您可以遍历棋盘的每个坐标,确定棋盘上有什么(玩家/自由/超出可见性范围),并相应地绘制它 至于“有更好的方法吗”:我肯定有,但还是用这个。由于您刚刚起步,这里是一个很好的地方。下面是一个演示使用模型视图控制器模式的游戏板和玩家的基本实现的示例。
此模式中的模型保存视图所需的所有信息(“我已经有了一个单独的类'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; }
}
导入java.awt.BorderLayout;
导入java.awt.Color;
导入java.awt.Dimension;
导入java.awt.FlowLayout;
导入java.awt.Graphics;
导入java.awt.GridLayout;
导入java.awt.Rectangle;
导入java.util.Random;
导入javax.swing.BorderFactory;
导入javax.swing.JButton;
导入javax.swing.JFrame;
导入javax.swing.JLabel;
导入javax.swing.JPanel;
公共类游戏控制器{
私有模型;
私人视野;
公共游戏控制器(){
模型=新模型();
视图=新视图(模型);
view.getButton().addActionListener(e->movePlayer());
}
//将玩家移动到随机位置仅用于演示
私人玩家(){
最终随机rnd=新随机();
model.setPlayerX(rnd.nextInt(100));//可能超出边界的任意限制
model.setPlayerY(rnd.nextInt(100));//可能超出边界的任意限制
view.refresh();
}
公共静态void main(字符串[]args){
新游戏控制器();
}
}
类视图{
专用最终静态int间隙=2;
模型;
专用主面板主面板;
视图(模型){
this.model=模型;
createAndShowGUI();
}
无效刷新(){
mainPanel.repaint();
}
私有void createAndShowGUI(){
JFrame f=新JFrame(“单人游戏”);
f、 setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
主面板=新的主面板();
f、 添加(主面板);
f、 包装();
f、 setVisible(真);
}
JButton getButton(){return mainPanel.getButton();}
类主面板扩展了JPanel{
私人配电盘;
主面板(){
setLayout(新边界布局(间隙,间隙));
添加(新的TopPanel(),BorderLayout.PAGE_START);
添加(新的BoardPanel(),BorderLayout.CENTER);
bPanel=新的底部面板();
添加(bPanel,BorderLayout.PAGE_END);
}
JButton getButton(){返回bPanel.getButton();}
}
类TopPanel扩展了JPanel{
托帕内尔(){
setLayout(新的FlowLayout(FlowLayout.LEADING));
添加(新JLabel(“这是游戏板”);
}
}
类BoardPanel扩展了JPanel{
玩家;
董事会(){
setboorder(BorderFactory.createLineBorder(Color.BLACK,GAP));
GridLayout=新的GridLayout(model.getBoardRows(),
model.getBoardCols());
设置布局(布局);
对于(int i=0;i为棋盘游戏考虑使用标准的布局管理器(例如<代码> GridLayout < /代码>),并将其添加到组件中(如<代码> jabel)。请参阅棋盘游戏面板
。另外,请坚持网站政策,每篇文章只回答一个重点问题。谢谢,我已经有了一个单独的类“Board.Java”,其中包含棋盘游戏的矩阵表示,包括坐标(矩阵以数字形式打印在控制台中),但我不知道如何与sperate类GUI结合,将这块板转换成一个GUI表示形式,其中包含一个可以移动的播放器和板上的对象。我实际上不明白,也完全不知道该怎么做(这就是为什么我在GUI类中创建了一个新的板),是如何在“Board类”/“Player类”和GUI之间进行耦合。是否可以用示例代码简单地解释这一点?是否知道如何用用户定义的移动替换随机移动?(我的意思是,具体地说,如何用例如在X方向上移动1个网格单元来替换model.setPlayerX(rnd.nextInt(100))private void movePlayerX(int-distance){model.setPlayerX(distance);}
是最简单的部分。您需要定义distance
。是的,例如,我将distance定义为int 50,与您提供的代码相结合。但是没有发生任何事情。我不明白的是,当rnd.NextInt(100)当你不能简单地做一个x+50或y+50?时,效果很好(当然,最终的目的是用一个gridcel移动,在我的代码中应该是-50,所以一个简单的方法将玩家从当前位置移动到x+50和y+50(x-50和y-50也可以)。(它也可以用t
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; }
}