ITI0011:Aardejaht

Allikas: Kursused
Mine navigeerimisribale Mine otsikasti

Tagasi kursuse lehele

Info

10. veebruar:

  • Lisatud põhiosa mall.
  • Aarete loendamine ruudu ümbruses läks põhiosast 1. lisaosa alla.

Ülesanne

Xena on just lõpetanud pika sõjakäigu ning saabunud äsjavallutatud piirkonda. Selleks, et piirkond üles ehitada, on vaja kulda. Xena oli kuulnud jutte, kuidas piirkonnas olevat juba ammusest ajast palju varandust maa alla peidetud (arvatavasti mõne vana hõimkonna komme). Kaalunud võimalust tööga raha teenida, otsustab Xena hakata kulda maapõuest otsima. Kuna aga kulla otsimine konkreetselt alalt võtab aega, ei tahaks ta kogu ala läbi kaevata. Eesmärk oleks kogu kuld piirkonnas kokku koguda võimalikult väikese vaevaga.

Aardejaht on ühe mängija mäng, kus tuleb võimalikult kiiresti (väheste "kaevamiste" arvuga) leida üles kõik aarded.

Mäng toimub M x N (M rida, N veergu) laua peal, kus igas lahtris (edaspidi "ruudus") võib olla aare. Kõik ruudud on algselt mängija eest peidetud ehk siis mängija ei tea, kas ruudu all on aare. Kui mängija valib ühe ruudu, siis see ruut avatakse. Mäng kestab seni, kuni kõik aarded on üles leitud. Mängu jooksul avatud ruutude summa on mängija "aeg" - mida väiksem see number on, seda parem. Mängulauale peidetud aarete kogus on teada.

Põhiosa (4p)

Nõuded:

  • mängijalt küsitakse mängulaua suurus (M ja N)
  • mängijalt küsitakse aarete kogus (X)
  • programm genereerib M x N kaardi, mille peal on juhuslikult paigutatud X aaret
  • kasutaja valib ruudu (rida, veerg), mis tuleb avada
  • mängijale kuvatakse jooksvalt leidmata aarete kogus, kasutatud avamiste kogu ja mängulaud peale igat käiku.
  • kui kõik aarded on leitud, küsib programm, kas mängija tahab uuesti mängida.

Näide:

Sisesta M (ridade arv), N (veergude arv), X (aarete arv): 3, 3, 3

Edukat kaevamist!

...
...
...
kaevamisi: 0, aardeid jäänud: 3
Mida kaevame (rida, veerg): 0, 0

 ..
...
...
kaevamisi: 1, aardeid jäänud: 3
Mida kaevame (rida, veerg): 0, 1

  .
...
...
kaevamisi: 2, aardeid jäänud: 3
Mida kaevame (rida, veerg): 1, 1

  .
.+.
...
AARE!

kaevamisi: 3, aardeid jäänud: 2
Mida kaevame (rida, veerg): 2, 1
(1,0 pole mõtet kaevata, kuna 0,0 ümbruses oli üks aare ja see paikneb 1,1 ruudul)

  .
.+.
. .
kaevamisi: 4, aardeid jäänud: 2
Mida kaevame (rida, veerg): 2, 2

  .
.+.
. +
AARE!

kaevamisi: 5, aardeid jäänud: 1
Mida kaevame (rida, veerg): 2, 0

  .
.+.
+ +
AARE!

kaevamisi: 6, aardeid jäänud: 0

Mäng läbi! Kokku tehti 6 kaevamist.
Kas soovid veel mängida?

Põhiosa mall

<source lang="java">

/**

* Template for HW01: Treasurehunt.
* More information:
* https://courses.cs.ttu.ee/pages/ITI0011:Aardejaht
*/

public class HW01 {

   /**
    * Value to return in makeMove in case
    * the cell was empty.
    */
   public static final int CELL_EMPTY = 0;
   /**
    * Value to return in makeMove in case
    * the cell contained treasure.
    */
   public static final int CELL_TREASURE = 1;
   /**
    * Value to return in makeMove in case
    * the cell does not exist.
    */
   public static final int CELL_ERROR = -1;


   /**
    * Main entry.
    * @param args Command-line arguments.
    */
   public static void main(String[] args) {
       // game logic here
   }
   /**
    * Makes move to cell in certain row and column
    * and returns the contents of the cell.
    * Use CELL_* constants in return.
    * @param row Row to make move to.
    * @param col Column to make move to.
    * @return Contents of the cell.
    */
   public static int makeMove(int row, int col) {
       if (row == -1) return CELL_ERROR;
       return CELL_EMPTY;
   }
   /**
    * Creates a map with certain measures and treasures.
    * As this is a static method which doesn't return anything (void),
    * you should store the created map internally.
    * This means you can choose your own implementation of how to store
    * the map.
    * The treasures should be put on the map randomly using setCell method.
    * @param height Height of the map.
    * @param width Width of the map.
    * @param treasures The number of treasures on the map.
    * @return Whether map was created.
    */
   public static boolean createMap(int height, int width, int treasures) {
       // initialize map (for example 2D-array)
       //   - set all cells empty (is this needed?)
       // do some random for every treasure and add them to map:
       setCell(2, 3, CELL_TREASURE);
       if (height == -3) return false;
       return false;
   }
   /**
    * Sets the cell value for the active map (created earlier using
    * createMap method).
    * This method is required to test certain maps
    * @param row Row index.
    * @param col Column index.
    * @param cellContents The value of the cell.
    * @return Whether the cell value was set.
    */
   public static boolean setCell(int row, int col, int cellContents) {
       if (row == -123) return false;
       return false;
   }

}

</source>

Lisaosa: kaardi avamine (1p)

Kaardi avamine minesweeperi moodi.

Kui avada ruut, mille ümbruses on 0 aaret, avada järjest kõik ruudud, mis samamoodi sisaldavad väärtust 0. Iga sellise 0 väärtusega ruudu ümbert avatakse kõik 8 ruutu.

Nõuded:

  • kui mängija satub 0 väärtusega ruudu peale, avatakse kogu tühi ala eelnevalt kirjeldatud loogika alusel.
  • kui avatud ruudus ei ole aare, siis näidatakse välja number, mitu aaret on selle ruudu kõrval olevates ruutudes (iga ruudu küljes võib maksimaalselt olla 8 aaret).

Lisaosa: edetabel (1p)

Parimad tulemused jäätakse meelde koos nimega. Erinevate mänguseadete jaoks (laua suurus, aarete arv) on erinev edetabel. Meeles hoitakse kuni 10 parimat tulemust. Mängijal on võimalik jooksvalt vaadata edetabelit.

Nõuded:

  • kui mäng lõppeb tulemusega, mis mahub edetabelisse (on parem kui praegu edetabelis 10. kohal olev tulemus), küsitakse mängijalt nimi
  • mängija nimi peab sisaldama vähemalt 3 sümbolit ja maksimaalselt 20 sümbolit
  • saadud nimi salvestatakse mällu (faili salvestamist pole vaja teha)
  • kui tulemus satub mõne eelnevalt saadud tulemuse ette, siis kõik praegusest tulemusest kehvemad tulemused nihutatakse ühe koha võrra edasi.
  • kui tulemus kattub (on võrdne) mõne olemasoleva tulemusega, siis uus tulemus läheb vanast tulemusest kehvemale kohale (kui näiteks edetabelis on 2. kohal tulemus 100 ja mängija saab tulemuseks 100, siis uus tulemus läheb 3. kohale).
  • edetabel kuvatakse välja nii, et tulemused on üksteise all joondatud paremale (vt näidet)
  • edetabelit on võimalik "puhastada"

Näide:


käik (rida, veerg) või käsk: edetabel

Edetabel seadetega 10x10, 5
1. ago           6
2. ago          16
3. agooooooo    92

käik (rida, veerg) või käsk: puhasta

Edetabel seadetega 10x10, 5 puhastatud

Lisaosa: aardeotsimise MM (1p)

Mängitakse 5 mängu, iga mäng läheb raskemaks (laud suureneb ja/või aarete arv väheneb).

Nõuded:

  • Mängija mängib järjest 5 mängu
  • iga mängu kohta kehtivad muudes punktides määratud reeglid
  • mängija kasutatud käigud summeeritakse kokku
    • kui on realiseeritud edetabeli lisaosa, on MM-i jaoks eraldi edetabel

Lisaosa: soe-külm variant (1p)

Variatsioon mängust, kus mängija saab ruudu avamise korral informatsiooni lähedal oleva aarde kohta. Kui avatud ruudu all ei ole aare, antakse mängijale lähima aarde kaugus antud ruudust.

Nõuded:

  • selle variatsiooni puhul kaardi avamist (vt eraldi lisaosa) ei toimu
    • kui realiseeritud on kaardi avamise lisaosa, siis mängija saab mängu alguses valida, kumba varianti ta mängida tahab.
  • kui avatava ruudu all aaret pole, antakse mängijale üks number, mis näitab, kui kaugel on kõige lähemalolev aare.
  • avatud ruudud jäävad avatuks (ruudule on märgitud ümardatud kaugus lähima aardeni).

Mall

Siia tuleb mall, mille saab aluseks võtta.