数独java界面基础_java版数独游戏界面实现(二)

本文实例为大家分享了java版数独游戏界面实现的具体代码,供大家参考,具体内容如下

实现效果图:

这里写图片描述

主函数用于启动程序:

package hlc.shudu.app;

import hlc.shudu.src.ShuduHelper;

import hlc.shudu.ui.ShuduMainFrame;

public class AppStart {

public static void main(String[] args) {

ShuduMainFrame mainFrame = new ShuduMainFrame();

mainFrame.setVisible(true);

}

}

主窗体类(包含消息区,时间区,游戏区):

package hlc.shudu.ui;

import java.awt.BorderLayout;

import java.awt.Color;

import java.awt.Font;

import java.awt.GridLayout;

import java.awt.event.ActionEvent;

import java.awt.event.ActionListener;

import java.sql.Time;

import java.text.SimpleDateFormat;

import javax.swing.Icon;

import javax.swing.ImageIcon;

import javax.swing.JButton;

import javax.swing.JFrame;

import javax.swing.JLabel;

import javax.swing.JPanel;

import javax.swing.JTextField;

import javax.swing.Timer;

import javax.swing.border.TitledBorder;

/*

* 数独主窗体

*/

public class ShuduMainFrame extends JFrame {

public static int pass = 1; // 关卡

public static JLabel lbPass; // 显示关卡的lable

public static long usedTime = 0; // 玩家用时

private ShuduCanvers panelCanvers; // 主游戏区

public static Timer userTimeAction;

/*

* 默认构造函数

*/

public ShuduMainFrame() {

// 初始化方法

init();

// 添加组件

addComponent();

// 添加主游戏区

addCanvers();

}

/*

* 添加主游戏区

*/

private void addCanvers() {

panelCanvers = new ShuduCanvers();

panelCanvers.setBorder(new TitledBorder("游戏区"));

// 将主游戏区添加到窗体中

this.add(panelCanvers, BorderLayout.CENTER);

}

/*

* 添加组件区

*/

private void addComponent() {

JPanel panelComponent = new JPanel();

// 添加消息区

addPanelMsg(panelComponent);

// 添加时间区

addPanelTime(panelComponent);

// 将组件添加到窗体顶部

this.add(panelComponent, BorderLayout.NORTH);

}

private void addPanelTime(JPanel panelComponent) {

JPanel panelTime = new JPanel();

panelTime.setBorder(new TitledBorder("时间"));

panelTime.setLayout(new GridLayout(2, 1));

final JLabel lbSysTime = new JLabel();

final JLabel lbUserTime = new JLabel();

panelTime.add(lbSysTime, BorderLayout.NORTH);

panelTime.add(lbUserTime, BorderLayout.SOUTH);

// 设置系统时间定时器

Timer sysTimeAction = new Timer(500, new ActionListener() {

@Override

public void actionPerformed(ActionEvent e) {

long timeMillis = System.currentTimeMillis();

SimpleDateFormat df = new SimpleDateFormat(

"yyyy-MM-dd HH:mm:ss");

lbSysTime.setText(" 系统时间: " + df.format(timeMillis));

}

});

sysTimeAction.start();

userTimeAction = new Timer(1000, new ActionListener() {

@Override

public void actionPerformed(ActionEvent e) {

lbUserTime.setText(" 您已用时: " + (++usedTime)+ " sec.");

}

});

userTimeAction.start();

panelComponent.add(panelTime, BorderLayout.EAST);

}

/*

* 添加消息区

*/

private void addPanelMsg(JPanel panelComponent) {

// panelComponent.setBorder(new TitledBorder("消息区"));

panelComponent.setLayout(new GridLayout(1, 3));

Font font14 = new Font("", 4, 14);

Font font28 = new Font("", 2, 28);

JPanel panelMsg = new JPanel();

panelMsg.setBorder(new TitledBorder("消息区"));

JLabel lbPass1 = new JLabel("关卡:第");

lbPass1.setFont(font14);

panelMsg.add(lbPass1);

// 显示关卡数

lbPass = new JLabel("" + pass);

lbPass.setForeground(Color.RED);

lbPass.setFont(font28);

panelMsg.add(lbPass);

JLabel lbPass2 = new JLabel("关/总共10关");

lbPass2.setFont(font14);

panelMsg.add(lbPass2);

panelComponent.add(panelMsg, BorderLayout.CENTER);

}

/*

* 界面初始化

*/

private void init() {

ImageIcon image = new ImageIcon("icon/icon.png");

this.setIconImage(image.getImage());

// 设置窗口初始大小

this.setSize(515, 600);

// 设置窗口初始位置

this.setLocation(500, 50);

// 设置窗口标题

this.setTitle("数独游戏(By:侯龙超)");

// 设置窗体不允许改变大小

this.setResizable(false);

// 设置默认关闭操作

this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

}

}

游戏区画布:

package hlc.shudu.ui;

import hlc.shudu.src.ShuduHelper;

import java.awt.BorderLayout;

import java.awt.Color;

import java.awt.Dialog.ModalExclusionType;

import java.awt.event.InputEvent;

import java.awt.event.MouseEvent;

import java.awt.event.MouseListener;

import javax.swing.JDialog;

import javax.swing.JOptionPane;

import javax.swing.JPanel;

import javax.swing.border.Border;

import javax.swing.border.TitledBorder;

public class ShuduCanvers extends JPanel implements MouseListener {

ShuduCell[][] cells;

// 得到数独数组

int[][] maps = new int[9][9];

private SelectNumFrame selectNum;

/*

* 默认构造函数

*/

public ShuduCanvers() {

ShuduMainFrame.usedTime = 0;

maps = ShuduHelper.getMap();

// 加载数独区

this.setLayout(null);

cells = new ShuduCell[9][9];

for (int i = 0; i < 9; i++) {

for (int j = 0; j < 9; j++) {

// this.remove(cells[i][j]);

// 创建单元格

cells[i][j] = new ShuduCell();

// 设置位置

cells[i][j].setLocation(20 + i * 50 + (i / 3) * 5, 20 + j * 50

+ (j / 3) * 5);

if (passRole(ShuduMainFrame.pass)) {

cells[i][j].setText("" + maps[i][j]);

// 设置背景颜色

cells[i][j].setBackground(getColor(maps[i][j]));

cells[i][j].setEnabled(false);

cells[i][j].setForeground(Color.gray);

} else {

cells[i][j].addMouseListener(this);

}

this.add(cells[i][j]);

}

}

checkFinish();

// reLoadCanvers();

}

/*

* 检查是否完成

*/

private void checkFinish() {

for (int i = 0; i < 9; i++) {

for (int j = 0; j < 9; j++) {

if (!check(i, j)) {

return;

}

}

}

// 停止用户用时计时器

ShuduMainFrame.userTimeAction.stop();

// 清除所有cell监听

clearAllListener();

// 闯关数加一

ShuduMainFrame.pass += 1;

if (ShuduMainFrame.pass > 10) {

int o = JOptionPane

.showConfirmDialog(this, "您已经通关了,是否重头开始?", "", 0);

if (o == 1) {

System.exit(0);

} else {

ShuduMainFrame.pass = 1;

}

} else {

JOptionPane.showMessageDialog(this, "恭喜你通过本关!用时:"

+ ShuduMainFrame.usedTime + "秒\n即将进入下一关!");

}

// 更新关卡提示

ShuduMainFrame.lbPass.setText("" + ShuduMainFrame.pass);

// 开始新的关卡

reLoadCanvers();

// 打开用户用时计时器

ShuduMainFrame.userTimeAction.start();

}

/*

* 检查指定坐标处的单元格

*/

private boolean check(int i, int j) {

if (cells[i][j].getText().isEmpty()) {

return false;

}

for (int k = 0; k < 9; k++) {

if (cells[i][j].getText().trim().equals(cells[i][k].getText().trim()) && j!=k) {

return false;

}

if (cells[i][j].getText().trim().equals(cells[k][j].getText().trim()) && i != k) {

return false;

}

int ii = (i / 3) * 3 + k / 3;

int jj = (j / 3) * 3 + k % 3;

if (cells[i][j].getText().trim().equals(cells[ii][jj].getText().trim()) &&!(i == ii && j == jj)) {

return false;

}

}

return true;

}

/*

* 重新加载数独区

*/

public void reLoadCanvers() {

ShuduMainFrame.usedTime = 0;

maps = ShuduHelper.getMap();

for (int i = 0; i < 9; i++) {

for (int j = 0; j < 9; j++) {

this.remove(cells[i][j]);

// 创建单元格

cells[i][j] = new ShuduCell();

// 设置位置

cells[i][j].setLocation(20 + i * 50 + (i / 3) * 5, 20 + j * 50

+ (j / 3) * 5);

if (passRole(ShuduMainFrame.pass)) {

cells[i][j].setText("" + maps[i][j]);

// 设置背景颜色

cells[i][j].setBackground(getColor(maps[i][j]));

cells[i][j].setEnabled(false);

cells[i][j].setForeground(Color.gray);

} else {

cells[i][j].addMouseListener(this);

}

this.add(cells[i][j]);

}

}

this.repaint();

checkFinish();

}

/*

* 根据关卡随机产生该位置是否显示数字

*/

private boolean passRole(int pass) {

// TODO Auto-generated method stub

return Math.random() * 11 > pass;

}

/*

* 根据数字获得颜色

*/

private Color getColor(int i) {

Color color = Color.pink;

switch (i) {

case 1:

color = new Color(255, 255, 204);

break;

case 2:

color = new Color(204, 255, 255);

break;

case 3:

color = new Color(255, 204, 204);

break;

case 4:

color = new Color(255, 204, 153);

break;

case 5:

color = new Color(204, 255, 153);

break;

case 6:

color = new Color(204, 204, 204);

break;

case 7:

color = new Color(255, 204, 204);

break;

case 8:

color = new Color(255, 255, 255);

break;

case 9:

color = new Color(153, 255, 153);

break;

default:

break;

}

return color;

}

@Override

public void mouseClicked(MouseEvent e) {

// TODO Auto-generated method stub

}

@Override

public void mousePressed(MouseEvent e) {

int modes = e.getModifiers();

if ((modes & InputEvent.BUTTON3_MASK) != 0) {// 点击鼠标右键

// 清空点击单元格上的内容

((ShuduCell) e.getSource()).setText("");

} else if ((modes & InputEvent.BUTTON1_MASK) != 0) {// 点击鼠标左键

// 如果选择数字窗口存在则销毁

if (selectNum != null) {

selectNum.dispose();

}

// 新建一个选择窗口

selectNum = new SelectNumFrame();

// 设置成模态窗口

selectNum.setModal(true);

// 设置选择窗口在显示器上的位置

selectNum.setLocation(e.getLocationOnScreen().x,

e.getLocationOnScreen().y);

// 将点击的单元格传递给数字选择窗口

selectNum.setCell((ShuduCell) e.getSource());

// 显示数字选择窗口

selectNum.setVisible(true);

}

checkFinish();

}

/*

* 清除所有cell的点击监听

*/

private void clearAllListener() {

for (int i = 0; i < 9; i++) {

for (int j = 0; j < 9; j++) {

cells[i][j].removeMouseListener(this);

}

}

}

@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

}

}

数独单元格:

package hlc.shudu.ui;

import java.awt.Color;

import java.awt.Font;

import javax.swing.JButton;

public class ShuduCell extends JButton {

public ShuduCell(){

this.setSize(50,50);

Font font = new Font("",2,24);

this.setFont(font);

this.setBackground(new Color(255,153,102));

this.setForeground(Color.BLUE);

}

}

数字选择框:

package hlc.shudu.ui;

import java.awt.Color;

import java.awt.Window;

import java.awt.event.InputEvent;

import java.awt.event.MouseEvent;

import java.awt.event.MouseListener;

import javax.swing.JButton;

import javax.swing.JDialog;

import javax.swing.JFrame;

public class SelectNumFrame extends JDialog implements MouseListener {

private ShuduCell cell;

public void setCell(ShuduCell cell) {

this.cell = cell;

}

public SelectNumFrame(){

//隐藏界面上面的工具栏

this.setUndecorated(true);

this.setSize(150, 150);

this.setBackground(new Color(255,204,153, 123));

this.setLayout(null);

addNum();

}

//添加数字1~9

private void addNum() {

for (int i = 0; i < 3; i++) {

for (int j = 0; j < 3; j++) {

JButton btn = new JButton();

btn.setSize(50, 50);

btn.setLocation(i*50,j*50);

btn.setText(""+(j*3+i+1));

btn.addMouseListener(this);

this.add(btn);

}

}

}

@Override

public void mouseClicked(MouseEvent e) {

// TODO Auto-generated method stub

}

@Override

public void mousePressed(MouseEvent e) {

int modes = e.getModifiers();

if ((modes & InputEvent.BUTTON1_MASK) != 0) {

JButton btn = (JButton) e.getSource();

cell.setText(btn.getText());

}

this.dispose();

}

@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

}

}

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

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

多国相继出台政策法规:为「自动驾驶」的「创新发展」保驾护航

来源&#xff1a;腾讯研究院曹建峰 腾讯研究院法律研究中心高级研究员祝林华 腾讯研究院法律研究中心助理研究员人工智能等新技术&#xff0c;正从科幻概念逐步落地到各行各业&#xff0c;将从重塑驾驶、医疗、制造等领域开始&#xff0c;全面重构人类社会和生活。自动驾驶汽…

测试替身之类型

测试桩Stub 桩&#xff1a;截断的或非常短的物体。 测试桩&#xff0c;用最简单的可能实现代替Real。 基本实现&#xff1a;所有方法仅一行&#xff0c;返回默认值。 public class LoggerStub implements Logger {public void log(LogLevel level, String message) {// still…

华为《5G业务商业价值评估》白皮书!

来源&#xff1a;5G蹇飒&#xff1a;华为公司商业与网络咨询部咨询专家。概要&#xff1a;在过去不长的时间里&#xff0c;5G技术不断取得重大进展&#xff0c;5G发展之路更为清晰。未来智能实验室是人工智能学家与科学院相关机构联合成立的人工智能&#xff0c;互联网和脑科学…

java正则匹配的坑_java正则表达式入坑指南

在日常开发工作中&#xff0c;无论你使用的语言是java、python、shell、golang还是C#&#xff0c; 正则表达式是编程语言中几乎绕不开的话题。有了它&#xff0c;可以帮你快速定位到符合条件的文本内容。今天小编带大家一起来学习下正则表达式&#xff0c;相信通过这篇文章的介…

这有5种来自大自然「馈赠」的AI技术及其应用,你知道多少?

原文来源&#xff1a;Towards Data Science作者&#xff1a;Luke James「雷克世界」编译&#xff1a;KABUDA对于技术领域中存在的AI相关技术&#xff0c;我们应心存感恩。人类不仅花费了数十年的时间来研究完善数学算法&#xff0c;以使这些奇妙复杂的算法发挥效用&#xff0c;…

有效单元测试之可读性

断言 断言的基本原理和意图隐藏在无意义的单词和数字背后&#xff0c;难以理解&#xff0c;难以验证断言的正确性。 Bad eg. Test public void outputHasLineNumbers() {String content "1st match on #1\nand\n2nd match on #3";String out grep.grep("ma…

mysql 异步复制建立过程_mysql生产环境高可用---基于GTID异步复制项目实施

客户需求&#xff1a;客户需要上线一个门户网站&#xff0c;初期业务量非常小&#xff0c;数据量10个G&#xff0c;后台需要使用msyql 数据库&#xff0c;需要建设一个数据库环境项目技术&#xff1a;操作系统&#xff1a;两台linux系统 红帽6.5数据库版本&#xff1a;msyql 5.…

物联网定位技术超全解析!定位正在从室外走向室内~

来源&#xff1a;物联网智库概要&#xff1a;GPS和基站定位技术基本满足了用户在室外场景中对位置服务的需求。GPS和基站定位技术基本满足了用户在室外场景中对位置服务的需求。然而&#xff0c;人的一生当中有80%的时间是在室内度过的&#xff0c;个人用户、服务机器人、新型物…

有效的单元测试--总结

思维导图&#xff1a;https://www.processon.com/view/link/60d3072d0791297edd63290a

java原生的ajax怎么写_原生Ajax代码实现

AjaxAsynchronous JavaScript And XML异步&#xff1a;指一段程序执行时不会阻塞其他程序执行&#xff0c;其表现形式为程序的执行顺序不依赖程序本身的书写顺序 &#xff0c;相反的则为同步&#xff0c;自己理解的就是类似百度的搜索框输入内容时的提示相关的内容功能&#xf…

人工智能阅读理解是如何打破人类记录? 解读阿里iDST SLQA 技术

来源&#xff1a;网络大数据概要&#xff1a;微软和阿里巴巴开发的人工智能在斯坦福阅读理解测试中并列第一&#xff0c;在答案的精确匹配度上比人类高出几个基点。微软和阿里巴巴开发的人工智能在斯坦福阅读理解测试中并列第一&#xff0c;在答案的精确匹配度上比人类高出几个…

Java测试驱动开发--总结

思维导图&#xff1a;https://www.processon.com/view/link/60d307415653bb049a437111

java发送邮件354_基于SMTP的JAVA邮件发送程序

这个程序没有使用JavaMail API&#xff0c;而是根据SMTP协议的要求直接处理协议的细节发送邮件&#xff0c;虽然比较麻烦了一些&#xff0c;但是对了解邮件协议的细节很有帮助的。本文分两部分&#xff0c;第一部分是SMTP命令介绍(这个从别的地方抄的&#xff0c;嘿嘿)&#xf…

看到记忆的印迹:神经科学家们如何定位、唤醒甚至偷换记忆

来源&#xff1a;澎湃新闻概要&#xff1a;借助新兴的脑部成像技术&#xff0c;神经科学家们得以“看到”与特定记忆相关的特定神经细胞&#xff0c;了解记忆形成和唤起的规律&#xff0c;并成功地重新激活记忆通路。《神探夏洛克》中福尔摩斯在停尸间的初次登场&#xff0c;给…

卓有成效的管理者--总结

思维导图&#xff1a;https://www.processon.com/view/link/60d6f723e401fd50b99628ad

oci连接mysql_OCILIB 连接Oracle数据库——插入数据

二、进阶教程参看官方文档实例&#xff0c;有详细的说明&#xff0c;包括&#xff1a;查询获取数据、绑定向量、数据库连接池、12c隐式结果集、使用Oracle对象和数据库通知等例子。这里只做一个最简单的插入数据演示。1、简单的封装void COciUtil::Init(){CString strAppPath …

人工合成生命的最新进展比AI还快

合成酵母的科学杂志当期封面来源&#xff1a;通信和互联网的扫地僧2016年以来&#xff0c;以AlphaGo为标志的人工智能技术进入了发展的快车道&#xff0c;成为了民众热议的话题。2017年12月27日&#xff0c;华大基因董事长汪建在深商大会上表示&#xff0c;未来的5-10年&#x…

加利福尼亚大学提出从「因果革命」的七大成就中为「机器学习」寻求良好的模型指导

原文来源&#xff1a;arxiv作者&#xff1a;Judea Pearl「雷克世界」编译&#xff1a;嗯~是阿童木呀可以这样说&#xff0c;目前的机器学习系统几乎完全是以统计模式或无模型模式运行的&#xff0c;这对于其功率和性能来说存在着严格的理论限制。这样的系统不能引发干预和反思&…

被讨厌的勇气--总结

思维导图&#xff1a;https://www.processon.com/view/link/60d6fc2c7d9c087f54753b90

创建一个动物类 java_使用java面向对象创建动物类并输出动物信息

题目&#xff1a;使用java面向对象创建动物类并输出动物信息gitup下载地址&#xff1a;https://github.com/benxiaohai8888/Javase/blob/master/Animal.java代码&#xff1a;import java.util.Scanner;public class Animal{private double weight;//体重private int leg;//腿的…