java实现五子棋游戏GUI

java实现五子棋游戏GUI

引用包

//{Cynthia Zhang}
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
import javax.swing.border.LineBorder;
import javax.swing.JOptionPane;
import javax.swing.ImageIcon;
import java.awt.Image;
import com.sun.image.codec.jpeg.*;

前期预设

//extends JApplet {

    // Indicate which player has a turn, initially it is the X player
    private char whoseTurn = 'X';
    final int SIZE = 15;
    static boolean ISOVER = false;

    // Create and initialize cells
    private final Cell[][] cell = new Cell[SIZE][SIZE];

    // Create and initialize a status label
    private final JLabel jlblStatus = new JLabel("X's turn to play",JLabel.CENTER);

设置背景板

    // Initialize UI
    @Override
    public void init() {
        // Panel p to hold cells
        JPanel p = new JPanel();
        p.setLayout(new GridLayout(SIZE, SIZE, 0, 0));
        for (int i = 0; i < SIZE; i++) {
            for (int j = 0; j < SIZE; j++) {
                Cell ce = new Cell();
                ce.setBackground(new Color(150,88,42));  // 背景色绝美!
                p.add(cell[i][j] = ce);
            }
        }
        // Set line borders on the cells panel and the status label
        p.setBackground(new Color(143,105,94));  // 背景色绝美!
        jlblStatus.setBorder(new LineBorder(new Color(255,255,255), 2));  // 白框框加宽!
        
        // Place the panel and the label to the applet
        this.getContentPane().add(p, BorderLayout.CENTER);
        this.getContentPane().add(jlblStatus, BorderLayout.SOUTH);
    }

主要框架段落

    // This main method enables the applet to run as an application
    public static void main(String[] args) {
        // Create a frame
        JFrame frame = new JFrame("Tic Tac Toe");

        // Create an instance of the applet
        Homework8 applet = new Homework8();

        // Add the applet instance to the frame
        frame.getContentPane().add(applet, BorderLayout.CENTER);

        // Invoke init() and start()
        applet.init();
        applet.start();

        // Display the frame
        frame.setSize(600, 600);
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frame.setVisible(true);
    }

判断是否满了

    // Determine if the cells are all occupied
    public boolean isFull() {
        for (int i = 0; i < SIZE; i++) {
            for (int j = 0; j < SIZE; j++) {
                if (cell[i][j].getToken() == ' ') {
                    return false;
                }
            }
        }
        return true;
    }

判断是否赢了

和八皇后有点像,可以考虑那种数组优化四个方向,这里比较懒

    // Determine if the player with the specified token wins
    public boolean isWon(char token) {
        int winNum = 5; // define the max num for a rule
        for (int indexX = 0; indexX < SIZE; indexX++) {
            for (int indexY = 0; indexY < SIZE; indexY++){
                // in row check cell[indexX][indexY...indexY+winNum-1] 
                if (indexY+winNum-1<SIZE){
                    boolean flag=true;
                    for (int y =indexY;y<indexY+winNum;y++)
                        if (cell[indexX][y].getToken() != token){
                            flag=false; break;
                        }
                    if (flag==true) return true;
                }
                
                // in row check cell[indexX...indexX+winNum-1][indexY] 
                if (indexX+winNum-1<SIZE){
                    boolean flag=true;
                    for (int x =indexX;x<indexX+winNum;x++)
                        if (cell[x][indexY].getToken() != token){
                            flag=false; break;
                        }
                    if (flag==true) return true;
                }
                
                // check cell[indexX...indexX+winNum-1][indexY...indexY+winNum-1)
                if (indexX+winNum-1<SIZE && indexY+winNum-1<SIZE){
                    boolean flag=true;
                    for (int x =indexX,y=indexY;x<indexX+winNum;x++,y++)
                        if (cell[x][y].getToken() != token){
                            flag=false; break;
                        }
                    if (flag==true) return true;
                }
                
                // check cell[indexX...indexX+winNum-1][indexY...indexY+winNum-1)
                if (indexX+winNum-1<SIZE && indexY-winNum+1>=0){
                    boolean flag=true;
                    for (int x =indexX,y=indexY;x<indexX+winNum;x++,y--)
                        if (cell[x][y].getToken() != token){
                            flag=false; break;
                        }
                    if (flag==true) return true;
                }
            }
        }
        return false;
    }

设置棋子

    // An inner class for a cell
    public class Cell extends JPanel implements MouseListener {

        // Token used for this cell
        private char token = ' ';

        public Cell() {
            setBorder(new LineBorder(Color.black, 1)); // Set cell's border
            addMouseListener(this); // Register listener
        }

        // The getter method for token
        public char getToken() {
            return token;
        }

        // The setter method for token
        public void setToken(char c) {
            token = c;
            repaint();
        }

导入图片

        // Paint the cell
        @Override
        public void paintComponent(Graphics g) {
            if (token == 'X') {
                ImageIcon icon = new ImageIcon("C:\\Users\\Lenovo\\Desktop\\Black.png");
                Image image = icon.getImage();
                g.drawImage(image,0,0,35,35,this);    
            }else if (token=='O'){
                ImageIcon icon = new ImageIcon("C:\\Users\\Lenovo\\Desktop\\White.png");
                Image image = icon.getImage();
                g.drawImage(image,0,0,35,35,this);                
            }
            super.paintComponents(g);
        }

游戏结束的锁定与弹窗

        // Handle mouse click on a cell
        @Override
        public void mouseClicked(MouseEvent e) {
            if (ISOVER) return;   // if game is over, any issue should be forbidden
            int response=-1;
            if (token == ' ') // If cell is not occupied
            {
                if (whoseTurn == 'X') // If it is the X player's turn
                {
                    setToken('X'); // Set token in the cell
                    whoseTurn = 'O'; // Change the turn
                    jlblStatus.setText("The White's Turn"); // Display status
                    if (isWon('X')) {
                        jlblStatus.setText("The Black Won! The Game Is Over!");
                        response = JOptionPane.showConfirmDialog(null, "The Black Won! The Game Is Over!\n"
                                +"Do you want to quit?","提示",JOptionPane.YES_NO_OPTION);
                        
                        ISOVER = true;
                        if (response == 0) System.exit(0);  // choose "Yes" than quit;
                    } 
                } else if (whoseTurn == 'O') // If it is the O player's turn
                {
                    setToken('O'); // Set token in the cell
                    whoseTurn = 'X'; // Change the turn
                    jlblStatus.setText("The Black's Turn"); // Display status
                    if (isWon('O')) {
                        jlblStatus.setText("The White Won! The Game Is Over!");
                        response = JOptionPane.showConfirmDialog(null, "The White Won! The Game Is Over!\n"
                                +"Do you want to quit?","提示",JOptionPane.YES_NO_OPTION);
                        ISOVER = true;
                        
                        if (response == 0) System.exit(0);  // choose "Yes" than quit;
                    } 
                }
                if (isFull()) {
                    jlblStatus.setText("Plain Game! The Game Is Over!");
                    response = JOptionPane.showConfirmDialog(null, "Plain Game! The Game Is Over!\n"
                            +"Do you want to quit?","提示",JOptionPane.YES_NO_OPTION);
                    ISOVER = true;
                    if (response == 0) System.exit(0);  // choose "Yes" than quit;
                }
            }
            
        }

其他棋子信息

        @Override
        public void mousePressed(MouseEvent e) {
            // TODO: implement this java.awt.event.MouseListener method;
        }

        @Override
        public void mouseReleased(MouseEvent e) {
            // TODO: implement this java.awt.event.MouseListener method;
        }

        @Override
        public void mouseEntered(MouseEvent e) {
            // TODO: implement this java.awt.event.MouseListener method;
        }

        @Override
        public void mouseExited(MouseEvent e) {
            // TODO: implement this java.awt.event.MouseListener method;
        }
    }
}

图片显示

JAVA?
人生苦短我用Python
java实现五子棋游戏GUI_第1张图片

你可能感兴趣的:(安装编程瞎唠嗑)