Cieľom cvičení šiesteho týždňa je vyskúšať si ďalšiu prácu s poľom a dvojrozmerným poliami.
Poliarka
Budeme programovať triedu Poliarka
rozširujúcu triedu Turtle
, ktorá bude poznať niekoľko užitočných metód na prácu s poliami celých čísel. Na skúšanie práce s objektom triedy Poliarka
nebudeme už používať ObjectInspector
, ale experimentálny kód napíšeme priamo do metódy main
v triede Launcher
. Na zobrazenie obsahu poľa využijeme Arrays.toString
:
int[] pole = ...;
...
System.out.println(Arrays.toString(pole));
Na vytvorenie poľa si môžete vytvoriť metódu, ktorá vytvorí náhodné pole, alebo môžete využiť konštrukciu na vytvorenie poľa spolu s inicializáciou:
int[] pole = {4, 1, 8, 1, 3, 9, 10, 3, 14};
- Pridajte do triedy
Poliarka
metódu priemer
, ktorá vypočíta priemer čísel uložených v poli referencovanom parametrom pole
.
public double priemer(int[] pole)
- Pridajte do triedy
Poliarka
metódu pocetOpakovani
, ktorá vráti, koľko krát sa číslo cislo
opakuje v poli referencovanom parametrom pole
.
public int pocetOpakovani(int[] pole, int cislo)
- Pridajte do triedy
Poliarka
metódu zdvojPole
, ktorá vráti referenciu na novovytvorené pole int
-ov, v ktorom každý prvok poľa bude zduplikovaný. Ak pôvodné pole malo hodnoty {3, 7, 1, 4}
, hodnoty vo vrátenom poli budú: {3, 3, 7, 7, 1, 1, 4, 4}
public int[] zdvojPole(int[] pole)
- Pridajte do triedy
Poliarka
metódu jeNeklesajuce
, ktorá vráti, či prvky v poli referencovanom parametrom pole
tvoria neklesajúcu postupnosť.
public boolean jeNeklesajuce(int[] pole)
Projekt: prepínače (logická hra)'''
Naprogramujte jednoduchú logickú hru pre jedného hráča. Hrá sa na hracej doske, ktorá má 6 x 6 políčok. Na každom políčku je kameň červenej alebo modrej farby. Na začiatku sú farby všetkých kameňov "náhodné". Ťah hráča spočíva v kliknutí na niektorý z kameňov (do niektorého z políčok). Toto kliknutie spôsobí, že každý z jeho susedov (vľavo, vpravo, hore a dole) zmení svoju farbu na opačnú. T.j. ak bol kameň červený, po zmene farby bude modrý a naopak. Hrá sa končí, ak majú všetky kamene rovnakú farbu. Pripomeňme, že kameň, na ktorý sa kliklo, nemení svoju farbu.
import java.awt.Color;
import java.awt.event.MouseEvent;
import sk.upjs.jpaz2.*;
public class PrepinaciaHra extends WinPane {
/**
* Policka hracej dosky
*/
private boolean[][] doska = new boolean[6][6];;
/**
* Indikuje, ci hra bezi (hra konci, ked sa dosiahlo vyherne rozlozenie)
*/
private boolean hraBezi = true;
public PrepinaciaHra() {
this.kresliMriezku();
this.zamiesaj(30);
this.kresliDosku();
}
/**
* Nakresli mriezku
*/
public void kresliMriezku() {
Turtle k = new Turtle();
this.add(k);
for (int i=1; i<6; i++) {
k.setPosition(i*50, 0);
k.moveTo(i*50, this.getHeight());
}
for (int i=1; i<6; i++) {
k.setPosition(0, i*50);
k.moveTo(this.getWidth(), i*50);
}
this.remove(k);
}
/**
* Nakresli farebne kamene na zaklade obsahu policok
* v this.doska
*/
public void kresliDosku() {
// ???
}
/**
* Overi, ci riadok r a stlpec s su platne suradnice
*/
public boolean dobraSuradnica(int r, int s) {
return (r >= 0) && (r<6) && (s >= 0) && (s<6);
}
/**
* Zrealizuje tah, kedy bolo zatlaceny prepinac na policku
* v riadku r a stlpci s
*/
public void tah(int r, int s) {
int[][] smery = {{1, 0}, {0, 1}, {-1, 0}, {0, -1}};
// ???
}
/**
* Vytvori startovacie rozlozenie kamenov tak, ze spravi
* zadany pocet nahodnych prepnuti (tahov)
*/
public void zamiesaj(int pocetMiesani) {
// ???
}
/**
* Vrati, ci v aktualnom stave policok je kresliaca plocha
* jednofarebna
*/
public boolean jeVyherna() {
return false;
}
@Override
protected void onMouseClicked(int x, int y, MouseEvent detail) {
// ???
}
}
Asi nie každé iniciálne nastavenie farieb kameňov vedie k výhernej situácii. Preto na začiatku vytvorte iniciálne nastavenie farieb tak, že vychádzajúc z jednofarebnej konfigurácie hry zrealizujte zadaný počet náhodných ťahov.
Poliarka - ďalšie úlohy
- Pridajte do triedy
Poliarka
metódu indexNajmensieho
, ktorá vráti index políčka v poli referencovanom parametrom pole
, ktorý má najmenšiu hodnotu spomedzi prvkov na indexoch start
a koniec
(vrátane)
public int indexNajmensieho(int[] pole, int start, int koniec)
- Pridajte do triedy
Poliarka
metódu vymen
, ktorá v poli referencovanom parametrom pole
navzájom vymení obsah políčok na zadaných indexoch.
public void vymen(int[] pole, int idx1, int idx2)
- Pridajte do triedy
Poliarka
metódu zahada
, ktorá v poli referencovanom parametrom pole
zrealizuje nasledujúci algoritmus (nech L
je dĺžka poľa):
- v prvom kroku vymení prvok na indexe 0 s prvkom, ktorý je spomedzi prvkov na indexoch
0
až L-1
najmenší
- v druhom kroku vymení prvok na indexe 1 s prvkom, ktorý je spomedzi prvkov na indexoch
1
až L-1
najmenší
- v treťom kroku vymení prvok na indexe 2 s prvkom, ktorý je spomedzi prvkov na indexoch
2
až L-1
najmenší
- a tento postup sa opakuje, až kým sa nedôjde na koniec poľa
Využite metódy
indexNajmensieho
a
vymen
.
public void zahada(int[] pole)
Čo realizuje algoritmus implementovaný metódou zahada
?
- Pridajte do triedy
Poliarka
metódu najcastejsiaHodnota
, ktorá vráti najčastejšie sa vyskytujúcu hodnotu v poli referencovanom parametrom pole
.
public int najcastejsiaHodnota(int[] pole)
- Pridajte do triedy
Poliarka
metódu bezDuplicity
, ktorá vráti referenciu na novovytvorené pole, ktoré vznikne z pôvodného poľa odstránením duplicitných výskytov hodnôt. Pri riešení tejto úlohy zvážte vytvorenie pomocných metód:
- na overenie počtu výskytov zadanej hodnoty v políčkach poľa medzi zadanými indexami (podobne ako to bolo v metóde
indexNajmensieho
)
- na zistenie počtu rôznych hodnôt, ktoré sú uložené v poli
public int[] bezDuplicity(int[] pole)
- Vytvorte metódu, ktorá zadanú vetu (interpunkčné znamienka ignorujte) rozloží na slová (bez využitia metódy
split
objektov triedy String
):
public String[] vetaNaSlova(String s)
Korytnačí futbal s odstraňovaním lôpt
- Doprogramujte do projektu z prednášky odstraňovanie lôpt (lopta sa odstráni, ak na ňu klikneme so zatlačeným klávesom
CTRL
).
Je to to isté? (povinné)
V zdrojových kódoch možno často vidieť takéto if-y:
// p je premenná referenčného typu schopná uchovať referenciu na pole int-ov.
int[] p = ...;
// IF 1
if ((p == null) || (p.length == 0)) {
return 0;
}
// IF 2
if ((p.length == 0) || (p == null)) {
return 0;
}
Cieľom if-ov je vrátiť hodnotu 0, ak je referencia na pole null
alebo pole je nulovej dĺžky. Ktorý z if-ov je správny a prečo?
- IF 1,
- IF 2,
- IF 1 aj IF 2,
- ani jeden.