abendrobotor 发表于 2006-6-20 22:13

JAVA的SUDOKU问题,求各位高手帮忙指点(见最后一层)

我是新手,请高手帮忙解答一下,先谢谢拉.
java我们不要求学那么深,但是基础性的编程都应该掌握.但是到现在,越学越晕了.一般一个最简化的java程序,一共包括三部分:
1,konstruktor,
可以先定一些数值,做初始化的工作.
2,static void main methode,
整个程序的主要环节,也是程序运行的流程.
3,还有methode.
具体执行程序所用的不同方法.
问题是: 我做的好多例题,都不太一样,有的直接在konstruktor里设置量,有的却在main methode里才做,konstruktor是空的.到底什么东西是一定在konstruktor里先设定的呢?konstruktor和main methode都有哪些具体区别和具体功用呢?

[ 本帖最后由 abendrobotor 于 2006-7-6 07:58 编辑 ]

basset 发表于 2006-6-21 15:42

Main 严格的来讲是不属于类的。只是定义了一个程序开始(和结束)的地方。你完全可以在main里面写一些同类毫无关系的代码。
同样。你在main中也不能直接调用类的非static的属性和方法。也就是说,你根本不能在main中调用类对象的函数--除非你在main中新建了一个类的实例。

konstruktor是属于类的。在类对象被构造的时候自动执行。用于初始化变量什么的。konstruktor并不一定要存在。也可以用一些其它类似的方法初始化变量。

西门吹泡 发表于 2006-6-21 22:40

楼上的解释的正确,我再补充一下^_^:
Java是对象编程,每一个类都可以看作是一个对象。如果你想用这个对象,或者是给对对象(类)里的变量
负值,你可以在konstruktor里边进行,也可以通过类里的方法负值。
static void main methode只能操作static的方法或者变量。
举个例子:
public class Bla{
   
    private static int a;
    private int b;

    public Bla() {
    }

    public Bla(int b) {
      this.b=b;
    }

    public void setB(int b) {
      this.b=b;
    }
   
    public int getB() {
      return this.b;
    }
   public static void main(String args[]) {
         a=10;
         Bla bla = new Bla(20);
      //Bla bla = new Bla();
      //bla.setB(20);
      System.out.println("a: "+a + ", b: " + bla.getB());
    }
}

认真学 发表于 2006-6-22 14:48

l类可以理解为是对象的种类!楼主的理解有些偏颇,basset 说得很好,不过如果楼主现在学的是基础编程可以暂时如此理解,但是如果学的是数据结构等其他课程,最好还是好好弄清楚中间的区别!

abendrobotor 发表于 2006-6-22 23:11

哦,看了各位的解释,清楚一点了.谢谢各位.
各位都说了,"在main中也不能直接调用类的非static的属性和方法",但不是所有的变量和方法都要定义为static才能运用的吧?比如我在main里要运用到一系列的方法,但都没有定义static阿.那么这个static到底是什么意思呢?(不是问这个词是什么意思)
明天课上要给上个星期的例题答案,这个题对我有点复杂,等我研究一下,周末再来问问,希望高手支持.

大厨 发表于 2006-6-23 00:22

看了楼上几位的回答,俺实在受不了,想说两句。

1。对象是对象,类是类,对象是类的一个实例。

2。konstruktor不是可有可无的,每个类都有!如果你没有显示的为类定义一个konstruktor,那么java会自动创建一个默认的无参konsturktor.

3。为什么只有static的变量和方法才能被直接调用?因为static数据与对象无关!static在类创建的时候就已经产生了自己的数据空间,而一般的数据空间只有在类产生对象的时候才有!这就是之间的区别。

[ 本帖最后由 大厨 于 2006-6-23 01:33 编辑 ]

abendrobotor 发表于 2006-6-25 23:16

呵呵,看到有些不同的意见了,不知道哪个更正确一点?
今天好不容易有点时间,来分析分析星期五留下来的作业.弄了半天还是差点儿.我想这里有不少人都是java精通的了,像我这样学java,前不着村,后不着店儿的,才知道点皮毛,自然无法像各位一样从oop整体上来解决问题.还是我走到哪,碰到了些什么问题,就来向各位请教的好.

aufgabe是做个sudoku的简单游戏,如果各位不知道大概是个什么,有图.

http://www.wiley-vch.de/dummies/sudoku/images/74.jpg

一共81个方格,9个为一组(panel),每组方格有1-9的数字,不能重复,程序初始,每个panel里给出若干个从1到9数字.整个frame里的81个方格,纵向,横向任何一条,都像单个panel一样,只允许从1-9不能重复的九个数字.这个游戏的任务就是逻辑的推算出刨除每个panel初始时给的几个数的其他所有数字.

这个游戏要求本学期结束前完成,教授每个星期带着大家大概说一点,所以具体的主要工作还要自己独立完成.到下节课前,应该把这个程序大结构完成,虽然没有deklaration的演算,
1,但是frame,81个button,9个panel都应该显示出来,
2,包括颜色,button的format等等.
möglich3,如何公式化这81个button,使之成组,为以后的schleife打基础.

我编了这个结构,但是运行不了,看不出解决问题的方法.希望高手指点一二:
问题一:
制作button我当然用array喽:button[9][9],这样也好管理,可是语法总觉得不对.
konstruktor里我先写:
 Button[][] feld = new Button;
 Panel[] p = new Panel;
后边在一个methode里用循环语句让81个button显示出来的语句就运行不了:
 add(feld);
是应该这样写的嘛???

[ 本帖最后由 abendrobotor 于 2006-6-26 00:44 编辑 ]

greenflute 发表于 2006-6-26 07:42

这个要看你自己觉得怎么样合适了,一般而言,如图的排列,当然是整个作为一个panel,使用gridlayout比较好,但是这样的话,为了显示出9个小方块的区别,又要做一番显示上的代码处理。但是如果为了显示的方便使用9个小panel(也要使用gridlayout),那么就有两种按钮分配方式,一是每个panel分配数组中的一行/列,这样检查小方块比较方便,而为了检查每行每列必须满足不能重复的条件,为了不丧失使用数组的优势,就势必要有一点代码来将这81个按钮打破数组顺序分配给9个panel了。

所以觉得这样做,倒不如简单一些,声明一个81项的一维数组。这样在进行行列检查时也比较方便,行检查时对数组内一个范围检查,列检查时是对数组内以9为间隔的元素的检查。而在往小panel中添加时,也可以分别通过数组索引除9的整数和余数来确定行和列。

greenflute 发表于 2006-6-26 07:47

这里只考虑排列,不考虑以后的校验和菜单、事件的响应。

import javax.swing.*;
import javax.swing.border.LineBorder;
import java.awt.*;
import java.awt.event.ActionEvent;

public class Soduku extends JFrame {
    /**
   * create jframe
   */
    public Soduku(String title) {
      super(title);

      largepanel = new JPanel(new GridLayout(3, 3));

      int row, col, rrow, ccol;
      for (int i = 0; i < 81; i++) {
            row = i / 9;
            col = i % 9;
            rrow = row / 3;
            ccol = col / 3;

            System.out.println(row + "\t" + col + "\t" + rrow + "\t" + ccol);

            buttons = new JButton();
            buttons.setText("" + i);
            if (smallpanel == null) {
                smallpanel = new JPanel(new GridLayout(3, 3));
                smallpanel.setBorder(new LineBorder(Color.BLUE, 2));
                largepanel.add(smallpanel);
            }
            smallpanel.add((buttons));

      }
      this.getRootPane().setLayout(new BorderLayout());
      this.getRootPane().add(largepanel, BorderLayout.CENTER);
      statuspanel = new JPanel(new BorderLayout());
      status = new JLabel("");
      exitbutton = new JButton(new AbstractAction("Exit") {
            public void actionPerformed(ActionEvent e) {
                System.exit(0);
            }
      });
      statuspanel.add(status, BorderLayout.CENTER);
      statuspanel.add(exitbutton, BorderLayout.EAST);
      this.getRootPane().add(statuspanel, BorderLayout.SOUTH);
      this.pack();

    }

    public static void main(String [] args) {
      Soduku app = new Soduku("Soduku");
      Point center = GraphicsEnvironment.getLocalGraphicsEnvironment().getCenterPoint();
      app.setLocation((int) (center.getX() - app.getWidth() / 2), (int) (center.getY() - app.getHeight() / 2));
      app.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
      app.setVisible(true);
    }

    JButton [] buttons = new JButton;
    JPanel largepanel = null;
    JPanel statuspanel = null;
    JLabel status = null;
    JPanel [][] smallpanel = new JPanel;
    //JButton checkbutton = null;
    JButton exitbutton = null;
}

abendrobotor 发表于 2006-6-26 16:45

原帖由 greenflute 于 2006-6-26 08:47 发表
这里只考虑排列,不考虑以后的校验和菜单、事件的响应。

import javax.swing.*;
import javax.swing.border.LineBorder;
import java.awt.*;
import java.awt.event.ActionEvent;

public class Soduku e ...

大哥,一看你就是高手,信手拈来就写了这么多,佩服!!
import javax.swing.*;
import javax.swing.border.LineBorder;
可是这几类我都还没有学,你程序里写的好多命令我都不知道做什么用的,看来你这宰牛刀用在我这鸭子身上了.你的构思我大概看懂了,但是现在只是这个程序的第一步,以后一定要考虑到校验问题的,所以不为以后打基础,以后改起来更麻烦.
用array[][],这是教授给的tipp,双层array本身就简化了校验,纵向和横向的检查直接就在array里就可以完成了,剩下的就集中在9个小panel里每个小panel里的九个数字的检查了.教授给的tipps不用,估计以后不好交作业啊.
页: [1] 2 3 4
查看完整版本: JAVA的SUDOKU问题,求各位高手帮忙指点(见最后一层)