2009-08-14 2 views
4

그래서 나는 Hunt the Wumpus을 C++로 작성하고 있습니다. 유일한 진짜 차이점은 12 면체 형태의 동굴에 대해 걱정하지 않는다는 것입니다.Wuntus 사냥 - Room Connection

지금까지 나는 동굴 창조와 영웅, 박쥐, 우렁찬, 구덩이의 무작위 삽입을 구현했습니다.

// Hunt the Wumpus 

#include "std_lib_facilities.h" 
#include "time.h" 

class Room{ 
    bool is_occupied; 
    bool has_wumpus; 
    bool has_bat; 
    bool has_pit; 

public: 
    Room() // default constructor 
    { 
     is_occupied = false; 
     has_wumpus = false; 
     has_bat = false; 
     has_pit = false; 
    } 

    void random_insert(vector<Room>& v); 
}; 

void Room::random_insert(vector<Room>& v) 
{ 
    srand(time(NULL)); 
    int random_room = 0; 
    bool crowded = true; 

    random_room = rand() % 20; // insert hero 
    v[random_room].is_occupied = true; 

    while(crowded) // insert...THE WUMPUS! 
    { 
     random_room = rand() % 20; 
     if(v[random_room].is_occupied) ; 
     else if(!v[random_room].is_occupied) 
     { 
      v[random_room].has_wumpus = true; 
      crowded = false; 
     } 
    } 

    crowded = true; 
    while(crowded) // insert bat 
    { 
     random_room = rand() % 20; 
     if(v[random_room].is_occupied || v[random_room].has_wumpus) ; 
     else if(!v[random_room].is_occupied && !v[random_room].has_wumpus) 
     { 
      v[random_room].has_bat = true; 
      crowded = false; 
     } 
    } 

    crowded = true; 
    while(crowded) // insert pit 
    { 
     random_room = rand() % 20; 
     if(v[random_room].is_occupied || v[random_room].has_wumpus || v[random_room].has_bat) ; 
     else if(!v[random_room].is_occupied && !v[random_room].has_wumpus && !v[random_room].has_bat) 
     { 
      v[random_room].has_pit = true; 
      crowded = false; 
     } 
    } 
} 

vector<Room> create(Room& r) 
{ 
    vector<Room> c; 
    for(int i = 0; i < 20; ++i) 
     c.push_back(r); 
    return c; 
} 

int main() 
{ 
    Room r; 
    vector<Room> cave = create(r); // create cave 
    r.random_insert(cave); // randomly insert things 

} 

나는

그러나, I 등을 해요, 나는 박쥐는 현재의 상황을 출력, 촬영, 임의의 장소에 영웅을 삭제하여 다른 모든 것들을 구현하는거야 방법의 좋은 생각이있어 동굴에서 객실을 무작위로 연결하는 방법을 잘 모릅니다. 나는 벡터에서 일종의 무작위 정렬을 수행하고 방을 포인터로 왼쪽과 오른쪽에 연결하는 것을 고려해 보았습니다.하지만 그것은 동굴이 아닌 긴 복도 일뿐입니다. 어쩌면 좌표계를 만들 수 있을까요? 누구든지 추천 사항이 있습니까? 감사.

+0

질문과 관련이 없지만 생성자에 대한 초기화 프로그램 목록을 사용하는 것이 더 빠르고 안전합니다. – jkeys

+0

나는 속도에 대해 정말로 염려하지 않는다. 나는 이미 그것을 끝냈지 만, 어쨌든 그것을 바꿀 것이다. – trikker

답변

3

간단한 해결책은 출구가 3 개 미만인 방을 선택하고 임의의 방에 연결하는 것입니다 (물론 이중 연결을주의하십시오). 출구가 3 개 미만인 객실이 없으면 종료하십시오. 20 개 정도의 객실 만 있으면 구현 속도가 중요하지 않습니다.

편집 :지도의 일부가이 방법으로 나머지 부분과 "잘 리거나"하나의 복도로 연결될 가능성이 있습니다. "긴 복도"로 시작하고 다음에 위의 알고리즘을 적용하여 이것이 발생하지 않도록 할 수 있습니다.

+0

이 방법을 사용하여 각 방이 정확히 3 개의 출구로 끝나면 12 면체 모양이 부작용이됩니다. –

+0

그러나 실제 연결을 어떻게 처리해야합니까? 포인터? 또는 1, 2, 3 번 출구에 방 데이터 멤버를 지정하고 할당해야합니까? – trikker

+0

지금은 exit 데이터 멤버가 int 유형이고 그런 식으로 할당하는 것을 가지고 놀고 있습니다. 출구에 대한 특정 데이터가 필요할 때 나는 동굴 [출구]에 대해서만 묻습니다 – trikker

0

꽤 복잡한 알고리즘을 사용할 수 있습니다. 나는 달성하기 위해 Drunkard 's Walk 알고리즘을 사용하는 Java에서 random maze generator을 만들었습니다. 효과적으로 모든 단일 그리드 위치를 한 번 반복하면 그 위치에 방을 생성 할 때 인접한 임의의 인접한 위치에 방을 배치하기 시작합니다. 이전 위치에 인접한 새 공간을 만들 수 없을 때까지 계속 진행 한 다음 사용 가능한 다음 그리드 공간으로 반복합니다. 이것은 약간 복잡하지만 잘 작동합니다. 그것을 이해하는 가장 좋은 방법은 그 미로 생성기를 실행 시켜서 당신을 연결시키고, 미로 생성을 보는 것입니다. 당신은 그것을 빨리 이해해야합니다.

또 다른 해결책은 실제 위치에 해당하는 2D 그리드에 모든 방을 저장하는 것입니다. 그런 다음 각 그리드 공간을 반복하고 인접한 룸에 포인터를 무작위로 할당하십시오. 일부는 4 개의 연결을 가지며, 일부는 3, 2 또는 1 (최소 1)을 갖습니다. 나는 각 방에 방 * 북쪽, 방 * 동쪽, 방 * 남쪽, 방 * 서쪽 변수 그룹을 줄 것이고, 그 중 하나라도 없다면 벽이 있음을 의미한다.