Vydělávej až 160.000 Kč měsíčně! Akreditované rekvalifikační kurzy s garancí práce od 0 Kč. Více informací.
Hledáme nové posily do ITnetwork týmu. Podívej se na volné pozice a přidej se do nejagilnější firmy na trhu - Více informací.
Avatar
plnydumpsu
Člen
Avatar
plnydumpsu:8.1.2014 18:51

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
Tvůrce
Avatar
Petr Nymsa:8.1.2014 19:23

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:8.1.2014 19:24

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
Avatar
plnydumpsu
Člen
Avatar
Odpovídá na Michal Žůrek - misaz
plnydumpsu:8.1.2014 19:29

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:8.1.2014 19:31

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
Odpovídá na plnydumpsu
Michal Žůrek - misaz:8.1.2014 19:34

A zastavíš si ten časovač?

 
Nahoru Odpovědět
8.1.2014 19:34
Avatar
plnydumpsu
Člen
Avatar
Odpovídá na Alesseon
plnydumpsu:8.1.2014 19:42

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:8.1.2014 19:58

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:8.1.2014 20:49

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.