Diskuze: sudoku solver
V předchozím kvízu, Online test znalostí Java, jsme si ověřili nabyté zkušenosti z kurzu.


Tomhaus:3.9.2014 18:42
Aby jste to správně pochopili, tohle je jen začátek. Rámeček slouží k
tomu, aby bylo vidět kam se zadává číslo, které slouží jako vstupní
údaj k řešení sudoku. 
Ondřej Štorc:3.9.2014 21:59
Neuškodilo by sem napsat co ti to píše za chybu..
btw. jestli ti dělá problém takhle jednoduchý vykreslování tak nevim jak
chceš vytvořit celý sudoku...
zkus takto:
private Border b =  new Border(xCoor, yCoor, 44);
private ArrayList<Border> borders = borders = new ArrayList<>(); //zkus toto nevytvářet v konstruktoru, ale ještě nad tím, kde máš proměnné (v třídě Screen)
//následně v metodě paint:
for(Border border : borders) {
    border.draw(g);
}
					Ladislav Ondris:4.9.2014 13:17
pardon..oprava:
private ArrayList<Border> borders = new ArrayList<>();
					Potřeboval bych pomoct s posunováním toho rámečku, buď tam mam něco špatně nebo mi tam chybí kus kódu, já nevim. Prosim o radu.
package solver.graphics;
import java.awt.Color;
import java.awt.Dimension;
import java.awt.Graphics;
import java.awt.event.KeyEvent;
import java.awt.event.KeyListener;
import java.util.ArrayList;
import javax.swing.JPanel;
public class Screen extends JPanel{
        private static final long serialVersionUID = 1L;
        private static final int WIDTH = 371, HEIGHT = 500;
        private int xCoor = 3, yCoor = 3;
        private boolean right = false, left = false, up = false, down = false;
        private Border b = new Border(xCoor, yCoor, 44);
        private ArrayList<Border> borders = new ArrayList<>();
        private Key key;
        public Screen(){
                setFocusable(true);
                key = new Key();
                addKeyListener(key);
                setPreferredSize(new Dimension(WIDTH, HEIGHT));
                borders.add(b);
                move();
        }
        public void move(){
                if(right)xCoor += 40;
                if(left)xCoor -= 40;
                if(up)yCoor -= 40;
                if(down)yCoor += 40;
        }
        public void paint(Graphics g){
        g.clearRect(0, 0, WIDTH, HEIGHT);
        g.setColor(Color.BLACK);
                // svislé čáry
        g.drawLine(4, 4, 4, 366); // levé zesílení, doplnění horního a dolního levého rohového pixelu
        g.drawLine(5, 5, 5, 365);
        g.drawLine(6, 5, 6, 365); // pravé zesílení
        g.drawLine(45, 5, 45, 365);
        g.drawLine(85, 5, 85, 365);
        g.drawLine(124, 5, 124, 365); // levé zesílení
        g.drawLine(125, 5, 125, 365);
        g.drawLine(126, 5, 126, 365); // pravé zesílení
        g.drawLine(165, 5, 165, 365);
        g.drawLine(205, 5, 205, 365);
        g.drawLine(244, 5, 244, 365); // levé zesílení
        g.drawLine(245, 5, 245, 365);
        g.drawLine(246, 5, 246, 365); // pravé zesílení
        g.drawLine(285, 5, 285, 365);
        g.drawLine(325, 5, 325, 365);
        g.drawLine(364, 5, 364, 365); // levé zesílení
        g.drawLine(365, 5, 365, 365);
        g.drawLine(366, 4, 366, 366); // pravé zesílení, doplnění horního a dolního pravého rohového pixelu
                // vodorovné čáry
        g.drawLine(5, 4, 365, 4); // horní zesílení
        g.drawLine(5, 5, 365, 5);
        g.drawLine(5, 6, 365, 6); // dolní zesílení
        g.drawLine(5, 45, 365, 45);
        g.drawLine(5, 85, 365, 85);
        g.drawLine(5, 124, 365, 124); // horní zesílení
        g.drawLine(5, 125, 365, 125);
        g.drawLine(5, 126, 365, 126); // dolní zesílení
        g.drawLine(5, 165, 365, 165);
        g.drawLine(5, 205, 365, 205);
        g.drawLine(5, 244, 365, 244); // horní zesílení
        g.drawLine(5, 245, 365, 245);
        g.drawLine(5, 246, 365, 246); // dolní zesílení
        g.drawLine(5, 285, 365, 285);
        g.drawLine(5, 325, 365, 325);
        g.drawLine(5, 364, 365, 364); // horní zesílení
        g.drawLine(5, 365, 365, 365);
        g.drawLine(5, 366, 365, 366); // dolní zesílení
        for(Border border : borders){
                border.draw(g);
                }
        }
        private class Key implements KeyListener {
                public void keyPressed(KeyEvent e) {
                        int key = e.getKeyCode();
                        if(key == KeyEvent.VK_RIGHT && !left){
                                up = false;
                                down = false;
                                right = true;
                        }
                        if(key == KeyEvent.VK_LEFT && !right){
                                up = false;
                                down = false;
                                left = true;
                        }
                        if(key == KeyEvent.VK_UP && !down){
                                right = false;
                                left = false;
                                up = true;
                        }
                        if(key == KeyEvent.VK_DOWN && !up){
                                right = false;
                                left = false;
                                down = true;
                        }
                }
                @Override
                public void keyReleased(KeyEvent e) {
                        // TODO Auto-generated method stub
                }
                @Override
                public void keyTyped(KeyEvent e) {
                        // TODO Auto-generated method stub
                }
        }
}
					Jan Vargovský:6.9.2014 21:33
Třída ve třídě nevadí, občas se to používá pro pomocné třídy jako je tahle (říká se jim nested). Btw, proč nevykresuješ v cyklu podle % z výšky/šířky?
Tomhaus:6.9.2014 21:47
nevím, jestli to jde i jinak, ale o tomhle způsobu, který sem použil, vím.
Ladislav Ondris:7.9.2014 20:14
Pořád nevím, jak ho chceš posouvat a proč vlastně?
Ladislav Ondris:7.9.2014 22:32
Nevidím ten algoritmus..
Tak tam musíš mít nějakou podmínku asi špatně, když ti to pak nejde
po změně. Zkus si to sám prohlídnout a hlavně nespolíhat na nás, že ti
poradíme. Vím z vlastní zkušenosti... vždycky jsem akorát čekal na
odpověď a sám jsem tu chybu ani pořádně nehledal. Takže si to zkus projet
očima jen nebo si tam System.out.println(..); nebo přes debug, abys zjistil,
kde je chyba 
Teď mam problém ukončit cykl. Když dam šipku do prava, tak se v systémovim oknu začne vypysovat true, jenomže se vypisuje nekonečnokrát a já chci aby se vypsalo jen jednou. Jak to mam udělat?
package solver.graphics;
import java.awt.Color;
import java.awt.Dimension;
import java.awt.Graphics;
import java.awt.event.KeyEvent;
import java.awt.event.KeyListener;
import java.util.ArrayList;
import javax.swing.JPanel;
public class Screen extends JPanel implements Runnable {
        private static final long serialVersionUID = 1L;
        private static final int WIDTH = 371, HEIGHT = 500;
        private Thread thread;
        private boolean running = false;
        private int xCoor = 3, yCoor = 3;
        private boolean right = false, left = false, up = false, down = false;
        private Border b = new Border(xCoor, yCoor, 44);
        private ArrayList<Border> borders = new ArrayList<>();
        private int ticks;
        private Key key;
        public Screen(){
                setFocusable(true);
                key = new Key();
                addKeyListener(key);
                setPreferredSize(new Dimension(WIDTH, HEIGHT));
                borders.add(b);
                start();
        }
        public void tick(){
                ticks++;
                if(ticks > 250000){
                        if(right)System.out.println(right);
                        if(left)xCoor -= 40;
                        if(up)yCoor -= 40;
                        if(down)yCoor += 40;
                }
        }
        public void paint(Graphics g){
        g.clearRect(0, 0, WIDTH, HEIGHT);
                // svislé čáry ŠEDÉ
        g.setColor(Color.GRAY);
        g.drawLine(45, 5, 45, 365);
        g.drawLine(85, 5, 85, 365);
        g.drawLine(165, 5, 165, 365);
        g.drawLine(205, 5, 205, 365);
        g.drawLine(285, 5, 285, 365);
        g.drawLine(325, 5, 325, 365);
                // vodorovné čáry ŠEDÉ
        g.drawLine(5, 45, 365, 45);
        g.drawLine(5, 85, 365, 85);
        g.drawLine(5, 165, 365, 165);
        g.drawLine(5, 205, 365, 205);
        g.drawLine(5, 285, 365, 285);
        g.drawLine(5, 325, 365, 325);
                // svislé čáry ČERNÉ
        g.setColor(Color.BLACK);
        g.drawLine(4, 4, 4, 366); // levé zesílení, doplnění horního a dolního levého rohového pixelu
        g.drawLine(5, 5, 5, 365);
        g.drawLine(6, 5, 6, 365); // pravé zesílení
        g.drawLine(124, 5, 124, 365); // levé zesílení
        g.drawLine(125, 5, 125, 365);
        g.drawLine(126, 5, 126, 365); // pravé zesílení
        g.drawLine(244, 5, 244, 365); // levé zesílení
        g.drawLine(245, 5, 245, 365);
        g.drawLine(246, 5, 246, 365); // pravé zesílení
        g.drawLine(364, 5, 364, 365); // levé zesílení
        g.drawLine(365, 5, 365, 365);
        g.drawLine(366, 4, 366, 366); // pravé zesílení, doplnění horního a dolního pravého rohového pixelu
        g.drawLine(3, 5, 3, 365); // pravé  menší zesílení
        g.drawLine(367, 5, 367, 365); // levé menší zesílení
                // vodorovné čáry ČERNÉ
        g.drawLine(5, 4, 365, 4); // horní zesílení
        g.drawLine(5, 5, 365, 5);
        g.drawLine(5, 6, 365, 6); // dolní zesílení
        g.drawLine(5, 124, 365, 124); // horní zesílení
        g.drawLine(5, 125, 365, 125);
        g.drawLine(5, 126, 365, 126); // dolní zesílení
        g.drawLine(5, 244, 365, 244); // horní zesílení
        g.drawLine(5, 245, 365, 245);
        g.drawLine(5, 246, 365, 246); // dolní zesílení
        g.drawLine(5, 364, 365, 364); // horní zesílení
        g.drawLine(5, 365, 365, 365);
        g.drawLine(5, 366, 365, 366); // dolní zesílení
        g.drawLine(5, 3, 365, 3); // horní menší zesílení
        g.drawLine(5, 367, 365, 367); // dolní menší zesílení
        for(Border border : borders){
                border.draw(g);
                }
        }
        public void start(){
                running = true;
                thread = new Thread(this, "Game Loop");
                thread.start();
        }
        public void stop(){
                running = false;
                try {
                        thread.join();
                } catch (InterruptedException e){
                        e.printStackTrace();
                }
        }
        public void run() {
                while(running){
                        tick();
                        repaint();
                }
        }
        private class Key implements KeyListener {
                public void keyPressed(KeyEvent e) {
                        int key = e.getKeyCode();
                        if(key == KeyEvent.VK_RIGHT && !left){
                                up = false;
                                down = false;
                                right = true;
                        }
                        if(key == KeyEvent.VK_LEFT && !right){
                                up = false;
                                down = false;
                                left = true;
                        }
                        if(key == KeyEvent.VK_UP && !down){
                                right = false;
                                left = false;
                                up = true;
                        }
                        if(key == KeyEvent.VK_DOWN && !up){
                                right = false;
                                left = false;
                                down = true;
                        }
                }
                @Override
                public void keyReleased(KeyEvent e) {
                        // TODO Auto-generated method stub
                }
                @Override
                public void keyTyped(KeyEvent e) {
                        // TODO Auto-generated method stub
                }
        }
}
					Tomhaus:8.9.2014 22:08
njn, to sem nějak nepořešil, já sem to přidával postupně a ono se to
začalo kupit 
 aledíky za
radu, jdu to zkusit
tomisoka:8.9.2014 23:36
Tak už chápu jak ses k tomu dostal. Ale to byl input už předpřipravený
pro hada... Raději se zamysli jak to funguje.
Jinak teď koukám, ten můj způsob není asi zrovna ideální, raději
použij
if( key == KeyEvent.VK_RIGHT )right=true;
a ještě si musíš hlídat v " keyReleased" jestli jsi tu klávesu už nepustil.
Tomhaus:9.9.2014 16:57
To mam zadaný už v té třídě Key, tak proč bych to měl zadávat znova?
Tomhaus:9.9.2014 22:03
Takže jak mam zformulovat private, addKeyListener a class s implementací KeyListeneru?
Jak to, že se k xCoor, při stisku šipky do prava, nepřičte 40?
private class Key implements KeyListener {
                public void keyPressed(KeyEvent e) {
                        int key = e.getKeyCode();
                        if(key == KeyEvent.VK_RIGHT){
                                xCoor += 40;
                        }
                        if(key == KeyEvent.VK_LEFT){
                                xCoor -= 40;
                        }
                        if(key == KeyEvent.VK_UP){
                                yCoor -= 40;
                        }
                        if(key == KeyEvent.VK_DOWN){
                                yCoor += 40;
                        }
                }
                @Override
                public void keyReleased(KeyEvent e) {
                        right = false;
                        left = false;
                        up = false;
                        down = false;
                }
                @Override
                public void keyTyped(KeyEvent e) {
                        // TODO Auto-generated method stub
                }
        }
					Zobrazeno 42 zpráv z 42.
				

 Poradí někdo prosim?