黑马程序员技术交流社区

标题: 数独游戏设计初步成型,马友帮忙斧正 [打印本页]

作者: 李德国    时间: 2011-7-25 14:53
标题: 数独游戏设计初步成型,马友帮忙斧正
数独游戏经过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]
作者: 匿名    时间: 2011-7-25 19:04
标题: 回复 楼主 的帖子
写的还不错!
给2点建议:
1.控制需要填入的数字的位数   最好改为1位。
2.给个提示别人是否答对,游戏最好人性化点。
作者: 匿名    时间: 2011-8-17 16:47
二楼牛人,这么乱的代码竟然看得进去。。。。




欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2