30 lipca 2015

Generator rzutów koścmi (java)



Na własne potrzeby napisałem kawałek kodu javy, który symuluje rzuty kostkami. Głowna zasada, która mi przyświecała – wywołanie musi być łatwe w użyciu i rozszerzalne.

Standardowo w takich wypadkach tworzymy klasę użytkową ze statycznymi metodami.  W takim wypadku wywołanie wygląda tak:


1
int diceRoll= Dice.k6()


Jest ok, ale nie jest świetne - trudno przypisać odgórnie rodzaj kostki do obiektu wymagającego kostkę zanim nastąpi test.

Wykorzystałem w takim razie możliwość stworzenia enum-a w javie. Sposób wywołania trochę się zmienił:


1
int diceRoll = Dice.k6.roll();

Dodatkowo łatwo zapamiętać w dowolnym obiekcie jakiego rodzaju kości obsługuje.


1
objWithDice.setDice(Dice.k6);

W efekcie powstał enum wywołujący rzuty kością przez refleksję metod klasy ze statycznymi metodami.


Poniżej kod enuma:


 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
enum Dice {

    k4("k4"), k6("k6"), k8("k8"), k10("k10"), k12("k12"), k100("k100");
    private Logger log = Logger.getLogger(Dice.class.getName());
    private String rollType;

    Dice(String rollType) {
        this.rollType = rollType;
    }

    public int roll() {
        try {
            Method m = Dices.class.getDeclaredMethod(rollType);
            m.setAccessible(true);
            return (Integer) m.invoke(Dices.class);
        } catch (IllegalAccessException | IllegalArgumentException |
                InvocationTargetException | NoSuchMethodException | SecurityException ex) {
            log.log(Level.SEVERE, "Blad losowania dla " + rollType, ex);
        }
        return -1000;
    }
}

klasy, która zawiera rzuty kostką:


 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
public class Dices {

    private Dices() {
    }

    public static int k4() {
        int min = 1;
        int max = 4;
        return roll(min, max);
    }

    public static int k6() {
        int min = 1;
        int max = 6;
        return roll(min, max);
    }

    public static int k8() {
        int min = 1;
        int max = 8;
        return roll(min, max);
    }

    public static int k10() {
        int min = 1;
        int max = 10;
        return roll(min, max);
    }

    public static int k12() {
        int min = 1;
        int max = 12;
        return roll(min, max);
    }

    public static int k20() {
        int min = 1;
        int max = 20;
        return roll(min, max);
    }

    public static int k100() {
        int min = 1;
        int max = 100;
        return roll(min, max);
    }

    private static int roll(int min, int max) {
        return new Random().nextInt((max - min) + 1) + min;
    }
}

 oraz testu użycia:


 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
public class TestUtils {
    private static Logger log = Logger.getLogger(TestUtils.class.getName());
    public static void main(String[] args) {
        int k4= Dice.k4.roll();
        log.log(Level.INFO, "test k4 :" + k4);
        int dice2k6 = Dice.k6.roll() + Dice.k6.roll();
        log.log(Level.INFO, "test 2k6 :" + dice2k6);
        int dice2k10 = Dice.k10.roll() + Dice.k10.roll();
        log.log(Level.INFO, "test 2k10 :" + dice2k10);
    }
}


Działa dobrze, jest łatwe w użyciu i bez problemu można dodać kolejne kości, gdyby ktoś potrzebował.

Do podświetlenia składni użyłem: http://hilite.me/.
Projekcik napisany w Javie w najlepszym dostępnym środowisku programistycznym: IntelliJ IDEA 14

27 lipca 2015

Tuts+

Przeglądając neta znalazłem świetną stronę: http://gamedevelopment.tutsplus.com/ i tak się zacząłem zastanawiać - ile czasu zajmie mi przeczytanie, nie mówiąc o wykorzystaniu, interesujących mnie tematów, które tam znalazłem...

23 lipca 2015

zastój

Ponownie zastój na blogu.
Zajmowałem się ostatnio rysowaniem rąk  i różnych drobiazgów, a także programowaniem. Jak skończę z programowaniem może pokażę co napisałem. O ile będzie co pokazać.
Niestety nie chce mi się pisać, a i też nie mam o czym.

Kowboj z poprzedniego wpisu nie został ukończony. Poprawiłem mu jedyni broń (opierając się - niczym profesjonalista, heh) na zdjęciu odpowiedniego modelu rewolweru oraz wycieniowałem rękawy koszuli. I tyle. Zdjęcia nie mam :)