Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- import java.awt.*;
- import java.awt.event.ActionEvent;
- import java.awt.event.ActionListener;
- import java.io.IOException;
- import java.net.URL;
- import java.util.*;
- import javax.swing.*;
- import javax.sound.sampled.*;
- public class GUI extends JFrame implements ActionListener {
- /**
- * Her ligger spillebrikkene
- */
- private ImagePanel hovedPanel;
- /**
- * Viser tid og poeng nederst
- */
- private JPanel statusPanel;
- /**
- * 'Nytt spill' knapp og størrelsesvalg
- */
- private JPanel kontrollPanel;
- /**
- * Knapper for å starte nytt spill
- */
- private JButton nytt, igjen;
- /**
- * Størrelsesvalg
- */
- private JRadioButton small, medium, large, xlarge;
- /**
- * Vise tid og antall brikker
- */
- private JLabel antall, tid;
- /**
- * For å finne X og Y til knappen som ble trykket
- */
- private Map<Object, Integer> xMap;
- private Map<Object, Integer> yMap;
- /**
- * Liste over alle aktive brikker
- */
- private ArrayList<GUIBrikke> brikker;
- /**
- * Referanse til spillet
- */
- private ISpill spill;
- /**
- * Vekker oss hvert halve sekund
- */
- private javax.swing.Timer timer;
- /**
- * Katalog hvor GUI-en leter etter bilder (relativt til hvor klassefilene ligger)
- */
- public static String bildeSti = "images/";
- /**
- * Oppretter en ny spill-GUI
- * @param spill Spillet som skal kontrolleres
- */
- public GUI(ISpill spill) {
- super("Memo");
- this.spill = spill;
- timer = new javax.swing.Timer(500, this); // vekk oss hvert 500 millisekund
- kontrollPanel = new JPanel();
- hovedPanel = new ImagePanel(bildeSti + "bakgrunn.jpg");
- statusPanel = new JPanel();
- add(kontrollPanel, BorderLayout.NORTH);
- add(hovedPanel,BorderLayout.CENTER);
- add(statusPanel, BorderLayout.SOUTH);
- nytt = new JButton("Nytt Spill");
- nytt.addActionListener(this);
- small = new JRadioButton("S", false);
- medium = new JRadioButton("M", true);
- large = new JRadioButton("L", false);
- xlarge = new JRadioButton("XL", false);
- ButtonGroup g = new ButtonGroup();
- g.add(small);
- g.add(medium);
- g.add(large);
- g.add(xlarge);
- kontrollPanel.add(nytt);
- kontrollPanel.add(new JLabel("Brettstørrelse:"));
- kontrollPanel.add(small);
- kontrollPanel.add(medium);
- kontrollPanel.add(large);
- kontrollPanel.add(xlarge);
- antall = new JLabel("Brikker: 0");
- tid = new JLabel("Tid: 0:00");
- statusPanel.add(antall);
- statusPanel.add(tid);
- lagBrett(spill.nyttSpill(Vanskelighet.MEDIUM));
- pack();
- setVisible(true);
- setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
- }
- /**
- * Lager et nytt spillbrett på hovedpanelet
- *
- * @param brett En 2D-tabell med brikker
- */
- private void lagBrett(ITabell2D<IBrikke> brett) {
- xMap = new HashMap<Object, Integer>();
- yMap = new HashMap<Object, Integer>();
- brikker = new ArrayList<GUIBrikke>();
- hovedPanel.removeAll();
- hovedPanel.setLayout(new GridLayout(brett.høyde(), brett.bredde()));
- for(int x = 0; x < brett.bredde(); x++)
- for(int y = 0; y < brett.høyde(); y++) {
- JPanel p = new JPanel();
- GUIBrikke b = new GUIBrikke(brett.hent(x, y), "bakside.jpg");
- brikker.add(b);
- b.addActionListener(this);
- p.add(b);
- p.setOpaque(false);
- hovedPanel.add(p);
- xMap.put(b, x);
- yMap.put(b, y);
- }
- timer.start();
- hovedPanel.settBilde(bildeSti + spill.bakgrunnsBilde());
- pack();
- }
- /**
- * Går gjennom og oppdaterer grafikken til alle brikkene, og viser oppdatert informasjon i displayet
- */
- private void oppdater() {
- boolean delay = false;
- for(GUIBrikke b : brikker)
- delay |= b.oppdater();
- if(delay)
- timer.start();
- antall.setText(String.format("Brikker: %d", spill.antall()));
- tid.setText(String.format("Tid: %d:%02d", spill.tid()/60, spill.tid()%60));
- hovedPanel.settBilde(bildeSti + spill.bakgrunnsBilde());
- }
- /**
- * Denne blir kalt av Java hver gang brukeren trykker på en knapp, eller hver gang
- * timer-signalet avfyres.
- *
- * @see java.awt.event.ActionListener#actionPerformed(java.awt.event.ActionEvent)
- */
- @Override
- public void actionPerformed(ActionEvent e) {
- if(e.getSource() == nytt || e.getSource() == igjen) {
- Vanskelighet v = Vanskelighet.MEDIUM;
- if(small.isSelected())
- v = Vanskelighet.SMALL;
- else if(medium.isSelected())
- v = Vanskelighet.MEDIUM;
- else if(large.isSelected())
- v = Vanskelighet.LARGE;
- else if(xlarge.isSelected())
- v = Vanskelighet.XLARGE;
- lagBrett(spill.nyttSpill(v));
- }
- else if(e.getSource() == timer) {
- //timer.stop();
- oppdater();
- }
- else {
- int x = xMap.get(e.getSource());
- int y = yMap.get(e.getSource());
- if(spill.velg(x, y))
- oppdater();
- else
- vunnet();
- }
- }
- /**
- * Vis vinnertekst og be brukeren spille en gang til
- */
- private void vunnet() {
- hovedPanel.settBilde(bildeSti + spill.bakgrunnsBilde());
- hovedPanel.removeAll();
- hovedPanel.setLayout(new GridLayout(4,1));
- JPanel p = new JPanel();
- p.setOpaque(false);
- igjen = new JButton("En gang til?");
- igjen.addActionListener(this);
- igjen.setOpaque(false);
- p.add(igjen);
- JLabel l = new JLabel(spill.sluttTekst());
- l.setHorizontalAlignment(SwingConstants.CENTER);
- l.setForeground(Color.WHITE);
- l.setOpaque(false);
- JPanel p1 = new JPanel();
- p1.setOpaque(false);
- JPanel p2 = new JPanel();
- p2.setOpaque(false);
- hovedPanel.add(p1);
- hovedPanel.add(l);
- hovedPanel.add(p);
- hovedPanel.add(p2);
- timer.stop();
- validate();
- }
- }
- class ImagePanel extends JPanel {
- private Image img;
- private String imgNavn;
- private int w;
- private int h;
- public ImagePanel(String bilde) {
- super();
- settBilde(bilde);
- Dimension size = new Dimension(w, h);
- setSize(size);
- }
- public void settBilde(String bilde) {
- if(!bilde.equals(imgNavn)) {
- System.out.println(bilde);
- img = new ImageIcon(getClass().getResource(bilde)).getImage();
- w = img.getWidth(null);
- h = img.getHeight(null);
- imgNavn = bilde;
- validate();
- }
- }
- public void paintComponent(Graphics g) {
- int gw = this.getWidth();
- int gh = this.getHeight();
- int iw = w;
- int ih = h;
- int ix = 0, iy = 0;
- if(iw-gw > 20 || ih-gh > 20) {
- if((double)gw/gh > (double)iw/ih) {
- ih = (int)((double)iw*(double)gh/(double)gw);
- iy = (h-ih)/2;
- }
- else {
- iw = (int)((double)ih*(double)gw/(double)gh);
- ix = (w-iw)/2;
- }
- }
- else {
- if(iw > gw) {
- ix = (gw-iw)/2;
- iw = gw;
- }
- if(ih > gh) {
- iy = (gh-ih)/2;
- ih = gh;
- }
- }
- g.drawImage(img, 0, 0, gw-1, gh-1, ix, iy, iw-1, ih-1, null);
- }
- }
- ----------------------------------------------------------------------------
- import java.awt.Insets;
- import javax.swing.ImageIcon;
- import javax.swing.JButton;
- public class GUIBrikke extends JButton {
- private static final long serialVersionUID = -7919110561211386669L;
- private ImageIcon åpen;
- private ImageIcon lukket;
- IBrikke brikke;
- public GUIBrikke(IBrikke brikke, String lukketBilde) {
- super();
- this.brikke = brikke;
- setContentAreaFilled(false);
- åpen = new ImageIcon(getClass().getResource(GUI.bildeSti + brikke.bilde()));
- lukket = new ImageIcon(getClass().getResource(GUI.bildeSti + lukketBilde));
- oppdater();
- setMargin(new Insets(0,0,0,0));
- }
- public boolean oppdater() {
- if(isVisible()) {
- if(brikke.erÅpen())
- setIcon(åpen);
- else
- setIcon(lukket);
- if(!isEnabled())
- setVisible(false);
- if(!brikke.erAktiv()) {
- setEnabled(false);
- this.setDisabledIcon(åpen);
- return true;
- }
- }
- return false;
- }
- }
- ----------------------------------------------------------------------------
- /**
- * Kontrakt for spillbrikker.
- *
- * GUI-en bruker en del av metodene under for å finne ut hvordan brikken skal
- * tegnes; resten vil være nyttig i resten av spillimplementasjonen.
- *
- */
- public interface IBrikke {
- /**
- * @return True om brikken er 'åpen' (viser bildet sitt)
- */
- public abstract boolean erÅpen();
- /**
- * @return True om brikken ikke er fjernet fra spillet
- */
- public abstract boolean erAktiv();
- /**
- * Setter brikken til å være lukket. (=> erÅpen() == false)
- */
- public abstract void lukk();
- /**
- * Setter brikken til å være åpen. (=> erÅpen() == true)
- */
- public abstract void åpne();
- /**
- * Setter brikken til å være fjernet. (=> erAktiv == false)
- */
- public abstract void fjern();
- /**
- * Bilde (PNG, JPG, GIF, ...) for brikken. Bør være 75x100 piksler stort.
- *
- * @return Navn på billedfil som viser brikkens bilde (i åpen tilstand).
- */
- public abstract String bilde();
- /**
- * @param b Brikke vi skal sammenlikne med
- * @return True om brikken representerer samme symbol som 'b'
- */
- public abstract boolean erLik(IBrikke b);
- /**
- * @return Brikkens symbol (to brikker er like om getId() gir like strenger)
- */
- public abstract String getId();
- }
- ----------------------------------------------------------------------------
- /**
- * Interface for todimensjonale tabeller.
- * @param <E> Typen til elementene
- */
- public interface ITabell2D<E> {
- /**
- * @param x X-posisjon
- * @param y Y-posisjon
- * @return Elementet på posisjon (x, y)
- */
- public abstract E hent(int x, int y);
- /**
- * @param x X-posisjon
- * @param y Y-posisjon
- * @param e Element som skal settes inn på posisjon (x, y)
- */
- public abstract void sett(int x, int y, E e);
- /**
- * @return Høyde til tabellen (høyeste lovlige X-posisjon + 1)
- */
- public abstract int høyde();
- /**
- * @return Bredden til tabellen (høyeste lovlige Y-posisjon + 1)
- */
- public abstract int bredde();
- /**
- * @return En kopi av tabellen, med de samme elementene
- */
- public abstract ITabell2D<E> clone();
- }
- ----------------------------------------------------------------------------
- /**
- * Denne enum-klassen definerer fire konstanter: SMALL, MEDIUM, LARGE, XLARGE.
- * @author anya
- *
- */
- public enum Vanskelighet {
- SMALL,
- MEDIUM,
- LARGE,
- XLARGE;
- /**
- * @return Bredden til et brett med denne vanskeligheten
- */
- public int bredde() {
- switch(this) {
- case SMALL:
- return 6;
- case MEDIUM:
- return 7;
- case LARGE:
- return 8;
- case XLARGE:
- return 9;
- }
- return 0;
- }
- /**
- * @return Høyden til et brett med denne vanskeligheten
- */
- public int høyde() {
- switch(this) {
- case SMALL:
- return 3;
- case MEDIUM:
- return 4;
- case LARGE:
- return 5;
- case XLARGE:
- return 6;
- }
- return 0;
- }
- /**
- * @return Antall brikker på et brett med denne vanskeligheten
- */
- public int antall() {
- return bredde() * høyde();
- }
- }
- ----------------------------------------------------------------------------
- /**
- * Kontrakt for memory-spill. GUI-klassen forventer å få et objekt av denne
- * typen, som tar hånd om spillmekanikken. Alle metodene under blir kalt fra GUI
- * basert på forskjellige hendelser -- som at brukeren trykker på en knapp, for
- * eksempel.
- *
- public interface ISpill {
- /**
- * Kalles når brukeren vil starte et nytt spill.
- *
- * @param v
- * Vanskelighet -- beskriver bredde og høyde på brettet
- * @return Et nytt brett med brikker utplassert.
- */
- public abstract ITabell2D<IBrikke> nyttSpill(Vanskelighet v);
- /**
- * Kalles når brukeren trykker på en brikke.
- *
- * 'x' og 'y' er alltid innenfor grensene på det sist returnerte spillbrettet.
- *
- * @param x
- * X-posisjon til brikken
- * @param y
- * Y-posisjon til brikken
- * @return True hvis spillet fremdeles pågår, false hvis spillet nå er
- * avsluttet (vunnet)
- */
- public abstract boolean velg(int x, int y);
- /**
- * Kalles for hvert trekk
- *
- * @return Antall brikker som er igjen på brettet, for visning i display
- */
- public abstract int antall();
- /**
- * Kalles med jevne mellomrom
- *
- * @return Antall sekunder spillet har pågått
- */
- public abstract int tid();
- /**
- * Kalles for hver trekk. Kan brukes til f.eks. å vise et annet bilde når
- * brukeren har vunnet.
- *
- * @return Filnavn på bakgrunnsbilde
- */
- public abstract String bakgrunnsBilde();
- /**
- * Kalles etter at velg() returnerer false.
- *
- * @return En tekst som skal vises når brukeren har vunnet.
- */
- public abstract String sluttTekst();
- }
- -------------------------------------------------------------------
- import java.io.IOException;
- import java.util.HashMap;
- import javax.sound.sampled.AudioInputStream;
- import javax.sound.sampled.AudioSystem;
- import javax.sound.sampled.Clip;
- import javax.sound.sampled.LineUnavailableException;
- import javax.sound.sampled.UnsupportedAudioFileException;
- public class LydSpiller {
- private static HashMap<String, Clip> clips = new HashMap<String,Clip>();
- public static String lydSti = "sounds/";
- /**
- * @param lyd Navn på lydfilen som skal spilles av (leter i <code>lydSti</code> underkatalogen)
- */
- public static void spillLyd(String lyd) {
- if(!clips.containsKey(lyd)) {
- try {
- AudioInputStream ais = AudioSystem.getAudioInputStream(LydSpiller.class.getResource(lydSti + lyd));
- Clip clip = AudioSystem.getClip();
- clip.open(ais);
- clips.put(lyd, clip);
- }
- catch(IOException e) {
- e.printStackTrace();
- }
- catch (UnsupportedAudioFileException e) {
- e.printStackTrace();
- } catch (LineUnavailableException e) {
- // TODO Auto-generated catch block
- e.printStackTrace();
- }
- }
- Clip c = clips.get(lyd);
- c.setFramePosition(0);
- c.start();
- }
- }
- -----------------------------------------------------------------------------------
- /**
- * Tilstander for Brikke-klassen.
- */
- public enum Tilstand {LUKKET, ÅPEN, FJERNET}
- -----------------------------------------------------------------------------------
Add Comment
Please, Sign In to add comment