java

关注公众号 jb51net

关闭
首页 > 软件编程 > java > Java数独小游戏

Java实现数独小游戏

作者:dog_egg0327

这篇文章主要为大家详细介绍了Java实现数独小游戏,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下

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

题目要求:

制作一个数独游戏。数据游戏拼图由一个3*3的九宫格组成,每个格式又分成一个小九宫格,共九九八十一个小格子。游戏规则:游戏开始前会有一些格式了写好了1-9的数,在剩下的格式里填写1-9的数,直到把所有格式填满,要求任何一行或一列或者任一个小九宫中没有相同的数字。拼图示例如下:

任务要求:

(1) 可以根据在九宫格中初始给出的数字个数设定游戏难度,如初始给出30个数设定为难、35个数设定为中等难度、40个数设定为容易。
(2) 对于初始给出的数据要能验证题目的合法性(即验证给出数据本身是否符合游戏规则,行、列及小九宫中不能出现重复数字1-9),对玩游戏中填入的数字在提交后要能验证其正确性(任何一行或一列或者任一个小九宫中没有相同的数字)。
(3) 程序能保存玩家的信息、游戏记录以及成绩(最高分),并能够在游戏结束时查看玩家排名。

工作流程如下:

该数独游戏需要连接数据库,登录用户和保存数据记录,连接数据库创建表等暂不作显示。主要数独游戏部分(除去登录页面,注册页面,查看排名页面不做显示)分为Main(生成数独,将生成100个数独保存在文件中,也可以不保存,每次生成数独都为一次新的数独不做记录,效率较差)和Play(数独显示页面,同时包括填写数独和判断数独是否正确)两类。

1、Main类

package shudu;

import java.awt.BorderLayout;
import java.awt.Button;
import java.awt.Color;
import java.awt.Dimension;
import java.awt.Font;
import java.awt.GridLayout;
import java.awt.SystemColor;
import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileWriter;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.Random;

import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;

public class Main {

     private int[][] Arry;   //得到一个9*9的数独
     private int[][] shudu;  //挖空arry数组中的数字
     private int[][] answer; //存储数独答案
     private int[][] game;  //最终数独
     private int grade; 
     private int[] row; //每一行的个数
     private int[] col;  //每一列的个数
     private int[] places;  //每一个九宫格的个数
     private boolean flag=false;
   //读取文件名
  private String filename=new String("C:\\Users\\liaolilan\\Desktop\\shudu.txt");
   public static void main(String[] args){
    Main mainer=new Main();
   // mainer.UI();
   }
     
     public void  UI(){
      for(int k=0;k<100;k++){
       this.Arry=new int[9][9];
          this.shudu=new int[9][9];
          this.game=new int[9][9];
          this.answer=new int[9][9];
          this.row=new int[9];
          this.col=new int[9];
          this.places=new int[9];
          this.grade=grade;
          flag=false;
      //初始化数组
      for(int i=0;i<9;i++)
       row[i]=col[i]=places[i]=9;
      //调试
     // this.answer=new int[9][9]; //最终答案存储再arry中
      rand();//先产生15个随机数加上随机位置,一定需要随机生成,不然就会一直都是一个数组
      
      for(int i=0;i<9;i++){
       for(int j=0;j<9;j++)
        System.out.print(Arry[i][j]);
       System.out.println();
      }
      dfs(Arry,0);//获得一个数组答案d
 
     // diger(grade);//挖空数组
  //将100个数独写入文件中
     
      try{
           String data = "";
           File file =new File(filename);
           //if file doesnt exists, then create it
           if(!file.exists()){
            file.createNewFile();
           }
           //true = append file
           FileWriter fileWritter = new FileWriter(filename,true);
                  BufferedWriter bufferWritter = new BufferedWriter(fileWritter);
                  bufferWritter.write(k+1+"\r\n");
                  for(int i=0;i<9;i++){
                   data="";
                   for(int j=0;j<9;j++){
                    data=data+answer[i][j]+"";
                   }
                   System.out.println(data);
                   bufferWritter.write(data+"\r\n");
                  }
                  bufferWritter.close();
              System.out.println("Done");
          }catch(IOException e){
           e.printStackTrace();
          }
      }
     }
     //随机给数
     public void rand(){
      int t=0;
      //t=14不随机性太高,容易产生没有解的数独,经过参考资料发现,当t=6的时候,几乎100%有解
      while(t<6){
      int x=new Random().nextInt(9);
      int y=new Random().nextInt(9); 
      int i=new Random().nextInt(9)+1;
      if(Arry[x][y]==0){
       if(istrue(Arry,x,y,i)){  //判断数是否能填
        Arry[x][y]=i;
        t++;
       }
      }
      }
     }
     //判断在arry[x][y]上是否能放num
     public boolean istrue(int arry[][],int x,int y,int num){
      //横竖是否有num
  for(int i=0;i<9;i++){
   if(arry[x][i]==num||arry[i][y]==num)
    return false;
  }
  
  for(int i=(x/3)*3;i<(x/3+1)*3;i++)
   for(int j=(y/3)*3;j<(y/3+1)*3;j++)
    if(arry[i][j]==num)
     return false;
  return true;
     }
     //根据前面放的数获得一个正确的答案,dfs获取
     public void dfs(int arry[][],int n){
      if(n<81){
       if(flag==true) return;
       int x=n/9;//x第N个数的横坐标
       int y=n%9;//y第N个数的纵坐标
       if(arry[x][y]==0){
        //若第N个数为0,没有被填过,则判断0~9是否能被填
        for(int i=1;i<10;i++){
         if(istrue(arry,x,y,i)){
          //第N个数可以填i,填入然后dfs
          arry[x][y]=i;
          dfs(arry,n+1);
          //dfs回溯
          arry[x][y]=0;
         }
        }
       }
       else{
        dfs(arry,n+1);
       }
      }
      else{
       //获得第一个结果,flag置true!!!!!
     
       flag=true;
       //将获得的数组放入shudu中然后再挖空
       //if(all==false){
        for(int i=0;i<9;i++)
         for(int j=0;j<9;j++)
          shudu[i][j]=answer[i][j]=arry[i][j];
        
        System.out.println("###################");
        for(int i=0;i<9;i++){
              for(int j=0;j<9;j++)
               System.out.print(arry[i][j]);
               System.out.println();
              }
      } 
     }
     //为了避免数独无解,保证数独有唯一解
     //挖空数组,分难易程度,,grade为挖空个数
     //是否有一个行、列、九宫格已经为空
     boolean emptyrow=false,emptycol=false,emptyplaces=false;
     //挖空数、关卡
     public void diger(int grade,int level){
      this.shudu=new int[9][9];
      this.game=new int[9][9];
      this.answer=new int[9][9];
      this.row=new int[9];
      this.col=new int[9];
      this.places=new int[9];
      this.grade=grade;
       File file=new File(filename);
       BufferedReader reader = null;
          try {
              System.out.println("以行为单位读取文件内容,一次读一整行:");
              reader = new BufferedReader(new InputStreamReader(new FileInputStream(file),"utf-8"));
             // reader = new BufferedReader(new FileReader(file));
              String tempString = null;
              int line = 1,k=0;
              boolean flag=false;
              // 一次读入一行,直到读入null为文件结束
              while ((tempString = reader.readLine()) != null&&k<9) {
                  // 显示行号
                  System.out.println(" line " + line + ": " + tempString);
                  if(tempString.equals(level+"")){
                  flag=true;
                  continue;
                  }
                 if(flag==true){
                  for(int i=0;i<9;i++)
                   answer[k][i]=tempString.charAt(i)-48;
                  k++;
                 }
                  line++;
              }
              reader.close();
          } catch (IOException e) {
              e.printStackTrace();
          } finally {
              if (reader != null) {
                  try {
                      reader.close();
                  } catch (IOException e1) {
                  }
              }
          }
          for(int i=0;i<9;i++)
           for(int j=0;j<9;j++)
            shudu[i][j]=answer[i][j];
      int t=grade;
      while(t>0){
       //随机抽到x,y
       int x=new Random().nextInt(9);
       int y=new Random().nextInt(9);
       //若x,y没有被挖空则挖空x,y
       if(shudu[x][y]!=0){
        row[x]--;
        col[y]--;
        places[(y/3)*3+x/3]--;
        if((row[x]==0&&emptyrow)||(col[y]==0&&emptycol)||(places[(y/3)*3+x/3]==0&&emptyplaces))
        {
         System.out.println(x+" "+y+" 不可以");
         continue;
        }
        else{
        shudu[x][y]=0;
        t=t-1;}
        if(row[x]==0)
         emptyrow=true;
        if(col[y]==0)
         emptycol=true;
        if(places[(y/3)*3+x/3]==0)
         emptyplaces=true;
       }
      }
      
      
      //获得最终游戏数独
       for(int i=0;i<9;i++)
        for(int j=0;j<9;j++)
         game[i][j]=shudu[i][j];
      
     }
      //获得最终游戏数独
     public int[][] getArr(){
      int t=0;
      for(int i=0;i<9;i++){
       for(int j=0;j<9;j++){
        System.out.print(game[i][j]);
        if(game[i][j]==0)
         t++;
         
       }
        System.out.println();
       }
   System.out.println("###################");
   System.out.println("挖空数为:"+t);
      return this.game;
     }
     
     //获得答案数独
     public int[][] getAnswer(){
      for(int i=0;i<9;i++){
        for(int j=0;j<9;j++)
         System.out.print(answer[i][j]);
         System.out.println();
        }
   System.out.println("###################");
      return this.answer;
     }
}

2、Play类

package shudu;

import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.Dimension;
import java.awt.Font;
import java.awt.GridLayout;
import java.awt.SystemColor;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.FocusEvent;
import java.awt.event.FocusListener;
import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;
import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.FileReader;
import java.io.FileWriter;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import java.util.ArrayList;
import java.util.List;
import java.util.Timer;
import java.util.TimerTask;

import javax.swing.BorderFactory;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JOptionPane;
import javax.swing.JPanel;
import javax.swing.JTextField;
import javax.swing.border.Border;

import SQLconnect.UserDao;
import shudu.Main;
import vo.User;

//游戏界面的设计
public class Play {
 
 //设置全局变量,九宫格
 JTextField[][] numberFields=new JTextField[9][9];
 
 //游戏数独数组
 int[][] gamearr=new int[9][9];
 
 //游戏答案数组
 int[][] answerarr=new int[9][9];
 
 //灰色
 Color green=new Color(93, 200, 138);
 Color lightGray = new Color(217, 217, 217);
 Color blue = new Color(102, 183, 255);
 
 //挖空数!
 private int grade=40;
    //过去的
 private int usedgrade=0;
 //计时器
 Timer time;
 JLabel timeLabel;
 TimerTask task;
 
 //用标签表示游戏进展
 JLabel labelsc=new JLabel();
 
 //创建字体,之后所有的字体为该字体
 Font f=new Font("方正仿宋简体", Font.BOLD, 25);
 
 //选择九宫格中的格子的坐标
 int sx=10;
 int sy=10;
 
 //是否已经看过答案
    private boolean isanswer;
    
  //用户名
    JLabel username=new JLabel();
    JLabel usergrade=new JLabel();
    private int gamegrade=0;//游戏分数
    
    //登录
    login loger=new login();
 User user=loger.user;
 
 //读取文件名
 private String filename=new String("C:\\Users\\liaolilan\\Desktop\\SuDoKu.txt");
 
 //以前游戏数组
 private int[][] usedgame=new int[9][9];
 
 //以前的游戏时间
 private int usedtim=1;
 
 //判断是不是新用户
  //是否为新用户
 private boolean isnew=true; 
 
 //保存用户名存在在第几行
 private int act=-1;
 //关卡
 JLabel levels=new JLabel();
 int levs=1;
 //窗口
 private JFrame jf ;
    public Play(){
     //制作游戏界面
     System.out.println(user.getUsername()+" "+user.getUserpwd()+" "+user.getUsergrade());
       jf = new JFrame();
       jf.setTitle("数独游戏");
       jf.setBounds(400, 0, 1100, 1000);
       jf.setResizable(false);//不允许窗口最大化
       jf.setDefaultCloseOperation(JFrame.DO_NOTHING_ON_CLOSE);//不执行任何操作;要求程序在已注册的 WindowListener 对象的 windowClosing 方法中处理该操作
       jf.setLocationRelativeTo(null);//居中,不用定位窗口大小
       jf.setVisible(true);
       //打开时,判断是否上一局游戏
        jf.addWindowListener(new WindowAdapter() {
                  @Override
                  public void windowOpened(WindowEvent arg0) {
                      //如果是新用户,保存数组
                   //保存记录,读取文件,读出文件,在开始游戏的时候读出
                       File file=new File(filename);
                       BufferedReader reader = null;
                          try {
                              System.out.println("以行为单位读取文件内容,一次读一整行:");
                              reader = new BufferedReader(new InputStreamReader(new FileInputStream(file),"utf-8"));
                             // reader = new BufferedReader(new FileReader(file));
                              String tempString = null;
                              int line = 1;
                              // 一次读入一行,直到读入null为文件结束
                              while ((tempString = reader.readLine()) != null) {
                                  // 显示行号
                                  System.out.println(" line " + line + ": " + tempString);
                                  if(tempString.equals(user.getUsername())){
                                   act=line;
                                   isnew=false;
                                  }
                                  else if(isnew==false){
                                    //关卡
                                    levs=Integer.valueOf(tempString);
                                          System.out.println(levs);
                                          break;
                                  }
                                  line++;
                              }
                              reader.close();
                          } catch (IOException e) {
                              e.printStackTrace();
                          } finally {
                              if (reader != null) {
                                  try {
                                      reader.close();
                                  } catch (IOException e1) {
                                  }
                              }
                          }
                   newGame(grade,levs);
                  }
              });
       //关闭时,保存关卡记录
        jf.addWindowListener(new WindowAdapter() {
                     @Override
                     public void windowClosing(WindowEvent arg0) {
                          BufferedReader reader = null;
                          //保存记录,读取文件,读出文件,在开始游戏的时候读出
                            File file=new File(filename);
                                     int num=0;//第几行
                                  boolean flag=false;
                                  System.out.println("act:"+act);
                                  List list = new ArrayList();
                                  try{
                                   reader = new BufferedReader(new InputStreamReader(new FileInputStream(file),"utf-8"));
                                        // reader = new BufferedReader(new FileReader(file));
                                         String str = null;
                                         // 一次读入一行,直到读入null为文件结束
                                         while ((str = reader.readLine())!= null) {
                                             ++num;
                                             System.out.println(num+"行:"+str);
                                      if(isnew==false&&(num==act||num==act+1)){
                                       System.out.println(str);
                                       continue;
                                      }
                                  list.add(str);
                                  }
                                  }catch(IOException e){
                                       e.printStackTrace();
                                      }
                                  System.out.println("list size:"+list.size());
                                  System.out.println("删除成功");
                                  //重新写入
                                  try{
                                  FileWriter fileWritter = new FileWriter(filename);
                                      BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(new FileOutputStream(filename), "utf-8"));
                                      //BufferedWriter bw= new BufferedWriter(fileWritter);
                                  for( int i=0;i<list.size();i++ ){
                                  System.out.println("list["+i+"]"+list.get(i));
                                  bw.write(list.get(i).toString());
                                  bw.newLine();
                                  }
                                  String data = user.getUsername();
                                   //用户名,保存用户所通过的关卡?
                                   bw.write(data+"\r\n");
                                   //关卡
                                   bw.write(levs+"\r\n");
                                  System.out.println("Done");
                                  bw.flush();
                                  bw.close();
                                
                              
                             }catch(IOException e){
                                e.printStackTrace();
                               }
                                   System.exit(0);
                     }
                 });
       //中间数独部分
  
       JPanel bodyPanel=new JPanel();
       bodyPanel.setBackground(lightGray);
       jf.add(bodyPanel,BorderLayout.CENTER);
       bodyPanel.setLayout(new GridLayout(9,9,0,0));
       
       
       //右边布局,难易程度,计时,重新开始,换一题等选择按钮
       JPanel rightPanel=new JPanel();
       //宽度大小设置
       rightPanel.setPreferredSize(new Dimension(200, 789));
       jf.add(rightPanel, BorderLayout.EAST);
               
       //显示用户名和当前分数
       username.setText("用户名:  "+user.getUsername());
       username.setFont(f);
       rightPanel.add(username);
       usergrade.setText("总分数:   "+user.getUsergrade());
       usergrade.setFont(f);
       rightPanel.add(usergrade);
       //显示当前关卡
       levels.setText("关卡:    "+levs);
       levels.setFont(f);
       rightPanel.add(levels);
       //难度选择,默认为容易
       JLabel label1=new JLabel("请选择模式");
       label1.setFont(f);
       rightPanel.add(label1);
       //容易,中等,难
       String[] btnstr={"容易","中等","难"};
       for(int i=0;i<3;i++){
        JButton btn=new JButton(btnstr[i]);
        btn.setFont(f);
        btn.setBackground(lightGray);
        btn.setPreferredSize(new Dimension(120,60));
        //为难度按钮加上监听器
        btn.addActionListener(new funactionListener());
        
        rightPanel.add(btn);
        
        //加监听器
       }
       
       //功能按钮
       JLabel label2=new JLabel("功能按钮 ");
       label2.setFont(f);
       rightPanel.add(label2);
       //换一题
       JButton changebtn=new JButton("换一题");
       changebtn.setFont(f);
       changebtn.setPreferredSize(new Dimension(120,60));
       changebtn.setBackground(lightGray);
       changebtn.setForeground(Color.black);
       changebtn.addActionListener(new funactionListener());
       rightPanel.add(changebtn);
      
       //重做
       JButton newbtn=new JButton("重玩");
       newbtn.setFont(f);
       newbtn.setPreferredSize(new Dimension(120,60));
       newbtn.setBackground(lightGray);
       newbtn.setForeground(Color.BLACK);
       newbtn.addActionListener(new funactionListener());
       rightPanel.add(newbtn);
       
       
       //答案
       JButton answerbtn=new JButton("答案");
       answerbtn.setFont(f);
       answerbtn.setPreferredSize(new Dimension(120,60));
       answerbtn.setBackground(Color.red);
       answerbtn.setForeground(Color.WHITE);
       answerbtn.addActionListener(new funactionListener());
       rightPanel.add(answerbtn);
       
       
       //计时
       JLabel label3=new JLabel("    计时    ");
       label3.setFont(f);
       rightPanel.add(label3);
       timeLabel=new JLabel("00:00");
       timeLabel.setFont(f);
       rightPanel.add(timeLabel);
       
       //放一个游戏进展
       rightPanel.add(labelsc);
       labelsc.setVisible(false);
       
       
       //下面布局
       JPanel lastPanel=new JPanel();
       jf.add(lastPanel,BorderLayout.SOUTH);
       lastPanel.setPreferredSize(new Dimension(1333, 100));
       lastPanel.setLayout(new GridLayout(0, 10, 0, 0));
       
       //放选择按钮
       JButton[] setNum=new JButton[10];
       for(int i=0;i<10;i++){
        if(i==9){
         setNum[i]=new JButton("清除");
         //加清除的监听器
        }
        else{
         setNum[i]=new JButton(i+1+"");
         //加按钮的监听器
        }
        setNum[i].setFont(f);
        setNum[i].setForeground(Color.WHITE);
        setNum[i].setBackground(green);
        setNum[i].setPreferredSize(new Dimension(90,70));
        setNum[i].setFocusPainted(false);
           //加下方按钮监听器
        setNum[i].addActionListener(new buttonaction());
        lastPanel.add(setNum[i]);
       }
       //对中间布局进行控制
       //组件边框
       Border centernBorder = BorderFactory.createMatteBorder(1, 1, 1, 1, Color.GRAY);
       Border rightAndBottomBorder = BorderFactory.createMatteBorder(1, 1, 4, 4, Color.GRAY);
       Border bottomBorder = BorderFactory.createMatteBorder(1, 1, 4, 1, Color.GRAY);
       Border rightBorder = BorderFactory.createMatteBorder(1, 1, 1, 4, Color.GRAY);
             //循环设置组件JTextField,九宫格
       //numberFields = new JTextField[9][9];
       for (int i = 0; i < 9; i++) {
        for (int j = 0; j < 9; j++) {
         //System.out.println(i+j+"");
         numberFields[i][j] = new JTextField();
         //不可编辑
         numberFields[i][j].setEditable(false);
         numberFields[i][j].setFont(new Font("微软雅黑", Font.BOLD, 35));
         numberFields[i][j].setHorizontalAlignment(JTextField.CENTER);
         numberFields[i][j].setBackground(Color.WHITE);
         numberFields[i][j].setForeground(Color.BLACK);
         //加边框!
         if (i == 2 && j == 2 || i == 2 && j == 5 || i == 5 && j == 2 || i == 5 && j == 5) {
          numberFields[i][j].setBorder(rightAndBottomBorder);
         } else if (j == 2 || j == 5) {
          numberFields[i][j].setBorder(rightBorder);
         } else if (i == 2 || i == 5) {
          numberFields[i][j].setBorder(bottomBorder);
         } else {
          numberFields[i][j].setBorder(centernBorder);
         }
         //对每个格子加上名称来标识
         numberFields[i][j].setName(Integer.toString(i) + Integer.toString(j));
         
         //对每个格子加上监听器
         numberFields[i][j].addFocusListener(new textfocusaction());;
         bodyPanel.add(numberFields[i][j]);
        }
       }
    }
    //开始新游戏
    public void newGame(int grade,int level){
     isanswer=false;
     //显示总分数
     usergrade.setText("总分数: "+user.getUsergrade());
     //显示当前关卡
  levels.setText("关卡:"+levs+"");
     Main maker=new Main();
     maker.diger(grade, level);
     gamearr=maker.getArr();
     answerarr=maker.getAnswer();
     for(int i=0;i<9;i++){
        for(int j=0;j<9;j++)
         System.out.print(answerarr[i][j]);
         System.out.println();
        }
   System.out.println("###################");
     //先清空九宫格
     for(int i=0;i<9;i++)
      for(int j=0;j<9;j++){
       if(gamearr[i][j]!=0){
        numberFields[i][j].setText(gamearr[i][j]+"");
        numberFields[i][j].setBackground(lightGray);
        numberFields[i][j].setForeground(Color.BLACK);
        //加监听器!
       }
       else{
        numberFields[i][j].setText("");
        numberFields[i][j].setBackground(Color.WHITE);
        numberFields[i][j].setForeground(Color.BLACK);
       }
      }
     //开始计时
     startTime();
    }
    
    //游戏开始计时
    public void startTime(){
     //游戏开始计时!
  time = new Timer();
  task = new TimerTask() {
   int count = usedtim;
   
   @Override
   public void run() {
                
    timeLabel.setText(gettime(count));
    count++;
   }
  };
  time.schedule(task, 1000L, 1000L); // 开始游戏时自动计时
    }
    
    //时间重新计时
    public void restartTime(){
     //删除time记录,要使用过才能删除
     time.cancel();
     time=new Timer();
     timeLabel.setText("00:00");
     task = new TimerTask() {
   int count = 1;

   @Override
   public void run() {

    timeLabel.setText(gettime(count));
    count++;
    
   }
  };
  time.schedule(task, 1000L, 1000L);
    }
    //将时间转换成分:秒
    public String gettime(int count){
     String second = null;
  String minute = null;
  if (count / 60 < 10) {
   minute = "0" + (count / 60);
  } else {
   minute = "" + (count / 60);
  }
  if (count % 60 < 10) {
   second = ":0" + count % 60;
  } else {
   second = ":" + count % 60;
  }
  return minute + second;

    }
    
    //重玩该关
    public void again(){
     //重新设置
     for(int i=0;i<9;i++)
      for(int j=0;j<9;j++){
       if(gamearr[i][j]!=0){
        numberFields[i][j].setText(gamearr[i][j]+"");
        numberFields[i][j].setBackground(lightGray);
        //加监听器!
       }
      }
    }
    
    //输出答案!!
    public void answer(){
     //gamearr中为0的地方放答案!!
     for(int i=0;i<9;i++)
      for(int j=0;j<9;j++){
       if(gamearr[i][j]==0){
        numberFields[i][j].setText(answerarr[i][j]+"");
        numberFields[i][j].setForeground(Color.RED);
       }
      }
    }
    
    //清空九宫格!!!重新对获取新数独
    public void resetfields(){
     for(int i=0;i<9;i++)
      for(int j=0;j<9;j++){
       numberFields[i][j].setText("");
    numberFields[i][j].setBackground(Color.WHITE);
      }
    }
  //下面为各事件的处理!!!
   
    //右边处理数独按钮监听器(难度类别监听,换一题,重玩,答案)
    class funactionListener implements ActionListener{
     //难度监听器
        String btnstr;
     @Override
     public void actionPerformed(ActionEvent e) {
      // TODO Auto-generated method stub
      btnstr=e.getActionCommand();
      if(btnstr.equals("容易")){
       grade=40;
       //若选择按钮难度为容易,重新开始游戏
       resetfields();
       newGame(grade,levs);
       restartTime();
      }
      else if(btnstr.equals("中等")){
       grade=45;
       //若选择按钮难度为中等,重新开始游戏
       resetfields();
       newGame(grade,levs);
       restartTime();
      }
      else if(btnstr.equals("难")){
       //同上
       grade=50;
       resetfields();
       newGame(grade,levs);
       restartTime();
      }
      else if(btnstr.equals("换一题")){
       resetfields();
       newGame(grade,levs);
       restartTime();
      }
      //重新开始计分
      else if(btnstr.equals("重玩")){
       resetfields();
       again();
       restartTime();
      }
      //将分归零
      else if(btnstr.equals("答案")){
       answer();
       time.cancel();
       isanswer=true;
      }
     }
     
    }
    //九宫格数组的监听器
 class textfocusaction implements FocusListener{

   //该各自获得焦点
  @Override
  public void focusGained(FocusEvent e) {
   // TODO Auto-generated method stub
   JTextField jt=(JTextField) e.getSource();
   //点击之前还原颜色
   replace();
   sameNumber(jt);
  }
         
  //该格子失去焦点,将颜色还原
  @Override
  public void focusLost(FocusEvent e) {
   // TODO Auto-generated method stub
   labelsc.setVisible(false);
   replace();
  }
 }
 
 //处理获得焦点的文本格子
 public void sameNumber(JTextField jt){
  String name=jt.getName();
  System.out.println(name);
  int x=Integer.parseInt(name.substring(0,1));
  int y=Integer.parseInt(name.substring(1));
  String number=jt.getText();
  
  //System.out.println(x+"  "+y);
        if(gamearr[x][y]!=0){
         sx=10;
         sy=10;
        }
        else{
         sx=x;
         sy=y;
         System.out.println(sx+"  "+sy);
         //格子为空
         if(number.equals("")){
          //使该行该列和该小九宫格的颜色置blue,提醒用户
          for(int i=0;i<9;i++){
           numberFields[i][sy].setBackground(blue);
           numberFields[sx][i].setBackground(blue);
          }
          for(int i=(sx/3)*3;i<((sx/3)+1)*3;i++)
           for(int j=(sy/3)*3;j<((sy/3)+1)*3;j++)
            numberFields[i][j].setBackground(blue);
          numberFields[sx][sy].setBackground(green);
         }
         //格子不为空,使与格子相同的数显示粉色
         else{
                  for(int i=0;i<9;i++)
                   for(int j=0;j<9;j++)
                    if(numberFields[i][j].getText().equals(number))
                     numberFields[i][j].setBackground(Color.pink);
         }
        }
  
 }
 
 //使格子颜色还原
 public void replace(){
  if(sx<10&&sy<10){
   for(int i=0;i<9;i++){
    if(gamearr[i][sy]!=0)
       numberFields[i][sy].setBackground(lightGray);
    else
     numberFields[i][sy].setBackground(Color.WHITE);
    if(gamearr[sx][i]!=0)
           numberFields[sx][i].setBackground(lightGray);
     else
     numberFields[sx][i].setBackground(Color.WHITE);
      }
   for(int i=(sx/3)*3;i<((sx/3)+1)*3;i++)
       for(int j=(sy/3)*3;j<((sy/3)+1)*3;j++)
       if(gamearr[i][j]!=0)
        numberFields[i][j].setBackground(lightGray);
    else
     numberFields[i][j].setBackground(Color.WHITE);
   for(int i=0;i<9;i++)
             for(int j=0;j<9;j++)
              if(numberFields[i][j].getText().equals(numberFields[sx][sy].getText())&&!(i==sx&&j==sy)){
               if(gamearr[i][j]!=0)
              numberFields[i][j].setBackground(lightGray);
       else
        numberFields[i][j].setBackground(Color.WHITE);
                
              }
  }
  
 }
 
 //为下方的按钮增加监听器
 
 class buttonaction implements ActionListener{

  @Override
  public void actionPerformed(ActionEvent e) {
   // TODO Auto-generated method stub
   String btnstr;
   btnstr=e.getActionCommand();
   replace();
   //如果按钮为清除,则将格子置空
   if(btnstr.equals("清除")&&(sx<10&&sy<10)){
    numberFields[sx][sy].setText("");
    numberFields[sx][sy].setBackground(Color.white);
   }
   //若为其他的,在格子中放入值
   else if(sx<10&&sy<10){
    numberFields[sx][sy].setText(btnstr);
    numberFields[sx][sy].setForeground(Color.blue);
    numberFields[sx][sy].setBackground(Color.white);
    
    //判断值放的是否正确,若不正确,则将该值和相冲突的格子背景颜色置为红色
    
    jugewrong(btnstr);
   }
  }
  
  
 }
 
 //判断值放的是否正确,若不正确,则将该值和相冲突的格子背景颜色置为红色
 public void jugewrong(String number){
   boolean flag=false; //该值是否正确
  //行列是否有相同的
  for(int i=0;i<9;i++){
   if(i!=sy&&(numberFields[sx][i].getText().equals(number))){
    numberFields[sx][i].setBackground(Color.red);
    flag=true;
   }
   if(i!=sx&&(numberFields[i][sy].getText().equals(number))){
    numberFields[i][sy].setBackground(Color.red);
    flag=true;
   }
  }
    //小九宫格内是否有已经存在过这个值
  for(int i=(sx/3)*3;i<((sx/3)+1)*3;i++)
   for(int j=(sy/3)*3;j<((sy/3)+1)*3;j++){
    if(!(i==sx&&j==sy)&&(numberFields[i][j].getText().equals(number))){
     numberFields[i][j].setBackground(Color.red);
     flag=true;
    }
   }
  if(flag){
   labelsc.setText("已有该数字,请检查!");
   labelsc.setFont(new Font("方正仿宋简体", Font.BOLD, 21));
   labelsc.setForeground(Color.RED);
   labelsc.setVisible(true);
  }
  else{
   //挑战成功后!!!
   if(isanswer==false&&gamesc()){
    //关卡加一
    levs++;
    time.cancel();
    String runtime=new String();
    runtime=timeLabel.getText();
    System.out.println(runtime);
    //转换成秒
    int tim=((runtime.charAt(0)-48)*10+(runtime.charAt(1))-48)*60+
      (runtime.charAt(3)-48)*10+runtime.charAt(4)-48;
    //计分规则
    System.out.println(tim);
    if(grade==40){
     if(tim<=180)
              gamegrade=80;
     else if(tim<=600)
                    gamegrade=70;
     else if(tim<=1800)
      gamegrade=60;
     else
      gamegrade=50;
    }
    else if(grade==45){
      if(tim<=180)
               gamegrade=90;
      else if(tim<=600)
                     gamegrade=85;
      else if(tim<=1800)
       gamegrade=75;
      else
       gamegrade=65;
    }
    else{
     if(tim<=180)
               gamegrade=100;
      else if(tim<=600)
                     gamegrade=90;
      else if(tim<=1800)
       gamegrade=85;
      else
       gamegrade=80;
    }
    user.setUsergrade(user.getUsergrade()+gamegrade);
    System.out.println(user.getUsergrade());
    UserDao dao=new UserDao();
    dao.modifyuser(user);
    //弹出一个成功的对话框!
    Object[] options = { "查看排名", "继续挑战"}; 
    //查看排名是0,继续挑战是1
    int x = JOptionPane.showOptionDialog(null, "挑战成功!分数为"+gamegrade,  "挑战成功!",
                  JOptionPane.DEFAULT_OPTION, JOptionPane.INFORMATION_MESSAGE, null, options, options[0]);
    System.out.println(x);
    if(x==0){
     rank ranker;
     ranker=new rank();
     //newGame(grade);
    }
    else{
     newGame(grade,levs);
    }
  }
  }
  
 }
  //判断点完之后数独是否成功!
  public boolean gamesc(){
   for(int i=0;i<9;i++)
    for(int j=0;j<9;j++){
     System.out.println(numberFields[i][j].getText());
     System.out.println("点击!");
     if(numberFields[i][j].getText().equals("")){
     // System.out.println("111失败!");
      return false;
     }
     for(int k=0;k<9;k++)
      if((k!=j&&numberFields[i][k].getText().equals(numberFields[i][j].getText()))||(k!=i&&numberFields[k][j].getText().equals(numberFields[i][j].getText()))){
      numberFields[i][j].setBackground(Color.RED);
      numberFields[i][k].setBackground(Color.red);
       return false;
      }
     for(int m=(i/3)*3;m<(i/3+1)*3;m++)
      for(int n=(j/3)*3;n<(j/3+1)*3;n++)
       if(!(m==i&&n==j)&&(numberFields[m][n].getText().equals(numberFields[i][j].getText())))
       {  
        return false;
       }
    }
   System.out.println("成功!");
     return true;
  }

}

最后生成数独页面的效果如下:

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

您可能感兴趣的文章:
阅读全文