Java实现五子棋游戏单机版(1.0)

本文实例为大家分享了Java实现五子棋游戏单机版的具体代码,供大家参考,具体内容如下

简介

这个程序实现了单机版五子棋,目前无法联机,只能自己跟自己下。
棋盘是20*20的。
主要功能:下棋、认输、悔棋、重新开始、退出等功能

PS:目前设置只有显示游戏规则。

截图

完整代码

package Gobang;
import javax.swing.*;
import java.awt.*;
import java.awt.event.*;
import java.awt.image.*;
//import java.applet.*;
//import java.net.*;
//import java.io.*;
//import javax.imageio.*;
public class Frame  extends JFrame implements MouseListener,ActionListener{//JFrame的扩展类

    private static final long serialVersionUID = 1L;
    JPanel panel1;//用于安放按钮;
    JButton RestartButton,SetButton,AdmitDefeatButton,RegretButton,ExitButton;//五个按钮,各有其功能。
    Graphics g;//画笔
    BufferedImage buf;
    int x;//鼠标的坐标
    int y;
    int[][] Chess = new int[20][20];   // 保存棋子,1表示黑子,2表示白子
    boolean IsBlack = true;   //表示当前要下的是黑子还是白子,true表示黑子,false表示白子
    boolean IsFinish = false;   //表示当前游戏是否结束
    int xRange;
    int yRange;
    int[] chessX = new int[400];//用来保存从开始到当前的所有棋子,用于悔棋;
    int[] chessY = new int[400];
    int countX = 0;
    int countY = 0;
    /*本来想用于播放背景音乐,但是没有成功,,,先暂时放弃
    //File f;
    //URI uri;
    //URL url;
    //@SuppressWarnings("deprecation")
    */
    //
    public Frame() {
        //设置标题、大小、排列方式等
        this.setTitle("五子棋");
        this.setSize(500,550);
        this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        this.setVisible(true);
        this.setLayout(null);
        //五个按钮:重新开始、设置、认输、悔棋、退出。
        RestartButton = new JButton("重新开始");
        RestartButton.setSize(20,40);
        SetButton = new JButton("设置");
        SetButton.setSize(20,40);
        AdmitDefeatButton = new JButton("认输");
        AdmitDefeatButton.setSize(20,40);
        RegretButton = new JButton("悔棋" );
        RegretButton.setSize(20,40);
        ExitButton = new JButton("退出");
        ExitButton.setSize(20,40);
        //五个按钮添加到中间容器;
        panel1 = new JPanel();
        panel1.setBorder(BorderFactory.createLoweredBevelBorder()); //设置边框
        panel1.setLayout(new GridLayout(1,5));
        panel1.add(RestartButton);
        panel1.add(SetButton);
        panel1.add(AdmitDefeatButton);
        panel1.add(RegretButton);
        panel1.add(ExitButton);
        this.add(panel1);
        panel1.setSize(460,20);
        panel1.setLocation(0, 460);
        
        this.repaint();//表示重新绘制画布,可以自动调用paint函数;
        //本类作为监听类,包括鼠标监听和按钮动作监听;
        this.addMouseListener(this);
        RestartButton.addActionListener(this);
        SetButton.addActionListener(this);
        AdmitDefeatButton.addActionListener(this);
        RegretButton.addActionListener(this);
        ExitButton.addActionListener(this);
        /*音频播放部分
        try {
            f = new File("");
            uri = f.toURI();
            url = uri.toURL();
            AudioClip aau; 
            aau = Applet.newAudioClip(url);
            aau.loop();  //循环播放
        } catch (Exception e)
        {
            e.printStackTrace();
        }
        */
    }
    //画布绘制
    public void paint(Graphics g)
    {
        if(g == null)//如果第一次绘制,新建一个图片,并且创建画布。
        {
            buf = new BufferedImage(450, 450, BufferedImage.TYPE_INT_RGB);
            g =  buf.createGraphics();
        }
        if(g != null)//
        {
            super.paint(g);//表示在原来图像的基础上,再画图
            g.setColor(new Color(249,205,173));//画笔颜色调成褐色;
            g.fill3DRect(20, 40, 400, 400,true);//用画笔画一个边长为400的正方形;边距为20,40
            for(int i = 0; i <= 20; i++)//用画笔横竖各画19条线
            {
                g.setColor(Color.BLACK);//画笔颜色调为黑色;
                g.drawLine(20,40+i*20,420,40+i*20);
                g.drawLine(20+i*20,40,20+i*20,440);
            }
        }
         for(int i=0; i<20; i++){
                for (int j = 0; j < 20; j++) {
                    //画实心黑子,直径16
                    if(Chess[i][j] == 1){    
                        int tempX = i*20+12;
                        int tempY = j*20+32;
                        g.setColor(Color.BLACK);
                        g.fillOval(tempX, tempY, 16, 16);
                        g.setColor(Color.BLACK);
                        g.drawOval(tempX, tempY, 16, 16);
                    }
                    
                    //画实心白子,直径16
                    if(Chess[i][j] == 2){
                        int tempX = i*20+12;
                        int tempY = j*20+32;
                        g.setColor(Color.WHITE);
                        g.fillOval(tempX, tempY, 16, 16);
                        g.setColor(Color.WHITE);
                        g.drawOval(tempX, tempY, 16, 16);
                    }
                }
            }
        g.drawImage(buf, 0, 0,this);
        
    }        

    public void mousePressed(MouseEvent e) {
        // TODO Auto-generated method stub
        
        if(!IsFinish)    //判断棋局是否结束
        {
            x = e.getX();    //获取当前鼠标点击位置
            y = e.getY();
            if(x >= 20 && x < 420 && y >= 40 && y<= 440)//判断鼠标是否在棋局内
            {
                xRange = (x-20)%20;
                if(xRange > 10 && xRange < 20)    //如果在交叉点的边长为10的范围内,就把棋子下在这;
                {
                    x = (x - 20) / 20 + 1;
                }
                else
                {
                    x = (x - 20) / 20;
                }
                yRange = (y-40)%20;
                if(yRange > 10 && yRange < 20)
                {
                    y = (y - 40) / 20 + 1;
                }
                else
                {
                    y = (y - 40) / 20;
                }
                
                if(Chess[x][y] == 0)    //如果该交叉点没有被下过;
                {
                    chessX[countX++] = x;    //存储当前棋子的位置;
                    chessY[countY++] = y;
                    if(IsBlack)            //如果是黑子
                    {
                        Chess[x][y] = 1;
                        IsBlack = false;
                    }
                    else
                    {
                        Chess[x][y] = 2;
                        IsBlack = true;
                    }
                    this.repaint();//重新绘制画布
                }
                
                if(this.isWin())//如果下棋之后赢了,弹出对话框
                {
                    if(Chess[x][y] == 1)
                    {
                        JOptionPane.showMessageDialog(this, "黑方胜利");
                    }
                    else 
                    {
                        JOptionPane.showMessageDialog(this, "白方胜利");
                    }
                    this.IsFinish = true;  //游戏结束
                }
                
            }
            

        }
    }
    
    public boolean isWin(){
        boolean flag = false;
        int count = 1; 
        int color = Chess[x][y];  
        //判断横向是否有5个棋子相连
        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;
    }
     // 检查棋盘中的五子棋是否连成五子,xChange,yChange为相对于当前棋子位置的变化量
    public int checkCount(int xChange , int yChange ,int color){
        int count = 1;//统计总共有几个连着的棋子;
        int tempX = xChange;
        int tempy = yChange;  
        //判断棋子右边有没有相同颜色的棋子;
        while(x + xChange >=0 && x+xChange <20  && y+yChange >=0 && 
                y+yChange < 20 && color == Chess[x+xChange][y+yChange])
        {
            count++;                        //如果有,棋子数加一
            if(xChange != 0)  
                xChange++;                    //如果横向方向变化,x相对位置加一
            if(yChange != 0 )                
            {      
                if(yChange != 0)            
                {
                    if(yChange > 0)            //如果纵向方向增加,y相对位置加一
                    {   
                        yChange++;        
                    }
                    else                     //如果纵向方向减小,y相对位置减一
                    {
                        yChange--;        
                    }
                }
            }
            
        }
        xChange = tempX;
        yChange = tempy;  
        //判断棋子左边有没有相同颜色的棋子;
        while(x-xChange >=0 && x-xChange <20 && y-yChange >=0 &&
                y-yChange <20 && color == Chess[x-xChange][y-yChange])
        {        
            count++;
            if(xChange != 0)
            {
                xChange++;
            }
            if(yChange != 0)
            {
                if (yChange > 0) 
                {
                    yChange++;            
                }
                else 
                {
                    yChange--;            
                }
            }
        }
        return count;
    }
    //监听动作函数
    public void actionPerformed(ActionEvent e) {
        // TODO Auto-generated method stub
        if(e.getSource() == RestartButton)//如果点击的按钮是RestartButton,清空画板,还原设置
        {
            if(JOptionPane.showConfirmDialog(this, "Do you want to restart the game?") == 0)
            {
                for (int i = 0; i < 15; i++) 
                {
                    for (int j = 0; j < 15; j++) 
                    {
                        Chess[i][j] = 0;  //清空棋盘的棋子
                    }
                    
                }
                
                //清空下棋棋子坐标的记录
                for (int i = 0; i < 15; i++)
                {
                    chessX[i] = 0;
                    chessY[i] = 0;
                }
                countX =0;
                countY =0;
                IsBlack = true;
                IsFinish = false;
                this.repaint();
            }
        }
        if(e.getSource() == AdmitDefeatButton)//如果点击的按钮是AdmitDefeatButton,结束游戏,并提示
        {
            if(!IsFinish)    //判断棋局是否结束
            {
                if(JOptionPane.showConfirmDialog(this, "Are you sure you want to give up?") == 0)
                {
                    if(IsBlack == true)
                    {
                        JOptionPane.showMessageDialog(this,"白方获胜");
                    }
                    else
                    {
                        JOptionPane.showMessageDialog(this,"黑方获胜");
                    }
                    IsFinish = true;
                }
            }
        }
        if(e.getSource() == ExitButton)//如果点击的按钮是ExitButton,退出程序
        {
            if(JOptionPane.showConfirmDialog(this, "Do you want to exit?") == 0)
            {
                System.exit(0);
            }
        }
        if(e.getSource() == RegretButton)///如果点击的按钮是RegretButton,悔棋一步
        {
            if(!IsFinish)    //判断棋局是否结束
            {
            if(IsBlack == true)    //如果现在是黑子要下,表示悔棋的是白子
            {
                if(JOptionPane.showConfirmDialog(this, "The white want to regret,do you agree?") == 0)
                {
                    int tempX = chessX[--countX];    //获取上一步白子下的位置;
                    int tempY = chessY[--countY];
                    Chess[tempX][tempY] = 0;    //撤回白子
                    IsBlack = false;    //当前要下的变为白方
                }
            }
            else
            {
                if(JOptionPane.showConfirmDialog(this, "The black want to regret,do you agree?") == 0)
                {
                    int tempX = chessX[--countX];
                    int tempY = chessY[--countY];
                    Chess[tempX][tempY] = 0;
                    IsBlack = true;
                }
            }
            this.repaint();    //重新绘制画布
            }
        }
        if(e.getSource() == SetButton)    //设置按钮,现在只显示游戏规则
        {
                 JDialog frame1 = new JDialog();//新建对话框
                 frame1.setBounds(            //设置对话框边界
                            new Rectangle(
                                    0,
                                    260, 
                                    600, 
                                    200
                            )
                        );
                 JTextField tf = new JTextField();//新建文本框
                 frame1.setTitle("Play Rule");
                 frame1.getContentPane().add(tf);    //添加文本框
                 tf.setText("The two sides use black and white pieces respectively.\n At the intersection of the straight line and horizontal line of the chessboard, \nthe one who forms a five piece line first wins.");
                 frame1.setModalityType(Dialog.ModalityType.APPLICATION_MODAL);    // 设置模式类型
                 frame1.setVisible(true);
         }        
    }
    public static void main(String[] args) {
        new Frame();
}
    @Override
    public void mouseClicked(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
        
    }
}

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持我们。

(0)

相关推荐

  • java实现五子棋小游戏

    java实现五子棋小游戏 package Gomoku; import java.awt.Toolkit; import javax.swing.JFrame; public class GomokuFrame extends JFrame { //定义一个操作面板 OperatorPane op=null; public GomokuFrame() { //设置名称 this.setTitle("五子棋"); //设置窗口大小 this.setSize(510,510); //设置窗

  • java基于swing实现的五子棋游戏代码

    本文实例讲述了java基于swing实现的五子棋游戏代码.分享给大家供大家参考. 主要功能代码如下: 复制代码 代码如下: import java.awt.*; import javax.swing.*; import java.awt.event.*; public class Main extends JFrame implements ActionListener{         private static final long serialVersionUID = 1L;      

  • Java实现两人五子棋游戏(二) 画出棋盘

    本文为大家分享了java画出五子棋游戏棋盘的方法,供大家参考,具体内容如下 棋盘模块: 画五子棋棋盘:19条横线.19条竖线 步骤一:显示棋盘 我有一张名为chessboard.png的棋盘,位置为根目录/res/drawable/chessboard/png,现在我要显示这张图片. DrawChessBoard.java package xchen.test.simpleGobang; import java.awt.Graphics; import java.awt.Image; impor

  • Java编程实现五子棋人人对战代码示例

    利用Java,在控制台操作下,编写的五子棋,作为复习二维数组,面向对象等基础知识.w表示白棋,b表示黑棋 import java.util.Scanner; public class MainMethod { public static char[][] c = new char[10][10]; public static void main(String[] args) { MainMethod mainMethod = new MainMethod(); mainMethod.init()

  • java实现单人版五子棋游戏

    本文实例讲述了java实现的五子棋游戏代码,分享给大家供大家参考,具体代码如下 package gyb.exam; import java.awt.BorderLayout; import java.awt.Color; import java.awt.Dimension; import java.awt.Font; import java.awt.Graphics; import java.awt.Point; import java.awt.Toolkit; import java.awt.

  • Java实现五子棋网络版

    本文实例为大家分享了Java实现五子棋网络版的具体代码,供大家参考,具体内容如下 需求分析: 对于网络五子棋而言,在普通五子棋的基础上需要添加以下功能: 1.拥有服务器端和客户端,用户通过客户端登录服务器后可与其他登录的用户进行对弈 2.服务器支持多组用户同时进行对弈 3.用户可以在服务器上创建新游戏或加入已创建的游戏 4.用户在下棋的时候可以进行聊天交流 由上可以知道需要实现的功能: ·提供服务器和客户端的功能 ·服务器将监听客户端的登录情况并允许多个客户端进行登录 ·用户通过客户端可以登录服

  • Java实现五子棋AI算法

    五子棋AI算法 也算是一个典型的游戏AI算法,一些棋类的AI算法都可以参考实现,下面是Java实现代码 棋盘抽象接口 import java.util.List; public interface IChessboard { //取得棋盘最大横坐标 public int getMaxX(); //最大纵坐标 public int getMaxY(); //取得当前所有空白点,这些点才可以下棋 public List<Point> getFreePoints(); } 棋子类实现 //棋子类 p

  • java实现单机版五子棋

    这个小游戏是我和我姐们儿的JAVA课程设计,也是我做的第一个JAVA项目,适合初学者,希望能帮到那些被JAVA课设所困扰的孩纸们~~~ 一.该游戏需要实现 1.设计主框架,界面. 2.利用ActionListener接口实现按钮事件的监听. 3.重新开始功能的实现. 4.悔棋功能的实现. 5.退出功能的实现. 6.棋盘中棋子点类的定义. 7.利用MouseListener接口实现事件监听,并实现接口里的所有方法. 8.当鼠标移动到棋盘上的交点上,且该点上无棋子时能够变成小手形状. 9.点击棋盘时

  • Java实现五子棋游戏的完整代码

    用Java编写简单的五子棋,供大家参考,具体内容如下 前言 这两天在空闲时间做了个五子棋项目,分享给大家看一下,界面是这样的: 界面很丑我知道,本人虽有几年PS基础,但知识浅薄,审美观不尽人意,做到如此实属极限(其实我懒得做了),大家将就着看看吧. 下面放出代码,为方便大家参考,我几乎每条代码都标有注释.    测试类代码 public class Test { public static void main(String[] args) { MyJFrame mj=new MyJFrame()

  • Java实现五子棋(附详细源码)

    本文实例为大家分享了Java实现五子棋游戏的具体代码,供大家参考,具体内容如下 学习目的:熟悉java中swing类与java基础知识的巩固.(文末有源代码文件和打包的jar文件) 效果图: 思路:**1.首先构建一个Frame框架,来设置菜单选项与按钮点击事件. MyFrame.java文件代码如下 package StartGame; import javax.swing.ButtonGroup; import javax.swing.Icon; import javax.swing.JBu

随机推荐