效果图:




代码


import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.FlowLayout;
import java.awt.Font;
import java.awt.GridLayout;
import java.awt.Menu;
import java.awt.MenuBar;
import java.awt.MenuItem;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.MouseEvent;
import java.awt.event.MouseListener;
import java.io.File;
import java.io.FileReader;
import java.io.FileWriter;
import java.util.Vector;import javax.swing.ImageIcon;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JMenu;
import javax.swing.JMenuBar;
import javax.swing.JOptionPane;
import javax.swing.JPanel;
import javax.swing.JTextField;
import javax.swing.border.BevelBorder;
import javax.swing.border.EmptyBorder;/***** * 点击完确认鼠标立即移走,否则卡死**/
public class ShuDuGame带固定按钮 extends JFrame implements ActionListener,MouseListener{private JLabel Lab1,lab,Lab2,lab2,lab3;private JTextField T1,T2;private JButton B1,B2;private JPanel p;private ImageIcon pic=new ImageIcon("src/img/2.jpg");private MenuBar menubar;         //src//字体  setForeground(Color.red);(颜色)/*****************登录界面****************/public void init(){p=new JPanel();p.setLayout(null);//重中之重/*this 调用JFrame的构造方法*/this.setBounds(450,200,340,250);//x,y,w,h JFrame下的JPanelLab1=new JLabel("用户名:");Lab1.setFont(new Font("华文新魏",Font.BOLD,20));Lab1.setBounds(20,30,80,26);p.add(Lab1);T1=new JTextField(15);T1.setBounds(100,30,180,30);p.add(T1);Lab2=new JLabel("密码:");Lab2.setFont(new Font("华文新魏",Font.BOLD,20));p.add(Lab2);Lab2.setBounds(40,70,80,26);T2=new JTextField(15);T2.setBounds(100,70,180,30);p.add(T2);B1=new JButton("取消");B1.setBounds(80,150,60,30);B1.addActionListener(this);this.add(B1);B2=new JButton("确定");B2.setBounds(220,150,60,30);B2.addActionListener(this);this.add(B2);/*******控件在越前面就越先出现**************lab3在lab2之前,所以lab3不会被图片遮住****/lab3=new JLabel("用户名或密码错误,请重新登录!");lab3.setBounds(100,10,250,15);p.add(lab3);lab2=new JLabel(new ImageIcon("src/img/3.jpg"));lab2.setBounds(0,0,340,250);p.add(lab2);menubar=new MenuBar();setMenuBar(menubar);Menu menu=new Menu("帮助");menu.setFont(new Font("华文新魏",Font.PLAIN,10));MenuItem mi1=new MenuItem("读我");MenuItem mi2=new MenuItem("退出");menu.addActionListener(this);menu.add(mi1);menu.add(mi2);menubar.add(menu);lab3.setVisible(false);this.setResizable(false);//固定大小位置,不可拖动this.setTitle("登录界面");//登录界面头像this.setIconImage(pic.getImage());this.add(p);this.setVisible(true);p.addMouseListener(this);}public static void main(String[] args){new ShuDuGame带固定按钮().init();}/**************死循环画图*************public void paint(Graphics g) {super.paint(g);pic=new ImageIcon("bin/img/1.jpg");g.drawImage(pic.getImage(), 0,190,400,60,this);}**********************************/public void actionPerformed(ActionEvent e){if(e.getActionCommand()=="读我"){JOptionPane.showMessageDialog(null, "用户名:linjinpeng\n"+"密码:123456");}else if(e.getActionCommand()=="退出"){this.setVisible(false);}else if(e.getSource()==B1){T1.setText("");T2.setText("");lab3.setVisible(false);}else if(e.getSource()==B2){if(T1.getText().equals("linjinpeng")&&T2.getText().equals("123456")){progressbar pg=new progressbar();pg.setVisible(true);pg.setResizable(false);this.setVisible(false);}else{lab3.setVisible(true);T1.setText("");T2.setText("");}}}public void mouseClicked(MouseEvent e) {if(e.getSource()==p){lab3.setVisible(false);}}@Overridepublic void mousePressed(MouseEvent e) {// TODO Auto-generated method stub}@Overridepublic void mouseReleased(MouseEvent e) {// TODO Auto-generated method stub}@Overridepublic void mouseEntered(MouseEvent e) {// TODO Auto-generated method stub}@Overridepublic void mouseExited(MouseEvent e) {// TODO Auto-generated method stub}
}/***************关卡解锁****************/
class Rank extends JFrame implements ActionListener{private JButton buttons[]=new JButton[16];private JPanel panel3;Vector<JButton> jb=new Vector<JButton>(16);private int holeNumber;private String string;private String wenjian;private File file;private FileReader fr;private FileWriter fw;private int txtread;private int k;//判断文件长度是否为空public Rank(){}public Rank(int holeNumber,String string,String wenjian){super("数独游戏");this.setBounds(450,150,400,400);panel3=new JPanel();panel3.setLayout(null);panel3.setLayout(new GridLayout(4,4,5,5));for(int i=0;i<16;i++){buttons[i]=new JButton("第"+(i+1)+"关");buttons[i].setFont(new Font("华文新魏",Font.PLAIN|Font.BOLD,18));buttons[i].addActionListener(this);panel3.add(buttons[i]);buttons[i].setEnabled(false);jb.add(buttons[i]);}this.add(panel3);file=new File("D:/JAVA/javaproject/Game/src/rank/"+wenjian);try{if(!file.exists()){file.createNewFile();}char[] data=new char[20];fr=new FileReader(file);int length=fr.read(data);if(length==-1){    //文件为空,k赋予值0k=0;}else{k=1;String str=new String(data,0,length);txtread=Integer.parseInt(str);fr.close();}}catch(Exception e){e.printStackTrace();}if(k==0){jb.elementAt(0).setEnabled(true);try{fw=new FileWriter(file);String str="1";fw.write(str);fw.close();}catch(Exception e){e.printStackTrace();}   }else{for(int i=0;i<txtread;i++){jb.elementAt(i).setEnabled(true);}}this.holeNumber=holeNumber;this.string=string;this.wenjian=wenjian;    }public void actionPerformed(ActionEvent e){for(int i=0;i<16;i++){if(e.getSource()==jb.elementAt(i)){this.setVisible(false);Game2 frame = new Game2(holeNumber,string,wenjian);frame.setVisible(true);frame.setResizable(false);frame.setTitle("数独游戏");}}}
}/****************主菜单等级*************/
class mainmenu extends JFrame implements ActionListener{private JLabel lab1,lab2;private JButton btn1,btn2,btn3,btn4,btn5;private int holeNumber=25;//等级默认为简单private String string;private JLabel lab4=new JLabel(new ImageIcon("bin/img/1.jpg"));private String wenjian=null;                //srcpublic mainmenu(){this.setLayout(null);this.setBounds(450,150,450,400);lab1=new JLabel("主菜单:");lab1.setBounds(80,50,130,40);lab1.setFont(new Font("华文隶书",Font.BOLD,30));this.add(lab1);lab2=new JLabel("选项:");lab2.setFont(new Font("华文隶书",Font.BOLD,25));lab2.setBounds(30,100,80,40);this.add(lab2);btn1=new JButton("Easy");btn1.setBounds(60,140,130,30);btn1.setBorder(new BevelBorder(BevelBorder.RAISED));btn1.setFont(new Font("华文隶书",Font.BOLD,25));btn1.addActionListener(this);this.add(btn1);btn2=new JButton("Normal");btn2.setBounds(60,180,130,30);btn2.setBorder(new BevelBorder(BevelBorder.RAISED));btn2.setFont(new Font("华文隶书",Font.BOLD,25));btn2.addActionListener(this);this.add(btn2);btn3=new JButton("Difficult");btn3.setBounds(60,220,130,30);btn3.setBorder(new BevelBorder(BevelBorder.RAISED));btn3.setFont(new Font("华文隶书",Font.BOLD,25));btn3.addActionListener(this);this.add(btn3);btn4=new JButton("Config");btn4.setBounds(60,260,130,30);btn4.setBorder(new BevelBorder(BevelBorder.RAISED));btn4.setFont(new Font("华文隶书",Font.BOLD,25));btn4.addActionListener(this);this.add(btn4);btn5=new JButton("Start");btn5.setBounds(240,130,100,60);btn5.setFont(new Font("华文隶书",Font.BOLD,30));btn5.setBorder(new BevelBorder(BevelBorder.RAISED));btn5.addActionListener(this);this.add(btn5);lab4.setBounds(0,0,450,400);this.add(lab4);this.setVisible(true);}public void actionPerformed(ActionEvent e){if(e.getSource()==btn1){wenjian="E.txt";holeNumber=25;string="Easy";btn1.setBackground(Color.gray);btn2.setBackground(null);btn3.setBackground(null);}else if(e.getSource()==btn2){wenjian="N.txt";holeNumber=35;string="Normol";btn2.setBackground(Color.gray);btn1.setBackground(null);btn3.setBackground(null);}else if(e.getSource()==btn3){wenjian="D.txt";holeNumber=45;string="Difficult";btn3.setBackground(Color.gray);btn1.setBackground(null);btn2.setBackground(null);}else if(e.getSource()==btn5){   if(wenjian==null){JOptionPane.showMessageDialog(this, "选择等级才能开始游戏哦!");}                              //当前组件else{this.setVisible(false);Rank rank=new Rank(holeNumber,string,wenjian);rank.setVisible(true);}    }else if(e.getSource()==btn4){btn2.setBackground(null);btn1.setBackground(null);btn3.setBackground(null);}}}/*****************游戏界面***************/
class Game2 extends JFrame implements ActionListener{private JPanel contentPane;private Vector<JButton> buttonsVector; //存放81个按钮    Vector<E>private Vector<JButton> numberButtonVector; //存放9个数字键private JButton choosedButton; //重新开始按钮 //当前被选中的按钮,表示将要被修改private GameCore core; //游戏内核,含有游戏算法private int[][] backup; //用来备份游戏,用于清除后重新导入private int T,M,S;//计时器private int holenumber;private String string;private String wenjian;private JPanel panel_2;private JButton[] btnButton=new JButton[81]; private JButton btnButton1,btnButton2;private JLabel lab1;private Thread thread;private JMenu mnNewMenu1,mnNewMenu2 ;private File file;private File fileGrades;private FileReader fr;//读出文件txt的数据(字符串)private FileWriter fw;//将数据(字符串)写到文件中,方便调用private int txtread;private int Grades;private Color[] colors={Color.green,Color.white,Color.yellow,};/*** Create the frame.*/public Game2(int holeNumber,String string,String wenjian) {this.holenumber=holeNumber;this.string=string;this.wenjian=wenjian;setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);setBounds(450, 20, 600, 700);ImageIcon picture2=new ImageIcon("bin/img/1.jpg");this.setIconImage(picture2.getImage());JMenuBar menuBar = new JMenuBar();setJMenuBar(menuBar);/***************计时框架**************/mnNewMenu1 = new JMenu("***  计时:");mnNewMenu1.setFont(new Font("华文行楷", Font.PLAIN|Font.BOLD, 20));menuBar.add(mnNewMenu1);mnNewMenu2 = new JMenu("00:00  ***");mnNewMenu2.setFont(new Font("华文行楷", Font.PLAIN|Font.BOLD, 20));menuBar.add(mnNewMenu2);contentPane = new JPanel();//大容器contentPane.setBorder(new EmptyBorder(5, 5, 5, 5));//页边空白setContentPane(contentPane);setLayout(null);contentPane.setLayout(new BorderLayout(0, 0));JPanel panel = new JPanel();//小容器1contentPane.add(panel, BorderLayout.SOUTH);//上北下南panel.setLayout(new FlowLayout(FlowLayout.CENTER, 5, 5));//hgap  vgapString[] j={"1","2","3","4","5","6","7","8","9"};/*****最下面一行按钮******/JButton button[]=new JButton[9];for(int i=0;i<9;i++){button[i] = new JButton(j[i]);button[i].setFont(new Font("宋体", Font.PLAIN, 20));//字体大小panel.add(button[i]);                     }JPanel panel_1 = new JPanel();//小容器2panel_1.setLayout(null);contentPane.add(panel_1, BorderLayout.NORTH);panel_1.setBounds(0, 0, 600, 40);panel_1.setLayout(new FlowLayout(FlowLayout.CENTER, 5, 5));btnButton1=new JButton("返回主菜单");btnButton1.setFont(new Font("华文行楷", Font.PLAIN|Font.BOLD, 20));btnButton1.addActionListener(this);panel_1.add(btnButton1);btnButton2=new JButton("开始游戏");btnButton2.setFont(new Font("华文行楷", Font.PLAIN|Font.BOLD, 20));btnButton2.addActionListener(this);panel_1.add(btnButton2);JButton btnNewButton_1 = new JButton("清除已填");btnNewButton_1.setFont(new Font("华文行楷", Font.PLAIN|Font.BOLD, 20));btnNewButton_1.addActionListener(new ActionListener() {public void actionPerformed(ActionEvent arg0) {//清除所有按钮监听器for (int i = 0; i < 9; i ++) {for (int j = 0; j < 9; j ++) {core.test[i][j] = backup[i][j]; }}initGame();}});panel_1.add(btnNewButton_1);lab1=new JLabel("等级:"+string);lab1.setFont(new Font("华文行楷", Font.PLAIN|Font.BOLD, 20));panel_1.add(lab1);panel_1.setVisible(true);panel_2 = new JPanel();//小容器3contentPane.add(panel_2, BorderLayout.CENTER);panel_2.setLayout(new GridLayout(9, 9, 5, 5));//水平与垂直间隔5像素
//                                     rows columns hgap vgapfor(int i=0;i<81;i++){btnButton[i] = new JButton("");int x = i/ 9;   //行int y = i % 9;  //列if((x/3==0&&y/3==0)||(x/6==1&&y/3==0)||(y/6==1&&x/3==0)||(x/6==1&&y/6==1)){btnButton[i].setBackground(colors[2]);}else if(x/3==1&&y/3==1){btnButton[i].setBackground(colors[1]);}else{btnButton[i].setBackground(colors[0]);}btnButton[i].setBorder(new BevelBorder(BevelBorder.RAISED));//立体感panel_2.add(btnButton[i]);}panel_2.setVisible(false);/***************向量按钮************/buttonsVector = new Vector<JButton>(81); //存放九宫格81个按钮numberButtonVector = new Vector<JButton>(9); //存放9个数字键backup = new int[9][9]; //题目的备份//把81个格子放入容器中for(int i=0;i<81;i++){buttonsVector.add(btnButton[i]);//向量}for(int i=0;i<9;i++){numberButtonVector.add(button[i]);}core = new GameCore(holeNumber);//备份一份题目backUpProblem(); initGame();//为81个按钮添加监视器 for (int i = 0; i < 81; i ++) {buttonsVector.elementAt(i).addActionListener(this);}//为9个数字键添加监视器for (int i = 0; i < 9; i ++) {button[i].addActionListener(this);}}//监视器public void actionPerformed(ActionEvent e) {//控制81个显示按钮JButton button = null;for (int i = 0; i < 81; i ++) {if (e.getSource() == buttonsVector.elementAt(i)) {button = buttonsVector.elementAt(i);if (button.getText()==null) {if (choosedButton != null) {setButtonColor(choosedButton);}/*监听事件,选定空按钮*/  choosedButton = buttonsVector.elementAt(i);buttonsVector.elementAt(i).setBackground(Color.LIGHT_GRAY); }}}if(e.getSource()==btnButton1){this.setVisible(false);new mainmenu().setVisible(true);}if(e.getSource()==btnButton2){panel_2.setVisible(true);thread=new Thread(new Runnable(){public void run(){while(true){try{Thread.sleep(1000);T++;M=T/60;S=T%60;mnNewMenu2.setText(M+":"+S+"  ***");}catch(Exception e1){e1.printStackTrace();}}}}); //计时thread.start(); }//控制9个数字键按钮String numberStr;int num, index, x, y;;/********手动填入数字*************/for (int i = 0; i < 9; i ++) {if (e.getSource() ==numberButtonVector.elementAt(i)) {numberStr = numberButtonVector.elementAt(i).getText().trim();num = Integer.parseInt(numberStr);if ( isLegal(num) ) {choosedButton.setText(numberStr);  //如果符合规则则填入所选数字choosedButton.setForeground(Color.BLACK);//修改Test布局表index = buttonsVector.indexOf(choosedButton);x = index / 9;y = index % 9;core.test[x][y] = num;//备份//判读是否成功了if (isFinish()) {thread.stop();JOptionPane.showMessageDialog(null, "用时"+M+"分"+S+"秒   得分:"+(1000-T)+"分\n"+ "好厉害,快点解锁下一关吧");this.setVisible(false);file=new File("D:/JAVA/javaproject/Game/src/rank/"+wenjian);//绝对路径Rank ran=new Rank(holenumber,string,wenjian);try{char[] data=new char[20]; fr=new FileReader(file);int length=fr.read(data);String str=new String(data,0,length);//读取文件file内容txtread=Integer.parseInt(str);fr.close();}catch(Exception e1){e1.printStackTrace();}/**************分数存储*************/fileGrades=new File("D:/JAVA/javaproject/Game/src/grades/"+wenjian);try{if(!fileGrades.exists()){fileGrades.createNewFile();}//若文件找不到则创建新文件fr=new FileReader(fileGrades);char[] data=new char[20];  //文件界定长度20字节int length=fr.read(data); if(length!=-1){       //分数文件长度不为空String str=new String(data,0,length);//读出分数Grades=Integer.parseInt(str);    }else{Grades=0;}Grades+=(1000-T);String s=Integer.toString(Grades);//整型转换为字符串fw=new FileWriter(fileGrades);fw.write(s);  //写入分数s到文件filefr.close();  //关闭fw.close();}catch(Exception e1){e1.printStackTrace();}/*****************三个等级通关成功******************/if((txtread==16)&&(wenjian.equals("E.txt"))){                       JOptionPane.showMessageDialog(null,"简单级别您拿到"+Grades+"分,简直不要太厉害啦,快去解锁下一个等级吧");new mainmenu().setVisible(true);this.setVisible(false);}else if((txtread==16)&&(wenjian.equals("N.txt"))){                     JOptionPane.showMessageDialog(null,"一般级别您拿到"+Grades+"分,是大佬没错了,快去解锁下一个等级吧");new mainmenu().setVisible(true);this.setVisible(false);}else if((txtread==16)&&(wenjian.equals("D.txt"))){                       JOptionPane.showMessageDialog(null,"困难级别您拿到"+Grades+"分,大神是你吗?收小弟吗?");new mainmenu().setVisible(true);this.setVisible(false);}else{/**********解锁几关对应使能多少按钮**************/for(int k=0;k<(txtread+1);k++){ran.jb.elementAt(k).setEnabled(true);}try{fw=new FileWriter(file);txtread++;String s=Integer.toString(txtread);//将文本以字符串形式s存到文件file中fw.write(s);fw.close();}catch(Exception e1){e1.printStackTrace();}ran.setVisible(true);initGame();}}}}}}//初始化函数,负责初始化显示方面的数据/*********初始化数字********/private void initGame() {for(int i=0;i<81;i++){int x = i/ 9;   //行int y = i % 9;  //列if((x/3==0&&y/3==0)||(x/6==1&&y/3==0)||(y/6==1&&x/3==0)||(x/6==1&&y/6==1)){btnButton[i].setBackground(colors[2]);}else if(x/3==1&&y/3==1){btnButton[i].setBackground(colors[1]);}else{btnButton[i].setBackground(colors[0]);}}for (int i = 0; i < 81; i ++) {buttonsVector.elementAt(i).setEnabled(true);buttonsVector.elementAt(i).setFont(new Font("华文新魏", Font.PLAIN|Font.BOLD, 40));}int index = 0;for (int i = 0; i < 9; i ++) {for (int j = 0; j < 9; j ++) {if (core.test[i][j] != 0) {    //将所备份的还原到指定按钮buttonsVector.elementAt(index).setText(String.valueOf(core.test[i][j]));buttonsVector.elementAt(index).setForeground(Color.BLACK);} else {buttonsVector.elementAt(index).setText(null);}++ index;//推进到下一个按钮}}}//判断操作是否符合游戏填数规则,符合返回TRHEpublic boolean isLegal(int num) { int x, y;boolean flag = true;  //默认不含有相同元素 int index = buttonsVector.indexOf(choosedButton);if (index != -1) {//找到Buttonx = index / 9;//行y = index % 9;//列for (int i = 0; i < 9; i ++){  // 判断行和列是否含有num元素if (core.test[x][i] == num){ //行判断flag = false;break;}if (core.test[i][y] == num){  //列判断flag = false;break;}}//判断第(tempa, tempb)小九宫格是否含有num元素int tempa = x / 3;//知道在哪个小九宫格里           3X3个小宫格int tempb = y / 3;for (int i = tempa * 3; i < (3 + tempa * 3); i ++){//扫描该(a,b)所在的小九宫格for (int j = tempb * 3; j < (3 + tempb * 3); j ++){if (core.test[i][j] == num){flag = false;break;}}}}return flag;   }//通过按钮设置它应有的颜色public void setButtonColor(JButton button){ int index = buttonsVector.indexOf(button);//indexOf 索引当前指定·字符的位置//设置为蓝色buttonsVector.elementAt(index).setBackground(Color.CYAN);        }//判断81个格子是否都已填上数,填上则表示结束了,返回TRUEpublic boolean isFinish() {boolean flag = true; //默认为填完了for (int m = 0; m < 9; m ++) {for (int n = 0; n < 9; n ++) {if (core.test[m][n] == 0) {flag = false;break; //只要有一个还为0,即表示没有填完}}}return flag;}//用来把Test的值拷贝给a数组private void backUpProblem() {for (int i = 0; i < 9; i ++) {for (int j = 0; j < 9; j ++) {backup[i][j] = core.test[i][j];}}}
}``
// 核心算法文件
import java.awt.Color;
import java.util.Random;import javax.swing.ImageIcon;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JOptionPane;
import javax.swing.JProgressBar;public class GameCore
{ private int[] hole = null;  public int[][] test = null;  //挖过洞后的数组private int nHole;private int N;private int num;private int X, Y;private int FillNum;private int Cnum;  private int holeNumbers;  //设置挖洞数量//构造函数public GameCore(int holeNumber) {hole = new int[81];test = new int[9][9];  //存放挖好洞的布局this.holeNumbers = holeNumber;initialGame();  //初始化}//设置挖洞数量public void setHoleNumber(int holeNumber) {this.holeNumbers = holeNumber;}//Generator方法    ,产生原始填充数独  private void Generator() {  Cnum = 0;N = 9;nHole = 0;   int count = 0;  //Math.random()随机生成一个小于1的数,(int)Math.Random()相当于取整符,不会四舍五入num = 16 + (int)(Math.random() * 6);  //产生16到22之间的随机数,不包括22,也就是16到21的整数   //while循环  尝试在数组中填入符合数独规则的数字  以此来减少树的分支,提高效率   while(count != num) {  X = (int)(Math.random() * 9); //0~8 Y = (int)(Math.random() * 9);  FillNum = 1 + (int)(Math.random() * 9); //1-9 if(bPack(X, Y, FillNum))  {  test[X][Y] = FillNum;  count++;  }  }  }  //bPack方法  判断是否可将 n 填入 M[y][x] 里  private boolean bPack (int x, int y, int n) {  //for循环  纵横判断  for (int i=0; i<N; i++)                 //若 M[0~N-1][x]  if (n == test[x][i] || n == test[i][y])   //或 M[y][0~N-1] 中已存在 n  //例第一列0-8行                       第一行0-8列        十字return false;                   //则返回 false  //for循环 区域判断  int D_X, D_Y, OrderNum;  OrderNum=9*(x+1)+(y+1);  D_X=((int)(x / 3)) * 3;  D_Y=((int)(y / 3)) * 3;  for(int count = 0; count != 9; count++) {  if(D_X == x && D_Y == y)  continue;  if(test[(D_X + count / 3)][(D_Y + count % 3)] == n)  return false;//退出方法,返回false}  //返回结果  return true;  }  //fill方法  此方法用来填充完整已有数子的数独    private void fill(int num) {  if(Cnum == 81){  return;  //表示填满返回  }  if(test[Cnum / 9][Cnum % 9] != 0) {  ++Cnum;  fill(Cnum);    //位置不为0,填充下一个  return;  } else {  //从1到9里面选择数字填进去  for(int x = 1; x != 11; x++) {    if(Cnum == 81){  return;  //表示填满返回  }  if(x == 10 && Cnum != 0) {  --Cnum;  test[(Cnum / 9)][(Cnum % 9)] = 0;  return;     }  if(bPack((Cnum / 9), (Cnum % 9), x)){  test[(Cnum / 9)][(Cnum % 9)] = x;  ++Cnum;  fill(Cnum);  }  }  }  }  public void initialGame() {for (int i = 0; i < 9; i ++) {for (int j = 0; j < 9; j ++) test[i][j] = 0;}for (int i = 0; i < 81; i ++) {hole[i] = 0;}Generator();fill(Cnum);DigHole();}//随机挖洞,生成游戏布局private void DigHole() {Random random = new Random();int r, x, y;for (int i = 0; i < holeNumbers;  ){r = random.nextInt(81);x = r / 9;y = r % 9;if (test[x][y] != 0) {test[x][y] = 0;i ++;}}}}/*********进度条*************/
class progressbar extends JFrame{private JProgressBar jp=new JProgressBar();private JLabel lab1=new JLabel(new ImageIcon("bin/img/4.jpg"));public progressbar(){this.setBounds(350,150,600,400);this.setVisible(true);this.setLayout(null);jp.setBounds(50,300,500,15);jp.setForeground(Color.BLUE);jp.setVisible(true);this.add(jp);lab1.setBounds(0,0,600,400);lab1.setVisible(true);this.add(lab1);new Thread(new Runnable(){public void run(){while(true){try {int i =progressbar.this.jp.getValue();//jp需要是全局变量if (i < progressbar.this.jp.getMaximum()) {int k = ++i;progressbar.this.jp.setValue(k);progressbar.this.jp.setStringPainted(true);if (k <= 75) {Thread.sleep(10); progressbar.this.jp.setString("正在载入数独游戏......" + k+ "%");}else {         java.lang.Thread.sleep(5);                                  progressbar.this.jp.setString("正在缓冲,请稍后......" + k+ "%");                                 }           }else {progressbar.this.dispose();  //清除该容器所有组件                     }                       } catch (Exception e){                              e.printStackTrace();                                }// 成功登入if (progressbar.this.jp.getValue() == 100){progressbar.this.jp.setString("完成100%");JOptionPane.showMessageDialog(null,"游戏载入成功,进入游戏!");new mainmenu().setVisible(true);    progressbar.this.dispose();break;}}}}).start();}
}

JAVA九宫格数独游戏相关推荐

  1. java数独流程图_九宫格数独游戏C语言解法

    最近几天深圳一直下雨,一个人闷在屋里很是无聊,偶然打开一个小游戏网站看到了我的最爱--九宫格数独游戏.共有1-5五个难度级别,像我这种资深玩家其他难度就不用考虑了,冲着难度5的题目就去了,结果做地汗流 ...

  2. 微信小程序版 九宫格数独游戏

    前言 继上次JAVA版的九宫格数独,这几天把java版的迁移到了小程序这边,写一篇记录一下. 核心还是在算法上,话不多说,直接干代码 一.核心算法 先把81个格子填满,填充之前需要先判断当前格子填的数 ...

  3. java 九宫格数独_Java web - 数独九宫格游戏攻略

    分享游戏攻略,源代码集集:- String path = request.getContextPath(); String basePath = request.getScheme()+": ...

  4. 9 9简单的数独游戏python,python实现数独游戏 java简单实现数独游戏

    使用python和java实现数独游戏,有比较才有收获哦. 1.Python版 #--coding:utf-8-- import random import itertools from copy i ...

  5. 数独游戏-安卓版源代码和分析。

    1.在创建的项目中,主要有以下类,其中, Game.java 是数独游戏的算法: keydialog:主要控制数据九宫格的显示和操作 MainActivity:主要加载主页面,代码只需改动一个setc ...

  6. java完成九宫格数独_简单实现java数独游戏

    本文实例为大家分享了java数独游戏的具体代码,供大家参考,具体内容如下 打算把javaFx需要的组件装好以后直接用javaFx的,但似乎eclipse的版本不对,安装了也不能用... 数独代码是在之 ...

  7. java九宫格问题课程设计_课程设计九宫格数独.doc

    课程设计九宫格数独 中南民族大学管理学院 学生课程设计报告 课题名称: java课程设计 选题名称: 九宫格数独 年 级: 2009 专 业: 信息管理与信息系统 学 号: 姓 名: 指导教师: 完成 ...

  8. java 数独算法_java版数独游戏核心算法(一)

    之前学习javascript时用javascript写过一个数独游戏,最近看了一点java的内容,于是就心血来潮想搞一个java版的数独游戏. 现在将全部代码分享出来和大家学习交流,当然代码中有着各种 ...

  9. android 手机九宫格解锁实验报告,Android数独游戏实验分析报告.pdf

    本科生实验报告 实验课程 Android 课程设计数独游戏 学院名称 信息科学与技术学院 专业名称 物联网工程 学生姓名 学生学号 指导教师 实验地点 实验成绩 二〇一五 年 十 月 二〇一五 年 十 ...

  10. 数独游戏java版(一)--核心算法

    之前学习javascript时用javascript写过一个数独游戏,最近看了一点java的内容,于是就心血来潮想搞一个java版的数独游戏. 现在将全部代码分享出来和大家学习交流,当然代码中有着各种 ...

最新文章

  1. Windows DOS窗口查看历史执行过的命令的三种方式
  2. 每日一皮:第一次用CSS的时候,我震惊了...
  3. hdu3793 判断对称(水题)
  4. Java JDK11快速下载地址
  5. 【启智树NOIP模拟】生存【父子分治】
  6. 首发不同文件的md5碰撞真正方法——有图(视频教程加工具)非暴力碰撞!
  7. 程序人生 | 35岁以上的 iOS 程序员都到哪里去了?
  8. XenMotion 与HA的区别
  9. 关于Ubuntu下apt的一些用法及和yum的比较
  10. Python zipfile – Python ZIP
  11. 【转】在birt中显示条形码
  12. Django之WSGI浅谈
  13. iOS活体人脸识别的Demo和一些思路
  14. 一万年很长,所以只争朝夕
  15. 「TJOI 2018」碱基序列
  16. 009.查找手机电话簿【散列表】
  17. 《蜘蛛侠3》5月2日中国提前上映
  18. navicat for mysql v11企业版破解
  19. 步进电机和步进驱动器的介绍、接线、细分和控制方法
  20. 《 猜数字》小游戏的Java实现

热门文章

  1. linux查找历史记录内容,linux中查看历史记录
  2. 2019竞赛公开题库c语言,干货!全国电子设计大赛你必知的C语言知识
  3. 矩阵的广义逆——减号、加号广义逆的求法
  4. uboot - 配置过程1(分析国产君正的ingenic-linux-kernel3.10.14-x1000-v8.2-20181116\u-boot\mkconfig脚本)
  5. java 汇率换算_原生JS实现简单的汇率转换问题
  6. 公式冒号是什么意思_冒号是什么意思
  7. 取整函数 --- 以Python为例
  8. PowerBI-筛选器函数-KEEPFILTERS
  9. rms 公式 有效值_真有效值RMS定义及推导
  10. linux创建自签名证书