Java实现数独小游戏

网友投稿 578 2022-10-23


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

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)){

ihttp://f(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());

http:// 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;

}

}

http:// System.out.println("成功!");

return true;

}

}

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

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)){

ihttp://f(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());

http:// 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;

}

}

http:// System.out.println("成功!");

return true;

}

}

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


版权声明:本文内容由网络用户投稿,版权归原作者所有,本站不拥有其著作权,亦不承担相应法律责任。如果您发现本站中有涉嫌抄袭或描述失实的内容,请联系我们jiasou666@gmail.com 处理,核实后本网站将在24小时内删除侵权内容。

上一篇:有了 HTTP 协议,为什么还要 RPC 协议,两者有什么区别?
下一篇:使用OpenSSL生成证书 pem文件的生成 celery Security
相关文章

 发表评论

暂时没有评论,来抢沙发吧~