Java Swing实现11x11五子棋:棋盘绘制与落子逻辑详解

Felix
Felix
发布时间:2026-10-16| 3人浏览过
原创

本文详细介绍了如何利用Java Swing库从零开始构建一个11x11的简易五子棋游戏。主要内容包括使用Graphics类绘制标准棋盘网格、通过JFrame建立窗口界面,以及核心玩法逻辑的实现。文章重点解析了如何将鼠标点击坐标映射到网格节点,使用二维数组管理棋盘状态以避免棋子重复放置,并实现了黑白色棋子轮流显示的功能。

棋盘绘制基础

五子棋的核心数据结构是一个二维数组,用于存储每个交叉点的状态(空、黑子、白子)。在图形界面中,首先需要使用绘图对象在画布上画出11x11的网格线。这可以通过遍历坐标并调用drawLine方法来实现,确保网格线之间的间距统一。

以下是初始化棋盘和网格线的核心代码:

public void setGraphics(Graphics g){
    this.g=g;
    // 绘制11条竖线和11条横线
    for(int i=0;i<11;i++){
        g.drawLine(100+Size*i, 100, 100+Size*i, 500);
        g.drawLine(100, 100+Size*i, 500, 100+Size*i);
    }
    // 初始化二维数组,0代表无棋子
    for(int i=0;i<11;i++){
        for(int j=0;j<11;j++){
            chessboard[i][j]=0;
        }
    }
}

鼠标点击与棋子绘制

实现落子功能的关键在于将用户的鼠标点击事件转换为棋盘上的具体坐标。由于用户很难精确点击交叉点中心,需要设定一个拾取范围。假设网格大小(Size)为40像素,起始偏移为100像素,则以交叉点为中心,向上下左右各扩展20像素(即半个网格宽)的范围均视为有效点击。

一旦确定了有效的网格坐标,即可调用椭圆绘制方法放置棋子。为了保证棋子圆心与网格点重合,绘制时需调整左上角坐标:a-Size/4, b-Size/4,直径设为Size/2。通过切换颜色并使用fillOval填充,可以实现黑色和白色棋子的视觉效果。

防覆盖与状态管理

若不在同一位置点击两次,会导致棋子重叠。解决这一问题的方法是结合数组索引进行判断。每次点击后,计算其对应的二维数组索引((a-100)/Size),检查该位置是否为0。只有当位置为空时,才允许执行绘制操作并更新数组值为1。

完整工程结构

整个游戏由两个核心类组成:主程序入口ShowUI负责启动窗口并触发绘图;监听器类DrawListener则负责具体的绘图逻辑和交互处理。

第1步:创建主窗口界面

目的:搭建游戏运行的基础窗口。
操作:实例化JFrame,设置窗口大小、位置及关闭行为。获取窗口的Graphics对象并传递给监听器。注意,在真实项目中通常建议使用JPanel并重写paintComponent方法以获得更好的双缓冲支持,此处展示的是基础实现方式。

package game;
import java.awt.Graphics;
import javax.swing.JFrame;

public class ShowUI {
    public void Draw(){
        JFrame drawframe=new JFrame();
        drawframe.setSize(1000,600);
        drawframe.setLocationRelativeTo(null);
        drawframe.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        
        // 创建监听器对象
        DrawListener draw = new DrawListener();
        drawframe.addMouseListener(draw);
        drawframe.setVisible(true);
        
        try {
            Thread.sleep(566);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
        
        Graphics g = drawframe.getGraphics();
        draw.setGraphics(g);
    }

    public static void main(String[] args) {
        ShowUI a=new ShowUI();
        a.Draw();
    }
}

第2步:实现交互与绘制逻辑

目的:处理鼠标点击、坐标映射、状态判定及棋子渲染。
操作:DrawListener类实现了MouseListener接口。在mouseClicked方法中,首先通过循环判断鼠标坐标落在哪个网格范围内。若范围有效且对应数组位置为空,则根据当前轮次(由number变量标记,偶数黑子,奇数白子)设置颜色并绘制填充椭圆,最后将数组对应位置标记为1。

package game;
import java.awt.Color;
import java.awt.Graphics;
import java.awt.event.MouseEvent;
import java.awt.event.MouseListener;

public class DrawListener implements MouseListener{
    Graphics g;
    public int Start_X=50;
    public int Start_Y=50;
    public int Size=40;
    public int number=0;
    public int [][]chessboard=new int[11][11];
    
    public void setGraphics(Graphics g){
        this.g=g;
        for(int i=0;i<11;i++){
            g.drawLine(100+Size*i, 100, 100+Size*i, 500);
            g.drawLine(100, 100+Size*i, 500, 100+Size*i);
        }
        for(int i=0;i<11;i++){
            for(int j=0;j<11;j++){
                chessboard[i][j]=0;
            }
        }
    }

    @Override
    public void mouseClicked(MouseEvent e){
        int countx=e.getX();
        int county=e.getY();
        int Size=40;
        int a=0;
        int b=0;
        
        // 计算落子对应的网格坐标
        for(int i=0;i<11;i++){
            if(countx>=(100+Size*i-(Size/2))&&countx<(100+Size*i+(Size/2))){
                a=100+Size*i;
            }
            if(county>=(100+Size*i-(Size/2))&&county<(100+Size*i+(Size/2))){
                b=100+Size*i;
            }
        }
        
        if(a!=0&&b!=0){
            int flag1=(a-100)/Size;
            int flag2=(b-100)/Size;
            
            // 检查位置是否已存在棋子
            if(chessboard[flag1][flag2]==0){
                if(number==0){
                    g.drawOval(a-Size/4, b-Size/4, Size/2, Size/2);
                    g.setColor(Color.BLACK);
                    g.fillOval(a-Size/4, b-Size/4, Size/2, Size/2);
                    number++;
                } else {
                    g.drawOval(a-Size/4, b-Size/4, Size/2, Size/2);
                    g.setColor(Color.WHITE);
                    g.fillOval(a-Size/4, b-Size/4, Size/2, Size/2);
                    number--;
                }
                chessboard[flag1][flag2]=1;
            } else {
                System.out.println("此处已经放置了棋子");
            }
        }
    }

    // 其他鼠标事件留空或按需实现
    public void mousePressed(MouseEvent e){}
    public void mouseReleased(MouseEvent e){}
    public void mouseEntered(MouseEvent e){}
    public void mouseExited(MouseEvent e){}
}

以上就是Java实现简单五子棋小游戏的详细内容,更多关于Java图形界面开发互相关资料请关注本站其它相关文章!

相关标签:

免责声明:本文内容仅供参考,不代表本站观点。转载或引用请注明出处。

Python 相关产品和应用

全部下载
Selenium

Selenium

4.51.0 · Windows

用于浏览器自动化和 Web 测试的 Python 工具。

scikit-learn

scikit-learn

1.9.1 · Windows

常用 Python 机器学习算法与模型评估工具库。

Black

Black

26.10.1 · Windows

强调一致性的 Python 自动代码格式化工具。

Ruff

Ruff

0.17.1 · macOS

由 Rust 编写的高速 Python 代码检查和格式化工具。

pytest

pytest

9.1.1 · Windows

简洁而强大的 Python 自动化测试框架。

FastAPI

FastAPI

0.146.0 · Windows

高性能 Python API 框架,支持类型提示和自动接口文档。

Flask

Flask

3.1.3 · Windows

轻量灵活的 Python Web 应用框架。

Django

Django

6.1.2 · Windows

成熟的 Python Web 框架,适合构建内容站点和业务系统。

Spyder

Spyder

6.1.7 · Windows

面向科学计算与数据分析的 Python 集成开发环境。

SciPy

SciPy

1.18.1 · Windows

面向科学、工程和技术计算的 Python 算法库。