Ласло Краус |
ИР2ОО2/СИ2ОО2 Испит 10. 6. 2013. |
---|
Одговорити концизно (по једна или две реченице) и прецизно на следећа питaња:
а) (Java) Шта ради и чему служи метод run()
класе Thread
?
б) (C#) Да ли кључне речи checked
и unchecked
представљају операторе, односно наредбе и какво дејство производе?
в) (C#) Да ли су уграђени нумерички типови (int
, long
, …) примитивни подаци? Образложити.
Написати на језику Java следећи пакет типова (грешке пријављивати изузецима опремљеним текстовима порука):
Button
) које садржи целобројну вредност, која може да се зада и дохвати. Плочица може да прикаже садржану вредност или да је сакрије приказујући знак "?". Иницијално, плочица крије вредност.
Panel
). Садржи 20 плочица, које креира при свом стварању, поређаних у 4 врсте и 5 колона, и тајмер, који је обавештава о истеку времена. При стварању плочица, табла им постави позадинску боју на белу и онемогући интеракцију са њима. Може да се започне нова игра, да се провери да ли је текућа игра завршена, да се текућа игра прекине (замрзне се стање на табли) и да се табли објави крај играња (трајно се прекида рад тајмера). Приликом започињања нове игре, табла омогући интеракцију са свим плочицама, постави им позадинску боју на белу, поставља њихове садржаје на вредности од 1 до 10 (исту вредност у по две плочице) по случајном редоследу и сакрије њихов садржај. Узастопним притисцима на произвољан пар плочица приказују се и пореде њихови садржаји. Ако су једнаки, позадинска боја им се постави на зелену и онемогући се даља интеракција са њима. У супротном, позадинска боја се постави на црвену и покрене се тајмер у трајању од 1 s. Када тајмер обавести таблу о истеку времена, она сакрије садржај изабраних плочица и постави позадинску боју на белу. Игра је завршена када више нема плочица са сакривеним садржајем.
(20 поена) Написати на језику Java програм који на графичкој корисничкој површи према слици приказује таблу за игру памћења, дугмад (Button
) за контролу игре и индикатор (Label
) трајања игре. Покренута игра не може поново да се покрене док се не прекине или заврши. Прекинута игра не може да се прекине. Док траје игра, употребом тајмера у трајању од 500 ms са понављањем, освежава се садржај индикатора трајања и проверава се да ли је игра завршена.
// Obavestiv.java package igraPmacenja; public interface Obavestiv { void dogadjaj(); }(⇒ почетак)
// Tajmer.java package igraPmacenja; public class Tajmer extends Thread{ private boolean zavrsen, radi, ponavlja; private Obavestiv obav; private long trajanje; public Tajmer(Obavestiv ob, boolean pon) { obav = ob; ponavlja = pon; start(); } public void run() { while (!zavrsen) { try { synchronized (this) { while (!radi) wait(); } sleep(trajanje); obav.dogadjaj(); if (!ponavlja ) radi = false; } catch (InterruptedException g) {} } } public synchronized void meri(long msek) { radi = true; trajanje = msek; interrupt(); notify(); } public void prekini() { radi = false; interrupt(); } public void zaustavi() { zavrsen = true; prekini(); } }
// Plocica.java package igraPmacenja; import java.awt.*; public class Plocica extends Button { private int vr; public Plocica() { sakrij(); } public void postaviVr(int v) { vr = v; } public int dohvatiVr() { return vr; } public void prikazi() { setLabel(""+vr); } public void sakrij() { setLabel("?"); } }
// Tabla.java package igraPmacenja; import java.awt.* ; import java.awt.event.*; public class Tabla extends Panel implements Obavestiv { private static final int brojParova = 10; private Plocica[] plocice = new Plocica[2*brojParova]; private Plocica[] aktivne = new Plocica[2]; private Tajmer tjmr = new Tajmer(this, false); private int brojUparenih; public Tabla() { setLayout(new GridLayout(4, 5)); setEnabled(false); DugmeAkcija dugmeAkcija = new DugmeAkcija(); for (int i=0; i<2*brojParova; i++) { add(plocice[i] = new Plocica()); plocice[i].addActionListener(dugmeAkcija); } } private class DugmeAkcija implements ActionListener { public void actionPerformed(ActionEvent d) { if (aktivne[0] == null ) { aktivne[0] = (Plocica)d.getSource(); aktivne[0].prikazi(); } else if (aktivne[1] == null ) { aktivne[1] = (Plocica)d.getSource(); aktivne[1].prikazi(); if (aktivne[0].dohvatiVr() != aktivne[1].dohvatiVr()) { tjmr.meri(1000); aktivne[0].setBackground(Color.RED); aktivne[1].setBackground(Color.RED); } else { aktivne[0].setBackground(Color.GREEN); aktivne[0].setEnabled(false); aktivne[1].setBackground(Color.GREEN); aktivne[1].setEnabled(false); aktivne[0] = null; aktivne[1] = null; brojUparenih++; } } } } public void novaIgra() { brojUparenih = 0; aktivne[0] = aktivne[1] = null; for (int i=0; i<plocice.length; i++) { plocice[i].postaviVr(i/2+1); plocice[i].setEnabled(true); plocice[i].setBackground(Color.WHITE); plocice[i].sakrij(); } for (int i=0; i<plocice.length; i++) { int j = (int)(Math.random() * plocice.length); int t = plocice[j].dohvatiVr(); plocice[j].postaviVr(plocice[i].dohvatiVr()); plocice[i].postaviVr(t); } setEnabled(true); } public boolean zavrseno() { return brojUparenih == brojParova; } public void dogadjaj() { for(int i = 0; i < aktivne.length; i++) { aktivne[i].setBackground(Color.WHITE); aktivne[i].sakrij(); aktivne[i] = null; } } public void prekini() { setEnabled(false); } public void kraj() { setEnabled(false); tjmr.zaustavi(); } }
// Program.java import igraPmacenja.*; import java.awt.*; import java.awt.event.*; public class Program extends Frame implements Obavestiv { private Tabla tabla = new Tabla(); private Button pocni = new Button("Pocni"); private Button prekini = new Button("Prekini"); private Label tekVreme = new Label(" "); private Tajmer tjmr = new Tajmer(this,true); private long pocetnoVreme; private void krajIgre() { tjmr.prekini(); tabla.prekini(); prekini.setEnabled(false); pocni.setEnabled(true); } public Program() { super("Igra pamcenja"); setSize(200, 200); add(tabla, "Center"); Panel p = new Panel(); add(p, "South"); p.add(pocni); p.add(prekini); p.add(tekVreme); prekini.setEnabled(false); pocni.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent d) { tabla.novaIgra(); tjmr.meri(500); prekini.setEnabled(true); pocni.setEnabled(false); pocetnoVreme = System.currentTimeMillis(); } }); prekini.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent d) { krajIgre(); } }); setVisible(true); addWindowListener(new WindowAdapter() { public void windowClosing(WindowEvent d) { tabla.kraj(); tjmr.zaustavi(); dispose(); } }); } public void dogadjaj() { if (tabla.zavrseno()) krajIgre(); else { long vreme = System.currentTimeMillis(); long proteklo = vreme - pocetnoVreme; tekVreme.setText(""+(proteklo/1000)); } } public static void main(String[] varg) { new Program(); } }
Copyright © 2013, Laslo Kraus
Последња ревизија: 1.7.2013.