数独游戏经过N天闭门造车的努力,今天终于初步成型了,经过初步测试,基本达到要求,但是肯定还有许多错误之处,
现在把代码贴上来,希望各位马友斧正!
1、产生数独数组的类:[code=java]import java.util.Random;
public class DoShudu {
public static void main(String args[]){
DoShudu shudu=new DoShudu();
int[][] cells=shudu.getShudu();
shudu.printShuDu(cells);
}
public void printShuDu(int [][] cells) {//打印出打乱顺序后的数独数组
for(int k=0;k<9;k++){
for(int i=0;i<9;i++){
System.out.print(cells[k]);
}
System.out.println();
}
}
public int[][] getShudu(){//获得打乱顺序后的数独数组的方法
int[][] cells=new int[][]{//建立有顺序的数组
{1,2,3,4,5,6,7,8,9},
{4,5,6,7,8,9,1,2,3},
{7,8,9,1,2,3,4,5,6},
{2,3,1,5,6,4,8,9,7},
{5,6,4,8,9,7,2,3,1},
{8,9,7,2,3,1,5,6,4},
{3,1,2,6,4,5,9,7,8},
{6,4,5,9,7,8,3,1,2},
{9,7,8,3,1,2,6,4,5}
};
int countH=new Random().nextInt(10);
for(int k=0;k<countH;k++){//对数独数组行与列进行随机次数的交换
cells=lineTolie(cells);
}
int count=0;
for(int k=0;k<12;k++){//对数独数组行进行随机次数的交换
count=new Random().nextInt(9);
cells=changeLine(cells,count);
}
int countH2=new Random().nextInt(10);
for(int k=0;k<countH2;k++){//对数独数组行与列进行第二次随机次数的交换
cells=lineTolie(cells);
}
return cells;
}
public int [][] changeLine(int[][] cells,int m){//对数组进行行与行交换
int n=m;
int [] temp=new int[9];
n=((m+3)>=9)?(m+3-9):m+3;
for(int j=0;j<9;j++){
temp[j]=cells[m][j];
cells[m][j]=cells[n][j];
cells[n][j]=temp[j];
}
return cells;
}
public int[][] lineTolie(int[][] cells){//对数组进行行与列交换
int temp=0;
for(int j=0;j<9;j++){
for(int k=j+1;k<9;k++){
temp=cells[k][j];
cells[k][j]=cells[j][k];
cells[j][k]=temp;
}
}
return cells;
}
}[/code]2、运行类[code=java]import java.awt.Color;
import java.awt.Font;
import java.awt.GridLayout;
import java.awt.TextField;
import java.awt.event.TextEvent;
import java.awt.event.TextListener;
import java.util.Random;
import javax.swing.JFrame;
import javax.swing.JPanel;
import shudu.DoShudu;
public class Sudoku extends JFrame {
final private TextField[][] txtGame;
public static void main(String[] args) {
Sudoku shudu = new Sudoku();
}
public Sudoku() {//对JFrame进行布局初始以及监听设置
txtGame = new TextField[9][9];//建立81个TextField对象
DoShudu shudu = new DoShudu();
int[][] cells = shudu.getShudu();//获取数独数组
final JPanel jpl = new JPanel();//建立JPanel对象
final int spaceNum = 50;//spaceNum表示需要设置空白TextField的数量
jpl.setLayout(new GridLayout(9, 9));//JPanel布局
final int[][] cellAn = new int[9][9];//数独数组的答案
System.arraycopy(cells, 0, cellAn, 0, cells.length);//答案从建立的数独数组中Copy
for (int i = 0; i < 9; i++) {//把答案从Console打印出来
for (int j = 0; j < 9; j++) {
System.out.print(cellAn[j]);
}
System.out.println();
} //打印结束
this.setDefaultCloseOperation(this.EXIT_ON_CLOSE);
this.setSize(600, 600);
this.setResizable(false);
this.setTitle("黑马-李德国-数独游戏");
for (int i = 0; i < 9; i++) {
for (int j = 0; j < 9; j++) {
txtGame[j] = new TextField();
//设置TextField背景颜色
if ((i < 3 && j < 3) || (i < 6 && i >= 3 && j >= 3 && j < 6)
|| (i < 9 && i >= 6 && j >= 6 && j < 9)) {
txtGame[j].setBackground(Color.ORANGE);
}
if ((i < 6 && i >= 3 && j < 3) || (i < 3 && j >= 6 && j < 9)
|| (i < 9 && i >= 6 && j >= 3 && j < 6)) {
txtGame[j].setBackground(Color.GREEN);
}
if ((i < 9 && i >= 6 && j < 3) || (i < 3 && j >= 3 && j < 6)
|| (i < 6 && i >= 3 && j < 9 && j >= 6)) {
txtGame[j].setBackground(Color.PINK);
}
txtGame[j].setFont(new Font("Dialog", Font.CENTER_BASELINE,
60));// 设置字体大小
txtGame[j].setText(Integer.toString(cells[j]));
txtGame[j].setEnabled(false);
txtGame[j].setVisible(true);
jpl.add(txtGame[j]);
jpl.setVisible(true);
}
}
final int[][] tempArray = new int[spaceNum][2];
for (int i = 0; i < spaceNum; i++) {//依据需要空白的TextField数量,随机对TextField设置为空
final int ranD1 = new Random().nextInt(9);
final int ranD2 = new Random().nextInt(9);
tempArray[0] = ranD1;
tempArray[1] = ranD2;
txtGame[ranD1][ranD2].setText("");
txtGame[ranD1][ranD2].setBackground(Color.WHITE);
txtGame[ranD1][ranD2].addTextListener(new TextListener() {//对空白的TextField添加监听,数值发生变化后进行答案对比,如果全部答对在Console打印“good”
@Override
public void textValueChanged(TextEvent e) {
TextField tmp = (TextField) e.getSource();
int count = 0;
for (int u = 0; u < spaceNum; u++) {
if ((txtGame[tempArray[0]][tempArray[1]]
.getText())
.equals(Integer
.toString(cellAn[tempArray[0]][tempArray[1]]))) {
count++;
}
}
if (count == spaceNum) {
System.out.println("good");
}
}
});
txtGame[ranD1][ranD2].setEnabled(true);
}
this.add(jpl);
this.setVisible(true);
}
}[/code] |
|