一个带有天元的五子棋界面,javas

时间: 2023-11-28 21:47:48 浏览: 30
这是一个基于Java Swing的五子棋界面,包含天元和落子功能。代码如下: ```java import javax.swing.*; import java.awt.*; import java.awt.event.*; public class Gobang extends JFrame implements ActionListener { private static final long serialVersionUID = 1L; private JPanel jp1, jp2; private JButton jb1, jb2, jb3; private JLabel jl1, jl2, jl3, jl4; private JTextField jt1, jt2; private int[][] chessboard = new int[15][15];// 二维数组存储棋盘信息 private int player = 1;// 玩家1为黑方,玩家2为白方 private boolean isOver = false;// 判断游戏是否结束,false表示未结束,true表示结束 private int x = -1, y = -1;// 记录玩家当前落子的坐标 public Gobang() { super("五子棋游戏");// 设置窗体标题 setSize(600, 600);// 设置窗体大小 setLocationRelativeTo(null);// 将窗体放置到屏幕中央 setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);// 设置窗体关闭方式 setLayout(new BorderLayout());// 设置窗体布局为BorderLayout // 创建顶部面板 jp1 = new JPanel(); jl1 = new JLabel("玩家1:"); jt1 = new JTextField(10); jl2 = new JLabel("玩家2:"); jt2 = new JTextField(10); jp1.add(jl1); jp1.add(jt1); jp1.add(jl2); jp1.add(jt2); add(jp1, BorderLayout.NORTH); // 创建中心面板 jp2 = new JPanel(new GridLayout(15, 15)); for (int i = 0; i < 15; i++) { for (int j = 0; j < 15; j++) { JButton jb = new JButton(); jb.setPreferredSize(new Dimension(30, 30));// 设置按钮大小 jb.addActionListener(this);// 添加按钮事件监听器 jp2.add(jb); } } add(jp2, BorderLayout.CENTER); // 创建底部面板 jb1 = new JButton("开始游戏"); jb1.addActionListener(this); jb2 = new JButton("重新开始"); jb2.setEnabled(false); jb2.addActionListener(this); jb3 = new JButton("退出游戏"); jb3.addActionListener(this); jl3 = new JLabel("当前玩家:黑方"); jl4 = new JLabel("天元:"); JPanel jp3 = new JPanel(); jp3.add(jb1); jp3.add(jb2); jp3.add(jb3); jp3.add(jl3); jp3.add(jl4); add(jp3, BorderLayout.SOUTH); setVisible(true);// 显示窗体 } @Override public void actionPerformed(ActionEvent e) { if (e.getSource() == jb1) {// 点击开始游戏按钮 String name1 = jt1.getText().trim(); String name2 = jt2.getText().trim(); if (name1.equals("") || name2.equals("")) { JOptionPane.showMessageDialog(this, "玩家名称不能为空!", "错误", JOptionPane.ERROR_MESSAGE); return; } jl3.setText("当前玩家:黑方"); jt1.setEditable(false); jt2.setEditable(false); jb1.setEnabled(false); jb2.setEnabled(true); isOver = false; } else if (e.getSource() == jb2) {// 点击重新开始按钮 int result = JOptionPane.showConfirmDialog(this, "确定要重新开始吗?", "提示", JOptionPane.YES_NO_OPTION); if (result == JOptionPane.YES_OPTION) { reset(); } } else if (e.getSource() == jb3) {// 点击退出游戏按钮 int result = JOptionPane.showConfirmDialog(this, "确定要退出游戏吗?", "提示", JOptionPane.YES_NO_OPTION); if (result == JOptionPane.YES_OPTION) { System.exit(0); } } else {// 点击棋盘按钮 JButton jb = (JButton) e.getSource(); int index = jp2.getComponentZOrder(jb);// 获取按钮在面板中的索引 x = index / 15;// 计算按钮在棋盘中的行坐标 y = index % 15;// 计算按钮在棋盘中的列坐标 if (isOver) {// 游戏已结束,不能再落子 JOptionPane.showMessageDialog(this, "游戏已结束,请重新开始!", "提示", JOptionPane.INFORMATION_MESSAGE); return; } if (chessboard[x][y] != 0) {// 该位置已有棋子,不能再落子 JOptionPane.showMessageDialog(this, "该位置已有棋子,请重新选择!", "提示", JOptionPane.INFORMATION_MESSAGE); return; } if (player == 1) { jb.setIcon(new ImageIcon("images/black.png"));// 设置按钮图标为黑子 chessboard[x][y] = 1;// 该位置值设为1,表示黑子 jl3.setText("当前玩家:白方"); player = 2; } else { jb.setIcon(new ImageIcon("images/white.png"));// 设置按钮图标为白子 chessboard[x][y] = 2;// 该位置值设为2,表示白子 jl3.setText("当前玩家:黑方"); player = 1; } if (checkWin()) {// 检测是否有一方胜利 if (player == 1) { JOptionPane.showMessageDialog(this, jt2.getText().trim() + " 获胜!", "游戏结束", JOptionPane.INFORMATION_MESSAGE); } else { JOptionPane.showMessageDialog(this, jt1.getText().trim() + " 获胜!", "游戏结束", JOptionPane.INFORMATION_MESSAGE); } isOver = true; } } } // 重置游戏 private void reset() { for (int i = 0; i < 15; i++) { for (int j = 0; j < 15; j++) { JButton jb = (JButton) jp2.getComponent(i * 15 + j); jb.setIcon(null);// 清空按钮图标 chessboard[i][j] = 0;// 清空棋盘信息 } } jt1.setText(""); jt2.setText(""); jt1.setEditable(true); jt2.setEditable(true); jl3.setText("当前玩家:黑方"); jb1.setEnabled(true); jb2.setEnabled(false); isOver = false; player = 1; x = -1; y = -1; } // 检测是否有一方胜利 private boolean checkWin() { int count = 1;// 记录连续相同颜色的棋子数 int color = chessboard[x][y];// 当前落子颜色 // 横向检测 for (int i = y - 1; i >= 0; i--) {// 向左检测 if (chessboard[x][i] == color) { count++; } else { break; } } for (int i = y + 1; i < 15; i++) {// 向右检测 if (chessboard[x][i] == color) { count++; } else { break; } } if (count >= 5) { return true; } // 纵向检测 count = 1; for (int i = x - 1; i >= 0; i--) {// 向上检测 if (chessboard[i][y] == color) { count++; } else { break; } } for (int i = x + 1; i < 15; i++) {// 向下检测 if (chessboard[i][y] == color) { count++; } else { break; } } if (count >= 5) { return true; } // 左上到右下斜向检测 count = 1; for (int i = x - 1, j = y - 1; i >= 0 && j >= 0; i--, j--) {// 向左上检测 if (chessboard[i][j] == color) { count++; } else { break; } } for (int i = x + 1, j = y + 1; i < 15 && j < 15; i++, j++) {// 向右下检测 if (chessboard[i][j] == color) { count++; } else { break; } } if (count >= 5) { return true; } // 左下到右上斜向检测 count = 1; for (int i = x + 1, j = y - 1; i < 15 && j >= 0; i++, j--) {// 向左下检测 if (chessboard[i][j] == color) { count++; } else { break; } } for (int i = x - 1, j = y + 1; i >= 0 && j < 15; i--, j++) {// 向右上检测 if (chessboard[i][j] == color) { count++; } else { break; } } if (count >= 5) { return true; } return false; } public static void main(String[] args) { new Gobang(); } } ``` 需要注意的是,代码中用到了黑子和白子的图片,可以根据自己的需求修改为其他图片,或者直接使用文字表示棋子。图片文件需要放在与代码文件同一目录下。

相关推荐

最新推荐

recommend-type

javascript实现一个网页加载进度loading

loading随处可见,比如一个app经常会有下拉刷新,上拉加载的功能,在刷新和加载的过程中为了让用户感知到 load 的过程,我们会使用一些过渡动画来表达。最常见的比如“转圈圈”,“省略号”等等。 网页loading有很多...
recommend-type

javascript实现图片左右滚动效果【可自动滚动,有左右按钮】

本文实例讲述了javascript实现图片左右滚动效果。分享给大家供大家参考,具体如下: html代码: &lt;!doctype html&gt; &lt;html lang="en"&gt; &lt;head&gt; &lt;...meta name="description" conten
recommend-type

用javascript实现点击链接弹出图片另存为而不是直接打开

&lt;iframe height=”0″ width=”0″ src=”/images/logo.gif” name=”saveImage” id=”saveImage”&gt;&lt;/iframe&gt; &lt;a&gt;Click Me&lt;/a&gt;
recommend-type

javascript 改变字体大小方法集合 原创

第一种方法: 分为 大 中 小 控制正文字体大小,一般需要指定 id #content {font-size:12px; line-height:200%; padding:10px; } 字体: 小中大 软件开发网 www.jb51.net 欢迎大家的光临。 [Ctrl+A 全选 ...
recommend-type

javascript 控制 html元素 显示/隐藏实现代码

1。编写js函数 [removed] function display(y){$(y).style.... 要显示/隐藏的html元素加上 id 属性 &lt;table&gt; ”menu”&gt; 控制这个tr的显示/隐藏&lt;/td&gt; &lt;/tr&gt; &lt;/table&gt; 3,添加按钮,链接等触发 js 函数 &lt;input type=”b
recommend-type

zigbee-cluster-library-specification

最新的zigbee-cluster-library-specification说明文档。
recommend-type

管理建模和仿真的文件

管理Boualem Benatallah引用此版本:布阿利姆·贝纳塔拉。管理建模和仿真。约瑟夫-傅立叶大学-格勒诺布尔第一大学,1996年。法语。NNT:电话:00345357HAL ID:电话:00345357https://theses.hal.science/tel-003453572008年12月9日提交HAL是一个多学科的开放存取档案馆,用于存放和传播科学研究论文,无论它们是否被公开。论文可以来自法国或国外的教学和研究机构,也可以来自公共或私人研究中心。L’archive ouverte pluridisciplinaire
recommend-type

实现实时数据湖架构:Kafka与Hive集成

![实现实时数据湖架构:Kafka与Hive集成](https://img-blog.csdnimg.cn/img_convert/10eb2e6972b3b6086286fc64c0b3ee41.jpeg) # 1. 实时数据湖架构概述** 实时数据湖是一种现代数据管理架构,它允许企业以低延迟的方式收集、存储和处理大量数据。与传统数据仓库不同,实时数据湖不依赖于预先定义的模式,而是采用灵活的架构,可以处理各种数据类型和格式。这种架构为企业提供了以下优势: - **实时洞察:**实时数据湖允许企业访问最新的数据,从而做出更明智的决策。 - **数据民主化:**实时数据湖使各种利益相关者都可
recommend-type

可见光定位LED及其供电硬件具体型号,广角镜头和探测器,实验设计具体流程步骤,

1. 可见光定位LED型号:一般可使用5mm或3mm的普通白色LED,也可以选择专门用于定位的LED,例如OSRAM公司的SFH 4715AS或Vishay公司的VLMU3500-385-120。 2. 供电硬件型号:可以使用常见的直流电源供电,也可以选择专门的LED驱动器,例如Meanwell公司的ELG-75-C或ELG-150-C系列。 3. 广角镜头和探测器型号:一般可采用广角透镜和CMOS摄像头或光电二极管探测器,例如Omron公司的B5W-LA或Murata公司的IRS-B210ST01。 4. 实验设计流程步骤: 1)确定实验目的和研究对象,例如车辆或机器人的定位和导航。
recommend-type

JSBSim Reference Manual

JSBSim参考手册,其中包含JSBSim简介,JSBSim配置文件xml的编写语法,编程手册以及一些应用实例等。其中有部分内容还没有写完,估计有生之年很难看到完整版了,但是内容还是很有参考价值的。