| import java.awt.*; |
| import com.googlecode.prolog_cafe.lang.*; |
| /** |
| * <code>Peg</code><br> |
| * @author Naoyuki Tamura (tamura@kobe-u.ac.jp) |
| */ |
| public class Peg extends PrologFrame { |
| private PegPanel pegPanel; |
| private TextField N_Field; |
| private TextField I_Field; |
| private TextField J_Field; |
| private int N = 5; |
| private int I0 = 5; |
| private int J0 = 3; |
| |
| public Peg() { |
| setSize(500, 400); |
| setBackground(Color.lightGray); |
| setLayout(new BorderLayout()); |
| add("North", new Label("Peg", Label.CENTER)); |
| pegPanel = new PegPanel(); |
| add("Center", pegPanel); |
| Panel p = new Panel(); |
| add("South", p); |
| p.add(new Label("N=")); |
| N_Field = new TextField(Integer.toString(N), 2); |
| p.add(N_Field); |
| p.add(new Label("(I, J)=(")); |
| I_Field = new TextField(Integer.toString(I0), 1); |
| p.add(I_Field); |
| p.add(new Label(",")); |
| J_Field = new TextField(Integer.toString(J0), 1); |
| p.add(J_Field); |
| p.add(new Label(")")); |
| control = new PrologControlPanel(this); |
| p.add(control); |
| validate(); |
| } |
| |
| Term a1 = null; |
| Term a2 = null; |
| Term a3 = null; |
| Term a4 = null; |
| Predicate peg = null; |
| |
| void sendArgument() { |
| try { |
| N = Integer.parseInt(N_Field.getText()); |
| I0 = Integer.parseInt(I_Field.getText()); |
| J0 = Integer.parseInt(J_Field.getText()); |
| } catch (NumberFormatException e) { |
| N = 1; |
| N_Field.setText(Integer.toString(N)); |
| I0 = 1; |
| I_Field.setText(Integer.toString(I0)); |
| J0 = 1; |
| J_Field.setText(Integer.toString(J0)); |
| } |
| this.prolog = new PrologControl(); |
| a1 = new IntegerTerm(N); |
| a2 = new IntegerTerm(I0); |
| a3 = new IntegerTerm(J0); |
| a4 = new VariableTerm(); |
| Term[] args = {a1,a2,a3,a4}; |
| peg = new PRED_peg_game_4(); |
| prolog.setPredicate(peg, args); |
| } |
| |
| void receiveResult() { |
| Term result = a4.dereference(); |
| if (! result.isList()) { |
| System.out.println("Invalid result!"); |
| return; |
| } |
| int len = ((ListTerm)result).length(); |
| int moves[][] = new int[len][4]; |
| Term elm; |
| Term[] args; |
| try { |
| for (int i=0; i<len; i++) { |
| elm = ((ListTerm)result).car().dereference(); |
| args = ((StructureTerm)elm).args(); |
| moves[i][0] = ((IntegerTerm)(args[0].dereference())).intValue(); |
| moves[i][1] = ((IntegerTerm)(args[1].dereference())).intValue(); |
| moves[i][2] = ((IntegerTerm)(args[2].dereference())).intValue(); |
| moves[i][3] = ((IntegerTerm)(args[3].dereference())).intValue(); |
| result = ((ListTerm)result).cdr().dereference(); |
| } |
| pegPanel.setSol(N, I0, J0, moves); |
| } catch (Exception e) { |
| System.out.println("are?"); |
| } |
| pegPanel.start(); // start animation |
| } |
| |
| public static void main(String args[]) { |
| new Peg(); |
| } |
| } |
| |
| class PegPanel extends Panel implements Runnable { |
| private Thread pegAnimator = null; |
| private int N; |
| private int I0; |
| private int J0; |
| private Color peg[][] = null; |
| private int moves[][] = null; |
| private int cellSize; |
| private int x0; |
| private int y0; |
| private int wait = 300; |
| |
| public synchronized void start() { |
| stop(); |
| pegAnimator = new Thread(this); |
| pegAnimator.start(); |
| } |
| |
| public synchronized void stop() { |
| pegAnimator = null; |
| } |
| |
| public synchronized void setSol(int n, int i0, int j0, int m[][]) { |
| N = n; |
| I0 = i0; |
| J0 = j0; |
| moves = m; |
| peg = null; |
| repaint(); |
| } |
| |
| public void paint(Graphics g) { |
| int m, n; |
| if (peg == null) |
| return; |
| /* this.g = g; */ |
| int w = getSize().width; |
| int h = getSize().height; |
| cellSize = Math.min(w, h) / N; |
| x0 = (w - N * cellSize) / 2; |
| y0 = (h - N * cellSize) / 2; |
| for (int i = 1; i <= N; ++i) |
| for (int j = 1; j <= i; ++j) { |
| g.setColor(peg[i][j]); |
| m = i-1; |
| n = j-1; |
| int x = x0 + (N-1-m)*cellSize/2 + n*cellSize; |
| int y = y0 + m*cellSize; |
| g.fillOval(x+cellSize/4, y+cellSize/4, cellSize/2, cellSize/2); |
| } |
| } |
| |
| private void sleep(int t) { |
| try { |
| Thread.sleep(t); |
| } catch (InterruptedException e) {} |
| } |
| |
| public void run() { |
| if (moves == null) |
| return; |
| peg = new Color[N+1][N+1]; |
| for (int i = 1; i <= N; ++i) |
| for (int j = 1; j <= i; ++j) |
| peg[i][j] = Color.blue; |
| peg[I0][J0] = Color.white; |
| repaint(); |
| for (int k = 0; k < moves.length; ++k) { |
| sleep(wait); |
| int i0 = moves[k][0]; |
| int j0 = moves[k][1]; |
| int di = moves[k][2]; |
| int dj = moves[k][3]; |
| peg[i0][j0] = Color.red; |
| repaint(); |
| sleep(wait); |
| peg[i0][j0] = Color.white; |
| peg[i0+di][j0+dj] = Color.white; |
| peg[i0+2*di][j0+2*dj] = Color.blue; |
| repaint(); |
| sleep(wait); |
| } |
| } |
| } |