Irrelevant Skrevet 25. november 2012 Del Skrevet 25. november 2012 (endret) Driver og lager ett Snake-spill, men sitter fast når jeg prøver å få slangehodet til å bevege seg automatisk bortover med jevne mellomrom, uten at jeg må konstant trykke eller holde inne piltastene. Problemet er at selv når jeg trykker en annen tast etter å ha klikket opp-tasten, fortsetter hodet oppover. While-løkka skulle tilsi at den stoppet opp. Har bare lagt inn oppover så langt, de andre retningene er gammel kode. import java.awt.Color; import java.awt.Graphics; import java.awt.event.KeyEvent; import java.awt.event.KeyListener; import java.util.logging.Level; import java.util.logging.Logger; import javax.swing.JFrame; public class Snake2 extends JFrame implements KeyListener { boolean opp, ned, venstre, hoyre; Snakeelement2 hode = new Snakeelement2(); public Snake2() { this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); this.setBounds(0, 0, 600, 600); this.getContentPane().setBackground(Color.black); this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); this.setResizable(false); this.setVisible(true); this.addKeyListener(this); } @Override public void keyPressed(KeyEvent arg) { if (arg.getKeyCode() == arg.VK_RIGHT) { System.out.println("Trykket hoyre"); hode.x += 30; opp = false; ned = false; hoyre = true; venstre = false; } else if (arg.getKeyCode() == arg.VK_LEFT) { System.out.println("Trykket venstre"); hode.x -= 30; opp = false; ned = false; hoyre = false; venstre = true; } else if (arg.getKeyCode() == arg.VK_UP) { System.out.println("Trykket opp"); opp = true; ned = false; hoyre = false; venstre = false; } else if (arg.getKeyCode() == arg.VK_DOWN) { hode.y += 30; System.out.println("Trykket ned"); opp = false; ned = true; hoyre = false; venstre = false; } while (opp) { try { Thread.sleep(250); } catch (InterruptedException ex) { Logger.getLogger(Snake2.class.getName()).log(Level.SEVERE, null, ex); } hode.y -= 30; drawStuff(); } repaint(); } public void drawStuff() { System.out.println("paint"); Graphics g = this.getGraphics(); g.clearRect(0, 0, this.getWidth(), this.getHeight()); g.setColor(Color.BLACK); g.fillRect(0, 0, this.getWidth(), this.getHeight()); hode.drawMe(g); } public void paint(Graphics g) { drawStuff(); } @Override public void keyTyped(KeyEvent sadf) { } @Override public void keyReleased(KeyEvent asdf) { } public static void main(String[] argklpks) { Snake2 sol = new Snake2(); } } import java.awt.Color; import java.awt.Graphics; public class Grafikkelement3 { int bredde = 30; int hoyde = 30; int x,y; Color farge; public void drawMe(Graphics g) { g.setColor(farge); g.fillRect(x,y,bredde,hoyde); } } import java.awt.Color; public class Snakeelement2 extends Grafikkelement3 { public Snakeelement2(){ super(); x = 300; y = 300; farge=Color.green; } } Endret 25. november 2012 av Irrelevant Lenke til kommentar
Aleksander- Skrevet 27. november 2012 Del Skrevet 27. november 2012 Jeg kompilerte koden din for å prøve å finne ut av det, men jeg er ikke så stødig at jeg fant noe galt. Du kunne jo prøvd å kikke litt her, veldig gode forklaringer. http://zetcode.com/tutorials/javagamestutorial/snake/ Lenke til kommentar
Irrelevant Skrevet 28. november 2012 Forfatter Del Skrevet 28. november 2012 (endret) Jeg fant ut av det, tror jeg. Sleep-funksjonen stopper opp hele prosessen, så jeg måtte hatt flere tråder om løkka skulle lyttet til tastaturet. Vet ikke hvordan jeg bruker tråder ennå, og gidder ikke finne ut av det, så jeg løste det ved å bruke ActionListenerens timer-funksjon. Uansett litt rart med buggen i det ferdige spillet (se under) som gjør at slangen begynner å bevege seg umiddelbart når en gang ny omgang startes om man klikker en piltast mens slangen driver og blinker etter at den døde. import java.awt.Color; import java.awt.Font; import java.awt.Graphics; import java.awt.Rectangle; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import java.awt.event.KeyEvent; import java.awt.event.KeyListener; import java.io.FileInputStream; import java.io.FileNotFoundException; import java.io.FileOutputStream; import java.io.IOException; import java.io.ObjectInputStream; import java.io.ObjectOutputStream; import java.util.ArrayList; import java.util.Random; import java.util.logging.Level; import java.util.logging.Logger; import javax.swing.JFrame; import javax.swing.JOptionPane; import javax.swing.Timer; public class Snake extends JFrame implements KeyListener, ActionListener { boolean opp, ned, venstre, hoyre, veggkollisjon, selvkollisjon; Snakeelement hode = new Snakeelement(280, 280); Eple eple = new Eple(); ArrayList<Snakeelement> kropp = new ArrayList<>(); Timer tidtaker; int forflytning = 20; int ge = 20; int counter, gammelHodeX, gammelHodeY, sisteX, sisteY, score, highscore0, highscore1, highscore2, highscore3, forrigescore, vanskelighetsgrad, hastighet; double gjvpoengsum = 100; Color darkgreen = new Color(50, 200, 50); Random rg = new Random(); String[] dialogboksvalg = {"Sandkasse", "Lett", "Middels", "Vanskelig"}; public Snake() { hente(); plasserEple(); this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); this.setBounds(0, 0, ge * 32, ge * 31); this.getContentPane().setBackground(Color.black); this.setResizable(true); this.setVisible(true); this.addKeyListener(this); hode.farge = Color.green; velgVanskelighet(); repaint(); } public void velgVanskelighet() { vanskelighetsgrad = (int) JOptionPane.showOptionDialog(null, "Velg vanskelighetsgrad.", "", 0, 3, null, dialogboksvalg, null); if (vanskelighetsgrad == 0) { hastighet = 75; veggkollisjon = false; selvkollisjon = false; } else if (vanskelighetsgrad == 1) { hastighet = 100; veggkollisjon = false; selvkollisjon = true; } else if (vanskelighetsgrad == 2) { hastighet = 75; veggkollisjon = true; selvkollisjon = true; } else { hastighet = 50; veggkollisjon = true; selvkollisjon = true; } tidtaker = new Timer(hastighet, this); drawStuff(); } public void keyPressed(KeyEvent arg) { if (arg.getKeyCode() == arg.VK_SPACE && (opp || ned || hoyre || venstre)) { if (tidtaker.isRunning()) { tidtaker.stop(); } else { tidtaker.start(); } } if (arg.getKeyCode() == arg.VK_ESCAPE) { restart(); drawStuff(); velgVanskelighet(); } if (arg.getKeyCode() == arg.VK_RIGHT && !venstre) { opp = false; ned = false; hoyre = true; venstre = false; tidtaker.start(); } else if (arg.getKeyCode() == arg.VK_LEFT && !hoyre) { opp = false; ned = false; hoyre = false; venstre = true; tidtaker.start(); } else if (arg.getKeyCode() == arg.VK_UP && !ned) { opp = true; ned = false; hoyre = false; venstre = false; tidtaker.start(); } else if (arg.getKeyCode() == arg.VK_DOWN && !opp) { opp = false; ned = true; hoyre = false; venstre = false; tidtaker.start(); } else { } } @Override public void actionPerformed(ActionEvent e) { counter++; double counter2 = (double) counter / 80; if (eple.farge == Color.blue) { gjvpoengsum = 400 - counter * 5; if (gjvpoengsum < 100) { gjvpoengsum = 100; } } else { gjvpoengsum = 100 - counter * 1.5; if (gjvpoengsum < 20) { gjvpoengsum = 20; } } gammelHodeX = hode.x; gammelHodeY = hode.y; if (!kropp.isEmpty()) { sisteX = kropp.get(kropp.size() - 1).x; sisteY = kropp.get(kropp.size() - 1).y; } if (opp) { hode.y -= forflytning; } else if (ned) { hode.y += forflytning; } else if (hoyre) { hode.x += forflytning; } else { hode.x -= forflytning; } if (veggkollisjon) { if (hode.x >= ge * 29 || hode.x < ge * 2 || hode.y >= ge * 28 || hode.y < ge * 3) { blink(); restart(); } } else { if (hode.x >= ge * 29) { hode.x = ge * 2; } else if (hode.x < ge * 2) { hode.x = ge * 28; } else if (hode.y >= ge * 28) { hode.y = ge * 3; } else if (hode.y < ge * 3) { hode.y = ge * 27; } else { } } for (int i = kropp.size() - 1; i > 0; i--) { kropp.get(i).x = kropp.get(i - 1).x; kropp.get(i).y = kropp.get(i - 1).y; } if (!kropp.isEmpty()) { kropp.get(0).x = gammelHodeX; kropp.get(0).y = gammelHodeY; } if (counter2 == counter / 80) { plasserEple(); } sjekkKollisjonEple(); if (selvkollisjon) { sjekkKollisjonSlange(); } if (vanskelighetsgrad == 0) { if (score > highscore0) { highscore0 = score; lagre(); } } drawStuff(); } public void sjekkKollisjonEple() { Rectangle r1 = new Rectangle(hode.x, hode.y, hode.bredde, hode.hoyde); Rectangle r2 = new Rectangle(eple.x, eple.y, eple.bredde, eple.hoyde); if (r1.intersects(r2)) { counter = 0; score += (int) gjvpoengsum; int tilfeldigtall = rg.nextInt(100); if (tilfeldigtall > 89) { eple.farge = Color.blue; eple.bredde = 25; eple.hoyde = 25; } else { eple.farge = Color.red; eple.bredde = 20; eple.hoyde = 20; } plasserEple(); if (kropp.isEmpty()) { kropp.add(new Snakeelement(gammelHodeX, gammelHodeY)); } else { kropp.add(new Snakeelement(sisteX, sisteY)); } } } public void sjekkKollisjonSlange() { for (int i = 0; i < kropp.size(); i++) { Rectangle r3 = new Rectangle(hode.x, hode.y, hode.bredde, hode.hoyde); Rectangle r4 = new Rectangle(kropp.get(i).x, kropp.get(i).y, kropp.get(i).bredde, kropp.get(i).hoyde); if (r3.intersects(r4)) { blink(); restart(); } } } public void restart() { kropp.clear(); hode.x = 280; hode.y = 280; if (vanskelighetsgrad == 0) { if (score > highscore0) { tidtaker.stop(); highscore0 = score; } } else if (vanskelighetsgrad == 1) { if (score > highscore1) { tidtaker.stop(); highscore1 = score; JOptionPane.showMessageDialog(null, "Ny highscore: " + highscore1 + "!"); } } else if (vanskelighetsgrad == 2) { if (score > highscore2) { tidtaker.stop(); highscore2 = score; JOptionPane.showMessageDialog(null, "Ny highscore: " + highscore2 + "!"); } } else if (score > highscore3) { tidtaker.stop(); highscore3 = score; JOptionPane.showMessageDialog(null, "Ny highscore: " + highscore3 + "!"); } else { } forrigescore = score; lagre(); score = 0; opp = false; ned = false; hoyre = false; venstre = false; counter = 0; tidtaker.stop(); gjvpoengsum = 100; } public void blink() { for (int i = kropp.size() - 1; i > 0; i--) { kropp.get(i).x = kropp.get(i - 1).x; kropp.get(i).y = kropp.get(i - 1).y; } if (!kropp.isEmpty()) { kropp.get(0).x = gammelHodeX; kropp.get(0).y = gammelHodeY; } for (int i = 0; i < 8; i++) { hode.farge = Color.black; for (int j = 0; j < kropp.size(); j++) { kropp.get(j).farge = Color.black; } drawStuff(); try { Thread.sleep(100); } catch (InterruptedException ex) { Logger.getLogger(Snake.class.getName()).log(Level.SEVERE, null, ex); } hode.farge = Color.green; for (int j = 0; j < kropp.size(); j++) { kropp.get(j).farge = darkgreen; } drawStuff(); try { Thread.sleep(100); } catch (InterruptedException ex) { Logger.getLogger(Snake.class.getName()).log(Level.SEVERE, null, ex); } } } public void plasserEple() { if (eple.farge == Color.blue) { eple.x = ge * 2 + forflytning * rg.nextInt(26); eple.y = ge * 3 + forflytning * rg.nextInt(24); } else { eple.x = ge * 2 + forflytning * rg.nextInt(27); eple.y = ge * 3 + forflytning * rg.nextInt(25); } for (int i = kropp.size() - 1; i > 0; i--) { if ((eple.x == kropp.get(i).x && eple.y == kropp.get(i).y) || (hode.x == kropp.get(i).x && hode.y == kropp.get(i).y)) { plasserEple(); System.out.println("eple slange"); } } } public void drawStuff() { Graphics g = this.getGraphics(); g.clearRect(0, 0, this.getWidth(), this.getHeight()); g.setColor(Color.BLACK); g.fillRect(0, 0, this.getWidth(), this.getHeight()); g.setColor(Color.white); g.drawRect(ge * 2 - 1, ge * 3 - 1, ge * 27 + 1, ge * 25 + 1); eple.drawMe(g); for (int i = 0; i < kropp.size(); i++) { kropp.get(i).drawMe(g); } hode.drawMe(g); g.setFont(new Font("sansserif", Font.BOLD, 15)); g.setColor(Color.white); g.drawString("Score: " + score, 470, 50); g.drawString("" + (int) gjvpoengsum, 50, 50); if (vanskelighetsgrad == 0) { g.drawString("Highscore: " + highscore0, 130, 50); } else if (vanskelighetsgrad == 1) { g.drawString("Highscore: " + highscore1, 130, 50); } else if (vanskelighetsgrad == 2) { g.drawString("Highscore: " + highscore2, 130, 50); } else { g.drawString("Highscore: " + highscore3, 130, 50); } g.drawString("Forrige score: " + forrigescore, 280, 50); } public void paint(Graphics g) { drawStuff(); } public static void main(String[] as) { Snake s = new Snake(); } private void lagre() { // Write to disk with FileOutputStream try (FileOutputStream f_out = new FileOutputStream("snakedata.txt"); ObjectOutputStream obj_out = new ObjectOutputStream(f_out) { obj_out.writeObject(highscore0); obj_out.writeObject(highscore1); obj_out.writeObject(highscore2); obj_out.writeObject(highscore3); obj_out.writeObject(forrigescore); } catch (FileNotFoundException ex) { Logger.getLogger(Snake.class.getName()).log(Level.SEVERE, null, ex); } catch (IOException ex) { Logger.getLogger(Snake.class.getName()).log(Level.SEVERE, null, ex); } } private void hente() { try (FileInputStream f_in = new FileInputStream("snakedata.txt"); ObjectInputStream obj_in = new ObjectInputStream(f_in) { highscore0 = (int) obj_in.readObject(); highscore1 = (int) obj_in.readObject(); highscore2 = (int) obj_in.readObject(); highscore3 = (int) obj_in.readObject(); forrigescore = (int) obj_in.readObject(); } catch (Exception e) { System.out.println(e.getMessage()); } } @Override public void keyTyped(KeyEvent sadf) { } @Override public void keyReleased(KeyEvent asdf) { } } import java.awt.Color; public class Snakeelement extends Grafikkelement { Color darkgreen = new Color(50,200,50); public Snakeelement(int x, int y){ super(); this.x = x; this.y = y; farge=darkgreen; } } import java.awt.Color; import java.awt.Graphics; public class Grafikkelement { int bredde = 20; int hoyde = 20; int x,y; Color farge; public void drawMe(Graphics g) { g.setColor(farge); g.fillRect(x,y,bredde,hoyde); } } import java.awt.Color; public class Eple extends Grafikkelement { public Eple() { super(); farge = Color.red; } } Endret 28. november 2012 av Irrelevant Lenke til kommentar
stelar7 Skrevet 11. desember 2012 Del Skrevet 11. desember 2012 Lagde faktisk min egen versjon av snake for et par dager siden. source her om du er innteressert: https://github.com/stelar7-games/snake/blob/master/Snake/src/my/game/stelar7/snake/Main.java Lenke til kommentar
Anbefalte innlegg
Opprett en konto eller logg inn for å kommentere
Du må være et medlem for å kunne skrive en kommentar
Opprett konto
Det er enkelt å melde seg inn for å starte en ny konto!
Start en kontoLogg inn
Har du allerede en konto? Logg inn her.
Logg inn nå