추천 모바일 게임, Slay

요즘 하는 게임, Slay. 더 넓은 영토로 확장해 나가는 게임. 쉽게 말해 ‘땅따먹기’ 여러가지 생각을 하게 만드는 게임. 재미도 있지만 철학이 있는 게임. 처음 시작은 작은 영토에서 시작하면서 한명. 영역은 곧 자원이고 자원이 늘어날때마다 또 한명이 추가된다. 두명의 힘을 합치면 더 큰 능력을 가진 또 다른 한명이 된다. 그러나 소모되는 자원은 처음보다 3배가 더 필요하다.

사용자 삽입 이미지

일하다가 잠시 쉬면서, 또는 전철에서 하고 나면 머리가 지끈지끈한… 그러나 철학이 있어, 게임 중에도 그리고 끝난 후에도 생각을 하게 만드는 그런 좋은 게임. 화려함은 없고 규칙은 단순하며 삶에서 일어나는 것들을 어느 정도 투영하고 있는 게임, Slay. 개발자로써 이런 게임하나 만들어 보고 싶은 생각이 드는 게임이다. 정해진 시간 안에 끝내는 것이 아닌지라 천천히 생각해 가면서 결정하면 되는 신중하게 진행할 수 있는 기다릴 줄 아는 게임이다.

처음 확장을 위해 좋은 곳에 터를 잡아야 한다. 터가 나쁘면 아무리 뛰어난 능력이 있을지라도 확장하기 불가능하다. 다행히 이 게임은 처음 시작할 때 여러 개의 터를 제공한다. 여러 개의 터 중에 좋은 터 하나를 잘 선택해야 한다. 가능하다면 여러개의 터를 이어서 빨리 확장할 수 있다면 좋을 것이다.

처음 시작할때 각 터에는 단 한명의 사람이 있다. 이 사람은 별다른 능력이 없는 일반 시민이다. 터의 범위를 확장해 나가면 새로운 시민이 하나 추가되는데, 가능하다면 이 두 사람을 합쳐서 병사로 만든다. 병사는 시민을 죽일 수 있고 건물은 부술 수 있으나 성은 파괴할 수 없다. 성은 수비를 위한 것이다. 성을 만들기 위해서 생산할 수 있는 시민을 희생해야 한다.

병사 2명을 합치면 기사가 되고 기사는 병사와 시민을 죽일 수 있고 건물과 성 모두를 파괴할 수 있다. 기사 2명을 합하면 더 상위의 기사가 만들어지고 이 상위의 기사는 시민, 병사, 기사는 물론 건물, 성을 부술 수 있다. 자기가 죽일 수 없는, 또 부술 수 없는 것의 주위에는 접근할 수 없다는 규칙이 있다.

여기서 조심해야 할 것은 자원이다. 시민은 자원 2가 필요하고 병사는 자원 6이 필요하며 기사는 자원 18이 필요하고 상위 기사는 자원 54가 필요하다. 지원은 영토의 넓이 인데 자원이 부족하면 한 순간에 전멸한다. 이미 소유한 내 영역이라고 안심할 수 있는 것은 아닌데, 이유는 이 영역에 나무가 자라기 때문이다. 나무가 자라는 곳에서는 자원이 나오지 않는다. 계속 확장을 하면서 이미 가지고 있는 영역도 관리를 해야만 한다. 확장에 정신이 팔려 나무를 신경쓰지 않으면 자원 부족으로 전멸할 수 있다. 나무는 생각 이상으로 빠르게 확장해 자란다.

추천하는 이 게임, Slay. 꼭 해보시기 바란다.

[JavaScript] 보다 더 정확한 타입(type)을 얻는 함수

자바스크립트에는 해당 객체값에 대한 타입을 얻는 예약어로 typeof를 지원합니다. 그러나 요놈이 그다지 정확치 않는 녀석인지라 이보다 더 정확한 타입을 얻을 필요가 있을 시에 다음 함수를 사용할 수 있습니다.

function getType(x) {
    if (x == null) {
        return 'null';
    }

    var t = typeof x;
    if (t != "object") {
        return t;
    }

    var c = Object.prototype.toString.apply(x);
    c = c.substring(8, c.length - 1); // [object ?]의 특성을 이용함

    if (c != "Object") {
        return c;
    }

    if (c.constructor == "Object") {
        return c;
    } else {
        var s = x.constructor.toString();
        var i = s.indexOf("(");
        return s.substring(9, i); // function ?( ... 의 특성을 이용함
    }

    return "unknown type";
}

위의 코드에 대한 테스트는 아래와 같습니다.

function CTR(a) {
    this.a = a;
};

document.write(typeof CTR + " , " + getType(CTR));

var c = new CTR(1);
document.write(typeof c + " , " + getType(c));
        
document.write(typeof new Date() + " , " + getType(new Date()));
document.write(typeof new Array() + " , " + getType(new Array()));
document.write(typeof 1 + " , " + getType(1));
document.write(typeof "hi" + " , " + getType("hi"));
document.write(typeof this.document + " , " + getType(this.document));

실행 결과는 다음과 같습니다.

사용자 삽입 이미지

실행결과에 대한 각 라인의 첫번째는 자바스크립트에서 제공하는 typeof를 사용한 것이고 두번째는 보다 더 정확한 타입을 얻을 수 있는 getType 함수를 사용한 것입니다.

[JavaScript] 배열인가, 아닌가?


자바스크립트는 데이터 타입을 명시적으로 지정하는 것이 불가능한 언어이므로, 자바스크립트를 이용해 타 개발자가 사용하는 API를 개발하기 위해서는 API의 견고함을 유지하기 위해 변수의 데이터 타입을 검사하여 API가 받고자 하는 데이터 타입이 아닐 경우 예외 처리를 해주는 것이 필요합니다. 예를 들어서 어떤 함수가 있다고 할때, 이 함수가 어떤 배열을 인자로 받아 배열을 구성하는 원소를 모두 합한 값을 반환하고하 할때를 예로 들어 생각해 보겠습니다.

function sum(a) {
    var isArray = (a instanceof Array);
    var isLikeArray = (a && typeof a == "object" && "length" in a
        && (typeof a.length == "number"))

    if (isArray || isLikeArray) {
        var total = 0;
        for (var i = 0; i < a.length; i++) {
            var element = a[i];
            if (!element) continue;
            if (typeof element == "number") {
                total += element;
            } else {
                throw new Error("Element in array have to be number.");
            }
        }

        return total;
    } else {
        throw new Error("Argument have to be array.");
    }
}

2번 코드는 전달 받은 인자가 완벽한 배열 타입인지를 검사하는 것이고 3, 4번 코드는 인자가 최소한 객체이면서 length라는 프로퍼티를 가지고 있는지를 검사하면서 이 length의 타입이 숫자라는 것까지 검사하고 있습니다.

이제 인자가 배열(또는 배열로 간주할 수 있는 객체)로 판단되므로 이 배열을 구성하는 원소의 합을 구할 수 있는데, 11번 코드에서 배열을 구성하는 원소의 데이터 타입이 숫자일 경우에만 합산을 하고 그렇지 않다면 예외를 던지도록 하고 있습니다. 실제 사용 코드는 다음과 같습니다.

alert(sum([1, 2, 3, 4, 5]));

[Java] ByteBuffer로부터 unsigned int 읽기

자바는 그 창시자로부터 데이터 타입으로 unsigned가 의미가 없다는 판단에 의해 부호가 없는 정수형 데이터 타입을 지원하지 않는 우(?)를 범하였으니… 간혹 자바를 사용하는 개발자가 개고생인지라.. 개고생을 줄이고자 기록을 남깁니다.

long v = ((long)outBb.getInt() & 0xffffffffL);

이 얼마나 비효율의 극악을 달리는 코드인가? unsigned 값의 의도는 음수값을 가지지 않을 경우 적은 바이트수만을 활용하여 그 2배에 해당하는 양(+)의 범위 값을 가지도록 하고자 하는 선의인데, 4바이트의 unsigned int를 저장하기 위해 8바이트를 사용하고 있는 형국입니다.

자바 언어의 창시자인 제임스 고슬링님은 뭐하고 사시는지 살짝 궁금해지네요.. 소녀시대 팬이라는 소문도 있던데.. @_@