Java五子棋课程设计

Posted 明翥

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了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;
    


完整压缩版请移步MyFiveChess.rar-其他文档类资源-CSDN下载,0积分下载

以上是关于Java五子棋课程设计的主要内容,如果未能解决你的问题,请参考以下文章

水沝--JAVA团队课程设计博客

C语言大一课设——不会五子棋

五子棋程序设计实现技术文档

五子棋程序设计实现技术文档

五子棋程序设计实现技术文档

基于Java Swing五子棋小游戏设计和实现