简易黑白棋--我的第一个程序

类别:Java 点击:0 评论:0 推荐:

/**
 * @author [email protected] On Oct.23,2004 12:00
 *
 * TODO To change the template for this generated type comment go to Window -
 * Preferences - Java - Code Generation - Code and Comments
 */

 

import java.awt.*;
import java.awt.event.*;

import javax.swing.*;

public class First extends JFrame {

    public First() {
       
        DrawPane drawPane = new DrawPane(getBackground());
        Container pane = getContentPane();
        pane.add(drawPane, BorderLayout.CENTER);
        setSize(600, 580);
        //f.setExtendedState(JFrame.MAXIMIZED_BOTH);
        //f.setUndecorated(true);
        //f.setAlwaysOnTop(true);
        //f.setLocationByPlatform(true);

        setLocation(208, 104);
        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        //setBackground(Color.PINK);
        setResizable(false);
        setVisible(true);
    }

    public static void main(String[] args) {
        new First();
    }
}

class DrawPane extends JPanel {
    private Insets insets;

    final static int BLACK = -1;

    final static int WHITE = 1;

    private Point point = null;

    private int colorStatus;

    private int[][] status = null;

    private int count;

    private int chessNum;

    private JTextArea infoText = null;

    private int[][] statusW = null;

    private int level=1 ;

    private int whiteCount=0;

    private int blackCount=0;
    private Color bgColor=null;
    public DrawPane(Color c) {

        initComponent();
        initChess();
        bgColor=c;
        addMouseListener(new MouseAdapter() {
            public void mouseClicked(MouseEvent e) {
                response(e.getPoint());
            }
        });
        setFocusable(true);
        addKeyListener(new myKeyListener());
    }

    public void paintComponent(Graphics g) {
        super.paintComponent(g);
        if (insets == null) {
            insets = getInsets();
        }
        //super.paintComponents(g);
        Graphics2D g2d = (Graphics2D) g;
        g2d.setColor(Color.orange);
        g2d.fill3DRect(50, 50, 400, 400, true);
        g2d.setColor(Color.RED);
        for (int i = 0; i < 8; i++) {
            for (int j = 0; j < 8; j++) {
                g2d.drawString(i + "", 50 * i + 75, 45);
                g2d.drawString(j + "", 40, 50 * j + 75);
                g2d.drawRect(50 + 50 * i, 50 + 50 * j, 50, 50);
                if (status[i][j] == BLACK) {
                    g2d.setColor(Color.BLACK);
                    g2d.fillOval(i * 50 + 53, j * 50 + 53, 44, 44);
                }
                if (status[i][j] == WHITE) {
                    g2d.setColor(Color.WHITE);
                    g2d.fillOval(i * 50 + 53, j * 50 + 53, 44, 44);
                }
                if (status[i][j] > 1) {
                    //                    g2d.setColor(Color.BLUE);
                    //                                        g2d.drawString("" + (status[i][j] - 1), i * 50 + 75,
                    //                                                j * 50 + 75);
                    g2d.drawString("X", i * 50 + 75, j * 50 + 75);
                }

                g2d.setColor(Color.BLACK);
                g2d.fillOval(200, 470, 30, 30);

                g2d.setColor(Color.WHITE);
                g2d.fillOval(300, 470, 30, 30);

                g2d.setColor(bgColor);
                g2d.fillRect(240, 470, 60, 30);
                g2d.fillRect(340, 470, 60, 30);
                g2d.setColor(Color.RED);
                g2d.drawString("" + blackCount, 240, 490);
                g2d.drawString("" + whiteCount, 340, 490);

            }
        }
        //jug(colorStatus);
    }

    public void initComponent() {       
        infoText = new JTextArea();       
        setLayout(new BorderLayout());
        infoText.setEditable(false);
        //infoText.setBackground(Color.PINK);
        infoText.setForeground(Color.BLACK);
        JScrollPane jsp = new JScrollPane(infoText);
        JPanel infoPanel = new JPanel(new BorderLayout());
        //infoPanel.setBackground(Color.PINK);
        infoPanel.add(jsp, BorderLayout.CENTER);

        infoPanel.add(new JLabel("  "), BorderLayout.NORTH);
        infoPanel.add(new JLabel("  "), BorderLayout.SOUTH);

        add(infoPanel, BorderLayout.EAST);

    }

    public void initChess() {
       
      
        chessNum = 4;
        count = 0;
        colorStatus = BLACK;
        status = new int[8][8];
        status[3][3] = BLACK;
        status[4][4] = BLACK;
        status[3][4] = WHITE;
        status[4][3] = WHITE;
        statusW = new int[8][8];
        for (int i = 0; i < 8; i++) {
            for (int j = 0; j < 8; j++) {
                statusW[i][j] = 2;
            }
        }

        for (int i = 0; i < 4; i++) {
            statusW[i + 2][0] = 3;
            statusW[i + 2][1] = 1;
            statusW[i + 2][7] = 3;
            statusW[i + 2][6] = 1;
            statusW[0][i + 2] = 3;
            statusW[1][i + 2] = 1;
            statusW[7][i + 2] = 3;
            statusW[6][i + 2] = 1;
        }
        for (int i = 0; i < 2; i++) {
            for (int j = 0; j < 2; j++) {
                statusW[i][j] = 0;
                statusW[7 - i][j] = 0;
                statusW[i][7 - j] = 0;
                statusW[7 - i][7 - j] = 0;
            }
        }
        statusW[0][0] = 4;
        statusW[0][7] = 4;
        statusW[7][0] = 4;
        statusW[7][7] = 4;

        jug(colorStatus);
        String msg="  F1:   级别1\n  F2:   级别2\n  F3:   重新开始";
        infoText.setText(msg+"             \n");
        repaint();
    }

    public void response(Point p) {
        boolean interrupt = false;
        point = setPoint(p);
        if (point != null) {
            int x = point.x / 50 - 1;
            int y = point.y / 50 - 1;

            if (check(x, y, colorStatus) > 0) {

                manulChess(x, y, BLACK);
                if (level == 1) {
                    autoChess(WHITE);
                } else {
                    autoChess(WHITE, 2);
                }
                if (blPass()) {
                    if (!blPass()) {
                        repaint();
                    } else {
                        interrupt = true;
                    }
                }
                if (blOver(interrupt)) {
                    initChess();
                }
            }

        }

    }

    public Point setPoint(Point p) {
        if (p.x < 50 || p.x > 450 || p.y < 50 || p.y > 450) {
            return null;
        } else {
            p.x = (p.x / 50) * 50;
            p.y = (p.y / 50) * 50;
            return p;
        }
    }

    public boolean change(int i, int j, int sta) {

        boolean flag = false;

        //north
        if (j != 0) {
            if (sta != status[i][j - 1] && 1 == Math.abs(status[i][j - 1])) {
                int m = j - 1;
                while (status[i][j - 1] == status[i][m] && m > 0) {
                    m--;
                    //                    System.out.println(m);
                }
                if (status[i][m] == sta) {
                    flag = true;
                    for (int n = j - 1; n > m; n--) {
                        status[i][n] = sta;
                        //                        System.out.println("[" + i + "," + n + "]"
                        //                                + status[i][n]);
                    }
                }
            }
        }

        //south
        if (j != 7) {
            if (sta != status[i][j + 1] && 1 == Math.abs(status[i][j + 1])) {
                int m = j + 1;
                while (status[i][j + 1] == status[i][m] && m < 7) {
                    m++;
                    //                    System.out.println(m);
                }
                if (status[i][m] == sta) {
                    flag = true;
                    for (int n = j + 1; n < m; n++) {
                        status[i][n] = sta;
                        //                        System.out.println("[" + i + "," + n + "]"
                        //                                + status[i][n]);
                    }
                }

            }
        }

        //west
        if (i != 0) {
            if (sta != status[i - 1][j] && 1 == Math.abs(status[i - 1][j])) {
                int m = i - 1;
                while (status[i - 1][j] == status[m][j] && m > 0) {
                    m--;
                    //                    System.out.println(m);
                }
                if (status[m][j] == sta) {
                    flag = true;
                    for (int n = i - 1; n > m; n--) {
                        status[n][j] = sta;
                        //                        System.out.println("[" + n + "," + j + "]"
                        //                                + status[n][j]);
                    }
                }
            }
        }

        //east
        if (i != 7) {
            if (sta != status[i + 1][j] && 1 == Math.abs(status[i + 1][j])) {
                int m = i + 1;
                while (status[i + 1][j] == status[m][j] && m < 7) {
                    m++;
                    //                    System.out.println(m);
                }
                if (status[m][j] == sta) {
                    flag = true;
                    for (int n = i + 1; n < m; n++) {
                        status[n][j] = sta;
                        //                        System.out.println("[" + n + "," + j + "]"
                        //                                + status[n][j]);
                    }
                }

            }
        }

        //northwest
        if (j != 0 && i != 0) {
            if (sta != status[i - 1][j - 1]
                    && 1 == Math.abs(status[i - 1][j - 1])) {
                int m = i - 1;
                int n = j - 1;
                while (status[i - 1][j - 1] == status[m][n] && m > 0 && n > 0) {
                    m--;
                    n--;
                    //                    System.out.println("m=" + m + " n=" + n);
                }
                if (status[m][n] == sta) {
                    flag = true;
                    for (int x = i - 1, y = j - 1; x > m; x--, y--) {
                        //  for (int y = j - 1; y > n; y--) {
                        status[x][y] = sta;
                        //                        System.out.println("[" + x + "," + y + "]"
                        //                                + status[x][y]);
                        // }

                    }
                }
            }
        }

        //southeast
        if (j != 7 && i != 7) {
            if (sta != status[i + 1][j + 1]
                    && 1 == Math.abs(status[i + 1][j + 1])) {
                int m = i + 1;
                int n = j + 1;
                while (status[i + 1][j + 1] == status[m][n] && m < 7 && n < 7) {
                    m++;
                    n++;
                    //                    System.out.println("m=" + m + " n=" + n);
                }
                if (status[m][n] == sta) {
                    flag = true;
                    for (int x = i + 1, y = j + 1; x < m; x++, y++) {
                        //  for (int y = j + 1; y < n; y++) {
                        status[x][y] = sta;
                        //                        System.out.println("[" + x + "," + y + "]"
                        //                                + status[x][y]);
                        // }

                    }
                }
            }
        }

        //northeast
        if (j != 0 && i != 7) {
            if (sta != status[i + 1][j - 1]
                    && 1 == Math.abs(status[i + 1][j - 1])) {
                int m = i + 1;
                int n = j - 1;
                while (status[i + 1][j - 1] == status[m][n] && m < 7 && n > 0) {
                    m++;
                    n--;
                    //                    System.out.println("m=" + m + " n=" + n);
                }
                if (status[m][n] == sta) {
                    flag = true;
                    for (int x = i + 1, y = j - 1; x < m; x++, y--) {
                        //  for (int y = j - 1; y > n; y--) {
                        status[x][y] = sta;
                        //                        System.out.println("[" + x + "," + y + "]"
                        //                                + status[x][y]);
                        // }

                    }
                }
            }
        }

        //southwest
        if (j != 7 && i != 0) {
            if (sta != status[i - 1][j + 1]
                    && 1 == Math.abs(status[i - 1][j + 1])) {
                int m = i - 1;
                int n = j + 1;
                while (status[i - 1][j + 1] == status[m][n] && m > 0 && n < 7) {
                    m--;
                    n++;
                    //                    System.out.println("m=" + m + " n=" + n);
                }
                if (status[m][n] == sta) {
                    flag = true;

                    for (int x = i - 1, y = j + 1; x > m; x--, y++) {
                        // for (int y = j + 1; y < n; y++) {

                        status[x][y] = sta;
                        //                        System.out.println("[" + x + "," + y + "]"
                        //                                + status[x][y]);
                        //}

                    }
                }
            }
        }
        return flag;

    }

    public int check(int i, int j, int sta) {

        int flag = 0;
        if (Math.abs(status[i][j]) == 1) {
            return 0;
        }

        //north
        if (j != 0) {
            if (sta != status[i][j - 1] && 1 == Math.abs(status[i][j - 1])) {
                int m = j - 1;
                while (status[i][j - 1] == status[i][m] && m > 0) {
                    m--;
                    //                    System.out.println(m);
                }
                if (status[i][m] == sta) {
                    flag = flag + (j - 1 - m);
                }
            }
        }

        //south
        if (j != 7) {
            if (sta != status[i][j + 1] && 1 == Math.abs(status[i][j + 1])) {
                int m = j + 1;
                while (status[i][j + 1] == status[i][m] && m < 7) {
                    m++;
                    //                    System.out.println(m);
                }
                if (status[i][m] == sta) {
                    flag = flag + (m - j - 1);
                }

            }
        }

        //west
        if (i != 0) {
            if (sta != status[i - 1][j] && 1 == Math.abs(status[i - 1][j])) {
                int m = i - 1;
                while (status[i - 1][j] == status[m][j] && m > 0) {
                    m--;
                    //                    System.out.println(m);
                }
                if (status[m][j] == sta) {
                    flag = flag + (i - 1 - m);

                }
            }
        }

        //east
        if (i != 7) {
            if (sta != status[i + 1][j] && 1 == Math.abs(status[i + 1][j])) {
                int m = i + 1;
                while (status[i + 1][j] == status[m][j] && m < 7) {
                    m++;
                    //                    System.out.println(m);
                }
                if (status[m][j] == sta) {
                    flag = flag + (m - i - 1);

                }

            }
        }

        //northwest
        if (j != 0 && i != 0) {
            if (sta != status[i - 1][j - 1]
                    && 1 == Math.abs(status[i - 1][j - 1])) {
                int m = i - 1;
                int n = j - 1;
                while (status[i - 1][j - 1] == status[m][n] && m > 0 && n > 0) {
                    m--;
                    n--;
                    //                    System.out.println("m=" + m + " n=" + n);
                }
                if (status[m][n] == sta) {
                    flag = flag + (i - 1 - m);

                }
            }
        }

        //southeast
        if (j != 7 && i != 7) {
            if (sta != status[i + 1][j + 1]
                    && 1 == Math.abs(status[i + 1][j + 1])) {
                int m = i + 1;
                int n = j + 1;
                while (status[i + 1][j + 1] == status[m][n] && m < 7 && n < 7) {
                    m++;
                    n++;
                    //                    System.out.println("m=" + m + " n=" + n);
                }
                if (status[m][n] == sta) {
                    flag = flag + (m - i - 1);

                }
            }
        }

        //northeast
        if (j != 0 && i != 7) {
            if (sta != status[i + 1][j - 1]
                    && 1 == Math.abs(status[i + 1][j - 1])) {
                int m = i + 1;
                int n = j - 1;
                while (status[i + 1][j - 1] == status[m][n] && m < 7 && n > 0) {
                    m++;
                    n--;
                    //                    System.out.println("m=" + m + " n=" + n);
                }
                if (status[m][n] == sta) {
                    flag = flag + (j - 1 - n);

                }
            }
        }

        //southwest
        if (j != 7 && i != 0) {
            if (sta != status[i - 1][j + 1]
                    && 1 == Math.abs(status[i - 1][j + 1])) {
                int m = i - 1;
                int n = j + 1;
                while (status[i - 1][j + 1] == status[m][n] && m > 0 && n < 7) {
                    m--;
                    n++;
                    //                    System.out.println("m=" + m + " n=" + n);
                }
                if (status[m][n] == sta) {
                    flag = flag + (i - 1 - m);

                }
            }
        }
        return flag;

    }

    public void release() {
        for (int i = 0; i < 8; i++) {
            for (int j = 0; j < 8; j++) {
                if (status[i][j] > 1) {
                    status[i][j] = 0;
                }
            }
        }
    }

    public boolean jug(int color) {
        //Hashtable table=new Hashtable();
        int flag = 0;
        int isPass = 0;
        for (int i = 0; i < 8; i++) {
            for (int j = 0; j < 8; j++) {
                if (status[i][j] == 0) {
                    flag = check(i, j, color);
                    {
                        if (flag != 0) {
                            status[i][j] = flag + 1;
                            isPass++;
                        }
                    }

                } else {
                    flag = 0;
                }

            }
        }
        if (isPass > 0) {
            return true;
        } else {
            return false;
        }

    }

    public boolean blOver(boolean interrupt) {
        String msg = "";
        whiteCount=0;
        blackCount=0;
        for (int i = 0; i < 8; i++) {
            for (int j = 0; j < 8; j++) {
                if (status[i][j] == BLACK) {
                    blackCount++;
                }
                if (status[i][j] == WHITE) {
                    whiteCount++;
                }
            }
        }
        if ((whiteCount + blackCount) == 64 || blackCount == 0
                || whiteCount == 0 || interrupt) {

            if (whiteCount > blackCount) {
                msg = "白方胜!白方:黑方=" + whiteCount + ":" + blackCount;
            } else {
                msg = "黑方胜!黑方:白方" + blackCount + ":" + whiteCount;
            }
            JOptionPane.showConfirmDialog(this, msg, "Game Over",
                    JOptionPane.CLOSED_OPTION);
            return true;
        } else {
            return false;
        }

    }

    public boolean blPass() {
        if (chessNum >= 64) {
            return false;
        }
        if (!jug(colorStatus)) {
            JOptionPane.showMessageDialog(null, "pass");
            colorStatus = -colorStatus;
            count++;
            infoText.append(count + ":     --\n");
            return true;
        } else {
            return false;
        }
    }

    public void manulChess(int x, int y, int color) {
        if (colorStatus == color) {
            release();
            if (status[x][y] == 0) {
                status[x][y] = colorStatus;

            }
            change(x, y, colorStatus);
            repaint();
            count++;
            chessNum++;
            String value = "" + x + "*" + y;
            infoText.append(count + ":     " + value + "\n");
            colorStatus = -colorStatus;
        }
    }

    public void autoChess(int color) {
        if (colorStatus == color) {
            int flag = 0;
            int x = 0;
            int y = 0;
            for (int i = 0; i < 8; i++) {
                for (int j = 7; j >= 0; j--) {
                    int temp = check(i, j, colorStatus);
                    if (temp > flag) {
                        flag = temp;
                        x = i;
                        y = j;
                    }
                }
            }
            if (flag > 0) {
                if (status[x][y] == 0) {
                    status[x][y] = color;

                }
                change(x, y, colorStatus);
                repaint();
                colorStatus = -colorStatus;
                count++;
                chessNum++;
                String value = "" + x + "*" + y;
                infoText.append(count + ":     " + value + "\n");
            } else {
                colorStatus = -colorStatus;
            }
        }
    }

    public void autoChess(int color, int level) {
        if (colorStatus == color && level == 2) {
            int flag = -1;
            int x = -1;
            int y = -1;
            for (int i = 0; i < 8; i++) {
                for (int j = 7; j >= 0; j--) {
                    if (status[i][j] == 0 && statusW[i][j] > flag) {
                        if (check(i, j, colorStatus) > 0) {
                            flag = statusW[i][j];
                            x = i;
                            y = j;
                        }
                    }

                }
            }
            if (flag >= 0 && x > -1 && y > -1) {
                if (status[x][y] == 0) {
                    status[x][y] = color;

                }
                change(x, y, colorStatus);
                repaint();
                colorStatus = -colorStatus;
                count++;
                chessNum++;
                String value = "" + x + "*" + y;
                infoText.append(count + ":     " + value + "\n");
            } else {
                colorStatus = -colorStatus;
            }
        }
    }

    class myKeyListener extends KeyAdapter {
        public void keyPressed(java.awt.event.KeyEvent e) {
            System.out.println(e.getKeyChar());
            if (e.getKeyCode() == KeyEvent.VK_F5) {
                initChess();

            }
            if (e.getKeyCode() == KeyEvent.VK_F1) {
                level = 1;
                initChess();
            }
            if (e.getKeyCode() == KeyEvent.VK_F2) {
                level = 2;
                initChess();
            }
        }
    }
}

本文地址:http://com.8s8s.com/it/it14377.htm