坚持制作Kakurasu游戏

时间:2016-01-11 17:26:03

标签: java swing

我们正在学习java图形,现在我们必须建立一个名为Kakurasu的游戏(https://www.brainbashers.com/showkakurasu.asp

我很困难,我不知道该怎么做。

就我而言。我已经完成了一个带有面板的框架,面板内有7x7按钮,按下时从0变为1,白色变为绿色。我的想法是,我在顶部和左侧制作第一个原始数字为1-5,然后在底部和右侧制作随机生成的数字。

这是我的第一个代码:

import javax.swing.*;
import java.awt.*;

public class Start {

public static JButton[][] gumbi;

public static void main(String[] args) {
    buttons = new JButton[7][7];
    JFrame window = new JFrame("Kakurasu");
    JPanel panel = new JPanel(new BorderLayout());
    JPanel playingField = new JPanel(new GridLayout(7, 7));
    Listner1 p = new Listner1(buttons);

    panel.add(playingField, BorderLayout.CENTER);
    window.add(panel);

    for (int i = 0; i < 7; i++) {
        for (int j = 0; j < 7; j++) {
            buttons[i][j] = new JButton("0");
            playingField.add(buttons[i][j], BorderLayout.CENTER);
            buttons[i][j].addActionListener(p);
            buttons[i][j].setBackground(Color.WHITE);
        }
    }

    window.setVisible(true);
    window.setSize(500, 500);
    window.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
}

}

这是我的第二个代码:

import javax.swing.*;
import java.awt.*;
import java.awt.Color;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;

public class Poslusalec1 implements ActionListener {
public JButton[][] buttons;

public Listner1(JButton[][] gumbi) {
    this.buttons = buttons;
}

public void actionPerformed(ActionEvent e) {
    JButton button = (JButton) e.getSource();

    String tmp = button.getText();
    int n = Integer.parseInt(tmp);
    n += 1;
    if (n == 2) {
        n = 0;
    }
    button.setText("" + n);

    if (button.getBackground() == Color.WHITE) {
        button.setBackground(Color.GREEN);
    } else {
        button.setBackground(Color.WHITE);
    }

    for (int i = 0; i < buttons.length; i++) {
        for (int j = 0; j < buttons[i].length; j++) {
            if (button == buttons[i][j]) {
                System.out.println(i + ", " + j);
            }
        }
    }

}

}

是否可以将不同的动作侦听器分配给gridlayout中的不同按钮?

感谢您的帮助。

1 个答案:

答案 0 :(得分:4)

  

我很困难,我不知道怎么做。

要解决任何计算机问题,您可以将问题分解为越来越小的问题,直到您对可以编写每个小问题的代码感到满意为止。

通常,在对GUI进行编码时,您应该使用model / view / controller pattern

在Java Swing中,这意味着:

  1. 视图可以从模型中读取值。
  2. 视图可能无法更新模型。
  3. 控制器更新模型。
  4. 控制器重新绘制/重新验证视图。
  5. 所以,让我们为JButton创建一个模型。该模型将保持JButton的横向值,JButton的向下值以及JButton的背景颜色。

    package com.ggl.testing;
    
    import java.awt.Color;
    
    public class KakurasuCell {
    
        private final int acrossValue;
        private final int downValue;
    
        private Color backgroundColor;
    
        public KakurasuCell(int acrossValue, int downValue, Color backgroundColor) {
            this.acrossValue = acrossValue;
            this.downValue = downValue;
            this.backgroundColor = backgroundColor;
        }
    
        public Color getBackgroundColor() {
            return backgroundColor;
        }
    
        public void setBackgroundColor(Color backgroundColor) {
            this.backgroundColor = backgroundColor;
        }
    
        public int getAcrossValue() {
            return acrossValue;
        }
    
        public int getDownValue() {
            return downValue;
        }
    
    }
    

    这是一个Java对象。它包含多种类型的值。

    现在,我们为JButtons网格创建另一个模型。您应该从代码中识别出这一点。

    package com.ggl.testing;
    
    import java.awt.Color;
    
    public class KakurasuGrid {
    
        private int gridWidth;
    
        private KakurasuCell[][] cells;
    
        public KakurasuGrid(int gridWidth) {
            setGridWidth(gridWidth);
        }
    
        public int getGridWidth() {
            return gridWidth;
        }
    
        public void setGridWidth(int gridWidth) {
            this.gridWidth = gridWidth;
            this.cells = new KakurasuCell[gridWidth][gridWidth];
            setCells();
        }
    
        public KakurasuCell[][] getCells() {
            return cells;
        }
    
        private void setCells() {
            for (int i = 0; i < gridWidth; i++) {
                for (int j = 0; j < gridWidth; j++) {
                    KakurasuCell cell = new KakurasuCell((j + 1), (i + 1),
                            Color.GRAY);
                    cells[i][j] = cell;
                }
            }
        }
    
    }
    

    这应该足以让你入门。您仍然需要创建答案,创建GUI并添加控制器方法。