sudoku.java

来自「Semantic Web Ontology Editor」· Java 代码 · 共 1,029 行 · 第 1/3 页

JAVA
1,029
字号
package org.mindswap.swoop.fun;
import java.awt.BorderLayout;
import java.awt.Container;
import java.awt.Font;
import java.awt.GridLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.MouseEvent;
import java.awt.event.MouseListener;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileWriter;
import java.io.InputStreamReader;
import java.io.StringWriter;
import java.net.URI;
import java.util.ArrayList;
import java.util.HashSet;
import java.util.Iterator;
import java.util.List;
import java.util.Set;

import javax.swing.JButton;
import javax.swing.JCheckBoxMenuItem;
import javax.swing.JEditorPane;
import javax.swing.JFileChooser;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JMenu;
import javax.swing.JMenuBar;
import javax.swing.JMenuItem;
import javax.swing.JOptionPane;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.JTable;
import javax.swing.JToolBar;
import javax.swing.table.AbstractTableModel;
import javax.swing.table.TableModel;

import org.mindswap.swoop.SwoopFrame;
import org.mindswap.swoop.SwoopModel;
import org.mindswap.swoop.reasoner.PelletReasoner;
import org.mindswap.swoop.reasoner.SwoopToldReasoner;
import org.mindswap.swoop.renderer.entity.ConciseFormatEntityRenderer;
import org.mindswap.swoop.utils.SetUtils;
import org.mindswap.swoop.utils.owlapi.CorrectedRDFRenderer;
import org.mindswap.swoop.utils.ui.SwingWorker;
import org.semanticweb.owl.model.OWLClass;
import org.semanticweb.owl.model.OWLClassAxiom;
import org.semanticweb.owl.model.OWLDataFactory;
import org.semanticweb.owl.model.OWLDescription;
import org.semanticweb.owl.model.OWLDifferentIndividualsAxiom;
import org.semanticweb.owl.model.OWLDisjointClassesAxiom;
import org.semanticweb.owl.model.OWLEntity;
import org.semanticweb.owl.model.OWLEquivalentClassesAxiom;
import org.semanticweb.owl.model.OWLException;
import org.semanticweb.owl.model.OWLIndividual;
import org.semanticweb.owl.model.OWLObject;
import org.semanticweb.owl.model.OWLOntology;
import org.semanticweb.owl.model.OWLSameIndividualsAxiom;
import org.semanticweb.owl.model.change.AddClassAxiom;
import org.semanticweb.owl.model.change.AddEntity;
import org.semanticweb.owl.model.change.AddIndividualAxiom;
import org.semanticweb.owl.model.change.AddIndividualClass;
import org.semanticweb.owl.model.change.ChangeVisitor;
import org.semanticweb.owl.model.helper.OWLBuilder;
import org.semanticweb.owl.model.helper.OntologyHelper;
import org.xngr.browser.editor.XmlEditorPane;

/**
 * Created: Jan 09, 2006
 * @author Aditya Kalyanpur
 *
 */
public class Sudoku extends JFrame implements ActionListener, MouseListener {

	// Core Puzzle Parameters:
	static String SUDOKU_NS = "http://sudoku.owl";
	int dimen = 9; // default
	int subdim = (int) Math.sqrt(dimen);
	boolean useIndividuals = true; // default - use individuals for grids in OWL ontology
	boolean changed = false; //TEMP FIXME
	
	// UI:
	Font tahoma = new Font("Tahoma", Font.PLAIN, 11);
	JButton solBtn, clearBtn;
	JTable table;
	OWLOntology gridOnt;
	JMenuItem loadMItem, saveMItem, viewMItem, swoopMItem, changeMItem, defaultMItem1, defaultMItem2;
	JCheckBoxMenuItem useIndMItem, useClaMItem;
	
	// Swoop-related stuff:
	SwoopModel swoopModel;
	SwoopFrame swoopHandler;
	
	// Constructor:
	public Sudoku(int gridDimensions) {
		init(gridDimensions);		
	}
	
	public Sudoku(SwoopModel model, SwoopFrame handler, int gridDimensions) {
		this.swoopModel = model;
		this.swoopHandler = handler;
		init(gridDimensions);
	}
	
	private void init(int gridDimensions) {
		this.dimen = gridDimensions;
		this.subdim = (int) Math.sqrt(dimen);
		this.setupUI();		
	}
	
	private void setupUI() {
		
		Container content = this.getContentPane();
		// grid table
		TableModel dataModel = new AbstractTableModel() {
			  Object[][] tableContents = new Object[dimen+1][dimen+1];
	          public int getColumnCount() { return dimen; }
	          public int getRowCount() { return dimen;}
	          public Object getValueAt(int row, int col) { return tableContents[row][col]; }
	          public boolean isCellEditable(int row, int col) { return true; }
	          public void setValueAt(Object val, int row, int col) {
	          	tableContents[row][col] = val;
	          }	          
	     };
	     
	     table = new JTable(dataModel);
	     table.setFont(tahoma);
	     table.addMouseListener(this);
	     JScrollPane scrollpane = new JScrollPane(table);
	     // top panel UI
	     JLabel lbl = new JLabel("Sudoku Puzzle Grid");
	     lbl.setFont(tahoma);
	     clearBtn = new JButton("Clear Grid");
	     clearBtn.setFont(tahoma);
	     clearBtn.addActionListener(this);
	     solBtn = new JButton("Solve Puzzle using Pellet");
	     solBtn.setFont(tahoma);
	     solBtn.addActionListener(this);
	     JToolBar btnPanel = new JToolBar();
	     btnPanel.add(clearBtn);
	     btnPanel.add(solBtn);
	     JLabel explLbl = new JLabel("  (Right-click on grid cell to see explanation)");
	     explLbl.setFont(tahoma);
	     btnPanel.add(explLbl);
	     JPanel topPane = new JPanel();
	     topPane.setLayout(new BorderLayout());
	     topPane.add(lbl, "North");
	     topPane.add(scrollpane, "Center");
	     topPane.add(btnPanel, "South");
	     
	     content.setLayout(new GridLayout(1,1));
	     content.add(topPane);
	     
	     // setup menu bar
	     JMenuBar mbar = new JMenuBar();
	     JMenu fileMenu = new JMenu("File");
	     mbar.add(fileMenu);
	     loadMItem = new JMenuItem("Load Puzzle (.owl)");
	     saveMItem = new JMenuItem("Save Puzzle (.owl)");
	     fileMenu.add(loadMItem);
	     fileMenu.add(saveMItem);
	     JMenu gridMenu = new JMenu("Grid");
	     changeMItem = new JMenuItem("Change Dimensions...");
	     changeMItem.addActionListener(this);
	     gridMenu.add(changeMItem);
	     mbar.add(gridMenu);
	     JMenu defaultMenu = new JMenu("Samples");
	     defaultMItem1 = new JMenuItem("Sample 4X4 Puzzle");
	     defaultMItem1.addActionListener(this);
	     defaultMItem2 = new JMenuItem("Sample 9X9 Puzzle");
	     defaultMItem2.addActionListener(this);
	     defaultMenu.add(defaultMItem1);
	     defaultMenu.add(defaultMItem2);
	     mbar.add(defaultMenu);
	     JMenu owlMenu = new JMenu("OWL");
	     mbar.add(owlMenu);
	     viewMItem = new JMenuItem("View Source");
	     JMenu repMenu = new JMenu("Represent Grid Cells Using...");
	     useIndMItem = new JCheckBoxMenuItem("Individuals");
	     useIndMItem.setSelected(true); // default
	     useIndMItem.addActionListener(this);
	     useClaMItem = new JCheckBoxMenuItem("Classes");
	     useClaMItem.setSelected(false); // default
	     useClaMItem.addActionListener(this);
	     repMenu.add(useIndMItem);
	     repMenu.add(useClaMItem);
	     swoopMItem = new JMenuItem("Transfer OWL Ontology to Swoop");
	     owlMenu.add(repMenu);
	     owlMenu.addSeparator();
	     owlMenu.add(viewMItem);
	     owlMenu.add(swoopMItem);
	     loadMItem.addActionListener(this);
	     saveMItem.addActionListener(this);
	     viewMItem.addActionListener(this);
	     swoopMItem.addActionListener(this);
	     this.setJMenuBar(mbar);
	     
	     // setup main frame UI
	     this.setSize(450, 300);
	     this.setLocation(300, 100);
	     this.show();
	     this.setTitle("Sudoku using OWL");	     
	}
	
	public String getRDFXMLGridOnt() {
		String rdf = "";
		try {
			CorrectedRDFRenderer rdfRend = new CorrectedRDFRenderer();
			StringWriter st = new StringWriter();
			rdfRend.renderOntology(gridOnt, st);
			rdf = st.toString();
		}
		catch (OWLException ex) {
			ex.printStackTrace();
		}
		return rdf;
	}
	
	public void saveGridOntology() {
		try {
			FileWriter fw = new FileWriter(new File("sudoku.owl"));
			fw.write(this.getRDFXMLGridOnt());
			fw.close();
			System.out.println("Saved grid to file: sudoku.owl");
			JOptionPane.showMessageDialog(this, "Saved grid to file: sudoku.owl", "Saving Sudoko OWL Ontology", JOptionPane.INFORMATION_MESSAGE);
		}
		catch (Exception ex) {
			ex.printStackTrace();
		}
	}
	
	private void loadGridOntologyToSwoop() {
		try {
			this.generatePopulatedSudokuOWLGrid();
			swoopModel.addOntology(gridOnt);
		} 
		catch (Exception e) {
			e.printStackTrace();
		}
	}
	
	public void setGridValue(String ind1, String ind2) {
		try {
			Set entSet = new HashSet();
			if (this.useIndividuals) {
				entSet.add(gridOnt.getIndividual(new URI(SUDOKU_NS+ind1)));
				entSet.add(gridOnt.getIndividual(new URI(SUDOKU_NS+ind2)));
			}
			else {
				entSet.add(gridOnt.getClass(new URI(SUDOKU_NS+ind1)));
				entSet.add(gridOnt.getClass(new URI(SUDOKU_NS+ind2)));
			}
			this.makeEqual(entSet);
		}
		catch (Exception ex) {
			ex.printStackTrace();
		}
	}
	
	public void generatePopulatedSudokuOWLGrid() {
		
		// set useIndividuals based on user selection
		this.useIndividuals = this.useIndMItem.isSelected();
		
		// reset gridOnt
		this.generateEmptySudokuOWLGrid();
		
		// set individual values in gridOnt based on user inputs in table UI
		TableModel tm = table.getModel();
		for (int row = 1; row<=dimen; row++) {
			for (int col = 1; col<=dimen; col++) {
				if (tm.getValueAt(row-1, col-1)!=null) {
					String valStr = tm.getValueAt(row-1, col-1).toString();
					if (!valStr.equals("")) {
						valStr = "#"+valStr;
						// map (row, col) to (g, i, j)
						int g = ((row-1) / subdim) * subdim + 1 + ((int) (col-1) / subdim);
						int i = row % subdim;
						if (i==0) i = subdim;
						int j = col % subdim;
						if (j==0) j = subdim;
						String cellValue = "";
						if (this.useIndividuals) cellValue = "#V"+String.valueOf(g)+"_"+String.valueOf(i)+String.valueOf(j);
						else cellValue = "#C"+String.valueOf(g)+"_"+String.valueOf(i)+String.valueOf(j);
//						System.out.println("("+row+","+col+") translates to "+cellValue);
						this.setGridValue(cellValue, valStr);
					}
				}
			}
		}		
	}
	
	public OWLOntology generateEmptySudokuOWLGrid() {
		
		System.out.println("Generating sudoku grid of dimensions "+dimen+" X "+dimen+", with "+dimen +" sub-grids of dimension "+subdim+" X "+subdim);
		
		gridOnt = null;
		try {
			
			// initialize ontology
			OWLBuilder builder = new OWLBuilder();
			builder.createOntology(new URI(SUDOKU_NS), new URI(SUDOKU_NS));
			gridOnt = builder.getOntology();
			OWLDataFactory gridDF = gridOnt.getOWLDataFactory();
			
			// setup game grid
			// first init grid table array
			OWLObject[][][] grid = new OWLObject[dimen+1][subdim+1][subdim+1];
			Set gridEntities = new HashSet();
			// now create individuals (/classes) for each grid cell
			for (int g=1; g<=dimen; g++) {
				for (int i=1; i<=subdim; i++) {
					for (int j=1; j<=subdim; j++) {
						String gridCell = "";
						OWLEntity ent = null;
						if (this.useIndividuals) {
							gridCell = SUDOKU_NS+"#V"+ String.valueOf(g) + "_" + String.valueOf(i) + String.valueOf(j);
							ent = gridDF.getOWLIndividual(new URI(gridCell));
						}
						else {
							gridCell = SUDOKU_NS+"#C"+ String.valueOf(g) + "_" + String.valueOf(i) + String.valueOf(j);
							ent = gridDF.getOWLClass(new URI(gridCell));
						}
						
						AddEntity ae = new AddEntity(gridOnt, ent, null);
						ae.accept((ChangeVisitor) gridOnt);
						
						//*** add corresponding elements to grid sets ***
						grid[g][i][j] = ent;
						gridEntities.add(ent);
						
						if (this.useIndividuals) {
							// create dummy classes to see results in pellet online demo
							OWLClass cla = gridDF.getOWLClass(new URI(SUDOKU_NS+"#C"+ String.valueOf(g) + "_" + String.valueOf(i) + String.valueOf(j)));
							ae = new AddEntity(gridOnt, cla, null);
							ae.accept((ChangeVisitor) gridOnt);
							AddIndividualClass ai = new AddIndividualClass(gridOnt, (OWLIndividual) ent, cla, null);
							ai.accept((ChangeVisitor) gridOnt);
						}
						else {
							// create dummy individuals for each class
							OWLIndividual ind = gridDF.getOWLIndividual(new URI(SUDOKU_NS+"#V"+ String.valueOf(g) + "_" + String.valueOf(i) + String.valueOf(j)));

⌨️ 快捷键说明

复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?