Java使用Swing实现五子棋。

有点老了,突然写起这个还是有点奇怪。下面是代码,相应的图标和音乐文件都是放在c盘目录下。然后改成你想要的就可以了。图标,我建议去阿里矢量图库找一下。音乐,建议把格式转换成wav的。其他格式需要转码工具类。没有添加包名请自行添加。

以下是代码:

import sun.audio.AudioPlayer;
import sun.audio.AudioStream;

import javax.swing.*;
import java.applet.Applet;
import java.applet.AudioClip;
import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.MouseEvent;
import java.awt.event.MouseListener;
import java.io.File;
import java.io.FileInputStream;
import java.net.MalformedURLException;
import java.net.URL;
import java.util.Vector;


public class WuZiQiCode extends JFrame implements MouseListener {

    public static void main(String[] args) {
        WuZiQiCode wuZiQiCode = new WuZiQiCode();
    }

    //Vector 可以实现自动增长的对象数组,用来存下面的步数信息。
    Vector v = new Vector();    //所有的每步走棋信息
    Vector white = new Vector(); //白方走棋信息
    Vector black = new Vector(); //黑方走棋信息
    boolean b; //用来判断白旗还是黑棋
    int whiteCount, blackCount; //计算悔棋步数
    int w = 25;    //间距大小
    int px = 150, py = 150;
    int pxw = px + w, pyw = py + w;
    int width = w * 16, height = w * 16;
    int vline = width + px;    //垂直线的长度
    int hline = height + py; //水平线的长度



    JButton jb;
    JButton reset;
    JButton send1;
    JButton send2;
    TextArea ta = new TextArea(10, 40);
    TextField tf1 = new TextField(20);
    TextField tf2 = new TextField(20);
    /**
     * 构造方法
     */
    public WuZiQiCode() {
        super("Five-in-a-row");

        Container con = this.getContentPane();
        con.setLayout(null);

        //创建按钮
        jb=new JButton("悔棋");
        Icon back = new ImageIcon("C:\\res\\button.png");
        jb.setIcon(back);
        Font f=new Font("宋体",Font.BOLD,20);//根据指定字体名称、样式和磅值大小,创建一个新 Font。
        jb.setFont(f);
        jb.setBackground(Color.ORANGE);
        jb.addActionListener(new ActionListener() {
            public void actionPerformed(ActionEvent e) {
                jbClicked();
            }
        });
        jb.setVisible(true);
        jb.setBounds(600,250,150,45);
        reset=new JButton("重开");
        Icon resets = new ImageIcon("C:\\res\\button.png");
        reset.setIcon(resets);
        reset.setFont(f);
        reset.setBackground(Color.pink);
        reset.addActionListener(new ActionListener() {
            public void actionPerformed(ActionEvent e) {
                reset();
            }
        });
        reset.setVisible(true);
        reset.setBounds(600,350,150,45);

        send1=new JButton("发送");
        Icon iconSend1 = new ImageIcon("C:\\res\\button.png");
        send1.setIcon(iconSend1);
        send1.setFont(f);
        send1.setBackground(Color.CYAN);
        send1.addActionListener(new ActionListener() {
            public void actionPerformed(ActionEvent e) {
                send1();
            }
        });
        send1.setVisible(true);
        send1.setBounds(0,650,150,45);



        send2=new JButton("发送");
        Icon iconSend2 = new ImageIcon("C:\\res\\button.png");
        send2.setIcon(iconSend2);
        send2.setFont(f);
        send2.setBackground(Color.CYAN);
        send2.addActionListener(new ActionListener() {
            public void actionPerformed(ActionEvent e) {
                send2();
            }
        });
        send2.setVisible(true);
        send2.setBounds(600,650,150,45);

        tf1.setBounds(0,550,150,50);
        tf2.setBounds(600,550,150,50);
        ta.setBounds(200,550,300,200);
        ta.setBackground(Color.lightGray);
        con.add(jb);
        con.add(reset);
        con.add(send1);
        con.add(send2);
        con.add(tf1);
        con.add(tf2);
        con.add(ta);
        this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);//关闭按钮

        playMusic();

        this.addMouseListener(this);//添加监听
        this.setSize(800, 800);//
        //this.setIconImage(new ImageIcon("D:\\20190625095140.jpg").getImage());
        //this.setBackground(Color.lightGray);
        this.setVisible(true);

        int width = Toolkit.getDefaultToolkit().getScreenSize().width;
        int height = Toolkit.getDefaultToolkit().getScreenSize().height;
        this.setBounds((width - 800) / 2,
                (height - 800) / 2, 800, 800);

    }

    public void send1(){
        String tf_str = tf1.getText().trim();
        tf1.setText("");
        tf_str = "左边:"+tf_str;
        ta.append(tf_str+"\r\n");
        tf2.requestFocus();
    }

    public void send2(){
        String tf_str = tf2.getText().trim();
        tf2.setText("");
        tf_str = "右边:"+tf_str;
        ta.append(tf_str+"\r\n");
        tf1.requestFocus();
    }
    static void playMusic(){//背景音乐播放
        try {
            URL cb;
            File f = new File("C:\\res\\music.wav"); // 引号里面的是音乐文件所在的路径
            cb = f.toURL();
            AudioClip aau;
            aau = Applet.newAudioClip(cb);

            aau.play();
            aau.loop();//循环播放
//            FileInputStream fileau=new FileInputStream("C:\\res\\music.mp3");
//            AudioStream as=new AudioStream(fileau);
//            AudioPlayer.player.start(as);
            System.out.println("可以播放");
            // 循环播放 aau.play()
            //单曲 aau.stop()停止播放

        } catch (Exception e) {

            e.printStackTrace();
        }
    }


    public void reset(){
        this.v.clear();
        this.black.clear();
        this.white.clear();
        this.repaint();
    }


    public void jbClicked(){
        if (v.isEmpty()) {
            JOptionPane.showMessageDialog(this, "没有棋可悔");
        } else {
            if (v.size() % 2 == 0) {    //判断是白棋悔棋,还是黑棋悔棋
                int i =JOptionPane.showConfirmDialog(null, "黑棋要悔棋", "询问",JOptionPane.YES_NO_OPTION);
                if(i==1){
                    blackCount++;
                    if (blackCount > 3) {
                        JOptionPane.showMessageDialog(this, "黑棋已经悔了"+blackCount+"步");
                    } else {
                        v.remove(v.lastElement());
                        this.repaint();
                    }
                }

            } else {
                int i =JOptionPane.showConfirmDialog(null, "白棋要悔棋", "询问",JOptionPane.YES_NO_OPTION);
                if(i==0){
                    whiteCount++;
                    if (whiteCount > 3) {
                        JOptionPane.showMessageDialog(this, "白棋已经悔了"+whiteCount+"步");
                    } else {
                        v.remove(v.lastElement());
                        this.repaint();
                    }
                }

            }
        }
    }

    /**
     * 画棋盘和棋子
     * @param
     */
    public void paint(Graphics g) {

        g.setFont(new Font("宋体", Font.BOLD, 24));
        g.clearRect(0, 0, this.getWidth(), this.getHeight());//清除画板
        g.drawImage(new ImageIcon("C:\\res\\backs.jpg").getImage(),0,0,800,800,null);
        g.setColor(Color.BLACK);//绘制网格颜色
        g.drawRect(px, py, width, height);//网格大小
        g.drawString("Five-in-a-row", 240, 90);

        for (int i=0; i<15; i++) {//循环画出
            g.drawLine(pxw+i*w, py, pxw+i*w, hline);//每条横线和竖线
            g.drawLine(px, pyw+i*w, vline, pyw+i*w);
        }

        for (int x=0; x<v.size(); x++) {
            String str = (String)v.get(x);
            String tmp[] = str.split("-");
            int a = Integer.parseInt(tmp[0]);
            int b = Integer.parseInt(tmp[1]);
            a = a * w + px;
            b = b * w + py;
            if (x%2 == 0) {
                g.setColor(Color.WHITE);
            } else {
                g.setColor(Color.BLACK);
            }
            g.fillArc(a-w/2, b-w/2, w, w, 0, 360);
        }
        jb.repaint();
        reset.repaint();
        send1.repaint();
        send2.repaint();
        tf1.repaint();
        tf2.repaint();
        ta.repaint();
    }

    @Override
    public void mouseClicked(MouseEvent e) {//鼠标点击事件也就是左键或者右键点击
        if (e.getButton() == e.BUTTON1) {
            int x = e.getX();
            int y = e.getY();
            x = (x - x % w) + (x % w > w / 2 ? w : 0);
            y = (y - y % w) + (y % w > w / 2 ? w : 0);
            x = (x - px) / w;
            y = (y - py) / w;

            if (x >= 0 && y >= 0 && x <= 16 && y <= 16) {
                if (v.contains(x+"-"+y)) {
                    JOptionPane.showMessageDialog(this,"已经有棋了!");
                } else {
                    v.add(x+"-"+y);
                    this.repaint();
                    if (v.size() % 2 == 0) {
                        black.add(x+"-"+y);//这里加了个黑棋
                        this.victory(x, y, black);
                    } else {
                        white.add(x+"-"+y);//加了个白棋
                        this.victory(x, y, white);
                    }
                }
            } else {
            }
        }
    }

    /**
     * 判断胜利的方法
     * @param x
     * @param y
     * @param contain
     */
    private void victory(int x, int y, Vector contain) {
        int cv = 0;    //垂直方向棋子数量
        int ch = 0;    //水平方向棋子数量
        int ci1 = 0; //斜面方向棋子数量1
        int ci2 = 0; //斜面方向棋子数量2

        //计算水平方向棋子数量
        for (int i=1; i<5; i++) {
            if (contain.contains((x+i)+"-"+y)) {
                ch++;
            } else {
                break;
            }
        }
        for (int i=1; i<5; i++) {
            if (contain.contains((x-i)+"-"+y)) {
                ch++;
            } else {
                break;
            }
        }

        //计算垂直方向棋子数量
        for (int i=1; i<5; i++) {
            if (contain.contains(x+"-"+(y+i))) {
                cv++;
            } else {
                break;
            }
        }
        for (int i=1; i<5; i++) {
            if (contain.contains(x+"-"+(y-i))) {
                cv++;
            } else {
                break;
            }
        }

        //计算45°斜面方向棋子数量
        for (int i=1; i<5; i++) {
            if (contain.contains((x+i)+"-"+(y+i))) {
                ci1++;
            } else {
                break;
            }
        }
        for (int i=1; i<5; i++) {
            if (contain.contains((x-i)+"-"+(y-i))) {
                ci1++;
            } else {
                break;
            }
        }

        //计算135°斜面方向棋子数量
        for (int i=1; i<5; i++) {
            if (contain.contains((x+i)+"-"+(y-i))) {
                ci2++;
            } else {
                break;
            }
        }
        for (int i=1; i<5; i++) {
            if (contain.contains((x-i)+"-"+(y+i))) {
                ci2++;
            } else {
                break;
            }
        }

        if (ch>=4 || cv>=4 ||ci1>=4 ||ci2>=4) {
            System.out.println(v.size()+"步棋");
            if (v.size() % 2 == 0) {
                //判断是黑棋赢,还是白棋赢
                JOptionPane.showMessageDialog(null, "黑棋赢了");
            } else {
                JOptionPane.showMessageDialog(null, "白棋赢了");
            }
            this.v.clear();
            this.black.clear();
            this.white.clear();
            this.repaint();
        }
    }

    @Override
    public void mouseEntered(MouseEvent e) {
        // TODO Auto-generated method stub

    }

    @Override
    public void mouseExited(MouseEvent e) {
        // TODO Auto-generated method stub

    }

    @Override
    public void mousePressed(MouseEvent e) {
        // TODO Auto-generated method stub

    }

    @Override
    public void mouseReleased(MouseEvent e) {
        // TODO Auto-generated method stub

    }
}

 

posted @ 2019-06-26 09:56  土拨鼠v1  阅读(814)  评论(0编辑  收藏  举报