📄 knightstour.java
字号:
csq[currentSquare].update(csq[currentSquare].getGraphics());
path[unvisited]=moves+2;
csq[unvisited].num = moves+2;
csq[unvisited].repaint();
break;
}
}
} else {
// System.out.println("Failed to find solution");
// System.exit(1);
return;
}
return ;
}
}
public class KnightsTour extends Applet {
boolean inApplet = false;
int width = 280;
int height = 180;
public static void main(String argv[]){
int i = 0;
int N = 250;
if(argv.length > 0) {
try {
N = Integer.parseInt(argv[0]);
} catch (NumberFormatException e) {
System.out.println(e.getMessage());
System.exit(1);
}
}
int path[];
Board board = null;
MyFrame fr= new MyFrame();
fr.setLayout(new GridLayout(8,8));
fr.board = board;
CSquare sqr[] = new CSquare[64];
for(i = 0; i < 64; i++) {
sqr[i] = new CSquare();
sqr[i].id = i;
fr.add(sqr[i]);
}
fr.csq = sqr;
fr.validate();
fr.resize(200,200);
fr.show();
}
MyFrame frame;Board board;
Button fast,slow,show,hide;
public void init(){
inApplet = true;
int i = 0;
int N = 0;
setLayout(new BorderLayout());
fast = new Button("Faster");
slow = new Button("Slower");
show = new Button("Show");
hide = new Button("Hide");
hide.disable();
Panel p = new Panel();
p.add(fast); p.add(slow);p.add(show); p.add(hide);
add("South",p);
frame = new MyFrame();
frame.setLayout(new GridLayout(8,8));
frame.board = board;
frame.inApplet = true;
frame.show = show;
frame.hide = hide;
CSquare sqr[] = new CSquare[64];
frame.csq = sqr;
for(i = 0; i < 64; i++) {
sqr[i] = new CSquare();
sqr[i].id = i;
frame.add(sqr[i]);
}
width = size().width; height = size().height;
resize(width,height);
frame.resize(200,200);
board = null;
}
public Dimension minimumSize(){
return new Dimension(width,height);
}
public Dimension preferredSize(){
return minimumSize();
}
public void paint(Graphics g){
g.drawRect(0,0,size().width-1,140);
String s = "Knight's Tour";
g.setFont(new Font("Serif",Font.ITALIC,24));
FontMetrics fm = g.getFontMetrics();
int len = fm.stringWidth(s);
g.drawString(s,(size().width-len)/2,50);
g.setFont(new Font("Arial",Font.BOLD,12));
fm = g.getFontMetrics();
s = "Click on Show button to see Chess Board";
len = fm.stringWidth(s);
g.drawString(s,(size().width-len)/2,75);
s = "Click on any square to start tour from that square";
len = fm.stringWidth(s);
g.drawString(s,(size().width-len)/2,100);
s = "After the start, click on any square to stop";
len = fm.stringWidth(s);
g.drawString(s,(size().width-len)/2,125);
}
int interval = 250;
public boolean handleEvent(Event e) {
Object target = e.target;
if(e.id == Event.ACTION_EVENT){
if(e.target == show){
frame.show();
show.disable();
hide.enable();
return true;
}
if(e.target == hide){
frame.hide();
hide.disable();
show.enable();
return true;
}
if(e.target == fast){
if(board != null) {
board.delayInterval -= 50;
if(board.delayInterval < 50) board.delayInterval = 50;
}else {
frame.interval -= 50;
if(frame.interval < 50) frame.interval = 50;
}
return true;
}
if(e.target == slow){
if(board != null) {
board.delayInterval += 50;
if(board.delayInterval >2000) board.delayInterval = 2000;
} else {
frame.interval += 50;
if(frame.interval > 2000) frame.interval = 2000;
}
return true;
}
}
return super.handleEvent(e);
}
public void stop(){
frame.hide();
show.enable();
hide.disable();
}
}
class MyFrame extends Frame {
Board board;
CSquare csq[];
boolean inApplet = false;
int interval = 250;
Button show,hide;
public MyFrame(){
super("Knight's Tour");
}
// Deprecated in Java 1.1 onwards. Use event listners instead
public boolean handleEvent(Event event) {
if((event.id >= 5000)&&(event.id < 5064)){
if((board != null)&& board.running) {
csq = board.csq;
board.stop();
board = null;
return true;
}
if((board != null) && !board.running) board = null;
if(board == null) {
board = new Board();
board.csq = csq;
board.stsq = event.id-5000+1;
board.delayInterval = interval;
board.start();
}
}
if(!inApplet && (event.id == Event.WINDOW_DESTROY)) {
dispose();
System.exit(0); // necessary we should go to DOS prompt
return super.handleEvent(event);
}
if(inApplet && (event.id == Event.WINDOW_DESTROY)) {
hide();
show.enable();
hide.disable();
return true ;
}
return super.handleEvent(event);
}
}
class CSquare extends Canvas{
int h,w;
int id;
int num = -1;
int hval = -1;
CSquare(int w, int h){
this.w = w; this.h = h;
}
CSquare(){
h = 18;
w = 18;
}
synchronized public void paint(Graphics g){
w = size().width;h = size().height;
int r = id/8;
int c = (id%8);
if(hval == -1){
if( ((r+c)%2) == 0) g.setColor(Color.lightGray);
else
g.setColor(Color.gray /* new Color(192,192,192)*/);
}
else g.setColor(Color.red);
g.fillRect(0,0,w,h);
g.setColor(Color.black);
g.drawRect(1,1,w-1,h-1);
String s ;
if(num != -1){
s = num+"";
int len = g.getFontMetrics().stringWidth(s);
int ht = g.getFontMetrics().getHeight();
if( ((r+c)%2) == 0) g.setColor(Color.black);
else
g.setColor(Color.white);
g.drawString(s,(w-len)/2,(h+ht)/2);
}
}
public void update(Graphics g){
paint(g);
}
// Deprecated in Java 1.1 onwards. Use new Event model
synchronized public boolean handleEvent(Event e) {
Object target = e.target;
if(e.id == Event.MOUSE_UP){
// System.out.println("up");
getParent().deliverEvent(new Event(getParent(),5000+id,null));
return true;
}
return super.handleEvent(e);
}
// Deprecated in Java 1.1 onwards. Use get functions
public Dimension minimumSize() {
return new Dimension(w,h);
}
public Dimension preferredSize() {
return minimumSize();
}
}
// Improvements in packaging 22/04/98
// The author welcomes your comments
// V P Desai
// 6 Pushpamedh
// 39/40 Tulsibagwale Colony
// Parvati
// Pune 411 004
// India
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -