精华内容
下载资源
问答
  • java swing 五子棋

    2018-07-07 20:26:53
    人人 人机 PPT 项目毕设 答辩资料整整一套5分带走速度
  • Java Swing五子棋

    千次阅读 2020-02-24 21:50:21
    之前用python的pygame这样一个专门用于游戏制作的游戏框架写了一个扫雷,这回事用Java Swing库这个用于创建GUI的库实现了一个五子棋,我持有的观点不变,在初学时写个益智类小游戏,对算法接触基本语法等各方面都有...

    项目地址:https://github.com/ListeningRift/gobang

    之前用python的pygame这样一个专门用于游戏制作的游戏框架写了一个扫雷,这回事用Java Swing库这个用于创建GUI的库实现了一个五子棋,我持有的观点不变,在初学时写个益智类小游戏,对算法接触基本语法等各方面都有好处。

    还是一样的没有把太多精力放在界面美化上,界面的美化我个人认为大体归功于GUI框架的熟练程度,大部分时间花在API的熟悉上,所以并没有花太多精力。而且相对于一款完整的游戏,差的也比较远,我只做了主要游戏界面,开始界面,胜利界面都省略了。

    贴个代码记录一哈:

    首先是Game.java文件,主要做了一个JFrame窗体创建的工作,其次就是点击事件监听。

    import javax.swing.*;
    import java.awt.*;
    import java.awt.event.ActionEvent;
    import java.awt.event.ActionListener;
    import java.awt.event.MouseEvent;
    import java.awt.event.MouseListener;
    
    public class Game extends JFrame implements MouseListener {
        private static Insets insets;
        private static GamePanel panel;
        public static final int operationWidth = 80;
    
        public static void main(String[] args) {
            Game game = new Game();
            game.start();
        }
    
        public Game() {
            addMouseListener(this);
            setSize(GamePanel.WIDTH + 14 + operationWidth, GamePanel.HEIGHT + 37);
            setTitle("五子棋");
            setBackground(new Color(209,190,130));
            setResizable(false);
            setLocationRelativeTo(null);
            setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
            setVisible(true);
            insets = getInsets();
            addButton();
        }
    
        public void start() {
            panel = new GamePanel();
            add(panel);
            Thread th = new Thread((Runnable) panel);
            th.start();
        }
    
        public void mouseClicked(MouseEvent e) {
            int[] XY = getXY(e);
            // TODO limit the range
            if (XY[0] < 0 || XY[0] > 19 ||
                XY[1] < 0 || XY[1] > 19) {
                System.out.println("over");
                return;
            }
            Piece newPiece = new Piece(getPlayer(), XY[0], XY[1]);
            GamePanel.pieces.add(newPiece);
            panel.repaint();
            newPiece.judge();
        }
    
        public void mouseEntered(MouseEvent e) {}
        public void mouseExited(MouseEvent e) {}
        public void mousePressed(MouseEvent e) {}
        public void mouseReleased(MouseEvent e) {}
    
        public int[] getXY(MouseEvent e) {
            int mouseX = e.getX();
            int mouseY = e.getY() - insets.top;
            int X = (int) Math.floor(mouseX / GamePanel.gridWidth);
            int Y = (int) Math.floor(mouseY / GamePanel.gridHeight);
            int restWidth = mouseX - X * GamePanel.gridWidth;
            int restHeight = mouseY - Y * GamePanel.gridHeight;
            if (restWidth < GamePanel.gridWidth / 2) {
                X = X - 1;
            }
            if (restHeight < GamePanel.gridHeight / 2) {
                Y = Y - 1;
            }
            return new int[]{X, Y};
        }
    
        public String getPlayer() {
            return GamePanel.pieces.size() % 2 != 0 ? "white" : "black";
        }
    
        public void addButton() {
            JButton back = new JButton("悔棋");
            back.setBounds(GamePanel.WIDTH + 7, GamePanel.gridHeight + 30, 60, 30);
            back.addActionListener(new ActionListener() {
                @Override
                public void actionPerformed(ActionEvent actionEvent) {
                    GamePanel.pieces.remove(GamePanel.pieces.size() - 1);
                    panel.repaint();
                }
            });
            JButton giveUp = new JButton("认输");
            giveUp.setBounds(GamePanel.WIDTH + 7, GamePanel.gridHeight + 90, 60, 30);
            giveUp.addActionListener(new ActionListener() {
                @Override
                public void actionPerformed(ActionEvent actionEvent) {
                    GamePanel.win(getPlayer());
                }
            });
    
            add(back);
            add(giveUp);
        }
    }
    

    第二部分就是游戏JPanel部分,主要负责游戏主界面绘制,以及游戏输赢动作(这个动作没有认真去写,只是在控制台输出一下胜方而已)。

    import javax.swing.JPanel;
    import java.awt.Color;
    import java.awt.Graphics;
    import java.awt.Graphics2D;
    import java.awt.BasicStroke;
    import java.util.ArrayList;
    
    public class GamePanel extends JPanel {
        public static final int WIDTH = 672;
        public static final int HEIGHT = 672;
        public static int gridWidth;
        public static int gridHeight;
        public static ArrayList<Piece> pieces = new ArrayList<Piece>();
    
        public GamePanel() {
            setBackground(new Color(209,190,130));
            setSize(WIDTH, HEIGHT);
            gridWidth = getWidth() / 21;
            gridHeight = getHeight() / 21;
        }
    
        @Override
        public void paint(Graphics g) {
            super.paint(g);
            Graphics2D g2d = (Graphics2D) g;
            g2d.setStroke(new BasicStroke(2));
    
            for (int i = 1; i < 21; i++) {
                g.drawLine(i * gridWidth, gridHeight, i * gridWidth, gridHeight * 20);
                g.drawLine(gridWidth, i * gridHeight, gridWidth * 20, i * gridHeight);
            }
    
            for (Piece piece: pieces) {
                piece.paint(g2d);
            }
        }
    
        public static void win(String player) {
            System.out.println(player);
        }
    }
    

    第三部分写了一个棋子类,负责妻子绘制与判断连线数字判断。

    import java.awt.*;
    
    public class Piece {
        private static final int r = 14;
        public Color color;
        public int x;
        public int y;
    
        public Piece(String color, int x, int y) {
            if (color.equals("black")) {
                this.color = Color.BLACK;
            } else if (color.equals("white")) {
                this.color = Color.WHITE;
            }
            this.x = x;
            this.y = y;
        }
    
        public void paint(Graphics2D g) {
            g.setColor(color);
            g.fillArc((x + 1) * GamePanel.gridWidth - r, (y + 1) * GamePanel.gridHeight - r, 2 * r, 2 * r, 0, 360);
            g.setColor(Color.BLACK);
            g.setStroke(new BasicStroke(1));
            g.drawArc((x + 1) * GamePanel.gridWidth - r, (y + 1) * GamePanel.gridHeight - r, 2 * r, 2 * r, 0, 360);
        }
    
        public void judge() {
            String player = "";
            if (color == Color.BLACK) {
                player = "black";
            } else if (color == Color.WHITE) {
                player = "white";
            }
            if (judgeHorizontal() || judgeVertical() || judgeLeanToLeft() || judgeLeanToRight()) {
                GamePanel.win(player);
            }
        }
    
        public boolean judgeVertical() {
            int number = 1;
            for (int i = 1; i < 6; i++) {
                if (getTop(i)) {
                    number++;
                } else {
                    break;
                }
            }
            for (int i = 1; i < 6; i++) {
                if (getBottom(i)) {
                    number++;
                } else {
                    break;
                }
            }
            return number >= 5;
        }
    
        public boolean judgeHorizontal() {
            int number = 1;
            for (int i = 1; i < 6; i++) {
                if (getLeft(i)) {
                    number++;
                } else {
                    break;
                }
            }
            for (int i = 1; i < 6; i++) {
                if (getRight(i)) {
                    number++;
                } else {
                    break;
                }
            }
            return number >= 5;
        }
    
        public boolean judgeLeanToLeft() {
            int number = 1;
            for (int i = 1; i < 6; i++) {
                if (getTopLeft(i)) {
                    number++;
                } else {
                    break;
                }
            }
            for (int i = 1; i < 6; i++) {
                if (getBottomRight(i)) {
                    number++;
                } else {
                    break;
                }
            }
            return number >= 5;
        }
    
        public boolean judgeLeanToRight() {
            int number = 1;
            for (int i = 1; i < 6; i++) {
                if (getTopRight(i)) {
                    number++;
                } else {
                    break;
                }
            }
            for (int i = 1; i < 6; i++) {
                if (getBottomLeft(i)) {
                    number++;
                } else {
                    break;
                }
            }
            return number >= 5;
        }
    
        public boolean getTop(int distance) {
            for (Piece p: GamePanel.pieces) {
                if (x == p.x && y == p.y + distance) {
                    return p.color == color;
                }
            }
            return false;
        }
    
        public boolean getBottom(int distance) {
            for (Piece p: GamePanel.pieces) {
                if (x == p.x && y == p.y - distance) {
                    return p.color == color;
                }
            }
            return false;
        }
    
        public boolean getRight(int distance) {
            for (Piece p: GamePanel.pieces) {
                if (x == p.x - distance && y == p.y) {
                    return p.color == color;
                }
            }
            return false;
        }
    
        public boolean getLeft(int distance) {
            for (Piece p: GamePanel.pieces) {
                if (x == p.x + distance && y == p.y) {
                    return p.color == color;
                }
            }
            return false;
        }
    
        public boolean getTopRight(int distance) {
            for (Piece p: GamePanel.pieces) {
                if (x == p.x - distance && y == p.y + distance) {
                    return p.color == color;
                }
            }
            return false;
        }
    
        public boolean getTopLeft(int distance) {
            for (Piece p: GamePanel.pieces) {
                if (x == p.x + distance && y == p.y + distance) {
                    return p.color == color;
                }
            }
            return false;
        }
    
        public boolean getBottomRight(int distance) {
            for (Piece p: GamePanel.pieces) {
                if (x == p.x - distance && y == p.y - distance) {
                    return p.color == color;
                }
            }
            return false;
        }
    
        public boolean getBottomLeft(int distance) {
            for (Piece p: GamePanel.pieces) {
                if (x == p.x + distance && y == p.y - distance) {
                    return p.color == color;
                }
            }
            return false;
        }
    }
    

    实现的东西比较少,只是大概的一个骨架,贴了全部代码,记录一下在这无聊的时间里的消遣玩具。

    展开全文
  • java Swing五子棋

    2012-06-05 19:54:26
    一个Swing小游戏——五子棋,希望大家喜欢。下载并进行改正
  • 主要为大家详细介绍了Java swing五子棋的实现方法,Java开发图形界面程序五子棋的实现方式,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
  • jdk6.0 6.0编译 java swing 五子棋源码 网络版 欢迎广大JAVA爱好者前来下载学习 如有疑问,可在评论中说明,我会尽量快速的给大家回复
  • Java Swing五子棋项目

    2019-03-24 15:49:54
    可以掌握Java Swing基础,2D绘图,游戏算法。 五子棋游戏的功能: 1. 在点击鼠标时,可以在相应的位置显示棋子。 2. 可以自动判断游戏是否结束,是否黑方或白方已经胜利 3. 对游戏时间进行设置,判断是否超出规定...
  • JavaSwing写的五子棋代码,总共300行代码左右。环境:jdk8+eclipse com.Start.java为启动入口。com.view.ChessBorder.java为棋盘绘制类。com.model.ChessModel为数据管理。联系方式:2104951314@qq.com
  • java swing五子棋案例

    2011-08-02 15:01:30
    java面向对象必做项目之一,适合java初学者。五子棋项目。
  • JavaSwing五子棋游戏

    2021-07-21 14:00:52
    import java.awt.Graphics; import java.awt.Image; import java.awt.event.MouseEvent; import java.awt.event.MouseListener; import java.util.ArrayList; import java.util.List; import java.util.Locale...

    代码展示

    package wuziqi;

    import java.awt.Graphics;

    import java.awt.Image;

    import java.awt.event.MouseEvent;

    import java.awt.event.MouseListener;

    import java.util.ArrayList;

    import java.util.List;

    import java.util.Locale;

    import java.util.Random;

    import javax.swing.ImageIcon;

    import javax.swing.JOptionPane;

    import javax.swing.JPanel;

    public class pan extends JPanel implements MouseListener{

    int i=0,j=0;

    int row = 15;

    // 数组下标

    int col = 15;

    // 数组上标

    String qipan_name = "qipan1.jpg";

    String qizi1_name = "c1.png";

    String qizi2_name = "c2.png";

    int num[][] = new int[row][col];

    // 0:标示该位置为空,1:标示红棋子,2:标示黑棋子

    boolean canSetqizi = true;

    // 定义boolean值,用来判断该位置是否有子

    int qizi_num = 0;

    // 定义记录落子数

    List<paihangbang> paihanglist = new ArrayList();

    // 定义集合,用来存储排行榜

    public void paint(Graphics g){

    super.paint(g);

    Image img= new ImageIcon("img/"+qipan_name).getImage();

    // 调入棋盘图片

    g.drawImage(img, 0, 0, 567, 567, this);

    // 绘制棋盘

    Image c1= new ImageIcon("img/"+qizi1_name).getImage();

    Image c2= new ImageIcon("img/"+qizi2_name).getImage();

    for(int i = 0;i<num.length;i++){

    for(int j = 0;j<num[i].length;j++){

    if(num[i][j] == 1)

    {

    g.drawImage(c1, i*35+20, j*35+20, 35, 35, this);

    }

    else if(num[i][j] == 2)

    {

    g.drawImage(c2, i*35+20, j*35+20, 35, 35, this);

    }

    }

    // 重绘棋子

    }

    // 重载整个界面(防止最小化后原内容丢失)

    }

    public int[] getLoc(int x,int y) {

    int count = 1;

    // 定义计数器,用于计算棋子数

    int[] wz1 = null;

    int[] wz2 = null;

    // 定义数组,用来存储危险位置

    for(int i =x-1;i>=0;i--){

    if(num[i][y] == num[x][y])

    {

    count++;

    }

    else

    {

    if(num[i][y] == 0){

    wz1 = new int[]{i,y};

    // 获取左边的危险位置坐标

    }

    break;

    }

    }

    // 左

    for(int i =x+1;i<row;i++){

    if(num[i][y] == num[x][y])

    {

    count++;

    }else{

    if(num[i][y] == 0){

    wz2 = new int[]{i,y};

    // 获取有变位置危险坐标

    }

    break;

    }

    }

    // 右

    if(count>=3)

    {

    if(wz1 != null){

    return wz1;

    // 判断返回左边危险位置

    }else if(wz2 != null){

    return wz2;

    // 判断返回右边危险位置

    }else{

    return null;

    }

    }

    // 左右

    count = 1;

    wz1 = null;

    wz2 = null;

    // 初始化所有参数

    for(int j =y-1;j>=0;j--){

    if(num[x][j] == num[x][y])

    {

    count++;

    }

    else

    {

    if(num[x][j] == 0){

    wz1 = new int[]{x,j};

    }

    break;

    }

    }

    // 上

    for(int j =y+1;j<col;j++){

    if(num[x][j] == num[x][y])

    {

    count++;

    }else{

    if(num[x][j] == 0){

    wz2 = new int[]{x,j};

    }

    break;

    }

    }

    // 下

    if(count>=3)

    {

    if(wz1 != null){

    return wz1;

    }else if(wz2 != null){

    return wz2;

    }else{

    return null;

    }

    }

    // 上下

    count = 1;

    wz1 = null;

    wz2 = null;

    for(int i =x-1,j =y-1;i>=0&&j>=0;i--,j--){

    if(num[i][j] == num[x][y])

    {

    count++;

    }

    else

    {

    if(num[i][j] == 0){

    wz1 = new int[]{i,j};

    }

    break;

    }

    }

    // 左上

    for(int i =x+1,j =y+1;i<row&&j<col;i++,j++){

    if(num[i][j] == num[x][y])

    {

    count++;

    }else{

    if(num[i][j] == 0){

    wz2 = new int[]{i,j};

    }

    break;

    }

    }

    // 右下

    if(count>=3)

    {

    if(wz1 != null){

    return wz1;

    }else if(wz2 != null){

    return wz2;

    }else{

    return null;

    }

    }

    // 左上右下

    count = 1;

    wz1 = null;

    wz2 = null;

    for(int i =x-1,j =y+1;i>=0&&j<col;i--,j++){

    if(num[i][j] == num[x][y])

    {

    count++;

    }

    else

    {

    if(num[i][j] == 0){

    wz1 = new int[]{i,j};

    }

    break;

    }

    }

    // 左下

    for(int i =x+1,j =y-1;i<row&&j>=0;i++,j--){

    if(num[i][j] == num[x][y])

    {

    count++;

    }else{

    if(num[i][j] == 0){

    wz2 = new int[]{i,j};

    }

    break;

    }

    }

    // 右上

    if(count>=3)

    {

    if(wz1 != null){

    return wz1;

    }else if(wz2 != null){

    return wz2;

    }else{

    return null;

    }

    }

    // 左下右上

    return null;

    }

    public boolean iswin(int x,int y){

    int count = 1;

    for(int i =x-1;i>=0;i--){

    if(num[i][y] == num[x][y])

    {

    count++;

    }

    else

    {

    break;

    }

    }

    // 左

    for(int i =x+1;i<row;i++){

    if(num[i][y] == num[x][y])

    {

    count++;

    }else{

    break;

    }

    }

    // 右

    if(count>=5)

    {

    return true;

    }

    // 左右

    count = 1;

    for(int j =y-1;j>=0;j--){

    if(num[x][j] == num[x][y])

    {

    count++;

    }

    else

    {

    break;

    }

    }

    // 上

    for(int j =y+1;j<col;j++){

    if(num[x][j] == num[x][y])

    {

    count++;

    }else{

    break;

    }

    }

    // 下

    if(count>=5)

    {

    return true;

    }

    // 上下

    count = 1;

    for(int i =x-1,j =y-1;i>=0&&j>=0;i--,j--){

    if(num[i][j] == num[x][y])

    {

    count++;

    }

    else

    {

    break;

    }

    }

    // 左上

    for(int i =x+1,j =y+1;i<row&&j<col;i++,j++){

    if(num[i][j] == num[x][y])

    {

    count++;

    }else{

    break;

    }

    }

    // 右下

    if(count>=5)

    {

    return true;

    }

    // 左上右下

    count = 1;

    for(int i =x-1,j =y+1;i>=0&&j<col;i--,j++){

    if(num[i][j] == num[x][y])

    {

    count++;

    }

    else

    {

    break;

    }

    }

    // 左下

    for(int i =x+1,j =y-1;i<row&&j>=0;i++,j--){

    if(num[i][j] == num[x][y])

    {

    count++;

    }else{

    break;

    }

    }

    // 右上

    if(count>=5)

    {

    return true;

    }

    // 左下右上

    return false;

    }

    // 判断输赢

    @Override

    public void mouseClicked(MouseEvent e) {

    if(canSetqizi){

    Graphics g = this.getGraphics();

    int checkusersuccess = 0;

    // 标示是否落子成功

    int x = e.getX();

    int y = e.getY();

    // 获取鼠标点击的位置

    Image c1= new ImageIcon("img/"+qizi1_name).getImage();

    int i = (x-25)/35;

    int j = (y-75)/35;

    if(num[i][j] != 0){

                 JOptionPane.showMessageDialog(null, "该位置有旗子,请重新落子");

                 return;

    //              判断有子,终止本次事件,进行下次事件触发

    }else{

    g.drawImage(c1, i*35+20, j*35+20, 35, 35, this);

    // 画出玩家落子

    num[i][j] = 1;

    // 给数组付一个只值,表示该位置有旗子

    checkusersuccess = 1;

    // 标示量标示

    qizi_num++;

    // 记录玩家落子步数

    }

    boolean b=iswin(i,j);

    if(b){

    JOptionPane.showMessageDialog(null, "你赢了!");

    canSetqizi = false;

    paihangbang ph = new paihangbang();

    ph.setJushu(paihanglist.size()+1);

    ph.setBushu(qizi_num);

    ph.setJieguo("win");

    paihanglist.add(ph);

    return;

    }

    // 调用boolean判断方法

    try {

    Thread.sleep(1000);

    } catch (InterruptedException e1) {

    e1.printStackTrace();

    }

    // 时间间隔:玩家落子后的等待

    Random r = new Random();

    Image c2 = new ImageIcon("img/"+qizi2_name).getImage();

    // 调入黑棋子图片

    do{

    int[] wz =getLoc(i, j);

    if(wz == null){

    i = r.nextInt(15);

    j = r.nextInt(15);

    }else{

    i=wz[0];

    j=wz[1];

    }

    // 设置随机的坐标

    }while(num[i][j] != 0);

    g.drawImage(c2, i*35+20, j*35+20, 35, 35, this);

    num[i][j] = 2;

    boolean d=iswin(i,j);

    if(d){

    JOptionPane.showMessageDialog(null, "你输了!");

    canSetqizi = false;

    paihangbang ph = new paihangbang();

    ph.setJushu(paihanglist.size()+1);

    ph.setBushu(qizi_num);

    ph.setJieguo("fail");

    paihanglist.add(ph);

    return;

    }

    // 随机电脑落子位置;

    }

    }

    @Override

    public void mousePressed(MouseEvent e) {

    // TODO Auto-generated method stub

    }

    @Override

    public void mouseReleased(MouseEvent e) {

    // TODO Auto-generated method stub

    }

    @Override

    public void mouseEntered(MouseEvent e) {

    // TODO Auto-generated method stub

    }

    @Override

    public void mouseExited(MouseEvent e) {

    // TODO Auto-generated method stub

    }

    }

    技术描述

    开发工具: idea/eclipse
    数据库: mysql
    Jar包仓库: 普通jar包
    前段框架: layui/jquery
    后端框架: sping+springmvc+mybatis

    资料说明

    JavaSwing五子棋游戏,自定义单机游戏,采用人机对战模式

    下载

    http://code51.cn/article?aid=21

    展开全文
  • JAVA swing五子棋程序

    2009-08-26 14:00:29
    一个JAVA实现的五子棋程序,可以实现多个用户的聊天与下棋,有服务器
  • java实现五子棋,有判断谁赢得算法,原创,有不好的地方,见谅
  • Java swing 五子棋源码完整可以运行
  • Java Swing版本五子棋

    2020-12-15 09:05:16
    Java Swing版本的五子棋,有简易版,有复杂版,有AI对弈版本,有悔棋,重新开始,计时,暂停,播放音乐等丰富功能,代码注释详细,新手可看懂!
  • Java Swing实现五子棋程序

    千次阅读 2019-03-24 15:47:23
    首先感谢08年MLDN出的这个培训视频,我把代码和文档整理了一下,发布出来给需要学习Swing的朋友。 源码地址: https://gitee.com/indexman/gobang 一、知识点准备: JFrame:窗体 JOptionPane:对话框 ...

    首先感谢08年MLDN出的这个培训视频,我把代码和文档整理了一下,发布出来给需要学习Swing的朋友。

     

    源码地址:

    https://gitee.com/indexman/gobang

     

    一、知识点准备:

    JFrame:窗体

    JOptionPane:对话框

    MouseListener:鼠标事件

    Graphics:绘制二维图像

    Thread:线程类

     

    二、五子棋游戏的功能:

    1. 在点击鼠标时,可以在相应的位置显示棋子。
    2. 可以自动判断游戏是否结束,是否黑方或白方已经胜利
    3. 对游戏时间进行设置,判断是否超出规定时间

     

    三、游戏开发步骤

     

    1.开发游戏界面

    计算棋盘中每一条线的间距:这里用的是19X19的围棋棋盘,

    总宽度为360px, 分成18份,每份是20px

     

    2.在棋盘上的鼠标点击位置,显示一个棋子

    黑子:一个实心的黑圆表示

    白子:一个空心的黑圆+一个实心的白圆表示

     

    repaint() 方法表示重新执行一次paint()方法。

     

    3.保存之前下过的棋子

    通过一个二维数组来保存之前下过的所有棋子。

     

    4.判断游戏胜负

    依据 五子棋 的基本游戏规则,判断是否有同一颜色的棋子连城5个。

     

    完成五子棋游戏的核心算法

    这里可以把核心算法总结成一个灵活的方法。

    提示信息的保存

     

    5.处理屏幕闪烁问题

    使用双缓冲技术

     

    6.实现各个按钮的功能

    开始游戏:重新开始游戏

    游戏设置: 设置倒计时时间

    游戏说明:用来说明游戏规则和操作

    认输:某一方放弃游戏,投子认负

    关于:显示游戏制作者

    退出:退出程序

    -----------------------------------------------------分割线------------------------------------------------------

    四、代码部分

     

    1.启动类

    package com.laoxu.game;
    
    import com.laoxu.game.view.GobangFrame;
    import com.laoxu.game.view.MyFrame;
    
    /**
     * Hello world!
     *
     */
    public class App 
    {
        public static void main( String[] args )
        {
    
            GobangFrame frame = new GobangFrame();
            //MyFrame myFrame = new MyFrame();
            //JOptionPane
            /*JOptionPane.showMessageDialog(myFrame,"我的信息");
            int result = JOptionPane.showConfirmDialog(myFrame,"确定要开始游戏吗?","",0);
            if(result==0){
                JOptionPane.showMessageDialog(myFrame,"游戏开始");
            }
            if(result==1){
                JOptionPane.showMessageDialog(myFrame,"游戏结束");
            }
            if(result==2){
                JOptionPane.showMessageDialog(myFrame,"重新选择");
            }
    
            String username = JOptionPane.showInputDialog("请输入你的姓名:");
            System.out.println(username);
            JOptionPane.showMessageDialog(myFrame,"输入的姓名为:"+username);*/
            //System.out.println(System.getProperty("user.dir")+"/src/image/background.jpg");
    
        }
    }
    

     

    2.五子棋类

     

    package com.laoxu.game.view;
    
    import javax.imageio.ImageIO;
    import javax.swing.*;
    import java.awt.*;
    import java.awt.event.MouseEvent;
    import java.awt.event.MouseListener;
    import java.awt.image.BufferedImage;
    import java.io.File;
    import java.io.IOException;
    
    /**
     * @description: 五子棋主界面
     * @author: luohanye
     * @create: 2019-03-21
     **/
    public class GobangFrame extends JFrame implements MouseListener,Runnable {
        //获取当前平面分辨率,例如:1920x1080
        int swidth = Toolkit.getDefaultToolkit().getScreenSize().width;
        int sheight = Toolkit.getDefaultToolkit().getScreenSize().height;
    
        BufferedImage image = null;
        //保存坐标值
        int x = 0;
        int y = 0;
        //保存下过的棋子 0-没有棋子 1-黑子 2-白子
        int[][] allChess = new int[19][19];
        // 标识当前应该是黑子还是白子
        boolean isBlack = true;
        // 控制游戏是否可以玩
        boolean canPlay = true;
        // 保存游戏信息
        String message = "黑方先行";
        // 保存最多拥有多少时间(秒)
        int maxTime = 0;
        // 做倒计时的线程类
        Thread t = new Thread(this);
        // 保存黑方与白方的剩余时间
        int blackTime = 0;
        int whiteTime = 0;
        // 保存双方剩余时间的显示信息
        String blackMessage = "无限制";
        String whiteMessage = "无限制";
    
        public GobangFrame() {
            //设置标题
            this.setTitle("五子棋");
            int width = 500, height = 500;
            this.setSize(width, height);
    
            //设置窗体出现的位置
            this.setLocation((swidth - width) / 2, (sheight - height) / 2);
            //窗口大小不可变
            this.setResizable(false);
            //定义关闭动作
            this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
            //添加监听器
            this.addMouseListener(this);
            //窗体可见
            this.setVisible(true);
    
            //加载背景图片
            try {
                image = ImageIO.read(new File(System.getProperty("user.dir")+"/src/image/background.jpg"));
            } catch (IOException e) {
                e.printStackTrace();
            }
            // 启动线程
            t.start();
            t.suspend();
    
            // 刷新屏幕,防止开始游戏时出现无法显示的情况.
            this.repaint();
        }
    
        public void paint(Graphics g) {
            //双缓冲技术防止屏幕闪烁
            BufferedImage bi = new BufferedImage(500,500,BufferedImage.TYPE_INT_RGB);
            Graphics g2 = bi.createGraphics();
            g2.setColor(Color.BLACK);
            //绘制背景
            g2.drawImage(image, 0, 20, this);
            g2.setFont(new Font("黑体", Font.BOLD, 20));
            g2.drawString("游戏信息:"+message, 130, 60);
            //输出时间信息
            g2.setFont(new Font("宋体", 0, 14));
            g2.drawString("黑方时间:" + blackMessage, 30, 470);
            g2.drawString("白方时间:" + whiteMessage, 260, 470);
    
            //绘制棋盘
            /**
             *          X=10 Y=70
             *         X=370 Y=430
             *         X=370 Y=70
             *         X=10 Y=430
             */
            for (int i = 0; i < 19; i++) {
                g2.drawLine(10, 70 + 20 * i, 370, 70 + 20 * i);
                g2.drawLine(10 + 20 * i, 70, 10 + 20 * i, 430);
            }
            //标注点位
            g2.fillOval(68, 128, 4, 4);
            g2.fillOval(308, 128, 4, 4);
            g2.fillOval(308, 368, 4, 4);
            g2.fillOval(68, 368, 4, 4);
    
            g2.fillOval(68, 248, 4, 4);
            g2.fillOval(308, 248, 4, 4);
            g2.fillOval(188, 128, 4, 4);
            g2.fillOval(188, 368, 4, 4);
    
            g2.fillOval(188, 248, 4, 4);
    
            //绘制棋子
            for (int i = 0; i < 19; i++) {
                for (int j = 0; j < 19; j++) {
                    //黑子
                    if (allChess[i][j] == 1) {
                        int tempX = i * 20 + 10;
                        int tempY = j * 20 + 70;
                        g2.fillOval(tempX - 7, tempY - 7, 14, 14);
                    }
                    //白子
                    if (allChess[i][j] == 2) {
                        int tempX = i * 20 + 10;
                        int tempY = j * 20 + 70;
                        g2.setColor(Color.WHITE);
                        g2.fillOval(tempX - 7, tempY - 7, 14, 14);
                        g2.setColor(Color.BLACK);
                        g2.drawOval(tempX - 7, tempY - 7, 14, 14);
                    }
                }
            }
    
            g.drawImage(bi,0,0,this);
        }
    
        //鼠标按键在组件上按下时调用。
        @Override
        public void mousePressed(MouseEvent e) {
            System.out.println("X=" + e.getX() + " Y=" + e.getY());
            if (canPlay) {
                x = e.getX();
                y = e.getY();
                //判断点击是否在棋盘内
                if (x >= 10 && x <= 370 && y >= 70 && y <= 430) {
                    x = (x - 10) / 20;
                    y = (y - 70) / 20;
    
                    if (allChess[x][y] == 0) {
                        if (isBlack) {
                            allChess[x][y] = 1;
                            isBlack = false;
                            message="轮到白方";
                        } else {
                            allChess[x][y] = 2;
                            isBlack = true;
                            message="轮到黑方";
                        }
    
                        //判断游戏是否结束
                        boolean isWin = this.checkWin();
                        if (isWin) {
                            JOptionPane.showMessageDialog(this, "游戏结束,"
                                    + (allChess[x][y] == 1 ? "黑方" : "白方") + "获胜!");
                            canPlay = false;
                        }
                    }
    
                    this.repaint();
                }
            }
    
            // 点击 【开始游戏】 按钮
            if(e.getX() >=400 && e.getX()<=470 && e.getY()>=70 && e.getY()<=100){
                int result = JOptionPane.showConfirmDialog(this,"是否重新开始游戏?","",0);
                if(result==0){
                    //1.清空棋盘
                    allChess = new int[19][19];
                    //另一种方式:
                    /*for (int i = 0; i < 19; i++) {
                        for (int j = 0; j < 19; j++) {
                            allChess[i][j] = 0;
                        }
                    }*/
                    //2.重置游戏信息
                    message = "黑方先行";
                    //3.将下一步下棋的人改为黑方
                    isBlack = true;
                    //4.可以游戏标志改为true
                    canPlay = true;
                    //5.重置黑白双方时间限制
                    blackTime = maxTime;
                    whiteTime = maxTime;
                    if (maxTime > 0) {
                        blackMessage = maxTime / 3600 + ":"
                                + (maxTime / 60 - maxTime / 3600 * 60) + ":"
                                + (maxTime - maxTime / 60 * 60);
                        whiteMessage = maxTime / 3600 + ":"
                                + (maxTime / 60 - maxTime / 3600 * 60) + ":"
                                + (maxTime - maxTime / 60 * 60);
                        t.resume();
                    } else {
                        blackMessage = "无限制";
                        whiteMessage = "无限制";
                    }
                    //6.重新绘制窗体
                    this.repaint();
                }
            }
            //点击 【游戏设置】 按钮
            if (e.getX() >= 400 && e.getX() <= 470 && e.getY() >= 120
                    && e.getY() <= 150) {
                String input = JOptionPane
                        .showInputDialog("请输入游戏的最大时间(单位:分钟),如果输入0,表示没有时间限制:");
                try {
                    maxTime = Integer.parseInt(input) * 60;
                    if (maxTime < 0) {
                        JOptionPane.showMessageDialog(this, "请输入正确信息,不允许输入负数!");
                    }
                    if (maxTime == 0) {
                        int result = JOptionPane.showConfirmDialog(this,
                                "设置完成,是否重新开始游戏?");
                        if (result == 0) {
                            for (int i = 0; i < 19; i++) {
                                for (int j = 0; j < 19; j++) {
                                    allChess[i][j] = 0;
                                }
                            }
                            // 另一种方式 allChess = new int[19][19];
                            message = "黑方先行";
                            isBlack = true;
                            blackTime = maxTime;
                            whiteTime = maxTime;
                            blackMessage = "无限制";
                            whiteMessage = "无限制";
                            this.canPlay = true;
                            this.repaint();
                        }
                    }
                    if (maxTime > 0) {
                        int result = JOptionPane.showConfirmDialog(this,
                                "设置完成,是否重新开始游戏?");
                        if (result == 0) {
                            for (int i = 0; i < 19; i++) {
                                for (int j = 0; j < 19; j++) {
                                    allChess[i][j] = 0;
                                }
                            }
                            // 另一种方式 allChess = new int[19][19];
                            message = "黑方先行";
                            isBlack = true;
                            blackTime = maxTime;
                            whiteTime = maxTime;
                            blackMessage = maxTime / 3600 + ":"
                                    + (maxTime / 60 - maxTime / 3600 * 60) + ":"
                                    + (maxTime - maxTime / 60 * 60);
                            whiteMessage = maxTime / 3600 + ":"
                                    + (maxTime / 60 - maxTime / 3600 * 60) + ":"
                                    + (maxTime - maxTime / 60 * 60);
                            t.resume();
                            this.canPlay = true;
                            this.repaint();
                        }
                    }
                } catch (NumberFormatException e1) {
                    JOptionPane.showMessageDialog(this, "请正确输入信息!");
                }
            }
            //点击 【游戏说明】 按钮
            if(e.getX() >=400 && e.getX()<=470 && e.getY()>=170 && e.getY()<=200){
                JOptionPane.showMessageDialog(this,"这是一个五子棋游戏程序,黑白双方轮流下棋,当某一方连到五子时游戏结束。");
            }
            //点击 【认输】 按钮
            if(e.getX() >=400 && e.getX()<=470 && e.getY()>=270 && e.getY()<=300){
                int result = JOptionPane.showConfirmDialog(this,"是否确认认输?","",0);
                if(result==0){
                    if(isBlack){
                        JOptionPane.showMessageDialog(this,"黑方已经认输,游戏结束!");
                    }else{
                        JOptionPane.showMessageDialog(this,"白方已经认输,游戏结束!");
                    }
                    //停止游戏
                    canPlay = false;
                }
            }
            //点击 【关于】 按钮
            if(e.getX() >=400 && e.getX()<=470 && e.getY()>=320 && e.getY()<=350){
                JOptionPane.showMessageDialog(this,"本游戏由老徐制作,有问题请联系老徐。");
            }
            //点击 【退出】 按钮
            if(e.getX() >=400 && e.getX()<=470 && e.getY()>=370 && e.getY()<=400){
                JOptionPane.showMessageDialog(this,"游戏结束!");
                System.exit(0);
            }
        }
    
        private boolean checkWin() {
            boolean flag = false;
            //统计相连棋子数
            //横向
            int count = 1;
            int color = allChess[x][y];
    
            /*int i = 1;
            while (color == allChess[x + i][y]) {
                count++;
                i++;
            }
    
            i = 1;
            while (color == allChess[x - i][y]) {
                count++;
                i++;
            }
    
            if (count >= 5) {
                flag = true;
            }
    
            //竖向
            int count2 = 1;
            int i2 = 1;
            while (color == allChess[x][y+i2]) {
                count2++;
                i2++;
            }
    
            i2 = 1;
            while (color == allChess[x][y-i2]) {
                count2++;
                i2++;
            }
    
            if (count2 >= 5) {
                flag = true;
            }
            // 右上+左下
            int count3 = 1;
            int i3 = 1;
            while (color == allChess[x+i3][y-i3]) {
                count3++;
                i3++;
            }
    
            i3 = 1;
            while (color == allChess[x-i3][y+i3]) {
                count3++;
                i3++;
            }
    
            if (count3 >= 5) {
                flag = true;
            }
            // 左上+右下
            int count4 = 1;
            int i4 = 1;
            while (color == allChess[x-i4][y-i4]) {
                count4++;
                i4++;
            }
    
            i4 = 1;
            while (color == allChess[x+i4][y+i4]) {
                count4++;
                i4++;
            }
    
            if (count4 >= 5) {
                flag = true;
            }
    */      //判断横向
            count = this.checkCount(1,0,color);
            if(count>=5){
                flag = true;
            }else {
                //判断纵向
                count = this.checkCount(0,1,color);
                if(count>=5){
                    flag = true;
                }else {
                    //判断右上、左下
                    count = this.checkCount(1, -1, color);
                    if (count >= 5) {
                        flag = true;
                    } else {
                        //判断右下、左上
                        count = this.checkCount(1, 1, color);
                        if (count >= 5) {
                            flag = true;
                        }
                    }
                }
            }
            return flag;
    
        }
    
        private int checkCount(int xChange, int yChange, int color){
            int count = 1;
            int tempX = xChange;
            int tempY = yChange;
    
            while ((x+xChange>=0 && x+xChange <= 18 && y+yChange>=0 && y+yChange <= 18 )&&color == allChess[x+xChange][y+yChange]){
                count++;
                if(xChange != 0){
                    xChange++;
                }
                if(yChange!=0){
                    if(yChange>0){
                        yChange++;
                    }else {
                        yChange--;
                    }
                }
            }
    
            xChange = tempX;
            yChange = tempY;
    
            while ((x-xChange>=0 && x-xChange <= 18 && y-yChange>=0 && y-yChange <= 18 )&&color == allChess[x-xChange][y-yChange]){
                count++;
                if(xChange != 0){
                    xChange++;
                }
                if(yChange!=0){
                    if(yChange>0){
                        yChange++;
                    }else {
                        yChange--;
                    }
                }
            }
            return count;
        }
    
        @Override
        public void run() {
            // 判断是否有时间限制
            if (maxTime > 0) {
                while (true) {
                    if (isBlack) {
                        blackTime--;
                        if (blackTime == 0) {
                            JOptionPane.showMessageDialog(this, "黑方超时,游戏结束!");
                        }
                    } else {
                        whiteTime--;
                        if (whiteTime == 0) {
                            JOptionPane.showMessageDialog(this, "白方超时,游戏结束!");
                        }
                    }
                    blackMessage = blackTime / 3600 + ":"
                            + (blackTime / 60 - blackTime / 3600 * 60) + ":"
                            + (blackTime - blackTime / 60 * 60);
                    whiteMessage = whiteTime / 3600 + ":"
                            + (whiteTime / 60 - whiteTime / 3600 * 60) + ":"
                            + (whiteTime - whiteTime / 60 * 60);
                    this.repaint();
                    try {
                        Thread.sleep(1000);
                    } catch (InterruptedException e) {
                        e.printStackTrace();
                    }
                    System.out.println(blackTime + " -- " + whiteTime);
                }
            }
        }
    
        // 鼠标单击事件
        @Override
        public void mouseClicked(MouseEvent e) {
        }
    
        @Override
        public void mouseReleased(MouseEvent e) {
    
        }
    
        @Override
        public void mouseEntered(MouseEvent e) {
    
        }
    
        @Override
        public void mouseExited(MouseEvent e) {
    
        }
    }
    

     

     

     

     

     

     

     

     

     

    展开全文
  • java Swing实现五子棋

    2020-12-09 16:21:00
    java实现五子棋项目 运行结果 视频经过压缩画质略显粗糙。 标题 1)绘制网格棋盘: 重写JPanel的paint(Graphics g)方法,绘制16*16网格。 如图: 2)代码如下(仅包含部分代码): public class Board extends ...

    java实现五子棋项目

    运行结果

    视频经过压缩画质略显粗糙。
    在这里插入图片描述

    标题

    1)绘制网格棋盘:
    重写JPanel的paint(Graphics g)方法,绘制16*16网格。
    如图:
    在这里插入图片描述2)代码如下(仅包含部分代码):

    
    public class Board extends JPanel{
        int width = Toolkit.getDefaultToolkit().getScreenSize().width;
        int height = Toolkit.getDefaultToolkit().getScreenSize().height;
    
        public HashMap<Point,Color> points=new HashMap<>();//存放已出的所有其中,方便绘图和计算结果
        Board(){
            this.setVisible(true);
            drawBoard();
        }
    
        public int starX=300,starY=40,step=40,piecesR=28;
        BufferedImage buf;
    
        @Override
        public void paint(Graphics g){
            g.drawImage(buf, 0, 0,this);
        }
    
        void drawL(Point p,Graphics2D g1,int length,int bound){
            int x1=p.x-bound;
            int x2=p.x-bound-length;
            int x3=p.x+bound;
            int x4=p.x+bound+length;
            int y1=p.y-bound;
            int y2=p.y-bound-length;
            int y3=p.y+bound;
            int y4=p.y+bound+length;
            g1.drawLine(x1,y1,x2,y1);
            g1.drawLine(x1,y1,x1,y2);
            g1.drawLine(x1,y3,x2,y3);
            g1.drawLine(x1,y3,x1,y4);
            g1.drawLine(x3,y3,x3,y4);
            g1.drawLine(x3,y3,x4,y3);
            g1.drawLine(x3,y1,x4,y1);
            g1.drawLine(x3,y1,x3,y2);
        }
    
        public void drawBoard(){
            int Max=step*15;
            buf = new BufferedImage(this.width, this.height, BufferedImage.TYPE_INT_RGB);
            Graphics2D  g1 =  buf.createGraphics();  // 创建画笔
    
            g1.addRenderingHints((Map)(Toolkit.getDefaultToolkit().getDesktopProperty("awt.font.desktophints")));
    
            g1.setColor(new Color(46,139,87));//60,179,113//0,255,127
            g1.fillRect(0,0,this.width,this.height);
    
            g1.setColor(new Color(106,90,205));
            g1.fill3DRect(starX, starY, Max, Max, true);
    
    
            for (int i = 0; i <=15; i++) {
                g1.setColor(Color.WHITE);
    
                g1.drawLine(starX, starY+i*step, Max+starX, starY+i*step);  //画棋盘横线
                g1.drawLine(starX+i*step, starY, starX+i*step, Max+starY);  //画棋盘竖线
    
                g1.setColor(Color.black);
                g1.setFont(new Font("楷体",Font.BOLD,15));
                g1.drawString(numToCh(i),starX-((numToCh(i).length()==1)?25:35),starY+i*step+5);//纵行
                g1.drawString(numToCh(i),starX+i*step-((numToCh(i).length()==1)?5:15),starY-8);//横行
    
                g1.setColor(Color.BLACK);
    
                g1.setStroke(new BasicStroke(2.0f));
    
                if(i==4) {
                    drawL(new Point(starX+i*step,starY+i*step),g1,8,4);
                    drawL(new Point(starX+i*step,starY+12*step),g1,8,4);
                }
                if(i==12){
                    drawL(new Point(starX+i*step,starY+i*step),g1,8,4);
                    drawL(new Point(starX+i*step,starY+4*step),g1,8,4);
                }
    
            Iterator iterator=points.entrySet().iterator();
            while(iterator.hasNext()){
                Map.Entry<Point,Color> entry=(Map.Entry)iterator.next();
                g1.setColor(entry.getValue());
                g1.fillOval(starX+(entry.getKey().x)*step-17,starY+(entry.getKey().y)*step-17,34,34);
            }
    
            String []str={"开始","悔棋","投降","帮助","重来"};
            for(int i=0;i<str.length;i++) {
    
                g1.setColor(Color.white);
                g1.fillRect(140+190*i, starY +Max+45, 150, 50);
    
                g1.setColor(Color.black);
    
                g1.setStroke(new BasicStroke(50.0f));
                g1.setFont(new Font("宋体",Font.BOLD,35));
    
                g1.drawString(str[i], 180+190*i, starY +Max+80);//纵行
            }
            repaint();
        }
    }
    

    具体运行效果

    在这里插入图片描述

    具体项目代码见:https://download.csdn.net/download/qq_44140450/13609418

    展开全文
  • 自己改编的一个用java实现的五子棋项目,用户体验就完全谈不上了,不过功能已经实现,可给大家参考。自己在netBeans 7.0下调试成功,所以肯定没问题的。不复杂,但是看细节也有点小复杂,希望对大家有帮助。
  • Java实现五子棋
  • javajava swing五子棋人机对弈

    千次阅读 2017-05-04 14:39:00
    最近学习java swing,将上次的人机五子棋做了改进,将其界面化,在调试过程中还发现了上次代码中的一些问题。 问题一:无法应对A落在自己左上方的棋子 问题二:计算机不能应对落在边界的棋子,不能应对单个...
  • java swing写的五子棋

    2009-04-15 15:36:45
    Java Swing 写的五子棋 有需要的朋友参考下
  • Java-Swing五子棋源码

    千次阅读 2016-07-04 22:24:12
    五子棋源码package org.nick;import java.awt.Color; import java.awt.Font; import java.awt.Graphics; import java.awt.Toolkit; import java.awt.event.MouseEvent; import java.awt.event.MouseListener; import...
  • 主要是一个五子棋游戏,利用java swing技术编写,总共只有一个类,两个内部类。人机对战
  • 在Eclise或myEclipse中新建工程,添加上代码可直接运行,或者在DOS命令中运行,需要配置环境变量。
  • Java swing 单机版五子棋

    千次阅读 2019-03-17 16:42:20
    五子棋是基于javaswing开发,是单机版,源码见git:https://github.com/zhangliqingyun/FiveChess.git,先看效果图 二.功能介绍 1.首先建立程序启动类 public class MyFiveChess { public static void ...
  • 这个小程序是我1年多前自己写着玩的,当时不懂这么多,两个个文件就搞定了,写的也不规范。 ai不是很智能,只是会搜索当前局面的最优解,评分规则是我从网上找的一个。大概介绍一下这个规则: 能成死二(当前位置下...
  • 使用java swing制作人机五子棋背景算法原理棋盘分值更新范围: 背景 算法老师要求交个大作业什么的,自己就选择了制作“利用所学算法知识设计一个人机对弈程序或软件”这个课题,顺便首次记录一下自己独自写一个小...
  • 五子棋JavaSwing开发

    2018-06-10 11:21:33
    客户端,数据库模式开发,适用于初学者,了解数据库,Java之间的连接。
  • import java.awt.Color; import java.awt.Font; import java.awt.Graphics; import java.awt.Toolkit; import java.awt.event.MouseEvent; import java.awt.event.MouseListener; import java.awt.imag...
  • java swing开发的网络对战五子棋游戏
  • 哥的毕业设计,我曾经被自己的智能打败过,骄傲! 具体怎么使用已经在说明书里面写的很详细了 学长只能帮你到这了

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 1,098
精华内容 439
关键字:

javaswing五子棋

java 订阅