nazdar.....mohli by ste mi prosim vas pomoct s metodou update() v triede ConsoleUI??ma to vypisovat hracie pole.....dakujem
alebo z coho cerpat aspon ??
Quote from: jv1460 on 04.03.2013, 16:38:50
nazdar.....mohli by ste mi prosim vas pomoct s metodou update() v triede ConsoleUI??ma to vypisovat hracie pole.....dakujem
ahoj, a comu tam nerozumies ? skusal si uz nejako zacat ?
myslienka metody update je v tom ze si proste prebehnes cele herne pole v dvoch for-och, a pre kazdu bunku sa pytas ci je open,marked alebo closed. a podla toho vykreslis to herne pole. herne pole neni nic ine len textove riadky pod sebou....
vedel som co ma update() robit len som to nevedel zapisat predtym......teraz uz len potrebujem dostat sa k metode getValue() z triedy Clue
public void update() {
int row, column;
System.out.println(" 0 1 2 3 4 5 6 7 8");
for (row=0; row < field.getRowCount(); row++) {
switch(row){
case 0:System.out.print("A ");break;
case 1:System.out.print("B ");break;
case 2:System.out.print("C ");break;
case 3:System.out.print("D ");break;
case 4:System.out.print("E ");break;
case 5:System.out.print("F ");break;
case 6:System.out.print("G ");break;
case 7:System.out.print("H ");break;
case 8:System.out.print("I ");break;
}
for (column=0; column < field.getColumnCount() ; column++) {
System.out.print(" ");
Tile t = field.getTile(row, column);
if (t.getState() == Tile.State.MARKED) {
System.out.print("M");
}
if(t.getState() == Tile.State.OPEN){
if (t instanceof Mine){
System.out.print("X");
}
if (t instanceof Clue){
int c = field.getClues(); //getClues je getter v triede Filed ktory vracia pocet min naokolo lebo neviem pouzit metodu getValue z triedy Clue
System.out.print(+c);
}
}
if(t.getState() == Tile.State.CLOSED){
System.out.print("-");
}
}
System.out.println();
}
}
Quoteif (t instanceof Clue){
int c = field.getClues(); //getClues je getter v triede Filed ktory vracia pocet min naokolo lebo neviem pouzit metodu getValue z triedy Clue
System.out.print(+c);
}
t treba pretypovať na
Clue a potom zavolať
getValue(). Teda čosi takéto:
Quote((Clue) t).getValue();
Sanka dole.....tak dlho som to skusal a ked vidim ako to malo byt tak mi je do placu ze som to nespravil sam.....dakujem pekne
v navode pišu že odporučaju na vykreslenie použiť printf ....kde sa viem niečo o printf dočitať ? ..nepoužil som to ešte nikdy a nerozumiem ako vie printf krajšie vykresliť ten zaklad hracieho pola čiže čisla od 1 po n a tak isto abecedu od A po XYZ....určite niečo take existuje ale moje klucove slova do google su vadne :(
Krajšie vykreslenie hracieho poľa = že keď náhodou máš viac ako 10 stĺpcov, tak ti hracie pole rozhodí, lebo symboly '-', 'X', 'M', '?' sú len jednoznakové, ale označenie stĺpca bude už dvojznakové. Teda symboly už nebudú pekne zarovno s číselným označením stĺpca.
V návode narážajú konkrétne na takéto použitie printf-u:
QuoteSystem.out.printf("%2c ", '?');
sak ked das do googlu system.out.printf tak hned ti vyhodi das 4 odkazy na stackoverflow kde to mas popisane jak to funguje
jojo, Stackoverflow je zázračný web :)
Potreboval by som pomoct s metodou openAdjecentMines......robil som to podla countAdjecentMines
Neviem kde by mohla byt chyba
private void openAdjacentMines(int row,int column){
for (int rowOffset = -1; rowOffset <= 1; rowOffset++) {
int actRow = row + rowOffset;
if (actRow >= 0 && actRow < getRowCount()) {
for (int columnOffset = -1; columnOffset <= 1; columnOffset++) {
int actColumn = column + columnOffset;
if (actColumn >= 0 && actColumn < getColumnCount()) {
tiles[row][column].setState(Tile.State.OPEN);
}
}
}
}
}
A čo ti na tom konkrétne nefunguje? Spadne to alebo to robí hlúposti??
if (actColumn >= 0 && actColumn < getColumnCount()) {
tiles[row][column].setState(Tile.State.OPEN);
}
Snažíš sa otvárať stále tú istú (už otvorenú) dlaždicu, ktorej susedov kontroluješ... Pointou metódy je otvoriť práve tých susedov :D
BTW: Nemalo by sa to volať openAdjacentTiles? ;D
Ved ked sa v najvnutornejsom cykle metody countAdjecentMines ikrementuje premenna tak sa pocitaju okolite miny tak ked namiesto toho nastavim state na Open mali by sa otvarat okolite tiles ne??to mi neni velmi jasne
a hej ma sa to volat openAdjecentTiles
Quote from: jv1460 on 29.03.2013, 21:44:36
Ved ked sa v najvnutornejsom cykle metody countAdjecentMines ikrementuje premenna tak sa pocitaju okolite miny tak ked namiesto toho nastavim state na Open mali by sa otvarat okolite tiles ne??to mi neni velmi jasne
a hej ma sa to volat openAdjecentTiles
nebude problem nahodou
tiles[row][column].setState(Tile.State.OPEN);
bo nikde v cykle tieto hodnoty nemenis a idu zo vstupu, ostatne hodnoty sa ti pomenia ale toto [row] a [column] je furt to iste, nechces to mat nahodou takto ?
tiles[actRow][actColumn].setState(Tile.State.OPEN);
Quote from: jv1460 on 29.03.2013, 21:44:36
Ved ked sa v najvnutornejsom cykle metody countAdjecentMines ikrementuje premenna tak sa pocitaju okolite miny tak ked namiesto toho nastavim state na Open mali by sa otvarat okolite tiles ne??to mi neni velmi jasne
a hej ma sa to volat openAdjecentTiles
Nastavenie Open je v poriadku, ale pozri sa, pre ktoré políčko to nastavuješ. Vždy pre jedno a to isté (na ktoré si klikol). A ty chceš otvoriť okolité prázdne políčka.
Ako je spomenuté vyššie, má byť:
tiles[actRow][actColumn].setState(Tile.State.OPEN);
row, column - "súradnice" dlaždice, ktorú si otvoril (na ktorú si klikol)
actRow, actColumn - "súradnice" okolitých dlaždíc (menia sa v cykle)
Uz som to spravil......dakujem pekne
nazdar.....co by mohlo chybat v tejto metode??pole je vykreslene ale dlazdice nie su clickable
@Override
public void mousePressed(MouseEvent e) {
if(field.getState() == GameState.PLAYING){
TileComponent b = (TileComponent)e.getSource();
if(SwingUtilities.isLeftMouseButton(e)){
field.openTile(b.getRow(),b.getColumn());
}
if(SwingUtilities.isRightMouseButton(e)){
TileComponent t = (TileComponent)e.getSource();
field.markTile(t.getRow(), t.getColumn());
}
}
if(field.getState() == GameState.FAILED){
JOptionPane.showMessageDialog(rootPane, menuBar, "Konec", 200);
}
if(field.getState() == GameState.SOLVED){
JOptionPane.showMessageDialog(rootPane, menuBar, "Top seller v hre", 200);
BestTimes b = new BestTimes();
int m = Minesweeper.getInstance().getPlayingSeconds();
b.addPlayerTime(System.getProperty("user.name"),m);
}
}
Mám pocit, že po kliknutí na políčko by si mal volať metódu update() alebo také niečo.
ide to .....dakujem pekne
mam taku otazku mam to principom rovnako ako tu hore ...ale nevyskoci mi ziadna message.....naschval ked kliknem na minu cize failed malo by mi vypisat nejaku spravu nie ?..
JOptionPane.showMessageDialog(rootPane, menuBar, "YOU FAILED!!", WIDTH);
no ma zajima ze co znamena ten prvy a druhy parameter ? ..lebo to mi tam ponukol netbeans defaultne ..a neviem ci to mam alebo nemam menit ?..
take otazky sa riesia referencnou priruckou - java ma celkom slusnu na webe:
http://docs.oracle.com/javase/7/docs/api/javax/swing/JOptionPane.html (http://docs.oracle.com/javase/7/docs/api/javax/swing/JOptionPane.html)
o nic nesom mudrejsi aj tak :(.... ale asi budem mat chybu lebo ked nahodou prejdem hru alebo fail ..tak v ntbnse mam chyb na rozdavanie ....
Quote from: Dickenz on 22.04.2013, 15:47:52
o nic nesom mudrejsi aj tak :(.... ale asi budem mat chybu lebo ked nahodou prejdem hru alebo fail ..tak v ntbnse mam chyb na rozdavanie ....
Dokumentáciu sa dočítaš aj v NetBeanse a tam je to (IMHO) dosť jasne napísané (každý jeden parameter je tam rozpísaný).
Netreba používať všetko, čo ti NB nanúti ;) Stačí toto:
JOptionPane.showMessageDialog(rootPane, "Message");
Quote from: Dickenz on 22.04.2013, 04:22:47
mam taku otazku mam to principom rovnako ako tu hore ...ale nevyskoci mi ziadna message.....naschval ked kliknem na minu cize failed malo by mi vypisat nejaku spravu nie ?..
JOptionPane.showMessageDialog(rootPane, menuBar, "YOU FAILED!!", WIDTH);
no ma zajima ze co znamena ten prvy a druhy parameter ? ..lebo to mi tam ponukol netbeans defaultne ..a neviem ci to mam alebo nemam menit ?..
neviem sice jaky to ma konstruktor, ale dost som si isty ze namiesto 'WIDTH' tam by malo byt nejake cislo alebo rozmer dajaky
jj to mi doslo ze tam dam nejaky int ....ale nešlo to aj tak ...cez to co napisal veteran to funguje ...
robim zle tu metodu actionPerformed ? nullpointer exepction
ActionListener listener = new ActionListener() {
public void actionPerformed(ActionEvent evt) {
if (field.getState() == GameState.PLAYING){
setTimeLabelText();
}
}
};
nieco taketo nieje v jave povolene ?? ..alebo preco mi to proste nechce brat ?? .
if(SwingUtilities.isLeftMouseButton(e) && SwingUtilities.isRightMouseButton(e)
to chces dat akoze podmienku, ze ked je stlacene aj lave aj prave tlacitko mysi sucasne?
ano presne ....a este jeden problem mam ked klikam na bestTimes v menu hry ...kazdym kliknutim mi zduplikuje tabulku ..ked si to pozriem 15x tak mam 15x rovnaky cas pisany ...neviem preco ..kde mam hladat zadrhel pls ??
čo keby si aj pastol kód? :) bez kódu ťažko
@Override
public void mousePressed(MouseEvent e) {
TileComponent xx = (TileComponent) e.getSource();
if (field.getState() == GameState.PLAYING) {
if (SwingUtilities.isLeftMouseButton(e)) {
//TODO
}
if (SwingUtilities.isRightMouseButton(e)) {
//TODO
}
if (SwingUtilities.isLeftMouseButton(e) && SwingUtilities.isRightMouseButton(e)) {
//TODO but NOT WORK!!!!
}
}
update();
}
a druhy problem s besttimes
//konstruktor
public BestTimesDialog(java.awt.Frame parent, boolean modal) {
super(parent, modal);
initComponents();
jTextArea1.setText(Minesweeper.getInstance().getBestTimes().toString());
setLocationRelativeTo(this);
}
private void bestTimesMenuItemActionPerformed(java.awt.event.ActionEvent evt) {
new BestTimesDialog(this, true).setVisible(true);
}