Visa elektrotehnicka skola, Beograd
Ласло Краус
Програмирање на језику Java - колоквијуми
Други колоквијум
17. 1. 2009

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

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

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


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


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

// Casovnik.java

package slagalica;
import java.awt.*;

public class Casovnik extends Thread {
  private Label prik;
  private boolean radi = false;
  private long t0;

  public Casovnik( Label p) {
    prik = p;
    start();
  }

  public void run() {
    try {
      while( !interrupted()) {
        while (!radi) synchronized (this) {wait();}
        prik.setText( toString());
        sleep( 100);
      }
    } catch (InterruptedException g) {}
  }

  public synchronized void kreni() {
    t0 = System.currentTimeMillis();
    radi = true; notify();
  }

  public void stani() { radi = false; }

  public void zavrsi() { interrupt(); }

  public String toString() {
    long dt = (System.currentTimeMillis()-t0)/100;
    return String.format( "%2d:%4.1f", dt/600, dt%600/10.);
  }
}

// Tabla.java

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

public class Tabla extends Panel {
  Button[][] dugmad = new Button [4][4];
  private Button prazno;
  private Casovnik casovnik;

  public Tabla (Casovnik cas) {
    casovnik = cas;
    setLayout( new GridLayout( 4, 4));
    setEnabled(false);
    DugmeAkcija osl = new DugmeAkcija();
    for (int i=0; i<16; i++) {
      add( dugmad[i/4][i%4] = new Button());
      dugmad[i/4][i%4].addActionListener( osl);
    }
  }

  void postavi() {
    int[] a = new int [15];
    for (int i=0; i<15; i++) {
      int k, j;
      do {
        k = (int)(1 + Math.random() * 15);
        for (j=0; j<i && a[j]!=k; j++);
      } while (j < i);
      a[i] = k;
      dugmad[i/4][i%4].setLabel( Integer.toString( k));
    }
    dugmad[3][3].setLabel( "");
    prazno = dugmad[3][3];
    setEnabled( true);
    casovnik.kreni();
  }


  private class DugmeAkcija implements ActionListener {
    public void actionPerformed( ActionEvent d) {
      Button dgm = ((Button)d.getSource());
      if (dgm!=prazno) {
        prazno.setLabel( dgm.getLabel());
        dgm.setLabel( "");
        prazno = dgm;
      }
      int i=0;
      while (i<15) {
        if (dugmad[i/4][i%4]==prazno ||
            Integer.parseInt(dugmad[i/4][i%4].getLabel()) != i+1)
          break;
        i++;
      }
      if (i == 15) {
        Tabla.this.setEnabled( false);
        casovnik.stani();
      }
    }
  }
}

Slagalica.java

package slagalica;

import java.awt.*;
import java.awt.event.*;

public class Slagalica extends Frame {
  Label prik = new Label("00:00.0");
  private Casovnik casovnik = new Casovnik(prik);
  private Tabla tabla = new Tabla( casovnik);

  public Slagalica() {
    super( "Slagalica");
    setSize( 198, 198);
    setResizable( false);
    popuniProzor();
    setVisible( true);
    addWindowListener( new WindowAdapter() {
      public void windowClosing( WindowEvent d) { casovnik.zavrsi(); dispose(); }
    });
  }

  private void popuniProzor() {
    add( tabla, "Center");
    Panel plo = new Panel(); add( plo, "South");
    Button dgm = new Button( "Nova igra");
    plo.add( dgm);
    dgm.addActionListener( new ActionListener() {
      public void actionPerformed( ActionEvent d) { tabla.postavi(); }
    });
    plo.add( prik);
  }

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

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