package příklady;

import rup.česky. společně.P;
import rup.česky.tvary.IMultiposuvný;
import rup.česky.tvary.Kruh;
import rup.česky.tvary.Multipřesouvač;

import java.util.Random;


/*******************************************************************************
 * Třída Molekuly_10a slouží k ...
 *
 * @author    jméno autora
 * @version   0.00.000,  0.0.2003
 */
public class Molekuly extends Kruh implements IMultiposuvný
{
//== KONSTANTNÍ ATRIBUTY TŘÍDY =================================================

    /* Minimální rychlost pohybujících se molekul. */
    private static final int MIN_RYCHLOST = 50;

    /* Maximální rychlost pohybujících se molekul. */
    private static final int MAX_RYCHLOST = 500;

    /* Rozdíl mezi maximální a miniální rychlostí pro generování
     * náhodných rychlosti. */
    private static final int MM_RYCHLOST = MAX_RYCHLOST - MIN_RYCHLOST;

    /* Velikost kroku aktivního plátna (konstatnu AP třída dědí po rodičích. */
    private static final int KROK = AP.getKrok();

    /* Maximlální vodorovná souřadnice molekuly -
     * má-li molekula zůstat celá na plátně,
     * musí mít souřadnici o KROK menší ne maximální šířka plátna. */
    public static final int MAX_X = (AP.getŠířka() - 1) * KROK;

    /* Maximlální svislá souřadnice molekuly. */
    public static final int MAX_Y = (AP.getVýška() - 1) * KROK;

    /* Společný generátor  náhodných čísel. */
    private static final Random RND = new Random();

    /* Multipřesouvač starající se o přesuny všech molekul. */
    private static final Multipřesouvač MP = Multipřesouvač.getInstance();


//== PROMĚNNÉ ATRIBUTY TŘÍDY ===================================================
//== KONSTANTNÍ ATRIBUTY INSTANCÍ ==============================================
//== PROMĚNNÉ ATRIBUTY INSTANCÍ ================================================
//== PŘÍSTUPOVÉ METODY VLASTNOSTÍ TŘÍDY ========================================
//== OSTATNÍ METODY TŘÍDY ======================================================

    /***************************************************************************
     * Zeptá se uživatele, jak dlouho má simulace náhodného pohybu molekul 
     * běžet, a pak ji na zadanou dobu spustí.
     */
    public static void sekundBěhu()
    {
        int sekund = P.zadej( "Kolik sekund mají molekuly běžet", 5 );
        start5();
        int milisekund = 1000 * sekund;
        P.čekej( milisekund );
        System.exit( 0 );
    }
    
    

//##############################################################################
//== KONSTRUKTORY A TOVÁRNÍ METODY =============================================

    /***************************************************************************
     * Bezparametrický konstruktor vytvoří instanci ve středu plátna a
     * zavolá metodu přesunuto, čímž odstartuje opakovaný přesun.
     */
    public Molekuly()
    {
        super( MAX_X / 2,  MAX_Y / 2,  KROK );
        AP.přidej( this );
        přesunuto();
    }


//== PŘÍSTUPOVÉ METODY VLASTNOSTÍ INSTANCÍ =====================================
//== PŘEKRYTÉ METODY IMPLEMENTOVANÝCH ROZHRANÍ =================================

    /***************************************************************************
     * Nastaví novou náhodnou pozici a rychlost a požádá multipřesouvač,
     * aby ji tam přesunul.
     */
    public void přesunuto()
    {
        int x = RND.nextInt( MAX_X );
        int y = RND.nextInt( MAX_Y );
        int r = MIN_RYCHLOST + RND.nextInt(MM_RYCHLOST);
        Multipřesouvač mp = Multipřesouvač.getInstance();
        mp.přesuň( this, x, y, r );
    }

//== PŘEKRYTÉ ABSTRAKTNÍ METODY RODIČOVSKÉ TŘÍDY ===============================
//== PŘEKRYTÉ KONKRÉTNÍ METODY RODIČOVSKÉ TŘÍDY ================================
//== NOVĚ ZAVEDENÉ METODY INSTANCÍ =============================================
//== SOUKROMÉ A POMOCNÉ METODY TŘÍDY ===========================================
//== SOUKROMÉ A POMOCNÉ METODY INSTANCÍ ========================================
//== VNOŘENÉ A VNITŘNÍ TŘÍDY ===================================================
//== TESTY A METODA MAIN =======================================================

    /***************************************************************************
     * Testovací metoda vytvoří 5 instanci a "pustí je do světa".
     */
    public static void start5()
    {
        AP.setMřížka( false );
        new Molekuly();
        new Molekuly();
        new Molekuly();
        new Molekuly();
        new Molekuly();
    }


}

