Elektrotehnicki fakultet, Beograd  Ласло Краус ИР2ОО2
Испит
9. 9. 2005.

Аутори: Игор Тартаља и Ласло Краус

Задаци: 1 2 3 | Напоменe | Решења: 1

Поставка задатка 1 (укупно 70 поена) ( решење | почетак)

Реализовати на језику Java следећи пакет класа (класе изузетака опремити састављањем текста поруке):

(20 поена) Реализовати на језику Java програм с графичком корисничком површи, према приложеној слици, којим може да се игра XoX.

Поставка задатка 2 (30 поена) ( почетак)

Одговорити концизно (по једна или две реченице) и прецизно на следећа питaња:

а) Како се на језику Јава користе имена из неког пакета? Навести примере.

б) Који случајеви постоје и које су последице, када се метода истог имена појављује у више имплементираних интерфејса у једној класи на језику Јава?

в) Да ли се и зашто нека класа на Јави може дефинисати у неком изразу?

г) Како се у Јави спречава неизвесност трке (race hazard)?

д) Шта су делегати на језику C# и за шта се примарно користе?

Поставка задатка 3 (25 поена – допуна уместо лабораторијских вежби) ( почетак)

Реализовати на језику Java следећи пакет класа (класе изузетака опремити састављањем текста поруке):


Напоменe ( почетак)


Решење задатка 1 ( поставка | почетак)

// GNeMoze.java
package xox;
public class GNeMoze extends Exception {
  public String toString () { return "Nedozvoljen potez!"; }
}

// Tabla.java
package xox;
import java.awt.*;
import java.awt.event.*;
public class Tabla {
  private Panel ploca;
  private int pritisnuto;
  private Dugme[] dugmad = new Dugme [9];

  private static class Dugme extends Button {
    private int indeks;
    public Dugme (int ind) { super (" "); indeks = ind; }
  } // class Dugme

  public Tabla (Panel plo) {
    (ploca = plo).setLayout (new GridLayout (3, 3));
    ploca.setEnabled (false);
    ActionListener osmatrac = new ActionListener () {
      public void actionPerformed (ActionEvent d) {
        Dugme dgm = (Dugme)d.getSource ();
        pritisnuto = dgm.indeks; dalje ();
      }
    };
    Font font = new Font (null, Font.BOLD, 24);
    for (int i=0; i<9; i++) {
      ploca.add (dugmad[i] = new Dugme (i));
      dugmad[i].setFont (font);
      dugmad[i].addActionListener (osmatrac);
    }
  }

  private synchronized void dalje () { notify (); }

  public synchronized int uzmiPritisnuto () throws GPrekinuta {
    ploca.setEnabled (true);
    try { wait (); } catch (InterruptedException g) { throw new GPrekinuta (); }
    ploca.setEnabled (false); return pritisnuto;
  }

  void postaviOznaku (int polje, String  oznaka) throws GNeMoze {
    if (polje<0 || polje>=9 || !dugmad[polje].getLabel().equals(" "))
      throw new GNeMoze ();
    dugmad[polje].setLabel (oznaka);
    dugmad[polje].setEnabled (false);
  }

  void prazni () {
    for (int i=0; i<9; i++) {
      dugmad[i].setLabel (" ");
      dugmad[i].setEnabled (true);
    }
  }

  public String oznaka (int polje) { return dugmad[polje].getLabel (); }
}

// GPrekinuta.java
package xox;
public class GPrekinuta extends Exception {
  public String toString () { return "Igra je prekinuta!"; }
}

// Igrac.java
package xox;
public abstract class Igrac {
  private String oznaka; protected Tabla tabla;
  public Igrac (String ozn, Tabla tbl) { oznaka = ozn; tabla = tbl; }
  public abstract int birajPolje () throws GPrekinuta;
  public void odigrajPotez () throws GPrekinuta {
    while (true) {
      try { tabla.postaviOznaku (birajPolje(), oznaka); return; }
        catch (GNeMoze g) {}
    }
  }
}

// Covek.java
package xox;
public class Covek extends Igrac {
  public Covek (String ozn, Tabla tbl) { super (ozn, tbl); }
  public int birajPolje () throws GPrekinuta { return tabla.uzmiPritisnuto (); }
}

// Racunar.java
package xox;
public class Racunar extends Igrac {
  public Racunar (String ozn, Tabla tbl) { super (ozn, tbl); }
  public int birajPolje () { return (int)(Math.random() * 9); }
}

// Igra.java
package xox;
import java.awt.*;
public class Igra extends Thread {
  private Igrac[] igraci = new Igrac [2];
  private int tekIgrac;
  private Tabla tabla; private Label oznStanje;

  public Igra (Tabla tbl, Igrac prvi, Igrac drugi, Label sta) {
    tabla = tbl; tabla.prazni ();
    igraci[0] = prvi; igraci[1] = drugi;
    tekIgrac = 0; oznStanje = sta;
    oznStanje.setText (" "); start ();
  }

  private boolean isto (int a, int b, int c) {
    return !tabla.oznaka(a).equals(" ") &&
           tabla.oznaka(a).equals(tabla.oznaka(b)) &&
           tabla.oznaka(a).equals(tabla.oznaka(c))    ;
  }

  public String stanje () {
    if (isto (0, 1, 2)) return tabla.oznaka(0);
    if (isto (3, 4, 5)) return tabla.oznaka(3);
    if (isto (6, 7, 8)) return tabla.oznaka(6);
    if (isto (0, 3, 6)) return tabla.oznaka(0);
    if (isto (1, 4, 7)) return tabla.oznaka(1);
    if (isto (2, 5, 8)) return tabla.oznaka(2);
    if (isto (0, 4, 8)) return tabla.oznaka(0);
    if (isto (2, 4, 6)) return tabla.oznaka(2);
    for (int i=0; i<9; i++)
      if (tabla.oznaka(i).equals(" ")) return " ";
    return "?";
  }

  public void run () { String stanje = " ";
    try {
      while (stanje.equals(" ")) {
        igraci[tekIgrac].odigrajPotez ();
        tekIgrac = 1 - tekIgrac;
        stanje = stanje();
      }
      oznStanje.setText ("Pobednik: " + stanje);
    } catch (GPrekinuta g) {}
  }

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

// Xox.java
import java.awt.*;
import java.awt.event.*;
import xox.*;
public class Xox extends Frame {
  private Font font = new Font (null, Font.BOLD, 24);
  private Panel ploTabla = new Panel ();
  private Tabla tabla = new Tabla (ploTabla);
  private PloIgrac ploPrvi = new PloIgrac ("X");
  private PloIgrac ploDrugi = new PloIgrac ("O");
  private Igra igra;
  private Label stanje = new Label ("", Label.CENTER);

  private class PloIgrac extends Panel {
    private Igrac igrac;
    private CheckboxGroup grupa = new CheckboxGroup ();
    private Checkbox rdgCovek   = new Checkbox ("Covek",   true,  grupa),
                     rdgRacunar = new Checkbox ("Racunar", false, grupa);
    private String oznaka;

    PloIgrac (String ozn) {
      oznaka = ozn;
      setLayout (new GridLayout (3,1));
      Label lbl = new Label (ozn, Label.CENTER);
      lbl.setFont( font);
      add (lbl);
      ItemListener osmatrac = new ItemListener () {
        public void itemStateChanged (ItemEvent d) {
          if ((Checkbox)d.getSource() == rdgCovek)
            igrac = new Covek (oznaka, tabla);
          else
            igrac = new Racunar (oznaka, tabla);
        }
      };
      rdgCovek.addItemListener (osmatrac);
      add (rdgCovek);
      rdgRacunar.addItemListener (osmatrac);
      add (rdgRacunar);
      igrac = new Covek (oznaka, tabla);
    }
  } // class ploIgrac

  public Xox () {
    super ("XoX");
    setBounds (100, 100, 300, 200);
    addWindowListener (new WindowAdapter () {
      public void windowClosing (WindowEvent d)
        { if (igra!=null) igra.prekini(); dispose(); }
    });
    add (ploTabla, "Center");
    add (ploPrvi, "West");
    add (ploDrugi, "East");
    Button dugme = new Button ("Nova igra");
    dugme.addActionListener (new ActionListener () {
      public void actionPerformed (ActionEvent d) {
        if (igra != null) igra.prekini ();
        igra = new Igra (tabla, ploPrvi.igrac,
                 ploDrugi.igrac, stanje);
      }
    });
    add (dugme, "South");
    stanje.setFont (font); add (stanje, "North");
    setVisible (true);
  }
  public static void main(String[] varg) { new Xox(); }
}
( почетак)
         
Аутор: Ласло Краус
Е-пошта: kraus@etf.rs

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