2016-12-23 1 views
1

C에서 스네이크 게임을 약간 코딩하고 싶습니다. 게임 매트릭스를 표현하는 가장 좋은 방법이 무엇인지 알고 싶습니다.스네이크 그리드 표현하기

나는 2DArray 사용할 수 있습니다 (벡터 같은 < 벡터 < 지능>>) ​​(예 : 0 아무것도, 1 뱀, 2 벽, 3 음식, ...) 다른 개체를 나타내는 일부 값이 포함되는 에를 다른 한편으로, 나는 그리드를위한 배열을 사용할 수없고, 다른 게임 객체를위한 배수 배열을 사용할 수 있습니다 (예 : 벡터 < Wall>, 벡터 < SnakeTile>, 벡터 < 음식>, ...).

std :: deque를 사용하여 내 뱀을 나타내야할까요?

도움 주셔서 감사합니다.

+1

두 표현이 모두 정확하다고 생각합니다. 격자 모양의 표현은 메모리에서 더 많은 공간을 차지하지만 더 빠릅니다. "게임 개체"표현은 느리지 만 메모리에서 차지하는 공간이 적어서 논리가 더 낫습니다. 그래픽 라이브러리와 게임의 복잡성에 따라 다릅니다. 나는 개인적으로 뱀, 팩맨 등과 같은 간단한 아케이드 게임에 대한 그리드 표현을 선호합니다 ... – Hugal31

+1

@ Hugal31 "게임 개체"가 더 빨라질 수 있습니다. 20x20의 그릴은 O (400) + O (n), n은 객체의 수입니다. 반면에, 당신은 O (42) 개체를 가지고 있습니다. 그래서 내 의견으로는, 해시 맵은 두 가지 장점을 모두 갖는 좋은 옵션입니다. 그리드를 반복 할 필요가 없으며 특정 사례에 액세스하려는 경우 O (1)과 O (log n) 사이에 뭔가가 있습니다. – Stargateur

답변

1

난 당신이 안부, 행 기반 액세스를 제공하는 표준 벡터 래퍼를 쓰기 시작 놈이야 생각 :

template<typename T> 
class Matrix 
{ 
private: 
    std::vector<T> grid; 
    size_t _cols, _rows; 

public: 
    Matrix(const size_t& cols, const size_t& rows) : 
     _cols(cols), _rows(rows), grid(cols*rows); 
    { 
    } 

    T& at(const size_t& col, const size_t& row) 
    { 
     return grid[col + row * _cols]; 
    } 
} 

을하고 당신에게 그리드를 나타냅니다. Type T (또는 클래스)는 셀에 대한 모든 정보를 포함 할 Cell 객체를 나타낼 수 있습니다. 이렇게하면 그리드 데이터가 쉽게 액세스 할 수 있습니다.

Scake가 Grid와 상호 작용하는 방식과 그 룰이 어떻게 될지 생각해야합니다. (뱀이 맞는 곳에서는 과일을 넣을 수 없습니까?) 그럼 당신은 코드에서 이러한 inetractions을 impelent 수 있으며 그리드와 뱀이 infromations (그리고 그들 중 누구)를 교환 해야하는지 결정합니다.

0

충돌에 대해 생각하십시오. 뱀이 스스로 충돌하는지 확인하고 싶습니다. 머리가 움직이는 위치에서 눈금에 액세스하는 것은 일정합니다. 뱀의 몸 전체를 검색하는 것은 아닙니다. 플레이어가 다소 훌륭하다면 어떤 시점에서 뱀은 어쨌든 대부분의 그리드를 채울 것이고 이는 실제로 저장된 메모리가 전혀 없음을 의미합니다.

그러나 다른 작업들 : 뱀이 움직일 때 꼬리를 삭제하고 뱀을 페인팅합니다. 페인팅을 위해 플레이어가 흔들리는 것을 볼 수 있기를 원한다고 가정합니다. 따라서 뱀이 들판을 가로 지르는 순서가 필요합니다. 이것은 뱀의 위치에 대한 큐처럼 들립니다.

우리는 메모리에 대해 이야기했지만, 여기에 관련된 메모리는 무엇입니까? 400 개의 타일은 현대적인 기계에는 아무 것도 없습니다. 그리드 타일에 액세스하는 것보다 읽기 쉽지 않기 때문에 전신을 검색해야하는 것과 관련해서는 여전히 적절합니다.

따라서, 어떻게해야합니까? 충돌을위한 그리드와 뱀을위한 대기열을 나타내는 2D 벡터를 하나 가지고 있습니다. 우리가 음식과 벽에 관해 이야기하고 있다면, 뱀을 제외한 모든 것이 2D 벡터에 저장 될 수 있습니다. 지금 당장 가서 실행하고 문제가 발생하는지 확인하십시오. 최악의 경우, 경험을 쌓을 수 있습니까?