⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 chess.java

📁 八皇后源代码 JAVA课设 应该满足您的要求
💻 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 + -