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