萍聚社区-德国热线-德国实用信息网

 找回密码
 注册

微信登录

微信扫一扫,快速登录

萍聚头条

查看: 3455|回复: 30

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

[复制链接]
发表于 2006-6-20 23:13 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有账号?注册 微信登录

x
我是新手,请高手帮忙解答一下,先谢谢拉.
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 编辑 ]
Die von den Nutzern eingestellten Information und Meinungen sind nicht eigene Informationen und Meinungen der DOLC GmbH.
发表于 2006-6-21 16:42 | 显示全部楼层
Main 严格的来讲是不属于类的。只是定义了一个程序开始(和结束)的地方。你完全可以在main里面写一些同类毫无关系的代码。
同样。你在main中也不能直接调用类的非static的属性和方法。也就是说,你根本不能在main中调用类对象的函数--除非你在main中新建了一个类的实例。

konstruktor是属于类的。在类对象被构造的时候自动执行。用于初始化变量什么的。konstruktor并不一定要存在。也可以用一些其它类似的方法初始化变量。
Die von den Nutzern eingestellten Information und Meinungen sind nicht eigene Informationen und Meinungen der DOLC GmbH.
发表于 2006-6-21 23: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());
    }
}
Die von den Nutzern eingestellten Information und Meinungen sind nicht eigene Informationen und Meinungen der DOLC GmbH.
发表于 2006-6-22 15:48 | 显示全部楼层
l类可以理解为是对象的种类!楼主的理解有些偏颇,basset 说得很好,不过如果楼主现在学的是基础编程可以暂时如此理解,但是如果学的是数据结构等其他课程,最好还是好好弄清楚中间的区别!
Die von den Nutzern eingestellten Information und Meinungen sind nicht eigene Informationen und Meinungen der DOLC GmbH.
 楼主| 发表于 2006-6-23 00:11 | 显示全部楼层
哦,看了各位的解释,清楚一点了.谢谢各位.
各位都说了,"在main中也不能直接调用类的非static的属性和方法",但不是所有的变量和方法都要定义为static才能运用的吧?比如我在main里要运用到一系列的方法,但都没有定义static阿.那么这个static到底是什么意思呢?(不是问这个词是什么意思)
明天课上要给上个星期的例题答案,这个题对我有点复杂,等我研究一下,周末再来问问,希望高手支持.
Die von den Nutzern eingestellten Information und Meinungen sind nicht eigene Informationen und Meinungen der DOLC GmbH.
发表于 2006-6-23 01:22 | 显示全部楼层
看了楼上几位的回答,俺实在受不了,想说两句。

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

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

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

[ 本帖最后由 大厨 于 2006-6-23 01:33 编辑 ]
Die von den Nutzern eingestellten Information und Meinungen sind nicht eigene Informationen und Meinungen der DOLC GmbH.
 楼主| 发表于 2006-6-26 00:16 | 显示全部楼层
呵呵,看到有些不同的意见了,不知道哪个更正确一点?
今天好不容易有点时间,来分析分析星期五留下来的作业.弄了半天还是差点儿.我想这里有不少人都是java精通的了,像我这样学java,前不着村,后不着店儿的,才知道点皮毛,自然无法像各位一样从oop整体上来解决问题.还是我走到哪,碰到了些什么问题,就来向各位请教的好.

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



一共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[9][9];
 Panel[] p = new Panel[9];
后边在一个methode里用循环语句让81个button显示出来的语句就运行不了:
 add(feld[x][y]);
是应该这样写的嘛???

[ 本帖最后由 abendrobotor 于 2006-6-26 00:44 编辑 ]
Die von den Nutzern eingestellten Information und Meinungen sind nicht eigene Informationen und Meinungen der DOLC GmbH.
发表于 2006-6-26 08:42 | 显示全部楼层
这个要看你自己觉得怎么样合适了,一般而言,如图的排列,当然是整个作为一个panel,使用gridlayout比较好,但是这样的话,为了显示出9个小方块的区别,又要做一番显示上的代码处理。但是如果为了显示的方便使用9个小panel(也要使用gridlayout),那么就有两种按钮分配方式,一是每个panel分配数组中的一行/列,这样检查小方块比较方便,而为了检查每行每列必须满足不能重复的条件,为了不丧失使用数组的优势,就势必要有一点代码来将这81个按钮打破数组顺序分配给9个panel了。

所以觉得这样做,倒不如简单一些,声明一个81项的一维数组。这样在进行行列检查时也比较方便,行检查时对数组内一个范围检查,列检查时是对数组内以9为间隔的元素的检查。而在往小panel中添加时,也可以分别通过数组索引除9的整数和余数来确定行和列。
Die von den Nutzern eingestellten Information und Meinungen sind nicht eigene Informationen und Meinungen der DOLC GmbH.
发表于 2006-6-26 08:47 | 显示全部楼层
这里只考虑排列,不考虑以后的校验和菜单、事件的响应。

  1. import javax.swing.*;
  2. import javax.swing.border.LineBorder;
  3. import java.awt.*;
  4. import java.awt.event.ActionEvent;

  5. public class Soduku extends JFrame {
  6.     /**
  7.      * create jframe
  8.      */
  9.     public Soduku(String title) {
  10.         super(title);

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

  12.         int row, col, rrow, ccol;
  13.         for (int i = 0; i < 81; i++) {
  14.             row = i / 9;
  15.             col = i % 9;
  16.             rrow = row / 3;
  17.             ccol = col / 3;

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

  19.             buttons[i] = new JButton();
  20.             buttons[i].setText("" + i);
  21.             if (smallpanel[rrow][ccol] == null) {
  22.                 smallpanel[rrow][ccol] = new JPanel(new GridLayout(3, 3));
  23.                 smallpanel[rrow][ccol].setBorder(new LineBorder(Color.BLUE, 2));
  24.                 largepanel.add(smallpanel[rrow][ccol]);
  25.             }
  26.             smallpanel[rrow][ccol].add((buttons[i]));

  27.         }
  28.         this.getRootPane().setLayout(new BorderLayout());
  29.         this.getRootPane().add(largepanel, BorderLayout.CENTER);
  30.         statuspanel = new JPanel(new BorderLayout());
  31.         status = new JLabel("");
  32.         exitbutton = new JButton(new AbstractAction("Exit") {
  33.             public void actionPerformed(ActionEvent e) {
  34.                 System.exit(0);
  35.             }
  36.         });
  37.         statuspanel.add(status, BorderLayout.CENTER);
  38.         statuspanel.add(exitbutton, BorderLayout.EAST);
  39.         this.getRootPane().add(statuspanel, BorderLayout.SOUTH);
  40.         this.pack();

  41.     }

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

  49.     JButton [] buttons = new JButton[81];
  50.     JPanel largepanel = null;
  51.     JPanel statuspanel = null;
  52.     JLabel status = null;
  53.     JPanel [][] smallpanel = new JPanel[3][3];
  54.     //JButton checkbutton = null;
  55.     JButton exitbutton = null;
  56. }

复制代码
Die von den Nutzern eingestellten Information und Meinungen sind nicht eigene Informationen und Meinungen der DOLC GmbH.
 楼主| 发表于 2006-6-26 17: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不用,估计以后不好交作业啊.
Die von den Nutzern eingestellten Information und Meinungen sind nicht eigene Informationen und Meinungen der DOLC GmbH.
您需要登录后才可以回帖 登录 | 注册 微信登录

本版积分规则

手机版|Archiver|AGB|Impressum|Datenschutzerklärung|萍聚社区-德国热线-德国实用信息网 |网站地图

GMT+2, 2024-5-17 18:48 , Processed in 0.270758 second(s), 20 queries , MemCached On.

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表