在Java中玩一个简单的3x3骰子游戏
我正在创建一个骰子游戏,其中两名玩家有自己的骰子,每个人都有自己的掷骰轮次,玩家可以完全输掉分数,也可以根据他们站在窗口上的位置获得分数,当任何玩家首先站在终点线上时,游戏结束,赢家是得分最高的玩家,到目前为止,我一直致力于游戏的设计,但还没有研究游戏的逻辑
此链接是游戏外观的图片:
我想知道如何在每张牌上添加上面照片中的玩家1和玩家2,所以基本上每次玩家轮到他时,我希望他的名字开始移动,这取决于他掷骰子时得到的数字
代码:
import javax.swing.*;
import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
public class diceGame {
public static void main(String[] args) {
new RollDicePanel();
}
}
class RollDicePanel extends JFrame {
private Dice myLeftDie;
private Dice myRightDie;
JPanel mainPanel;
JPanel topLeft,topCenter,topRight;
JPanel centerLeft,centerCenter,centerRight;
JPanel bottomLeft,bottomCenter,bottomRight;
JLabel tLeft,tRight,tCenter,cLeft,cCenter1,cCenter2,cRight,bLeft,bCenter,bRight;
RollDicePanel() {
myLeftDie = new Dice();
myRightDie = new Dice();
JButton rollButton1 = new JButton("Player 1");
rollButton1.setFont(new Font("Sansserif", Font.BOLD, 5));
rollButton1.addActionListener(new RollListener1());
JButton rollButton2 = new JButton("Player 2");
rollButton2.setFont(new Font("Sansserif", Font.BOLD, 5));
rollButton2.addActionListener(new RollListener2());
topLeft = new JPanel();
tLeft = new JLabel("+20");
tLeft.setFont(new Font("Sansserif", Font.BOLD, 20));
tLeft.setLayout(new FlowLayout(FlowLayout.CENTER));
topLeft.add(tLeft,BorderLayout.WEST);
topLeft.setBackground(Color.RED);
topRight = new JPanel();
tRight = new JLabel("-50");
tRight.setFont(new Font("Sansserif", Font.BOLD, 20));
topRight.add(tRight,BorderLayout.EAST);
topRight.setBackground(Color.ORANGE);
topCenter = new JPanel();
tCenter = new JLabel("Try Again");
tCenter.setFont(new Font("Sansserif", Font.BOLD, 20));
topCenter.add(tCenter,BorderLayout.CENTER);
topCenter.setBackground(Color.BLUE);
centerCenter = new JPanel();
cCenter1 = new JLabel("Player 1");
cCenter2 = new JLabel("Player 2");
centerCenter.add(rollButton1,BorderLayout.NORTH);
centerCenter.add(myLeftDie,BorderLayout.SOUTH);
centerCenter.add(rollButton2,BorderLayout.NORTH);
centerCenter.add(myRightDie,BorderLayout.EAST);
centerLeft = new JPanel();
cLeft = new JLabel("Finish");
cLeft.setFont(new Font("Sansserif", Font.BOLD, 20));
centerLeft.add(cLeft,BorderLayout.WEST);
centerLeft.setBackground(Color.YELLOW);
centerRight = new JPanel();
cRight = new JLabel("Lost All");
cRight.setFont(new Font("Sansserif", Font.BOLD, 20));
centerRight.add(cRight,BorderLayout.EAST);
centerRight.setBackground(Color.GREEN);
bottomRight = new JPanel();
bRight = new JLabel("+30");
bRight.setFont(new Font("Sansserif", Font.BOLD, 20));
bottomRight.add(bRight,BorderLayout.EAST);
bottomRight.setBackground(Color.CYAN);
bottomCenter = new JPanel();
bCenter = new JLabel("+10");
bCenter.setFont(new Font("Sansserif", Font.BOLD, 20));
bottomCenter.add(bCenter,BorderLayout.CENTER);
bottomCenter.setBackground(Color.magenta);
bottomLeft = new JPanel();
bLeft = new JLabel("-10");
bLeft.setFont(new Font("Sansserif", Font.BOLD, 20));
bLeft.setForeground(Color.WHITE);
bottomLeft.add(bLeft,BorderLayout.WEST);
bottomLeft.setBackground(Color.BLACK);
mainPanel = new JPanel();
mainPanel.setLayout(new GridLayout(3,3));
mainPanel.add(topLeft,BorderLayout.NORTH);
mainPanel.add(topCenter,BorderLayout.NORTH);
mainPanel.add(topRight,BorderLayout.NORTH);
mainPanel.add(centerLeft,BorderLayout.CENTER);
mainPanel.add(centerCenter,BorderLayout.CENTER);
mainPanel.add(centerRight,BorderLayout.CENTER);
mainPanel.add(bottomLeft,BorderLayout.SOUTH);
mainPanel.add(bottomCenter,BorderLayout.SOUTH);
mainPanel.add(bottomRight,BorderLayout.SOUTH);
this.setTitle("Dice Game");
this.setBounds(200, 200, 700, 700);
this.add(mainPanel);
this.setVisible(true);
this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
this.pack();
}
private class RollListener1 implements ActionListener {
public void actionPerformed(ActionEvent e) {
myLeftDie.roll();
}
}
private class RollListener2 implements ActionListener {
public void actionPerformed(ActionEvent e) {
myRightDie.roll();
}
}
}
class Dice extends JPanel {
private static final int SPOT_DIAMETER = 4;
private int myFaceValue;
public Dice() {
setBackground(Color.white);
setPreferredSize(new Dimension(15,15));
roll();
}
int roll() {
int val = (int)(6*Math.random() + 1);
setValue(val);
return val;
}
public int getValue() {
return myFaceValue;
}
public void setValue(int spots) {
myFaceValue = spots;
repaint();
}
public void paintComponent(Graphics g) {
super.paintComponent(g);
int w = getWidth();
int h = getHeight();
g.drawRect(0, 0, w-1, h-1);
switch (myFaceValue) {
case 1: drawSpot(g, w/2, h/2);
break;
case 3: drawSpot(g, w/2, h/2);
case 2: drawSpot(g, w/4, h/4);
drawSpot(g, 3*w/4, 3*h/4);
break;
case 5: drawSpot(g, w/2, h/2);
case 4: drawSpot(g, w/4, h/4);
drawSpot(g, 3*w/4, 3*h/4);
drawSpot(g, 3*w/4, h/4);
drawSpot(g, w/4, 3*h/4);
break;
case 6: drawSpot(g, w/4, h/4);
drawSpot(g, 3*w/4, 3*h/4);
drawSpot(g, 3*w/4, h/4);
drawSpot(g, w/4, 3*h/4);
drawSpot(g, w/4, h/2);
drawSpot(g, 3*w/4, h/2);
break;
}
}
private void drawSpot(Graphics g, int x, int y) {
g.fillOval(x-SPOT_DIAMETER/2, y-SPOT_DIAMETER/2, SPOT_DIAMETER, SPOT_DIAMETER);
}
}
# 1 楼答案
我修好了你的GUI
我通过调用}方法启动了GUI。此方法确保在Event Dispatch Thread上创建和执行Swing组件
SwingUtilities
{我在类构造函数中创建了
JFrame
。我创建了一个外部JPanel
,八个内部JPanels
,和一个中心JPanel
。JFrame
方法必须按特定顺序执行。这是我用于Swing GUI的顺序外部
JPanel
使用GridLayout
来组织内部JPanels
。八个内部JPanels
是相似的,所以我使用了一个方法来创建它们中心
JPanel
使用GridBagLayout
来组织JButtons
和die图像下面是完整的可运行代码
更新1
我继续前进,完成了比赛
我创建了一个逻辑模型来保存棋盘方块和玩家位置,以及玩家1和玩家2的得分
我修改了视图以使用逻辑模型
下面是完整的可运行代码