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 + -
显示快捷键?