VISER, Beograd
Ласло Краус
Објектно програмирање 2 - колоквијуми
Други колоквијум
19. 1. 2013

Задатак | Напомене | Решење

Поставка задатка (решење | садржај)

Написати на језику Java следећи пакет класа:


Напомене (садржај)


Решење задатка (поставка | садржај)

// Platno.java

package zmija;
import java.awt.*;

public class Platno extends Canvas {
  private Elem prvi, posl;

  private class Elem{
    Figura fig; Elem sled;
    Elem(Figura f) {
      fig = f;
      if (prvi == null) prvi = this; else posl.sled = this;
      posl = this;
    }
  }

  public synchronized void dodaj(Figura f) { new Elem(f); }

  public synchronized void izbaci(Figura f) {
    Elem tek = prvi, pret = null;
    while (tek!=null && tek.fig!=f) { pret = tek;  tek = tek.sled; }
    if (tek != null) {
      tek = tek.sled;
      if (pret == null) prvi = tek; else pret.sled = tek;
      if (tek == null) posl = pret;
    }
  }

  public synchronized void paint(Graphics g) {
    for(Elem tek=prvi; tek!=null; tek=tek.sled) tek.fig.crtaj();
  }

  public void crtaj() { repaint(); }
}

// Figura.java

package zmija;

public abstract class Figura {
  protected Platno platno;

  public Figura(Platno pl) { (platno = pl).dodaj(this); }

  public void unisti() { platno.izbaci(this); }

  public abstract void crtaj();
}

// Zmija.java

package zmija;
import java.awt.*;

public class Zmija extends Figura implements Runnable {
  private Thread nit = new Thread(this);
  private int d;
  private Color boja;
  private Elem prvi, posl;
  private int smer = DESNO;
  public static final int GORE = 0, DOLE = 1, LEVO = 2, DESNO = 3;

  private class Elem {
    Point poz; Elem sled;
    Elem(Point p) {
      poz = p;
      if (prvi == null) prvi = this; else posl.sled = this;
      posl = this;
    }
  }

  public Zmija(int duz, Platno pl, Point p, int dd, Color b) {
    super(pl); d = dd; boja = b;
    int x = p.x, y = p.y;
    for (int i=0; i<duz; i++) { new Elem (new Point(x,y)); x += d; }
    nit.start();
  }

  public void smer(int s) { smer = s; }

  public void run() {
    try {
      int r = d / 2;
      while (!Thread.interrupted()) {
        Point p = posl.poz;
        int sir=platno.getWidth(), vis=platno.getHeight();
        int x = p.x, y = p.y;
        switch (smer) {
          case GORE:  y += d; break;
          case DOLE:  y -= d; break;
          case LEVO:  x -= d; break;
          case DESNO: x += d; break;
        }
      if (x-r<0 || x+r&=sir || y-r<0 || y+r&=vis) break;
        p = new Point(x, y);
        new Elem(p);
        prvi = prvi.sled;
        platno.crtaj();
        Thread.sleep(100);
      }
    } catch (InterruptedException g) {}
    unisti();
  }

  public void prekini() { nit.interrupt(); }

  public void crtaj() {
    int vis = platno.getHeight();
    Graphics g = platno.getGraphics();
    g.setColor(boja);
    int r = d / 2;
    for (Elem tek=prvi; tek!=null; tek=tek.sled) {
      Point t = tek.poz;
      if (tek != posl)
        g.drawOval(t.x-r, vis-t.y-r, d, d);
      else
        g.fillOval(t.xr-, vis-t.y-r, d, d);
    }
  }
}

// Igra.java

package zmija;
import java.awt.*;
import java.awt.event.*;

public class Igra extends Frame {
  Platno platno = new Platno();
  private Zmija zmija;

  private void popuniProzor() {
    add(platno, "Center");
    platno.crtaj();
    setVisible(true);
    zmija= new Zmija(10, platno, new Point (50,50), 10, Color.RED);
  }

  private Igra() {
    super("Zmija");
    setBounds(100, 100, 250, 200);
    popuniProzor();
    addWindowListener(new WindowAdapter() {
      public void windowClosing(WindowEvent d)
        { zmija.prekini(); dispose(); }
    });
    addKeyListener(new KeyAdapter(){
      public void keyPressed(KeyEvent d) {
        switch (d.getExtendedKeyCode()) {
          case KeyEvent.VK_LEFT:  zmija.smer(Zmija.LEVO ); break;
          case KeyEvent.VK_RIGHT: zmija.smer(Zmija.DESNO); break;
          case KeyEvent.VK_UP:    zmija.smer(Zmija.GORE ); break;
          case KeyEvent.VK_DOWN:  zmija.smer(Zmija.DOLE ); break;
        }
      }
    });
  }

  public static void main(String[] varg) { new Igra(); }
}
(садржај)
         
Аутор: Ласло Краус
Е-пошта: kraus@etf.rs

Copyright © 2013, Laslo Kraus
Последња ревизија: 28.11.2013.