Avatar
plnydumpsu
Člen
Avatar
plnydumpsu:

Dobrý večer, podle návodu jsem vytvořila hru Had2D (funguje jako tradiční hra Snake). V levém horním rohu se mi správně zobrazuje dosažené skóre, nyní bych však potřebovala po ukončení hry (které nastane buď nárazem hada do zdi nebo nárazem hada do sebe samého) zapisovat dosažené skóre do souboru. Bohužel se mi nedaří přijít na to, kam do programu příkaz pro otevření souboru a zápis do něj umístit. Kdykoliv jsem se o umístění pokusila, probíhal zápis ve smyčce, a proto se mi vše vypisovalo vícekrát až do vypnutí celého programu. Nenašel by se zde prosím někdo, kdo by mi mohl poradit? Stačilo by mi, kdyby někdo napsal, kam umístit např. System.out.prin­tln(proměnnaSeS­kore), aby se mi maximální dosažené skóre vypsalo alespoň na výstup, se samotným zápisem do souboru si již poradím. Níže přikládám svůj kód. Moc děkuji

Had2D.java

package had2d;

import javax.swing.JFrame;
import java.awt.*;
import java.awt.even­t.KeyEvent;
import java.awt.even­t.KeyListener;
import java.util.log­ging.Level;
import java.util.log­ging.Logger;

/**
*
* @author fidelio
*/
public class Had2D extends JFrame implements KeyListener, Runnable{
private final Bod bod = new Bod(3, this);
private boolean up, down, left, right;
private final Jidlo jidlo = new Jidlo(this);

public Had2D(String title){
super(title);
this.setFocusa­ble(true);
this.addKeyLis­tener(this);
jidlo.createLo­cation();

}
public void paint(Graphics g){
super.paint(g);

//Kreslení
g.drawImage(To­olkit.getDefau­ltToolkit().ge­tImage("Images/po­zadi.png"), 0, 0, this);

//Body, vykreslí bod(y), délku hada určuje první parametr
bod.paint(g);
//Malování jídla
jidlo.paint(g);

//Konec hry
if(bod.getGame­Over()){
g.setFont(new Font("Arial", Font.BOLD, 50));
g.drawString("Game Over", 100, 200);

}
//Sychronizuje komunikaci s HW (...linux)
Toolkit.getDe­faultToolkit()­.sync();
}

/**
* @param args the command line argumen
*/
public static void main(String[] args) {
Had2D had = new Had2D("Had2D");
had.setSize(500,500);
new Thread(had).star­t();
had.setDefaultClo­seOperation(JFra­me.EXIT_ON_CLO­SE);
had.setVisible(tru­e);
//had.setUnde­corated(true);
had.setLocati­on(100, 100);
}

@Override
public void keyTyped(KeyEvent e) {
}

@Override
public void keyPressed(KeyEvent e) {
if(e.getKeyCo­de()==KeyEven­t.VK_LEFT && !right){
left = true;
up = false;
down = false;
right = false;
} else if(e.getKeyCo­de()==KeyEven­t.VK_UP && !down){
up = true;
right = false;
left = false;
down = false;

} else if(e.getKeyCo­de()==KeyEven­t.VK_RIGHT && !left){
right = true;
up = false;
left = false;
down = false;
} else if(e.getKeyCo­de()==KeyEven­t.VK_DOWN && !up){
down = true;
up = false;
left = false;
right = false;
}
}

@Override
public void keyReleased(Ke­yEvent e) {
}

@Override
public void run() {
while (true){
if(!bod.getGa­meOver())
if (up){
bod.move("up");
} else if (down){
bod.move("down");
} else if (left){
bod.move("left");
} else if (right){
bod.move("right");
}
bod.snezJidlo(ji­dlo);
bod.narazilDoZdi();

repaint();

try {
Thread.sleep(150);
} catch (InterruptedEx­ception ex) {
Logger.getLog­ger(Had2D.clas­s.getName()).log(Le­vel.SEVERE, null, ex);
}
}
}

}

Bod. java

package had2d;

import java.awt.Color;
import java.awt.Component;
import java.awt.Graphics;
import java.awt.Toolkit;

/**
*
* @author fidelio
*/
public class Bod {

private int body;
private final int[] bodyX = new int[2500];
private final int[] bodyY = new int[2500];

private final Component comp;

private boolean gameOver;

public int points;

public Bod(int body, Component comp){
this.body = body;
this.comp = comp;
for (int i = 0; i < body; i++){
bodyX[i] = 100 - i*10;
bodyY[i] = 100;
}

}

public void move(String position){
for(int i = body; i > 0; i--){
bodyX[i] = bodyX[(i - 1)];
bodyY[i] = bodyY[(i - 1)];
}
switch (position) {
case "left":
bodyX[0] -= 10;
break;
case "right":
bodyX[0] += 10;
break;
case "down":
bodyY[0] += 10;
break;
case "up":
bodyY[0] -= 10;
break;
}
}

public void snezJidlo(Jidlo jidlo){
if(bodyX[0] == jidlo.getX() && bodyY[0] == jidlo.getY()){
jidlo.createLo­cation();
body++;
points++;

}
}

public void narazilDoZdi(){
if(bodyX[0] <= 0){
gameOver = true;

} else if (bodyX[0] >= 500 -10){
gameOver = true;

}
if(bodyY[0] <= 0){
gameOver = true;

} else if (bodyY[0] >= 500 -10){
gameOver = true;

}
for (int i = 1; i < body; i++){
if(bodyX[0] == bodyX[i] && bodyY[0] == bodyY[i]){
gameOver = true;

}
}

}
public boolean getGameOver(){
return gameOver;
}

public void paint(Graphics g){
for (int i = 0; i < body; i++){
g.drawImage(To­olkit.getDefau­ltToolkit().ge­tImage("Images/te­lo.png"), bodyX[i], bodyY[i],comp);
drawPoints(g);
}

}
public void drawPoints(Graphics g){
g.setColor(Co­lor.BLACK);
g.drawString("po­ints:" + points, 40, 60);
}
}

Jidlo.java

package had2d;

import java.awt.Component;
import java.awt.Graphics;
import java.awt.Toolkit;

/**
*
* @author fidelio
*/
public class Jidlo {

private final Component comp;
private int x,y;
public Jidlo(Component comp){
this.comp = comp;
}
public void createLocation(){
x = 10 * (int) (Math.random()*50);
y = 10 * (int) (Math.random()*50);
}

public int getX() {
return x;
}

public int getY() {
return y;
}

public void paint(Graphics g){
g.drawImage(To­olkit.getDefau­ltToolkit().ge­tImage("Images/te­lo.png"), x, y, comp);
}
}

 
Odpovědět 8.1.2014 18:51
Avatar
Petr Nymsa
Redaktor
Avatar
Petr Nymsa:

Pošli nám kód znova, pro přehlednost předchozí komentáře smažu :)

Nahoru Odpovědět 8.1.2014 19:23
Pokrok nezastavíš, neusni a jdi s ním vpřed
Avatar
Michal Žůrek (misaz):

Jednoduše tam kde zjistíš prohru (nezapomeň i na výhru) to uložíš. Ukládání je popsáno v tutoriálu http://www.itnetwork.cz/java/soubory

Nahoru Odpovědět 8.1.2014 19:24
Nesnáším {}, proto se jim vyhýbám.
Avatar
plnydumpsu
Člen
Avatar
Odpovídá na Michal Žůrek (misaz)
plnydumpsu:

Nešlo by to prosím upřesnit v mém kódu. Já jsem to právě zkoušela přidat na místo, kde zjišťuji prohru, bohužel se to potom stále vypisovalo ve smyčce dokola, takže se mi skóre vypisovalo neustále, dokud jsem program nezastavila (nezavřela křížkem či ve vývojovém prostředí).

 
Nahoru Odpovědět 8.1.2014 19:29
Avatar
Alesseon
Člen
Avatar
Alesseon:

Edituj ho pokud ti to ještě jde a vlož ho do tagů code, je tady v tom editoru hned vedle panáčka ikonka. :)
Sice Javu neznám, ale napadá mě přidat při akci ukončení což jak jsi popsala bylo naražení do zdi/kousnutí sebe sama to aby jsi tam zapsala to skóre a potom funkci ukončila, nevím jestli tam máš nějakou hlavní smyčku ale potom bych jí nastavil něco jako break, aby se hned při tom ukončila a pokračovalo se s dalším kódem za cyklem, což by bylo vypsání ukončovacího textu, nebo tak..
Snad je nápad srozumitelný... Kód jsem nepročítal 1. je v téhle podobě těžko čitelný 2. Javu neumím, a asi bych to moc nepochytil..

Nahoru Odpovědět 8.1.2014 19:31
This is a bad day to be human...
Avatar
Nahoru Odpovědět 8.1.2014 19:34
Nesnáším {}, proto se jim vyhýbám.
Avatar
plnydumpsu
Člen
Avatar
Odpovídá na Alesseon
plnydumpsu:

Editovat mi nejde, vkládám znovu, snad to ještě víc nezkazím:
Had2D.java

package had2d;

import javax.swing.JFrame;
import java.awt.*;
import java.awt.event.KeyEvent;
import java.awt.event.KeyListener;
import java.util.logging.Level;
import java.util.logging.Logger;

/**
 *
 * @author fidelio
 */
public class Had2D extends JFrame implements KeyListener, Runnable{
    private final Bod bod = new Bod(3, this);
    private boolean up, down, left, right;
    private final Jidlo jidlo = new Jidlo(this);


    public Had2D(String title){
        super(title);
        this.setFocusable(true);
        this.addKeyListener(this);
        jidlo.createLocation();

    }
    public void paint(Graphics g){
        super.paint(g);

        //Kreslení
        g.drawImage(Toolkit.getDefaultToolkit().getImage("Images/pozadi.png"), 0, 0, this);

        //Body, vykreslí bod(y), délku hada určuje první parametr
        bod.paint(g);
        //Malování jídla
        jidlo.paint(g);



        //Konec hry
        if(bod.getGameOver()){
            g.setFont(new Font("Arial", Font.BOLD, 50));
            g.drawString("Game Over", 100, 200);


        }
        //Sychronizuje komunikaci s HW (...linux)
        Toolkit.getDefaultToolkit().sync();
    }

    /**
     * @param args the command line argumen
     */
    public static void main(String[] args) {
        Had2D had = new Had2D("Had2D");
        had.setSize(500,500);
        new Thread(had).start();
        had.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        had.setVisible(true);
        //had.setUndecorated(true);
        had.setLocation(100, 100);
    }

    @Override
    public void keyTyped(KeyEvent e) {
    }

    @Override
    public void keyPressed(KeyEvent e) {
        if(e.getKeyCode()==KeyEvent.VK_LEFT && !right){
            left = true;
            up = false;
            down = false;
            right = false;
        } else if(e.getKeyCode()==KeyEvent.VK_UP && !down){
            up = true;
            right = false;
            left = false;
            down = false;

        } else if(e.getKeyCode()==KeyEvent.VK_RIGHT && !left){
            right = true;
            up = false;
            left = false;
            down = false;
        } else if(e.getKeyCode()==KeyEvent.VK_DOWN && !up){
            down = true;
            up = false;
            left = false;
            right = false;
        }
    }

    @Override
    public void keyReleased(KeyEvent e) {
    }

    @Override
    public void run() {
        while (true){
            if(!bod.getGameOver())
            if (up){
                bod.move("up");
            } else if (down){
                bod.move("down");
            } else if (left){
                bod.move("left");
            } else if (right){
                bod.move("right");
            }
            bod.snezJidlo(jidlo);
            bod.narazilDoZdi();

            repaint();

            try {
                Thread.sleep(150);
            } catch (InterruptedException ex) {
                Logger.getLogger(Had2D.class.getName()).log(Level.SEVERE, null, ex);
            }
        }
    }

}

Bod.java

package had2d;

import java.awt.Color;
import java.awt.Component;
import java.awt.Graphics;
import java.awt.Toolkit;


/**
 *
 * @author fidelio
 */
public class Bod {

    private int body;
    private final int[] bodyX = new int[2500];
    private final int[] bodyY = new int[2500];

    private final Component comp;

    private boolean gameOver;

    public int points;


    public Bod(int body, Component comp){
        this.body = body;
        this.comp = comp;
               for (int i = 0; i < body; i++){
                    bodyX[i] = 100 - i*10;
                    bodyY[i] = 100;
              }

    }

    public void move(String position){
        for(int i = body; i > 0; i--){
            bodyX[i] = bodyX[(i - 1)];
            bodyY[i] = bodyY[(i - 1)];
        }
        switch (position) {
            case "left":
                bodyX[0] -= 10;
                break;
            case "right":
                bodyX[0] += 10;
                break;
            case "down":
                bodyY[0] += 10;
                break;
            case "up":
                bodyY[0] -= 10;
                break;
        }
    }

    public void snezJidlo(Jidlo jidlo){
        if(bodyX[0] == jidlo.getX() && bodyY[0] == jidlo.getY()){
            jidlo.createLocation();
            body++;
            points++;

        }
    }

    public void narazilDoZdi(){
        if(bodyX[0] <= 0){
            gameOver = true;


        } else if (bodyX[0] >= 500 -10){
            gameOver = true;

        }
        if(bodyY[0] <= 0){
            gameOver = true;

        } else if (bodyY[0] >= 500 -10){
            gameOver = true;

        }
        for (int i = 1; i < body; i++){
            if(bodyX[0] == bodyX[i] && bodyY[0] == bodyY[i]){
                gameOver = true;

            }
        }

    }


    public boolean getGameOver(){
        return gameOver;
    }

    public void paint(Graphics g){
        for (int i = 0; i < body; i++){
            g.drawImage(Toolkit.getDefaultToolkit().getImage("Images/telo.png"), bodyX[i], bodyY[i],comp);
            drawPoints(g);
        }

    }
    public void drawPoints(Graphics g){
        g.setColor(Color.BLACK);
        g.drawString("points:" + points, 40, 60);
    }
}

Jidlo.java

package had2d;

import java.awt.Component;
import java.awt.Graphics;
import java.awt.Toolkit;

/**
 *
 * @author fidelio
 */
public class Jidlo {

    private final Component comp;
    private int x,y;
    public Jidlo(Component comp){
        this.comp = comp;
    }
    public void createLocation(){
        x = 10 * (int) (Math.random()*50);
        y = 10 * (int) (Math.random()*50);
    }

    public int getX() {
        return x;
    }

    public int getY() {
        return y;
    }

    public void paint(Graphics g){
        g.drawImage(Toolkit.getDefaultToolkit().getImage("Images/telo.png"), x, y, comp);
    }
}
 
Nahoru Odpovědět 8.1.2014 19:42
Avatar
plnydumpsu
Člen
Avatar
Odpovídá na Petr Nymsa
plnydumpsu:

Kód jsem vložila níže pod příspěvky, příště již budu poučenější, omlouvám se za zmatky. Děkuji

 
Nahoru Odpovědět 8.1.2014 19:58
Avatar
plnydumpsu
Člen
Avatar
plnydumpsu:

Děkuji všem lidem, kteří se mi snažili pomoci, především uživatelům Misaz a Alesseon. V metodě run() mi po prvním if chyběly složené závorky. Netbeans mě toto normálně ihned hlásí a mě začátečnici vůbec nenapadlo, že by mě na to prostředí neupozornilo. Je to pro mě trochu záhada. Teď vše funguje jak má. Ještě jednou děkuji

 
Nahoru Odpovědět 8.1.2014 20:49
Děláme co je v našich silách, aby byly zdejší diskuze co nejkvalitnější. Proto do nich také mohou přispívat pouze registrovaní členové. Pro zapojení do diskuze se přihlas. Pokud ještě nemáš účet, zaregistruj se, je to zdarma.

Zobrazeno 9 zpráv z 9.