2012-02-29 4 views
1

JS 연습을위한 재미있는 프로젝트로 MUD를 만들려고 노력하고 있습니다. (나는 멍청한 놈이지만 codecademy에서 더 많은 것을 배우기 위해 영감을 받았습니다!) 나는 내 감옥을 대표하는 방법에 대한 조언을 얻을 수 있기를 바랬습니다. JS. 내 던전에 대해하고 싶은JavaScript에서 던전을 표현하고 몬스터로 채우는 가장 좋은 방법은 무엇입니까?

기능은 다음과 같습니다

  1. 던전 (지정된 매개 변수 내에서) 객실
  2. 객실은 자동으로 괴물로 채워야의 임의의 숫자를해야
  3. (우리

JS가 OO 언어 인 것을 보는 것으로 나는 던전을 표현하는 가장 좋은 방법은 객체라고 생각했다 :

var dungeon = { 
    var room1:roomA, 
    var room2:roomB, 
    var room3:roomC 
} 

//RoomX is an object created with the following constructor 

function Room(){ 
    this.description: "Some text", 
    this.monsters:[monster1,monster2,monster3], 
    this.treasure:[treasure1,treasure2,treasure3] 
} 

플레이어가 룸의 물건과 상호 작용할 수 있도록 Room 개체의 메소드를 만드는 것이 계획입니다.

질문 :

1) 좋은 생각인가요?/효과가 있습니까?

2) 개체의 임의의 속성 수를 어떻게 생성합니까?

감사합니다.

답변

3

일반적으로 나에게 좋은 생각처럼 들리지만 던전에 대한 설명은 실제로 이해가 가지 않습니다. 던전을 개체로 만들 수 있습니다. 귀하의 예는 거의 맞다하지만 당신은 그와 같이, var 제거해야합니다

var dungeon = { 
    'room1': roomA, 
    'room2': roomB 
    ... 
} 

dungeon.room1를 통해 액세스 할 수 있습니다, 또는 dungeon['room1']

그러나 불필요의 임의의 숫자를 생성하기 위해 복잡 할 것 이것을위한 방. 마지막 요소를 가져 와서 끝에서 숫자를 가져와 하나씩 늘리고 다른 방을 추가해야합니다. 대신에 대해 당신이 던전을 정의하는 방법

은 배열이 객실의 난수를 생성하는 것보다 간단합니다 : 룸에 대한

//This generates a random number between min and max 
var rand = Math.floor(Math.random() * (max - min) + min); 

var dungeon = new Array(rand); 

for (var i = 0; i < dungeon.length; i++) { 
    //This depends on how do you want to generate random rooms 
    dungeon[i] = randRoom(); 
} 

생성자는 완전히 정확하지 않습니다.

function Room(){ 
    this.description = "Some text"; 
    this.monsters = [monster1,monster2,monster3]; 
    this.treasure = [treasure1,treasure2,treasure3]; 
} 

이과 같이 초기화한다 : 나는 다시 작성했다면 그 적절한 자바 스크립트가 될 것

var room = new Room(); 

그리고 당신은 모든 필드에 액세스 할 수 있습니다

room.description // returns "Some text" 
room.monsters // returns [monster1,monster2,monster3]; 

: 있습니다 객체 리터럴을 사용하여 객체를 만들 때 사용 된 {} 첫 번째 예제에서와 같이. 생성자로 정의 된 객체의 경우 =을 사용합니다.

+0

아하 그렇습니다. 나는 이해한다고 생각합니다. 나는 객체 리터럴과 생성자 표기법을 혼합하고 있었다. 내가'var'을 사용하는 이유는 각 방을 내가 아직 만들지 않은 getter 함수를 통해서만 접근 할 수있는 private 속성으로 만드는 것이었기 때문입니다. 그것은이 프로젝트에 너무 과장 될 수 있습니다. –

+0

실제로 주제를 조금 더 읽고 나니 실제로는 생성자를 사용하고 객체 리터럴은 사용하지 않는 private vars를 만들 수있는 것처럼 보입니다. –

+0

예, 그렇다고 생각합니다. http://javascript.crockford.com/private.html에서 이에 대한 많은 정보가 있습니다. – mck

3

이것은 상당히 개방적인 질문입니다.이 방법은 모두 "똑같이"똑같이 할 수 있습니다. 그러나 점 몇 :

개체 리터럴 구문이 유효하지 않습니다 - 그것은 다음과 같습니다 있도록 당신이 당신의 속성 이름에서 var 키워드를 제거해야합니다

var dungeon = { 
    room1:roomA, 
    room2:roomB, 
    room3:roomC 
} 

하지만 난 당신이 더 나은 것 같아요 방의 배열과 함께 :

var dungeon = [ roomA, roomB, roomC ]; 

그 다음 당신은 쉽게 방의 수를 바꿀 수 있기 때문에. 무작위로 방을 생성한다고 가정하면 dungeon.push(new Room())으로 새 방을 쉽게 배열에 추가 할 수 있습니다. 그렇게 당신의 객실은 일반 그리드에있을 것이다 발생하는 경우

또한,이를 나타내는 배열의 배열을 사용하는 것 같아서 :

오른쪽 중간 방은 다음과 같이 액세스 할 것 같은 것을
var dungeon = [ [ roomA, roomB, roomC ], 
       [ roomD, roomE, roomF ], 
       [ roomG, roomH, roomI ] ]; 

dungeon[1, 2] (행 1, 열 2, 배열 인덱스는 0을 기준으로 함). 함수 내에서

과제 구문은 잘못된 것입니다 : 당신은

this.propertyName = someValue; 
// NOT 
this.propertyName : someValue; 

콜론 :가 객체 리터럴 { property : value } 구문 속성 생성에 사용되는 말할 필요하지만, 등호는 = 다른 과제 variableOrProperty = value에 사용되는 서명합니다.