Check alle échte Black Friday-deals Ook zo moe van nepaanbiedingen? Wij laten alleen échte deals zien

[JAVA] Eerste programma geschreven, commentaar gevraagd

Pagina: 1
Acties:
  • 361 views

  • Famous Copra
  • Registratie: April 2010
  • Laatst online: 22:55
Ik ben net begonnen met java, mij leek het een leuke uitdaging om een programma te schrijven wat sudoku's oplost.

Nu heb ik uiteindelijk een programma geschreven wat sudoku's van 4x4 op kan lossen, de code is alleen erg lang en moet voor een groot gedeelte automatisch kunnen.
Zouden jullie mij commentaar kunnen geven op de code? Wat goed is, wat beter kan en wat absoluut fout is.

Hebben jullie anders nog leuke tutorials o.i.d. Alles is welkom!

Ik werk met eclipse als dat nog handige informatie is

Java:
1
*snip*

[ Voor 82% gewijzigd door Creepy op 11-07-2013 15:13 ]


  • Caelorum
  • Registratie: April 2005
  • Laatst online: 22:25
Zo op het oog zonde ral te diep er naar te kijken:
Ik zie echt heel veel duplicate code die je kan weg abstraheren. Kijk eens goed naar je code en vind alle (lange) stukken die dubbel zijn. Dat zijn prima kandidaten voor een methode. Bijv. alle if(n== <iets>): Wat check je daar precies? Maak een methode aan met een naam die dat aan de lezer verteld.
Daarna staan er in je for loops wat getallen die wellicht beter als constante kunnen worden gedefinieerd. Bijv.
code:
1
for (int n = 1; n <= 4; n++)

Wat is die 4 daar? Het hoogste getal dat kan worden ingevuld? Zet dat er dan neer :) en die 1?
en dan:
code:
1
for (int r = 0; r <= 3; r++) {

Die 3 is de breedte van de sudoku? Of is het de hoogte?

[ Voor 10% gewijzigd door Caelorum op 11-07-2013 15:09 ]


  • Daos
  • Registratie: Oktober 2004
  • Niet online
Ik heb ook ooit een sudoku-oplosser gemaakt (en als je ze kan oplossen, kan je ze ook genereren: Google Play: Sudoku variants)

Ik heb allemaal oplos-regeltjes bedacht die door de oplosser om beurten toegepast worden. Voor elk moeilijkheidsniveau zijn er extra regels. De volgende regels gebruik ik voor makkelijke puzzels (vraag me niet meer hoe het werkt):
Java:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
private static abstract class Rule {
    public abstract Set<Step> steps(Row row, Field field);
}

private static class GetSinglesRule extends Rule {
    enum HowManySeen {none, one, multiple};

    public Set<Step> steps(Row row, Field field) {
        Set<Step> res = new HashSet<Step>();
        
        Set<Integer> pos = new Cell().getPossibilities();

        // remove solved elsewhere from possibilities
        Set<Integer> set = new TreeSet<Integer>(pos);
        set.removeAll(row.getSolved());

        for (Integer value: set) {
            HowManySeen hms = HowManySeen.none;
            int location = 0;
            for (int i = 0; i < row.getSize(); i++) {
                if (row.getCell(i).isSolved())
                    continue;
                
                if (hms == HowManySeen.multiple)
                    break;

                boolean possible = row.getCell(i).isPossible(value);

                switch(hms) {
                case none:
                    if (possible) {
                        hms = HowManySeen.one;
                        location = i;
                    }
                    break;
                case one:
                    if (possible) {
                        hms = HowManySeen.multiple;
                    }
                    break;
                case multiple:
                    break;
                }
            }
            
            if (hms == HowManySeen.one) {
                Step step = new Step(location, new Cell(value));
                res.add(step);
            }
        }
        return res;
        
    }
}

private static class RemoveSolvedRule extends Rule {
    
    public Set<Step> steps(Row row, Field field) {
        HashSet<Step> res = new HashSet<Step>();
        for (int i = 0; i < row.getSize(); i++) {
            if (row.getCell(i).isSolved())
                continue;

            Set<Integer> pos = row.getCell(i).getPossibilities();

            // remove solved elsewhere from possibilities
            Set<Integer> set = new TreeSet<Integer>(pos);
            set.removeAll(row.getSolved());

            if (set.size() != pos.size()) {
                Step step = new Step(i, new Cell(set));
                res.add(step);
            }
        }
        
        //row.print(true);
        //System.out.println(res);
        
        return res;
    }   
}

  • Creepy
  • Registratie: Juni 2001
  • Laatst online: 22:23

Creepy

Tactical Espionage Splatterer

Net zoals dat we niet aan sitechecks doen, doen we hier ook niet aan het beoordelen van willekeurige stukken code. Ondanks dat Caelorum dit wel doet is dat niet de bedoeling op het forum. Als je een daadwerkelijk probleem hebt of aan iets concreets twijfelt en daar commentaar op wilt is dat natuurlijk prima. Maar dan zul je wel aan moeten geven waar je aan twijfelt en waarom. Alleen je code dumpen en vragen om commentaar is niet de bedoeling.

"I had a problem, I solved it with regular expressions. Now I have two problems". That's shows a lack of appreciation for regular expressions: "I know have _star_ problems" --Kevlin Henney


Dit topic is gesloten.