| import java.awt.*; |
| import com.googlecode.prolog_cafe.lang.*; |
| /** |
| * <code>Queens</code><br> |
| * @author Naoyuki Tamura (tamura@kobe-u.ac.jp) |
| */ |
| public class Queens extends PrologFrame { |
| private QueensPanel queensPanel; |
| private TextField N_Field; |
| private int N = 8; |
| |
| public Queens() { |
| setSize(500,400); |
| setBackground(Color.lightGray); |
| setLayout(new BorderLayout()); |
| add("North", new Label("N-Queens Solver", Label.CENTER)); |
| queensPanel = new QueensPanel(N); |
| add("Center", queensPanel); |
| Panel p = new Panel(); |
| add("South", p); |
| p.add(new Label("N=")); |
| N_Field = new TextField(Integer.toString(N), 2); |
| p.add(N_Field); |
| control = new PrologControlPanel(this); |
| p.add(control); |
| validate(); |
| } |
| |
| Term a1 = null; |
| Term a2 = null; |
| Predicate nqueens = null; |
| |
| void sendArgument() { |
| try { |
| N = Integer.parseInt(N_Field.getText()); |
| } catch (NumberFormatException e) { |
| N = 1; |
| N_Field.setText(Integer.toString(N)); |
| } |
| queensPanel.setN(N); |
| this.prolog = new PrologControl(); |
| a1 = new IntegerTerm(N); |
| a2 = new VariableTerm(); |
| Term[] args = {a1,a2}; |
| nqueens = new PRED_queens_2(); |
| prolog.setPredicate(nqueens, args); |
| } |
| |
| void receiveResult() { |
| Term result = a2.dereference(); |
| if ( !result.isList() || ((ListTerm)result).length() != N ){ |
| System.out.println("Invalid result!"); |
| return; |
| } |
| int queens[] = new int[N]; |
| Term elm; |
| try { |
| for (int i = 0; i < N; i++) { |
| elm = ((ListTerm)result).car().dereference(); |
| queens[i] = ((IntegerTerm)elm).intValue() - 1; |
| result = ((ListTerm)result).cdr(); |
| /* System.out.println(queens[i]); */ |
| } |
| } catch (Exception e){} |
| queensPanel.setQueens(queens); |
| } |
| |
| public static void main(String args[]) { |
| new Queens(); |
| } |
| } |
| |
| class QueensPanel extends Panel { |
| private int N = 0; |
| private int queens[] = null; |
| private int cellSize = 0; |
| private Image boardImage = null; |
| private int boardN = 0; |
| |
| public QueensPanel(int n) { |
| setN(n); |
| } |
| |
| public void setN(int n) { |
| if (n > 0) { |
| N = n; |
| setQueens(null); |
| repaint(); |
| } |
| } |
| |
| public void setQueens(int q[]) { |
| queens = q; |
| repaint(); |
| } |
| |
| private void drawBoard(Graphics g, int x0, int y0) { |
| int size = N * cellSize; |
| if (boardImage == null || N != boardN |
| || boardImage.getWidth(null) != size |
| || boardImage.getHeight(null) != size) { |
| boardImage = createImage(size, size); |
| Graphics b = boardImage.getGraphics(); |
| b.setColor(Color.white); |
| b.fillRect(0, 0, size, size); |
| b.setColor(Color.gray); |
| for (int i = 0; i < N; i++) |
| for (int j = 0; j < N; j++) |
| if ((i + j) % 2 == 1) { |
| b.fillRect(i*cellSize, j*cellSize, cellSize, cellSize); |
| } |
| boardN = N; |
| } |
| g.drawImage(boardImage, x0, y0, null); |
| } |
| |
| public void paint(Graphics g) { |
| if (N < 1) |
| return; |
| int w = getSize().width; |
| int h = getSize().height; |
| cellSize = Math.min(w, h) / N; |
| int x0 = (w - N * cellSize) / 2; |
| int y0 = (h - N * cellSize) / 2; |
| drawBoard(g, x0, y0); |
| if (queens == null || N != queens.length) |
| return; |
| int d = (8*cellSize)/10; |
| g.setColor(Color.orange); |
| for (int i = 0; i < N; i++) { |
| int j = queens[i]; |
| int x = x0 + i * cellSize + (cellSize - d) / 2; |
| int y = y0 + j * cellSize + (cellSize - d) / 2; |
| g.fillArc(x, y, d, d, 0, 360); |
| } |
| } |
| } |
| |
| |