관리 메뉴

멍개의 연구소

스네이크 게임 알고리즘 본문

컴퓨터 공학(Computer Science & Engineering))/알고리즘

스네이크 게임 알고리즘

멍개. 2017. 4. 29. 21:07

스네이크 게임 알고리즘에 대해서 다뤄보도록 하겠습니다.

스네이크 게임은 뱀을 움직이면서 음식을 먹고 뱀을 키우는 게임입니다.


아래의 알고리즘은 3개의 기능을 구현을 합니다.

1. 뱀 움직이기

2. 음식먹기

3. 뱀 움직이는 정책

  - 우측에서 좌측으로, 위에서 아래로 방향전환이 180도로 안되게 하기


코드는 파이썬으로 작성을 하도록 하겠습니다.


우선 음식을 먹는 것을 판단을 하는 함수를 하나 만들도록 하겠습니다.

1
2
def is_eat():
    return random.choice([10])
cs

랜던으로 true, false를 줍니다.(실제 게임 구현이 아닌 알고리즘만 구현을 하는 것이기 때문에 위와같이 작성을 해줍니다.)

실제 게임에서는 뱀의 머리가 음식의 좌표에 가있는지로 검사를 해주면 되겠습니다.

먹으면 0을 반환, 먹지 않으면 1을 반환하는 식입니다. 여기서 불리언으로 반환을 하지 않고 int타입으로 반환을 해주는 것이 포인트 입니다. 


1
2
3
4
5
6
7
8
key_position_map = {
    'w': [-10],  # up
    's': [10],  # down
    'a': [0-1],  # left
    'd': [01]  # right
}
 
direction = key_position_map.get('d')
cs


방향키 셋팅입니다. 방향키에 따른 좌표 계산에 필요한 데이터를 저장을 해줍니다.

초기 우측키를 눌러주도록 합니다


1
snake_body = [[23], [13],[12], [11]]
cs

뱀입니다. 뱀의 몸통을 이루는 좌표로 리스트를 만들어 줍니다.


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
while True:
    key = input()
    new_direction = key_position_map.get(key)
 
    if new_direction and direction_check(direction, new_direction):
        direction = new_direction
        snake_head = snake_body[len(snake_body)-1]
 
        new_snake_head = list()
 
        new_snake_head.append(snake_head[0+ direction[0])
        new_snake_head.append(snake_head[1+ direction[1])
 
        snake_body.append(new_snake_head)
 
        eatting = is_eat()
        snake_body = snake_body[eatting:]
        print(eatting, snake_body)
cs

이 부분은 실제 뱀이 움직이고, 음식을 먹었다면 뱀의 길이가 늘어나는 부분입니다.


우선 방향키를 인식을 하면 위에 계산에 필요한 데이터로 계산을 해줍니다. 계산은 뱀의 머리만 계산을 해주고 뱀의 몸통에 push를 해줍니다. 이후 음식을 먹었는지 판단을 해주고 먹었다면 0번째 인덱스부터, 먹지 않았다면 1번째 인덱스부터 뱀의 몸통을 다시 재구성을 해줍니다.


만약 다른 언어라면 <<1(shift 연산)을 해주면 됩니다. 


1
2
def direction_check(dir, new_dir):
    return (dir[0+ new_dir[0]) or (dir[1+ new_dir[1])
cs

direction_check는 방향이 180도 전환인지 확인을 해줍니다.

이전의 key_map데이터와 현재 눌린 key_map데이터를 각각의 좌표값을 더해준 후 or연산을 해주면 180도 전환일 경우 False, 180도 전환이 아닌경우 True가 반환이 됩니다.

'컴퓨터 공학(Computer Science & Engineering)) > 알고리즘' 카테고리의 다른 글

유전 알고리즘  (0) 2017.04.29
탐욕 알고리즘  (0) 2017.04.29
Comments