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

Člen

Zobrazeno 42 zpráv z 42.
//= Settings::TRACKING_CODE_B ?> //= Settings::TRACKING_CODE ?>
V předchozím kvízu, Online test znalostí Java, jsme si ověřili nabyté zkušenosti z kurzu.
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.
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);
}
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
}
}
}
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?
nevím, jestli to jde i jinak, ale o tomhle způsobu, který sem použil, vím.
Pořád nevím, jak ho chceš posouvat a proč vlastně?
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
}
}
}
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
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.
To mam zadaný už v té třídě Key, tak proč bych to měl zadávat znova?
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.