Java五子棋课程设计

一 .项目简介

本项目主要设计了一款五子棋对战小游戏,主要实现的功能有人机对战,双人同机对战和双人联网对战,其中双人联网对战实现了类似于qq的聊天功能.

二 .工作重点

  1. 本项目主要运用swing绘图组件进行绘图,采用双缓冲技术使画面流畅.
  2. 运用多线程实现倒计时和QQ聊天功能,可以在下棋的过程中同时实现倒计时
  3. 采用五元组赋分法来实现人机对战的功能
  4. 采用面向对象的方法实现五子棋的功能,如人机对战棋盘和人人对战棋盘均继承自双人同机对战.
  5. 采用TCP网络通信协议实现人人功能的对战,确保了通信的稳定性和安全性
  6. 采用缓冲流传输图片实现打印功能,保证了游戏画面的稳定

三 .项目主要结构

                                                                 五子棋UML类图

                                                                 初始化棋子时序图

                                                                QQChat时序图 

                                                                 PVC时序图

四 .项目功能演示

                                                 游戏最初登录页面

                                                                 游戏棋盘展示

                                                                人机功能对战演示

游戏胜利页面展示

 

                                                 创建双人房间                       加入房间

        

 

                                        双人游戏界面和聊天界面展示

                                                        双人聊天功能 

五 .部分代码展示

初始登录界面

package FiveChess;

import javax.imageio.ImageIO;
import javax.swing.*;
import java.awt.*;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;

import java.awt.image.BufferedImage;
import java.io.File;
import java.io.IOException;
public class FirstPage  {
    JFrame jFrame=new JFrame("五子棋");//设计主页面
    BufferedImage bufferedImage;
    {
        try {
            bufferedImage = ImageIO.read(new File("Resourse\first.png"));//读取主页面的背景图
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
    private class Canvas extends JPanel//自定义画布
    {
        @Override
        public void paint(Graphics g) {
            g.drawImage(bufferedImage,0,0,600,410,null);
        }
    }

    Canvas canvas=new Canvas();

    public void init()
    {
        jFrame.addMouseListener(new MouseAdapter() {
            @Override
            public void mouseClicked(MouseEvent e) {//获取鼠标点击事件
                int x=e.getX();
                int y=e.getY();
                if(x>=220&&x<=472&&y>=75&&y<=150)//判断点击的位置加载函数
                {
                    jFrame.setVisible(false);
                     new PVCMainBoard().init();
                }
                else if(x>=220&&x<=472&&y>150&&y<225){
                    jFrame.setVisible(false);
                    new MainChessBoard().init();
                }
                else if(y>=225&&y<=300&&x>=220&&x<=472)
                {
                    jFrame.setVisible(false);
                     new LoadPage().init();
                }
                else if(y>=325&&y<=400&&x>=220&&x<=472)
                {
                    System.exit(0);
                }
            }
        });
        jFrame.add(canvas);
        canvas.repaint();
        jFrame.setPreferredSize(new Dimension(600,410));//设置大小
        jFrame.pack();
        jFrame.setResizable(false);
        jFrame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        jFrame.setVisible(true);
    }
    public static void main(String[] args) {
        new FirstPage().init();
    }



}

棋盘主界面

package FiveChess;
import javax.sound.sampled.AudioSystem;
import javax.sound.sampled.Clip;
import javax.sound.sampled.LineUnavailableException;
import javax.sound.sampled.UnsupportedAudioFileException;
import javax.swing.*;
import java.awt.*;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
import java.awt.event.MouseListener;
import java.awt.event.MouseMotionListener;
import java.io.File;
import java.io.IOException;
import static javax.sound.sampled.AudioSystem.*;
public class MainChessBoard {
    Clip clip;

    {
        try {
            clip = getClip();//添加背景音乐
            clip.open(AudioSystem.getAudioInputStream(new File("Resourse\123_02.wav")));
        } catch (LineUnavailableException e) {
            e.printStackTrace();
        } catch (UnsupportedAudioFileException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

    IsGameOver isGameOver=new IsGameOver();
    JFrame jFrame=new JFrame("五子棋");//绘制游戏的主页面
    ChessBoard chessBoard=new ChessBoard();
    JMenuBar jMenuBar=new JMenuBar();
    JMenuItem jMenuItem=new JMenuItem("悔棋");
    Coor[] coors=new Coor[235];
    int coorstack=-1;
    public MainChessBoard()  {
    }
    public void init()
    {
        RetimeLimit();//开始倒计时
        init_Chess(chessBoard.chess);//初始化棋盘
        jMenuItem.addMouseListener(new MouseAdapter() {
            @Override
            public void mouseClicked(MouseEvent e) {
                //System.out.println("hello");
                Withdraw();
            }
        });
        jMenuBar.add(jMenuItem);
        chessBoard.repaint();
        chessBoard.addMouseListener(new MyMouselistener());
        chessBoard.addMouseMotionListener(new MyouseMoveListener());
        jFrame.setPreferredSize(new Dimension(ChessBoard.BOARD_SIZE_X,ChessBoard.BOARD_SIZE_Y+30));
        clip.start();//开始播放音乐
        jFrame.add(chessBoard);
        jFrame.setJMenuBar(jMenuBar);
        jFrame.pack();
        jFrame.setResizable(false);
        jFrame.setVisible(true);
        jFrame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    }
    void init_Chess(Chess[][] chess)
    {
        int i,j;
        for(i=0;i<15;i++)
        {
            for(j=0;j<15;j++)
            {
                chess[i][j]=new Chess();
                chess[i][j].setColor(0);//初始将所有棋子的颜色值为0
                coors[i*15+j]=new Coor(0,0);//初始悔棋栈
            }

        }

    }
    void Withdraw()
    {
        if(coorstack>0){
            int x=coors[coorstack].getX();
            int y=coors[coorstack].getY();
            chessBoard.chess[x][y].setColor(0);
            x=coors[coorstack-1].getX();
            y=coors[coorstack-1].getY();
            chessBoard.chess[x][y].setColor(0);
            coorstack=coorstack-2;
            chessBoard.repaint();
        }
    }

    public void RetimeLimit()//设置结束时间的倒计时
    {
        new Thread(()->{//多线程处理倒计时
            while (true)
            {
                try {
                    Thread.sleep(1000);//休息一秒
                    chessBoard.limit_time--;
                    chessBoard.repaint();//重新绘制页面
                    if(chessBoard.limit_time<0)
                    {
                        jFrame.setVisible(false);
                        if(chessBoard.is_white)//判断是否胜利
                            new gameOver("黑棋").init();
                        else
                            new gameOver("白棋").init();
                        break;
                    }
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }

            }
        }).start();
    }
     class MyouseMoveListener implements MouseMotionListener
    {
        @Override
        public void mouseDragged(MouseEvent e) {
        }
        @Override
        public void mouseMoved(MouseEvent e) {//获取移动鼠标的位置画蓝色框框
            int x=e.getX();
            int y=e.getY();
            int X=(x-ChessBoard.PLUS_X)/ChessBoard.CHESSBOARD_X;
            int Y=(y-ChessBoard.PLUS_Y)/ChessBoard.CHESSBOARD_Y;
            chessBoard.position_X=X;
            chessBoard.position_Y=Y;
            chessBoard.repaint();
        }
    }
      class MyMouselistener implements MouseListener
    {
        @Override
        public void mouseClicked(MouseEvent e) {//获取鼠标点击位置
            int x=e.getX();
            int y=e.getY();
            int X=(x-ChessBoard.PLUS_X)/ChessBoard.CHESSBOARD_X;//转换为数组中的相对位置
            int Y=(y-ChessBoard.PLUS_Y)/ChessBoard.CHESSBOARD_Y;chessBoard.limit_time=30;
            if(chessBoard.chess[X][Y].getColor()==0)
            {
                if(ChessBoard.is_white) {
                    chessBoard.chess[X][Y].setColor(1);//更改颜色信息
                    if (isGameOver.whowin(X, Y, chessBoard.chess, 1) == 1) {//判断游戏是否结束
                        jFrame.setVisible(false);
                        clip.stop();
                        new gameOver("白棋").init();
                    }
                    ChessBoard.is_white = !ChessBoard.is_white;
                }
                else {
                    chessBoard.chess[X][Y].setColor(2);
                    ChessBoard.is_white = !ChessBoard.is_white;
                    if(isGameOver.whowin(X,Y, chessBoard.chess, 2)==2)
                    {
                        jFrame.setVisible(false);
                        clip.stop();
                        new gameOver("黑棋").init();
                    }
                }
                coorstack=coorstack+1;
                coors[coorstack].setX(X);
                coors[coorstack].setY(Y);
            }
            chessBoard.repaint();

        }
        @Override
        public void mousePressed(MouseEvent e) {

        }

        @Override
        public void mouseReleased(MouseEvent e) {

        }

        @Override
        public void mouseEntered(MouseEvent e) {

        }

        @Override
        public void mouseExited(MouseEvent e) {

        }
    }

    public static void main(String[] args) {
        new MainChessBoard().init();
    }

}

实现人机对战

package FiveChess;

public class PVC {

   int [] scores;
   public PVC(){
       scores=new int[11];//初始化五元组
       scores[0]=7;//五元组为空
       scores[1]=35;//有一个子
       scores[2]=800;//有两个子
       scores[3]=15000;//有三个
       scores[4]=800000;//有四个
       scores[5]=0;//不存在
       scores[6]=0;//混杂
       scores[7]=15;//有一个其他子
       scores[8]=400;//有两个其他子
       scores[9]=1800;//三个
       scores[10]=100000;//四个
   }


    public int addScores(Chess[][]  chess,int x,int y)//计算该点的分数之和
    {
        int sum=0;
        for(int i=x-4;i<=x;i++){//计算横向的五元组
            int num=0;//棋子数量
            //保存初始位置
            for(int j=i;j<=i+4;j++){//防止越界
                if(j<0||j+4>14){
                    num=5;
                    break;
                }
                if(chess[j][y].getColor()==2)num++;
                if(chess[j][y].getColor()==1){
                    num=6;
                    break;
                }

            }
            sum+=scores[num];
        }
        for(int i=y-4;i<=y;i++){//计算纵向的五元组
            int num=0;//棋子数量
            //保存初始位置
            for(int j=i;j<=i+4;j++){//防止越界
                if(j<0||j+4>14){
                    num=5;
                    break;
                }
                if(chess[x][j].getColor()==2)num++;
                if(chess[x][j].getColor()==1){
                    num=6;
                    break;
                }

            }
            sum+=scores[num];
        }
        for(int i=-4;i<=0;i++){//计算-x方向的分数;
         int num=0;
         for(int j=i;j<=i+4;j++){
             if(x+j<0||x+j>14||y+j<0||y+j>14){
                 num=5;
                 break;
             }
             if(chess[x+j][y+j].getColor()==2)num++;
             if(chess[x+j][y+j].getColor()==1){
                 num=6;
                 break;
             }

         }
            sum+=scores[num];
        }
        for(int i=-4;i<=0;i++){//计算x方向的分数;
            int num=0;
            for(int j=i;j<=i+4;j++){
                if(x-j<0||x-j>14||y+j<0||y+j>14){
                    num=5;
                    break;
                }
                if(chess[x-j][y+j].getColor()==2)num++;
                if(chess[x-j][y+j].getColor()==1){
                    num=6;
                    break;
                }
            }
            sum+=scores[num];
        }
        for(int i=x-4;i<=x;i++){//计算白子横向的五元组
            int num=0;//棋子数量
            //保存初始位置
            for(int j=i;j<=i+4;j++){//防止越界
                if(j<0||j+4>14){
                    num=0;
                    break;
                }
                if(chess[j][y].getColor()==1)num++;
                if(chess[j][y].getColor()==2){
                    num=0;
                    break;
                }

            }
            sum+=scores[num+6];
        }
        for(int i=y-4;i<=y;i++){//计算纵向的五元组
            int num=0;//棋子数量
            //保存初始位置
            for(int j=i;j<=i+4;j++){//防止越界
                if(j<0||j+4>14){
                    num=0;
                    break;
                }
                if(chess[x][j].getColor()==1)num++;
                if(chess[x][j].getColor()==2){
                    num=0;
                    break;
                }

            }
            sum+=scores[num+6];
        }
        for(int i=-4;i<=0;i++){//计算-x方向的分数;
            int num=0;
            for(int j=i;j<=i+4;j++){
                if(x+j<0||x+j>14||y+j<0||y+j>14){
                    num=0;
                    break;
                }
                if(chess[x+j][y+j].getColor()==1)num++;
                if(chess[x+j][y+j].getColor()==2){
                    num=0;
                    break;
                }

            }
            sum+=scores[num+6];
        }
        for(int i=-4;i<=0;i++){//计算x方向的分数;
            int num=0;
            for(int j=i;j<=i+4;j++){
                if(x-j<0||x-j>14||y+j<0||y+j>14){
                    num=0;
                    break;
                }
                if(chess[x-j][y+j].getColor()==1)num++;
                if(chess[x-j][y+j].getColor()==2){
                    num=0;
                    break;
                }
            }
            sum+=scores[num+6];
        }
        return sum;
    }
    public Coor getCoor(Chess[][]chess){//获取下一个点的坐标
        int x=0,y=0;
        Coor coor=new Coor(0,0);
        int max=0;
        for(x=0;x<15;x++){
            for(y=0;y<15;y++){
                if(chess[x][y].getColor()==0){
                    if(addScores(chess,x,y)>max) {//选出分数最大的地方
                        coor.setX(x);
                        coor.setY(y);
                        max = addScores(chess, x, y);
                    }
                }
            }
        }
        return coor;
    }

}

本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
THE END
分享
二维码
< <上一篇
下一篇>>