Java GUI实现五子棋游戏

五子棋是一种双人对弈的棋类游戏,通常在棋盘上进行。棋盘为 15×15 的方格,黑白双方各执棋子,轮流在棋盘的格点上落子,先在横、竖、斜线上形成五个相连的同色棋子者获胜。五子棋规则简单,易学难精,兼具攻防和谋略,是一种极具智慧和趣味性的游戏。

以下是使用Java编写的五子棋游戏的示例代码:

棋盘类:

public class ChessBoard {

    private int[][] board;
    private final int rows;
    private final int cols;
    private final int winCount;

    public ChessBoard(int rows, int cols, int winCount) {
        this.rows = rows;
        this.cols = cols;
        this.winCount = winCount;
        board = new int[rows][cols];
    }

    public int getRows() {
        return rows;
    }

    public int getCols() {
        return cols;
    }

    public int getWinCount() {
        return winCount;
    }

    public int getChessman(int row, int col) {
        return board[row][col];
    }

    public boolean canPutChessman(int row, int col) {
        return board[row][col] == 0;
    }

    public void putChessman(int row, int col, int player) {
        board[row][col] = player;
    }

    public boolean isFull() {
        for (int i = 0; i < rows; i++) {
            for (int j = 0; j < cols; j++) {
                if (board[i][j] == 0) {
                    return false;
                }
            }
        }
        return true;
    }

    public boolean hasWinner(int player) {
        for (int i = 0; i < rows; i++) {
            for (int j = 0; j < cols; j++) {
                if (board[i][j] == player) {
                    if (checkHorizontal(i, j, player)) {
                        return true;
                    }
                    if (checkVertical(i, j, player)) {
                        return true;
                    }
                    if (checkDiagonal1(i, j, player)) {
                        return true;
                    }
                    if (checkDiagonal2(i, j, player)) {
                        return true;
                    }
                }
            }
        }
        return false;
    }

    private boolean checkHorizontal(int row, int col, int player) {
        int count = 1;
        for (int j = col + 1; j < cols && board[row][j] == player; j++) {
            count++;
        }
        for (int j = col - 1; j >= 0 && board[row][j] == player; j--) {
            count++;
        }
        return count >= winCount;
    }

    private boolean checkVertical(int row, int col, int player) {
        int count = 1;
        for (int i = row + 1; i < rows && board[i][col] == player; i++) {
            count++;
        }
        for (int i = row - 1; i >= 0 && board[i][col] == player; i--) {
            count++;
        }
        return count >= winCount;
    }

    private boolean checkDiagonal1(int row, int col, int player) {
        int count = 1;
        for (int i = row + 1, j = col + 1; i < rows && j < cols && board[i][j] == player; i++, j++) {
            count++;
        }
        for (int i = row - 1, j = col - 1; i >= 0 && j >= 0 && board[i][j] == player; i--, j--) {
            count++;
        }
        return count >= winCount;
    }

    private boolean checkDiagonal2(int row, int col, int player) {
        int count = 1;
        for (int i = row + 1, j = col - 1; i < rows && j >= 0 && board[i][j] == player; i++, j--) {
            count++;
        }
        for (int i = row - 1, j = col + 1; i >= 0 && j < cols && board[i][j] == player; i--, j++) {
            count++;
        }
        return count >= winCount;
    }

}

游戏界面类:

import java.awt.Color;
import java.awt.Graphics;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
import javax.swing.JFrame;
import javax.swing.JPanel;

public class GameUI extends JFrame {

    private final int rows;
    private final int cols;
    private final int winCount;
    private ChessBoard board;
    private int currentPlayer;
    private boolean gameOver;
    private final JPanel panel;

    public GameUI(int rows, int cols, int winCount) {
        this.rows = rows;
        this.cols = cols;
        this.winCount = winCount;
        setTitle("五子棋");
        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        setSize(cols * 40, rows * 40); // 每个棋子为正方形,大小为40
        setLocationRelativeTo(null);
        currentPlayer = 1;
        board = new ChessBoard(rows, cols, winCount);
        gameOver = false;
        panel = new JPanel() {
            @Override
            public void paintComponent(Graphics g) {
                super.paintComponent(g);
                for (int i = 0; i < rows; i++) {
                    for (int j = 0; j < cols; j++) {
                        int chessman = board.getChessman(i, j);
                        if (chessman == 1) {
                            g.setColor(Color.BLACK);
                            g.fillOval(j * 40 + 5, i * 40 + 5, 30, 30);
                        } else if (chessman == 2) {
                            g.setColor(Color.WHITE);
                            g.fillOval(j * 40 + 5, i * 40 + 5, 30, 30);
                            g.setColor(Color.BLACK);
                            g.drawOval(j * 40 + 5, i * 40 + 5, 30, 30);
                        }
                    }
                }
            }
        };
        panel.addMouseListener(new MouseAdapter() {
            @Override
            public void mouseClicked(MouseEvent e) {
                if (gameOver) {
                    return;
                }
                int col = e.getX() / 40;
                int row = e.getY() / 40;
                if (row < rows && col < cols && board.canPutChessman(row, col)) {
                    board.putChessman(row, col, currentPlayer);
                    panel.repaint();
                    if (board.hasWinner(currentPlayer)) {
                        gameOver = true;
                        System.out.println("Player " + currentPlayer + " wins.");
                    } else if (board.isFull()) {
                        gameOver = true;
                        System.out.println("Tie game.");
                    } else {
                        currentPlayer = 3 - currentPlayer; // 切换玩家
                    }
                }
            }
        });
        add(panel);
        setVisible(true);
    }

}

主程序:

public class Main {

    public static void main(String[] args) {
        new GameUI(15, 15, 5);
    }

}

在主程序中创建游戏界面对象,传入行数、列数和获胜所需连续棋子个数,即可开始游戏。

效果如下:

快去体验一下吧!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/150076.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

java,springboot钉钉开发连接器,自定义连接器配合流程使用,流程加入连接器,连接器发送参数,然后你本地处理修改值,返回给流程

1.绘制连接器&#xff0c;注意出餐入参的格式&#xff0c; 2.绘制流程&#xff0c;绑定连接器&#xff0c;是提交后出发还是表单值变化后 3.编写本地接口&#xff08;内网穿透&#xff09;&#xff0c;绑定连接器 钉钉开发连接器&#xff0c;自定义连接器配合流程使用&#x…

安防监控系统EasyCVR平台调用hls地址生成流的时间过长,该如何解决?

安防视频监控/视频集中存储/云存储/磁盘阵列EasyCVR平台可拓展性强、视频能力灵活、部署轻快&#xff0c;可支持的主流标准协议有国标GB28181、RTSP/Onvif、RTMP等&#xff0c;以及支持厂家私有协议与SDK接入&#xff0c;包括海康Ehome、海大宇等设备的SDK等。平台可拓展性强、…

报错缺少class(org.apache.hadoop.hdfs.DistributedFileSystem)

平台报错缺少 java.lang.RuntimeException:java.lang.ClassNotFoundException: Class org.apache.hadoop.hdfs.DistributedFileSystem not found 实则是缺少jar包 hadoop-hdfs-client-3.1.1.3.1.0.0-78.jar 找到对应的jar放到程序的lib中即可

【探索Linux】—— 强大的命令行工具 P.15(进程间通信 —— system V共享内存)

阅读导航 引言一、system V的概念二、共享内存(1) 概念(2) 共享内存示意图(3) 共享内存数据结构 三、共享内存的使用1. 共享内存的使用步骤&#xff08;1&#xff09;包含头文件&#xff08;2&#xff09;获取键值&#xff08;ftok函数&#xff09;&#xff08;3&#xff09;创…

运营商大数据是新时期贷款公司精准拓客的生命!!是企业的灵魂

贷款客户资源主要根据运营商大数据建模分析网站、app等&#xff0c;获取每天的网站实时访客&#xff0c;app活跃用户使用者数据的信息资源。 而贷款客户资源精准获客平台能帮您做的&#xff0c;就是根据用户实时动态轨迹与通信上网数据&#xff0c;锁定潜在意向客户&#xff0…

CAD Exchanger SDK 须知的开发配置--Crack

支持的配置 目录 支持的编程语言 C 支持C# 支持Java支持Python支持JavaScript 支持 CAD Exchanger SDK 是一组跨平台库&#xff0c;目前支持下列配置。随着时间的推移&#xff0c;旧版本的编译器、体系结构或依赖的第三方库从主要支持级别变为次要支持级别&#xff0c;然后被弃…

竞赛选题 深度学习花卉识别 - python 机器视觉 opencv

文章目录 0 前言1 项目背景2 花卉识别的基本原理3 算法实现3.1 预处理3.2 特征提取和选择3.3 分类器设计和决策3.4 卷积神经网络基本原理 4 算法实现4.1 花卉图像数据4.2 模块组成 5 项目执行结果6 最后 0 前言 &#x1f525; 优质竞赛项目系列&#xff0c;今天要分享的是 &a…

天津专升本新版报名系统网上报名、填志愿、缴费、审核等操作步骤

天津高职升本网上报名、填报志愿新版专升本报名系统 ▏报名入口&#xff1a;www.zhaokao.net▏注意&#xff1a;一定要在截止时间内完成报名、填报志愿、缴费、审核、下载《报名信息表》等4步骤▏可报考院校及专业请参考招生院校发布的通知&#xff08;招生简章、报考须知&…

数据备份软件调研与使用

目录 目的 Filezilla工具介绍&#xff1a; 获取地址 安装步骤 ①下载客户端和服务端​编辑 ②服务端server上传至目标服务器 安装服务端 server端登录 server配置 安装client 遇到的问题FAQ&#xff1a; ​编辑文档 目的 为确保企业数据安全、避免被非法入侵、数据…

【LabVIEW学习】1.对labview的初步使用,控制数据流动,快捷键,参考手册打不开怎么办

一。初步使用labview 1.程序图标 2.打开之后继续点击新建VI 原因&#xff1a;最后的程序后缀就是 .vi 3.新建之后&#xff0c;会有三个界面&#xff08;没有不要紧&#xff0c;找找肯定有&#xff09; 4.程序操作方法 1.拖动控件到前面板 2.此时程序框图会出现对应的控件 拖动…

PostGIS学习教程六:几何图形(geometry)

文章目录 一、介绍二、元数据表三、表示真实世界的对象3.1、点&#xff08;Points&#xff09;3.2、线串&#xff08;Linestring&#xff09;3.3、多边形&#xff08;Polygon&#xff09;3.4、图形集合&#xff08;Collection&#xff09; 四、几何图形输入和输出五、从文本转换…

【Proteus仿真】【Arduino单片机】DS18B20温度计

文章目录 一、功能简介二、软件设计三、实验现象联系作者 一、功能简介 本项目使用Proteus8仿真Arduino单片机控制器&#xff0c;使用PCF8574、LCD1602液晶、DS18B20温度传感器等。 主要功能&#xff1a; 系统运行后&#xff0c;LCD1602显示传感器采集温度。 二、软件设计 /*…

模拟业务流程+构造各种测试数据,一文带你测试效率提升80%

&#x1f4e2;专注于分享软件测试干货内容&#xff0c;欢迎点赞 &#x1f44d; 收藏 ⭐留言 &#x1f4dd; 如有错误敬请指正&#xff01;&#x1f4e2;交流讨论&#xff1a;欢迎加入我们一起学习&#xff01;&#x1f4e2;资源分享&#xff1a;耗时200小时精选的「软件测试」资…

窗口管理工具 Mosaic mac中文版功能特点

MosAIc mac是一种窗口管理工具&#xff0c;可帮助您在计算机屏幕上有效地组织和管理多个应用程序窗口。它提供了一种直观的方式来调整和排列窗口&#xff0c;以最大化工作效率。 MosAIc mac窗口管理软件功能和特点 窗口布局&#xff1a;MosAIc允许您选择不同的窗口布局&#x…

自由曲线与曲面 -计算机图形学

目录 自由曲线与曲面 函数的连续性 &#xff08;1&#xff09;参数连续性 &#xff08;2&#xff09;几何连续性 bezier 曲线 Bernstein基函数 *公式看不懂&#xff0c;带几个数进去看看&#xff0c;你就更好地可以看到这个公式的本质了 凸包性质 仿射不变性 …

Stable Diffusion WebUI使用AnimateDiff插件生成动画

AnimateDiff 可以针对各个模型生成的图片&#xff0c;一键生成对应的动图。 配置要求 GPU显存建议12G以上&#xff0c;在xformers或者sdp优化下显存要求至少6G以上。 要开启sdp优化&#xff0c;在启动参数加上--sdp-no-mem-attention 实际的显存使用量取决于图像大小&#…

【Selenium2+python】自动化unittest生成测试报告

前言 批量执行完用例后&#xff0c;生成的测试报告是文本形式的&#xff0c;不够直观&#xff0c;为了更好的展示测试报告&#xff0c;最好是生成HTML格式的。 unittest里面是不能生成html格式报告的&#xff0c;需要导入一个第三方的模块&#xff1a;HTMLTestRunner 一、导…

CUDA安装

在cmd中输入nvidia-smi。显示CUDA Version&#xff1a;12.3&#xff0c;所以只能下载小于等于12.3的版本。如下图&#xff1a; 进这个网址&#xff1a;https://developer.nvidia.com/cuda-toolkit-archive 选择一个版本下载。 选择完后之后这样选择&#xff1a; 最后点击下载即…

clion qt导出dll给别的项目用

clion 导出dll给别的项目用&#xff0c;并且引入matplotcpp dll生成一个mydll的dll文件 1.先做一个简单dll的测试下 cmake_minimum_required(VERSION 3.26) project(untitled) set(CMAKE_CXX_STANDARD 11) add_library(untitled SHARED main.cpp)main.h void hello();main.cp…

如何利用PCB创建PCB封装库

如何利用PCB创建PCB封装库 首先你要活得PCB工程文件&#xff0c;然后利用Altium Designer将工程文件打开&#xff0c;如下图所示&#xff1a; 然后选择工具栏“设计”->“生成PCB库&#xff08;P&#xff09;”&#xff0c;如下图&#xff1a; 最后将生成的库文件保存到指…