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),當(dāng)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ù)的橫坐標(biāo)
int y=n%9;//y第N個數(shù)的縱坐標(biāo)
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;
//用標(biāo)簽表示游戲進展
JLabel labelsc=new JLabel();
//創(chuàng)建字體,之后所有的字體為該字體
Font f=new Font("方正仿宋簡體", Font.BOLD, 25);
//選擇九宮格中的格子的坐標(biāo)
int sx=10;
int sy=10;
//是否已經(jīng)看過答案
private boolean isanswer;
//用戶名
JLabel username=new JLabel();
JLabel usergrade=new JLabel();
private int gamegrade=0;//游戲分?jǐn)?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);
//顯示用戶名和當(dāng)前分?jǐn)?shù)
username.setText("用戶名: "+user.getUsername());
username.setFont(f);
rightPanel.add(username);
usergrade.setText("總分?jǐn)?shù): "+user.getUsergrade());
usergrade.setFont(f);
rightPanel.add(usergrade);
//顯示當(dāng)前關(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);
}
//對每個格子加上名稱來標(biāo)識
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;
//顯示總分?jǐn)?shù)
usergrade.setText("總分?jǐn)?shù): "+user.getUsergrade());
//顯示當(dāng)前關(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)成功!分?jǐ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)文章
springboot?ConfigurationProperties的綁定源碼示例解析
這篇文章主要為大家介紹了springboot?ConfigurationProperties的綁定源碼示例解析,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪2023-09-09
Springboot繼承Keycloak實現(xiàn)單點登錄與退出功能
這篇文章主要介紹了Springboot繼承Keycloak實現(xiàn)單點登陸與退出,本文通過示例代碼給大家介紹的非常詳細,對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下2023-08-08
基于Java HttpClient和Htmlparser實現(xiàn)網(wǎng)絡(luò)爬蟲代碼
這篇文章主要介紹了基于Java HttpClient和Htmlparser實現(xiàn)網(wǎng)絡(luò)爬蟲代碼的相關(guān)資料,需要的朋友可以參考下2015-12-12

