2015년 5월 11일 월요일

c, c++ 랜덤함수 사용하여 중복되지 않게 몬스터 배치하기

학교 과제로 mfc 프로그래밍하는데 주제가 2D 로크라이크 게임만들기를 하면서
몬스터 좌표가 겹치지않게 하는 코드를 작성해 보았습니다.

일단 변수와 함수를 선언

//몬스터 랜덤 좌표세팅 함수
void MonsterRandomSet(void);

//몬스터 랜덤 좌표 함수
int MonsterRandomX(void);
int MonsterRandomY(void);

//몬스터 랜덤 좌표 넣기위한 저장 변수
int mrX[18];
int mrY[18];

//랜덤 좌표 중복을 방지하기위한 체크 변수(전체 x값은 0~38, y값은 0~22)
bool mrXCheck[37];
bool mrYCheck[22];


몬스터 좌표 xy 값을 랜덤하게 넣기 위해 함수로 각각 분할했고

//몬스터 x좌표 랜덤 함수
int CMainRoop::MonsterRandomX(void)
{
int x=0;
//좌표 범위는 각 테두리 33픽셀위치에 생성하면 안되므로 랜덤최대값+1
x=rand()%37 + 1;
return x;
}
//몬스터 y좌표 랜덤 함수
int CMainRoop::MonsterRandomY(void)
{
int y=0;
//좌표 범위는 각 테두리 33픽셀위치에 생성하면 안되므로 랜덤최대값+1
y=rand()%20 + 1;
return y;
}


좌표가 중복이 되는지 확인하여 중복되지않게 하기 위해 랜덤세팅 함수를 만들었어요.

//몬스터 좌표 랜덤 세팅함수
void CMainRoop::MonsterRandomSet(void)
{
for(int i = 0 ; i<18 ; i++){
//몬스터 좌표 넣기위한 저장 변수 초기화
mrX[i] = 0;
mrY[i] = 0;
}
for(int i = 0 ; i<38 ; i++){
//좌표 중복을 방지하기위한 체크 변수(전체 x값은 0~38, y값은 0~22) 초기화
mrXCheck[i] = false;
}
for(int i = 0 ; i<22 ; i++){
//좌표 중복을 방지하기위한 체크 변수(전체 x값은 0~38, y값은 0~22)
mrYCheck[i] = false;
}

for(int mrc = 0; mrc<18 ;){
//랜덤으로 좌표값을 구해 임시 변수에 저장한다.
int nTempX = MonsterRandomX();
int nTempY = MonsterRandomY();
//중복 검사 시작 x와 y 값이 false이면
if(mrXCheck[nTempX] == false && mrYCheck[nTempY] == false){
//해당하는 좌표값을 true로 바꾼다.
mrXCheck[nTempX] = true;
mrYCheck[nTempY] = true;
//그리고 몬스터 임시 좌표값 변수에 넣어준다.
mrX[mrc] = nTempX;
mrY[mrc] = nTempY;

//좌표값을 모두 넣기위해 여기서 증감연산을 함.
mrc++;
}
}
}

실제 좌표 넣는 코드

//해당 층의 몬스터가 세팅 되지 않았을때 몬스터 좌표 세팅
if(cMap[player->playerMapCount].mapMonsterSetCheck == false){
//몬스터 좌표세팅 함수 호출
MonsterRandomSet();
for(int i = 0 ; i<18; i++){
//몬스터 좌표가 셋팅되지 않았을 경우
if(cMap[player->playerMapCount].monster[i].monsterSets == FALSE){
//몬스터 좌표세팅 여부 true로 변경
cMap[player->playerMapCount].monster[i].monsterSets = TRUE;
//Sleep(1000);
//랜덤으로 생성한 값에 *33하여 좌표지정. 이미지가 33픽셀이므   로 랜덤 숫자*33하면 해당 좌표값이됨
cMap[player->playerMapCount].monster[i].Point.x = mrX[i]*33;
cMap[player->playerMapCount].monster[i].Point.y = mrY[i]*33;
}
}
//해당 맵의 몬스터 세팅이 완료되었다고 값 변환
cMap[player->playerMapCount].mapMonsterSetCheck = true;

}

댓글 없음:

댓글 쓰기