📄 chess.java
字号:
/*
* Chess.java
*
* Created on 2008年3月5日, 下午1:02
*
* To change this template, choose Tools | Template Manager
* and open the template in the editor.
*/
package eight;
import javax.swing.*;
import java.awt.*;
import javax.swing.*;
import java.awt.event.*;
/**
*
* @author 刘杨
*/
public class Chess extends JButton{
private boolean ChessBoolean;
private boolean ChessSetBoolean;
private ImageIcon queen1=new ImageIcon("queen1.jpg");
private ImageIcon queen2=new ImageIcon("queen2.jpg");
private ImageIcon noqueen1=new ImageIcon("noqueen1.jpg");
private ImageIcon noqueen2=new ImageIcon("noqueen2.jpg");
private ImageIcon flict1=new ImageIcon("flict1.jpg");
private ImageIcon flict2=new ImageIcon("flict2.jpg");
private ImageIcon indicate1=new ImageIcon("indicate1.jpg");
private ImageIcon indicate2=new ImageIcon("indicate2.jpg");
public ChessPanel panel;
public int m;
private int counter;
private boolean success;
/** Creates a new instance of Chess */
public Chess(ChessPanel panel) {
this.panel = panel;
ChessBoolean=false;//false代表该位置不与其他棋子冲突
ChessSetBoolean=false;//FALSE代表该位置尚未放置棋子
m=panel.getm();
}
public void act(int i,int j) {
//鼠标点击
counter=0;
panel.setpanelagain(m);
if(ChessSetBoolean==false){//如果该位置未放置棋子且可放棋子
if(flict(i,j)==false){//如果该位置不与其他棋子冲突
if(judge(i,j)==false){//如果该位置类型属于第一种
setpic(3);
panel.ChessButton[i][j].ChessSetBoolean=true;} else {//如果该位置类型属于第二种
setpic(4);
ChessSetBoolean=true;}
} else {//如果该位置与其他棋子冲突
search(i,j,this.m);
}
} else if(ChessSetBoolean==true){//如果该位置放置了棋子
if(flict(i,j)==false){//如果该位置不与其他棋子冲突
if(judge(i,j)==false) {//如果该位置类型属于第一种
setpic(1);
ChessSetBoolean=false;
} else{
setpic(2);
ChessSetBoolean=false;
}
} else{//如果该位置与其他棋子冲突
search(i,j,this.m);
}
}
for(int x=0;x<m;x++){
for(int y=0;y<m;y++) {
if(flict(x,y)==false&&panel.ChessButton[x][y].ChessSetBoolean==true)
counter+=1;
}
}
if(counter==m){
panel.setsuccess(true);
}
}
private void search(int r,int c,int m) {
for(int i=0;i<m;i++){
for(int j=0;j<m;j++) {
if((panel.ChessButton[i][j].ChessSetBoolean==true)&&!(i==r&&j==c))
//行列冲突
if(i==r||j==c)
flictsetpic(i,j,r,c);
//对角线冲突
else {
for(int w=1;r-w>=0 && c-w>=0;w++)
if(r-w==i&&c-w==j)
flictsetpic(i,j,r,c);
for(int w=1;r+w<m &&c+w<m;w++)
if(r+w==i&&c+w==j)
flictsetpic(i,j,r,c);
//判断右对角线
for(int w=1;r-w>=0 && c+w<m;w++)
if(r-w==i&&c+w==j)
flictsetpic(i,j,r,c);
for(int w=1;r+w<m && c-w>=0;w++)
if(r+w==i&&c-w==j)
flictsetpic(i,j,r,c);
}
}
}
if(panel.ChessButton[r][c].ChessSetBoolean==false){//如果该位置尚未放置棋子
panel.ChessButton[r][c].ChessBoolean=true;
panel.ChessButton[r][c].ChessSetBoolean=true;} else{//如果该位置已放置棋子
panel.ChessButton[r][c].ChessBoolean=false;
panel.ChessButton[r][c].ChessSetBoolean=false;}
}
public boolean judge(int m,int n) {
//判断属于哪种类型
boolean s = false;
int i=m,j=n;
if((i+j)%2 == 0)
s=true;
else
s= false;
return s;
}
public boolean flict(int r,int c){
boolean s = false;
for(int i=0;i<m;i++){
for(int j=0;j<m;j++) {
if((panel.ChessButton[i][j].ChessSetBoolean==true)&&!(i==r&&j==c)){
//行列冲突
if(i==r||j==c){
s=true;
}
//对角线冲突
else{ //判断左对角线
for(int w=1;r-w>=0 && c-w>=0;w++)
if(r-w==i&&c-w==j)
s=true;
for(int w=1;r+w<m &&c+w<m;w++)
if(r+w==i&&c+w==j)
s=true;
//判断右对角线
for(int w=1;r-w>=0 && c+w<m;w++)
if(r-w==i&&c+w==j)
s=true;
for(int w=1;r+w<m && c-w>=0;w++)
if(r+w==i&&c-w==j)
s=true;
}
}
}
}
return s;
}
public void flictsetpic(int i,int j,int r,int c){
if(panel.ChessButton[r][c].ChessSetBoolean==false){//如果该位置尚未放置棋子
panel.ChessButton[i][j].ChessBoolean=true;
if(judge(i,j)==false)
panel.ChessButton[i][j].setpic(5);
else
panel.ChessButton[i][j].setpic(6);
if(judge(r,c)==false)
panel.ChessButton[r][c].setpic(5);
else
panel.ChessButton[r][c].setpic(6);
} else{//如果该位置已放置棋子
if(flict(i,j)==false||flictexact(i,j)==1){
if(judge(i,j)==false)
panel.ChessButton[i][j].setpic(3);
else
panel.ChessButton[i][j].setpic(4);
panel.ChessButton[i][j].ChessBoolean=false;}
if(judge(r,c)==false)
panel.ChessButton[r][c].setpic(1);
else
panel.ChessButton[r][c].setpic(2);
}
}
public void setpic(int m){
switch(m){
case 1:
this.setIcon(noqueen1);
break;
case 2:
this.setIcon(noqueen2);
break;
case 3:
this.setIcon(queen1);
break;
case 4:
this.setIcon(queen2);
break;
case 5:
this.setIcon(flict1);
break;
case 6:
this.setIcon(flict2);
break;
case 7:
this.setIcon(indicate1);
break;
case 8:
this.setIcon(indicate2);
break;
}
}
public void refresh() {
this.ChessBoolean=false;
this.ChessSetBoolean=false;
}
private int flictexact(int r, int c) {
int s=0;
for(int i=0;i<m;i++){
for(int j=0;j<m;j++) {
if((panel.ChessButton[i][j].ChessSetBoolean==true)&&!(i==r&&j==c)){
//行列冲突
if(i==r||j==c){
s+=1;
}
//对角线冲突
else{
for(int w=1;r-w>=0 && c-w>=0;w++)
if(r-w==i&&c-w==j)
s+=1;
for(int w=1;r+w<m &&c+w<m;w++)
if(r+w==i&&c+w==j)
s+=1;
//判断右对角线
for(int w=1;r-w>=0 && c+w<m;w++)
if(r-w==i&&c+w==j)
s+=1;
for(int w=1;r+w<m && c-w>=0;w++)
if(r+w==i&&c-w==j)
s+=1;
}
}
}
}
return s;
}
public boolean getChessSetBoolean(){
return ChessSetBoolean;
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -