在java上制作数独游戏

在java上制作数独游戏,java,sudoku,Java,Sudoku,我是一个新的程序员。在用java自学了一些程序之后,现在我对用这种语言制作数独感兴趣。有人能告诉我如何控制9x9网格,并在每次程序运行时将数字随机化吗?提前谢谢。我刚刚写了一段代码,自己只接受整数的输入。代码如下: import javax.swing.UIManager.LookAndFeelInfo; import java.awt.*; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; impo

我是一个新的程序员。在用java自学了一些程序之后,现在我对用这种语言制作数独感兴趣。有人能告诉我如何控制9x9网格,并在每次程序运行时将数字随机化吗?提前谢谢。我刚刚写了一段代码,自己只接受整数的输入。代码如下:

import javax.swing.UIManager.LookAndFeelInfo;
import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.KeyAdapter;
import java.awt.event.KeyEvent;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
import java.awt.event.MouseWheelEvent;
import java.awt.event.MouseWheelListener;
import javax.swing.border.Border;
import javax.swing.*;

    public class GUI_project extends JFrame {

    private JMenuBar menuBar;
    private JTextField textfield1;
    String k;


public GUI_project(){

    this.setTitle("GUI_project");
    this.setSize(500,400);
    this.setJMenuBar(menuBar);


    JPanel contentPane = new JPanel(null);
    contentPane.setPreferredSize(new Dimension(500,400));
    contentPane.setBackground(new Color(192,192,192));

    textfield1 = new JTextField();
    textfield1.setBounds(105,109,148,108);
    textfield1.setBackground(new Color(255,255,255));
    textfield1.setForeground(new Color(0,0,0));
    textfield1.setEnabled(true);
    textfield1.setFont(new Font("sansserif",0,12));
    textfield1.setText("");
    textfield1.setVisible(true);


    textfield1.addActionListener(new ActionListener() {
            public void actionPerformed(ActionEvent evt) {
                chkdl();
            }
        });
    textfield1.addKeyListener(new KeyAdapter() {
            public void keyPressed(KeyEvent evt){
                chkdl();
            }

            public void keyTyped(KeyEvent evt){
                chkdl();
            }

            public void keyReleased(KeyEvent evt){
                chkdl();
            }
        });


    contentPane.add(textfield1);


    this.add(contentPane);
    this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    this.setLocationRelativeTo(null);
    this.pack();
    this.setVisible(true);
}


private void chkdl () {
    //TODO
    String f = textfield1.getText();


        try{
            int g = Integer.parseInt(f);
            if(g>0 && g<10){
                textfield1.setText(Integer.toString(g));
                k=Integer.toString(g);
                textfield1.setEditable(true);
            }
            else{
                textfield1.setText(k);
                textfield1.setEditable(true);
            }
        }
        catch(NumberFormatException ex){
            if(f.equals("")){
                textfield1.setText("");
                k="";
            }
            else{
            textfield1.setText(k);
            textfield1.setEditable(true);}
        }
}

public static void main(String[] args){
    System.setProperty("swing.defaultlaf", "com.sun.java.swing.plaf.nimbus.NimbusLookAndFeel");
    javax.swing.SwingUtilities.invokeLater(new Runnable() {
            public void run() {
                new GUI_project();
            }
        });
}
}

谢谢你的支持。我已经进步了这么多

    import java.util.*;
    class rnd{
    public static void main(String [] args){
    int [][] game = new int[10][10];
    for(int o = 0;o<9;o++){
        for(int o2 = 0;o2<9;o2++){
            game[o][o2]=0;
        }
    }
    int a = 0;
    Random r = new Random();
    int row = 1;
    int clm = 1;
    int cnt = 0;
    int chk=0;
    int fill = 0;
    while(row<9){
        while(clm<9){
            fill = r.nextInt(9)+1;
            chk = 0;
            if(clm==1 || clm==4 || clm==7){
                for(int cnc = clm;cnc!=(clm+2);cnc++){
                     chk=retchk(row,game,cnc,fill);
                }
            }
            else if(clm==2 || clm==5 || clm==8){
                for(int cnc = (clm-1);cnc!=(clm+1);cnc++){
                     chk=retchk(row,game,cnc,fill);
                }
            }
            else if(clm==3||clm==6||clm==9){
                for(int cnc = (clm-2);cnc!=clm;cnc++){
                    chk=retchk(row,game,cnc,fill);}
            }
            for(int rw = 0;rw!=9;rw++){
                if(game[row][rw]==fill){
                    chk=1;
                    cnt++;
                    break;
                }
            }
            if(chk==0){
                for(int c = 0;c!=9;c++){
                    if(game[c][clm]==fill){
                        chk=1;
                        cnt++;
                        break;
                    }
                }
                if(chk==0){
                    int qa = 0;
                    try{
                        qa = (game[row][clm]=fill);}
                    catch(ArrayIndexOutOfBoundsException ml){
                        System.out.print("\n"+row+"\n"+clm);
                    }
                    System.out.print(qa+" ");
                    clm++;
                }
                if(clm==9){
                    clm=0;
                    System.out.print("          Row "+(row)+" filled up\n");
                    row++;
                  }
              }
           }
        }
    }

 public static int retchk(int row,int [][] game,int cnc,int fill){
    int chk = 0;
    if(row==1 || row==4 || row==7){
        for(int cnr = row;cnr!=(row+2);cnr++){
            if(game[cnr][cnc]==fill){
                chk=1;
                break;
            }
        }
    }
    else if(row==2 || row==5 || row==8){
        for(int cnr = (row-1);cnr!=(row+1);cnr++){
            if(game[cnr][cnc]==fill){
                chk=1;
                break;
            }
        }
    }
    else if(row==3 || row==6 || row==9){
        for(int cnr = (row-2);cnr!=row;cnr++){
            if(game[cnr][cnc]==fill){
                chk=1;
                break;
            }
        }
    }
    return chk;
}
}


但有两个问题。首先,正如您所看到的,数组总是提供一个我必须捕获的arrarindexoutofboundsexception。而我尝试使用的算法,工作不正常。第三,3x3网格的代码不起作用。有什么想法吗?

我将从设计一个SudokuGrid类开始。您应该使用二维整数数组作为备份存储。以下是我将如何构建它:

public class SudokuGrid {

    // private instance variables
    private int[] grid;

    // constructor initializes sudoku grid with random values
    public SudokuGrid() {
        // TODO - I'll let you complete this method
    }

    // add value to the grid; throws an exception if an invalid value is added
    public void addValue(int value, int x, int y) {
        // TODO - I'll let you complete this method
    }

}

可以使用此类来表示网格。让数组中的0表示空白正方形。我首先将其创建为一个控制台程序,然后在数独逻辑正常工作后,您可以使用swing进行实验。如果您需要任何其他澄清或解释,请留下评论。

真正的问题是您是想从3x3子网格还是一个9x9网格构建网格。这将决定您的数据结构。两者都有各自的用例,因为3x3子网格将使在框中检查输入数字的有效性更容易,但在9x9网格中检查行和行的唯一性更容易一些。我认为9x9方法稍微容易一些

不管是哪种情况,您都需要一个二维数组

public class Grid
{
     private int[][] grid;

     public Grid()
     {
         grid = new int[9][9];
     }

     public int[][] getGrid()
     {
          return grid;
     }

     ...
 }
您应该使用我在这里描述的数独生成:

增编:

要创建从1到9的随机数,请使用以下方法:

Random random = new Random();
int randomNumber = random.nextInt(9)+1; //generates from 0 to 8, adds +1
编辑:

要随机化数组的内容,请执行以下操作:

int[] array = new int[9];
for(int i = 0; i < array.length; i++)
{
    array[i] = i+1; //result is array {1,2,3,4,5,6,7,8,9};
}
for(int i = 0; i < array.length; i++)
{
    int random_i_index = random.nextInt(array.length);
    int random_j_index = random.nextInt(array.length);

    //swapping
    int temp = array[random_i_index];
    array[random_i_index] = array[random_j_index];
    array[random_j_index] = temp;
}
//result is array with numbers from 1 to 9 in randomized order

老实说,我相信你应该先做一个控制台项目,因为Swing只会给你的学习工作增加不必要的复杂性,因为你所要求的基本上只是简单的2D int数组管理,并使用Random类,如Random Random=new Random;随机。nexting9+1;。至于将网格随机化,请查看我的回答:但在控制台中,是否可以将数字放入游戏中的任何空网格中?当然,您需要键入要选择的行和列索引,以及要放置在其中的数字。这是可行的,显然他需要的是基本的Java和编程,而不是乱动Swing。我能随机分配一个int数组吗?在你的情况下,我不会这样做,因为你需要你的数独是有效的。用随机数填充一个数组只需forint i=0;i<9;i++{array[i]=random.nexting9+1;}但正如我所说的那样,这不会产生有效的数独,为此,我链接的移位方法要好得多。与之相比,我将数独随机化的方法是随机交换用于生成数字的初始9长度数组中的元素。通过移位方法,我指的是我上面链接的方法。但似乎您的示例将有一个数独,其中只有数组的初始化方式。是吗?嗯,是的,它遵循一个特定的模式,但我真的不认为人们会注意到它背后的规则,考虑到你正在从中删除数字。初始数组顺序是随机化的,因此它不仅仅是1到9。