亚洲乱码中文字幕综合,中国熟女仑乱hd,亚洲精品乱拍国产一区二区三区,一本大道卡一卡二卡三乱码全集资源,又粗又黄又硬又爽的免费视频

Java實現(xiàn)數(shù)獨小游戲

 更新時間:2021年05月25日 10:04:21   作者:dog_egg0327  
這篇文章主要為大家詳細介紹了Java實現(xiàn)數(shù)獨小游戲,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下

本文實例為大家分享了Java實現(xiàn)數(shù)獨小游戲的具體代碼,供大家參考,具體內(nèi)容如下

題目要求:

制作一個數(shù)獨游戲。數(shù)據(jù)游戲拼圖由一個3*3的九宮格組成,每個格式又分成一個小九宮格,共九九八十一個小格子。游戲規(guī)則:游戲開始前會有一些格式了寫好了1-9的數(shù),在剩下的格式里填寫1-9的數(shù),直到把所有格式填滿,要求任何一行或一列或者任一個小九宮中沒有相同的數(shù)字。拼圖示例如下:

任務(wù)要求:

(1) 可以根據(jù)在九宮格中初始給出的數(shù)字個數(shù)設(shè)定游戲難度,如初始給出30個數(shù)設(shè)定為難、35個數(shù)設(shè)定為中等難度、40個數(shù)設(shè)定為容易。
(2) 對于初始給出的數(shù)據(jù)要能驗證題目的合法性(即驗證給出數(shù)據(jù)本身是否符合游戲規(guī)則,行、列及小九宮中不能出現(xiàn)重復(fù)數(shù)字1-9),對玩游戲中填入的數(shù)字在提交后要能驗證其正確性(任何一行或一列或者任一個小九宮中沒有相同的數(shù)字)。
(3) 程序能保存玩家的信息、游戲記錄以及成績(最高分),并能夠在游戲結(jié)束時查看玩家排名。

工作流程如下:

該數(shù)獨游戲需要連接數(shù)據(jù)庫,登錄用戶和保存數(shù)據(jù)記錄,連接數(shù)據(jù)庫創(chuàng)建表等暫不作顯示。主要數(shù)獨游戲部分(除去登錄頁面,注冊頁面,查看排名頁面不做顯示)分為Main(生成數(shù)獨,將生成100個數(shù)獨保存在文件中,也可以不保存,每次生成數(shù)獨都為一次新的數(shù)獨不做記錄,效率較差)和Play(數(shù)獨顯示頁面,同時包括填寫數(shù)獨和判斷數(shù)獨是否正確)兩類。

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的數(shù)獨
     private int[][] shudu;  //挖空arry數(shù)組中的數(shù)字
     private int[][] answer; //存儲數(shù)獨答案
     private int[][] game;  //最終數(shù)獨
     private int grade; 
     private int[] row; //每一行的個數(shù)
     private int[] col;  //每一列的個數(shù)
     private int[] places;  //每一個九宮格的個數(shù)
     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;
      //初始化數(shù)組
      for(int i=0;i<9;i++)
       row[i]=col[i]=places[i]=9;
      //調(diào)試
     // this.answer=new int[9][9]; //最終答案存儲再arry中
      rand();//先產(chǎn)生15個隨機數(shù)加上隨機位置,一定需要隨機生成,不然就會一直都是一個數(shù)組
      
      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);//獲得一個數(shù)組答案d
 
     // diger(grade);//挖空數(shù)組
  //將100個數(shù)獨寫入文件中
     
      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();
          }
      }
     }
     //隨機給數(shù)
     public void rand(){
      int t=0;
      //t=14不隨機性太高,容易產(chǎn)生沒有解的數(shù)獨,經(jīng)過參考資料發(fā)現(xiàn),當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)){  //判斷數(shù)是否能填
        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;
     }
     //根據(jù)前面放的數(shù)獲得一個正確的答案,dfs獲取
     public void dfs(int arry[][],int n){
      if(n<81){
       if(flag==true) return;
       int x=n/9;//x第N個數(shù)的橫坐標
       int y=n%9;//y第N個數(shù)的縱坐標
       if(arry[x][y]==0){
        //若第N個數(shù)為0,沒有被填過,則判斷0~9是否能被填
        for(int i=1;i<10;i++){
         if(istrue(arry,x,y,i)){
          //第N個數(shù)可以填i,填入然后dfs
          arry[x][y]=i;
          dfs(arry,n+1);
          //dfs回溯
          arry[x][y]=0;
         }
        }
       }
       else{
        dfs(arry,n+1);
       }
      }
      else{
       //獲得第一個結(jié)果,flag置true!!!!!
     
       flag=true;
       //將獲得的數(shù)組放入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();
              }
      } 
     }
     //為了避免數(shù)獨無解,保證數(shù)獨有唯一解
     //挖空數(shù)組,分難易程度,,grade為挖空個數(shù)
     //是否有一個行、列、九宮格已經(jīng)為空
     boolean emptyrow=false,emptycol=false,emptyplaces=false;
     //挖空數(shù)、關(guān)卡
     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("以行為單位讀取文件內(nèi)容,一次讀一整行:");
              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為文件結(jié)束
              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;
       }
      }
      
      
      //獲得最終游戲數(shù)獨
       for(int i=0;i<9;i++)
        for(int j=0;j<9;j++)
         game[i][j]=shudu[i][j];
      
     }
      //獲得最終游戲數(shù)獨
     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("挖空數(shù)為:"+t);
      return this.game;
     }
     
     //獲得答案數(shù)獨
     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;

//游戲界面的設(shè)計
public class Play {
 
 //設(shè)置全局變量,九宮格
 JTextField[][] numberFields=new JTextField[9][9];
 
 //游戲數(shù)獨數(shù)組
 int[][] gamearr=new int[9][9];
 
 //游戲答案數(shù)組
 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);
 
 //挖空數(shù)!
 private int grade=40;
    //過去的
 private int usedgrade=0;
 //計時器
 Timer time;
 JLabel timeLabel;
 TimerTask task;
 
 //用標簽表示游戲進展
 JLabel labelsc=new JLabel();
 
 //創(chuàng)建字體,之后所有的字體為該字體
 Font f=new Font("方正仿宋簡體", Font.BOLD, 25);
 
 //選擇九宮格中的格子的坐標
 int sx=10;
 int sy=10;
 
 //是否已經(jīng)看過答案
    private boolean isanswer;
    
  //用戶名
    JLabel username=new JLabel();
    JLabel usergrade=new JLabel();
    private int gamegrade=0;//游戲分數(shù)
    
    //登錄
    login loger=new login();
 User user=loger.user;
 
 //讀取文件名
 private String filename=new String("C:\\Users\\liaolilan\\Desktop\\SuDoKu.txt");
 
 //以前游戲數(shù)組
 private int[][] usedgame=new int[9][9];
 
 //以前的游戲時間
 private int usedtim=1;
 
 //判斷是不是新用戶
  //是否為新用戶
 private boolean isnew=true; 
 
 //保存用戶名存在在第幾行
 private int act=-1;
 //關(guān)卡
 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("數(shù)獨游戲");
       jf.setBounds(400, 0, 1100, 1000);
       jf.setResizable(false);//不允許窗口最大化
       jf.setDefaultCloseOperation(JFrame.DO_NOTHING_ON_CLOSE);//不執(zhí)行任何操作;要求程序在已注冊的 WindowListener 對象的 windowClosing 方法中處理該操作
       jf.setLocationRelativeTo(null);//居中,不用定位窗口大小
       jf.setVisible(true);
       //打開時,判斷是否上一局游戲
        jf.addWindowListener(new WindowAdapter() {
                  @Override
                  public void windowOpened(WindowEvent arg0) {
                      //如果是新用戶,保存數(shù)組
                   //保存記錄,讀取文件,讀出文件,在開始游戲的時候讀出
                       File file=new File(filename);
                       BufferedReader reader = null;
                          try {
                              System.out.println("以行為單位讀取文件內(nèi)容,一次讀一整行:");
                              reader = new BufferedReader(new InputStreamReader(new FileInputStream(file),"utf-8"));
                             // reader = new BufferedReader(new FileReader(file));
                              String tempString = null;
                              int line = 1;
                              // 一次讀入一行,直到讀入null為文件結(jié)束
                              while ((tempString = reader.readLine()) != null) {
                                  // 顯示行號
                                  System.out.println(" line " + line + ": " + tempString);
                                  if(tempString.equals(user.getUsername())){
                                   act=line;
                                   isnew=false;
                                  }
                                  else if(isnew==false){
                                    //關(guān)卡
                                    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);
                  }
              });
       //關(guān)閉時,保存關(guān)卡記錄
        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為文件結(jié)束
                                         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();
                                   //用戶名,保存用戶所通過的關(guān)卡?
                                   bw.write(data+"\r\n");
                                   //關(guān)卡
                                   bw.write(levs+"\r\n");
                                  System.out.println("Done");
                                  bw.flush();
                                  bw.close();
                                
                              
                             }catch(IOException e){
                                e.printStackTrace();
                               }
                                   System.exit(0);
                     }
                 });
       //中間數(shù)獨部分
  
       JPanel bodyPanel=new JPanel();
       bodyPanel.setBackground(lightGray);
       jf.add(bodyPanel,BorderLayout.CENTER);
       bodyPanel.setLayout(new GridLayout(9,9,0,0));
       
       
       //右邊布局,難易程度,計時,重新開始,換一題等選擇按鈕
       JPanel rightPanel=new JPanel();
       //寬度大小設(shè)置
       rightPanel.setPreferredSize(new Dimension(200, 789));
       jf.add(rightPanel, BorderLayout.EAST);
               
       //顯示用戶名和當前分數(shù)
       username.setText("用戶名:  "+user.getUsername());
       username.setFont(f);
       rightPanel.add(username);
       usergrade.setText("總分數(shù):   "+user.getUsergrade());
       usergrade.setFont(f);
       rightPanel.add(usergrade);
       //顯示當前關(guān)卡
       levels.setText("關(guān)卡:    "+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));
        //為難度按鈕加上監(jiān)聽器
        btn.addActionListener(new funactionListener());
        
        rightPanel.add(btn);
        
        //加監(jiān)聽器
       }
       
       //功能按鈕
       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("清除");
         //加清除的監(jiān)聽器
        }
        else{
         setNum[i]=new JButton(i+1+"");
         //加按鈕的監(jiān)聽器
        }
        setNum[i].setFont(f);
        setNum[i].setForeground(Color.WHITE);
        setNum[i].setBackground(green);
        setNum[i].setPreferredSize(new Dimension(90,70));
        setNum[i].setFocusPainted(false);
           //加下方按鈕監(jiān)聽器
        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);
             //循環(huán)設(shè)置組件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));
         
         //對每個格子加上監(jiān)聽器
         numberFields[i][j].addFocusListener(new textfocusaction());;
         bodyPanel.add(numberFields[i][j]);
        }
       }
    }
    //開始新游戲
    public void newGame(int grade,int level){
     isanswer=false;
     //顯示總分數(shù)
     usergrade.setText("總分數(shù): "+user.getUsergrade());
     //顯示當前關(guān)卡
  levels.setText("關(guān)卡:"+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);
        //加監(jiān)聽器!
       }
       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);
    }
    //將時間轉(zhuǎn)換成分:秒
    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;

    }
    
    //重玩該關(guān)
    public void again(){
     //重新設(shè)置
     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);
        //加監(jiān)聽器!
       }
      }
    }
    
    //輸出答案!!
    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);
       }
      }
    }
    
    //清空九宮格?。?!重新對獲取新數(shù)獨
    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);
      }
    }
  //下面為各事件的處理!!!
   
    //右邊處理數(shù)獨按鈕監(jiān)聽器(難度類別監(jiān)聽,換一題,重玩,答案)
    class funactionListener implements ActionListener{
     //難度監(jiān)聽器
        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;
      }
     }
     
    }
    //九宮格數(shù)組的監(jiān)聽器
 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);
         }
         //格子不為空,使與格子相同的數(shù)顯示粉色
         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);
                
              }
  }
  
 }
 
 //為下方的按鈕增加監(jiān)聽器
 
 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;
   }
  }
    //小九宮格內(nèi)是否有已經(jīng)存在過這個值
  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("已有該數(shù)字,請檢查!");
   labelsc.setFont(new Font("方正仿宋簡體", Font.BOLD, 21));
   labelsc.setForeground(Color.RED);
   labelsc.setVisible(true);
  }
  else{
   //挑戰(zhàn)成功后!!!
   if(isanswer==false&&gamesc()){
    //關(guān)卡加一
    levs++;
    time.cancel();
    String runtime=new String();
    runtime=timeLabel.getText();
    System.out.println(runtime);
    //轉(zhuǎn)換成秒
    int tim=((runtime.charAt(0)-48)*10+(runtime.charAt(1))-48)*60+
      (runtime.charAt(3)-48)*10+runtime.charAt(4)-48;
    //計分規(guī)則
    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 = { "查看排名", "繼續(xù)挑戰(zhàn)"}; 
    //查看排名是0,繼續(xù)挑戰(zhàn)是1
    int x = JOptionPane.showOptionDialog(null, "挑戰(zhàn)成功!分數(shù)為"+gamegrade,  "挑戰(zhàn)成功!",
                  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);
    }
  }
  }
  
 }
  //判斷點完之后數(shù)獨是否成功!
  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;
  }

}

最后生成數(shù)獨頁面的效果如下:

以上就是本文的全部內(nèi)容,希望對大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。

相關(guān)文章

  • Spring 整合多個配置文件的方法

    Spring 整合多個配置文件的方法

    在一些大型應(yīng)用中,可能存在多個配置文件,這篇文章給大家介紹了Spring 整合多個配置文件的方法,非常不錯,具有一定的參考借鑒價值,感興趣的朋友一起看看吧
    2018-05-05
  • springboot?ConfigurationProperties的綁定源碼示例解析

    springboot?ConfigurationProperties的綁定源碼示例解析

    這篇文章主要為大家介紹了springboot?ConfigurationProperties的綁定源碼示例解析,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪
    2023-09-09
  • java 與web服務(wù)器鏈接的實例

    java 與web服務(wù)器鏈接的實例

    這篇文章主要介紹了java 與web服務(wù)器鏈接的實例的相關(guān)資料,使用net.Socket類sock.getInetAddress()方法獲得與Web服務(wù)器連接,需要的朋友可以參考下
    2017-07-07
  • Java中內(nèi)部類的概念與分類詳解

    Java中內(nèi)部類的概念與分類詳解

    一個類的定義放在另一個類的內(nèi)部,這個類就叫做內(nèi)部類,下面這篇文章主要給大家介紹了關(guān)于Java中內(nèi)部類的概念與分類的相關(guān)資料,文中通過示例代碼介紹的非常詳細,需要的朋友可以參考下
    2021-09-09
  • Spring MVC項目開發(fā)踩過的一些bug

    Spring MVC項目開發(fā)踩過的一些bug

    這篇文章主要給大家介紹了關(guān)于Spring MVC項目開發(fā)踩過的一些bug,文中通過圖文介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2020-11-11
  • Springboot繼承Keycloak實現(xiàn)單點登錄與退出功能

    Springboot繼承Keycloak實現(xiàn)單點登錄與退出功能

    這篇文章主要介紹了Springboot繼承Keycloak實現(xiàn)單點登陸與退出,本文通過示例代碼給大家介紹的非常詳細,對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2023-08-08
  • Java多線程Callable接口實現(xiàn)代碼示例

    Java多線程Callable接口實現(xiàn)代碼示例

    相信大家對Java編程中如何創(chuàng)建線程已經(jīng)不陌生了,這篇文章就向朋友們介紹實現(xiàn)callable接口,具體實例詳見正文。
    2017-10-10
  • 基于Java HttpClient和Htmlparser實現(xiàn)網(wǎng)絡(luò)爬蟲代碼

    基于Java HttpClient和Htmlparser實現(xiàn)網(wǎng)絡(luò)爬蟲代碼

    這篇文章主要介紹了基于Java HttpClient和Htmlparser實現(xiàn)網(wǎng)絡(luò)爬蟲代碼的相關(guān)資料,需要的朋友可以參考下
    2015-12-12
  • SpringBoot中防止接口重復(fù)提交的有效方法

    SpringBoot中防止接口重復(fù)提交的有效方法

    在Web應(yīng)用開發(fā)過程中,接口重復(fù)提交問題一直是一個需要重點關(guān)注和解決的難題,本文將從SpringBoot應(yīng)用的角度出發(fā),探討在單機環(huán)境和分布式環(huán)境下如何有效防止接口重復(fù)提交,希望通過本文的介紹,讀者能夠掌握在SpringBoot應(yīng)用中防止接口重復(fù)提交的有效方法
    2024-05-05
  • Java多線程之同步鎖-lock詳解

    Java多線程之同步鎖-lock詳解

    這篇文章主要為大家詳細介紹了Java多線程中同步鎖-lock的原理與使用,文中的示例代碼講解詳細,對我們了解線程有一定幫助,需要的可以參考一下
    2022-10-10

最新評論