디자인 패턴 - 상태 머신

코드를 작성하다가

상태 머신을 구현해야할 필요가 있었다.

언젠가 수업에서 배운적이 있지만, 제대로 기억이 안나

정리를 하게 됐다.

상태 머신 (State machine)

image.png
<위키 백과>

유한 상태 기계(finite-state machine, FSM) 또는 유한 오토마톤(finite automaton, FA; 복수형: 유한 오토마타 finite automata)는 컴퓨터 프로그램과 전자 논리 회로를 설계하는데에 쓰이는 수학적 모델이다. 간단히 상태 기계라고 부르기도 한다. 유한 상태 기계는 유한한 개수의 상태를 가질 수 있는 오토마타, 즉 추상 기계라고 할 수 있다. 이러한 기계는 한 번에 오로지 하나의 상태만을 가지게 되며, 현재 상태(Current State)란 임의의 주어진 시간의 상태를 칭한다. 이러한 기계는 어떠한 사건(Event)에 의해 한 상태에서 다른 상태로 변화할 수 있으며, 이를 전이(Transition)이라 한다. 특정한 유한 오토마톤은 현재 상태로부터 가능한 전이 상태와, 이러한 전이를 유발하는 조건들의 집합으로서 정의된다. - 위키백과


다시 한번 정의

상태 기계는 상태 머신이라고도 부른다.

상태 머신에서 사용하는 용어들에 대한 설명을 먼저 한다.

상태 머신을 이루는 중요한 요소 현재 상태, 사건, 전이이다.

현재 상태(Current State)란 임의의 주어진 시간의 상태를 칭한다.

머신의 상태는 어떠한 사건(Event)에 의해

한 상태에서 다른 상태로 변화할 수 있으며,

이를 전이(Transition)이라 한다.


장점

상태 머신은 복잡한 문제를 단순화시킬 수 있다.

즉, 큰 문제들을 여러 개의 작은 문제들로 나눈다.

그래서 작은 문제에 집중할 수 있고,

프로그램이 동작하는 프로세스를 한 눈에 볼 수 있었다.


예시

나같은 경우, 로봇에 상태머신을 적용하였다.

상위 레벨에서 로봇의 상태를 체크, 관리, 상태에 따른 동작을 수행하도록 하였다.

로봇이 목적지 A까지 이동을 하여야한다.

보통 정상적으로 목적지에 도착하지만,

여러 이유로 멈춘다.

목적지에 장애물이 있다던가

벽에 부딛혔다던가

배터리가 떨어졌다던가

여러 가지 상태에 따라 특정한 동작을 수행하도록 하였다.

이렇게 상태에 따른 동작을 하게 해서

큰 문제를 작게 나눠서 풀 수 있었다.

즉,

상태 A에서 상태 B로 가는 event를 정의한다.

그 이벤트가 발생했을 때, 상태를 A에서 B로 바꾸고,

그에 따른 특정 함수를 실행한다.

그래서, 초기 상태에서 목적 상태로 갈 수 있도록 한다.


코드 작성을 위한 참고 링크

참고한 블로그가 있든데

http://boycoding.tistory.com/110
http://icecola89.blogspot.kr/2016/05/c.html

디자인 패턴 중에 상태 머신 패턴이 있다.
(디자인 패턴이란 자주 나오는 문제들을 보다 쉽게/효율적으로 해결할 수 있는 코드/아키텍쳐 디자인을 말한다.)

상황에 맞는 적절한 디자인패턴을 활용하여 코드를 작성하는 것은 코드를 보기좋고 유지관리하기에 좋다.

상태 머신 패턴을

단순히 하나의 쓰레드에서 동작시킬 것인지,

멀티 스레드 환경에서 동작하는지에 따라

고려할 것도 많고 구현할게 많아 귀찮을수있다.

나 같은 경우는 하나의 쓰레드에서만 해도 충분했다.

추후 멀티스레드 환경에서 구현하는 것도 해봐야겠다.


This page is synchronized from the post: ‘디자인 패턴 - 상태 머신’

[영화] 허리케인 하이스트, 목숨 10개

image.png

최악의 허리케인이 급습한 도시.대피령이 내려진 텅 빈 도시에 미 연방 재무부 금고를 노리는 범죄 조직이 나타난다. 이들은 가장 안전한 지역인 태풍의 눈을 이용한 범죄 계획을 세운다.한편, 범죄 조직에게 인질로 잡힌 형을 구해야 하는 천재 기상학자 ‘윌’과 금고 속에 남겨진 6,500억 원을 지켜야 하는 재무부 특수 요원 ‘케이시’는 돈과 생존을 둘러싼 사투를 시작하는데…태풍의 눈 속으로 질주하라!단 한 번의 기회가 그곳에 있다! - 네이버 영화

태풍
연방 재무부
특수요원
천재 기상학자
수리공 형

다시 설명하자면,
태풍으로 사람들이 다 대피할 때
미국 연방 재무부 금고를 노리는 조직을
기상학자와 형, 요원 한명이 힘을 합쳐 이겨내는 내용입니다.

어울리지 않지만
주인공들은 자연스럽게 만납니다.

영화를 보기 전에 줄거리만 보고 갔을 때,
이게 재난영화인가? 뭐지? 했습니다.
이 영화는 재난과 액션을 잘 섞은 영화입니다.

저는 4D로 영화를 봤는데,
흔들리고 물뿌리고 바람불고 재밌었습니다.


보면서 느낀점

미국의 기상학자는 운동도 잘하는구나 (뛰는 사람은 형입니다.)

image.png

목숨이 한 10개 있으면 해볼 수 있을 방법들로 살아남습니다.

미션 임파서블이 떠오르는군요.

아래 사진에 있는 사람들은 주인공들입니다.

image.png


팝콘과 콜라를 마시며

재밌게 액션을 볼 수 있는 영화였습니다 ㅎㅎ


@roys-market 1회차


This page is synchronized from the post: ‘[영화] 허리케인 하이스트, 목숨 10개’

스팀 기반의 게임 벤치마킹 (Game based on steem, Benchmark)

안녕하세요.

저는 스팀기반의 게임을 만들고있습니다.

스팀파이터!!!!

개발하는와중에 기존의 스팀기반 게임은 뭐가 있을까?

궁금했습니다.

제가 생각하는 스팀 기반의 게임이라 하면

로그인을 스팀으로 한다던가

게임의 보상을 스팀으로 준다던가

게임머니가 스팀이라던가

스팀 api, 스팀의 유저정보를 활용한다던가

이러한 게임들을 스팀기반의 게임이라고 생각합니다.

매력적입니다.


이제 기존의 스팀기반의 게임이 무엇이 있는지 분석해봅시다!

Steemgar

스팀파이터

  • Web game
  • 격투게임
  • 현재 컴퓨터 대전 가능, 개발중
  • 추후 배틀 및 싸이월드 같은 기능 개발 예정
  • 수익모델
    • Steemgar의 수익모델 괜찮아보인다.
    • 고래의 지원 필요, 어떻게? 게임 완성도를 높인 후 찾자
    • utopian을 통한 개발 글 작성
  • 만든다면 Steemgar만큼 충분히 재밌을 것이다.
  • 스팀파이터.oa.to
  • steemfighters.com

image.png

Steempunk

  • 크롬 확장 프로그램으로, 스팀잇 사이트를 들어가면 사이드에 아래 사진처럼 뜬다.
  • 현재 서비스 중
  • MMORPG
  • 비슷한 게임으로는 턴제, 클래시오브 클랜 같은 느낌이다.
  • 유저들이 서로 스팀잇 블로그에 들어가서 전투신청을 해야한다.
    다른 사람들의 블로그에 방문할 수 있게 유도하는 점은 좋아보인다.
  • 하지만 중간의 결과물이 없고 배틀 신청 –> 2시간 후 –> 배틀 결과가 나오는 것으로 보인다.
  • 개인적으로는 재미없다. 지워버림.
  • 스팀펑크 백서
    image.png

Ork Hulk

결론

Steemgar는 잘 만들었다.
스팀이랑 연동도 잘했다.
보상을 주는 방식도 괜찮고, 서비스도 잘 만들었다.

지렁이 게임하고 비슷한데, 관련 오픈소스가 있는걸까?

추가적으로 분석을 해볼만한
이더리움 기반의 게임, 스팀 기반의 게임이 있을 경우,
알려주시면 감사하겠습니다.


This page is synchronized from the post: ‘스팀 기반의 게임 벤치마킹 (Game based on steem, Benchmark)’

[스팀파이터] 개발 과정

안녕하세요.

어제 스팀을 조금 구매하여, 피라미가 됐습니다.

피라미!!! 행복해요~

꾸준히 스팀파이터를 개발하고 있습니다.


소개

스팀파이터는 F.LF2라는 리틀파이터 웹버젼 프로젝트를 기반으로 만들고 있습니다.

사실 게임 자체로는 유명하기도 하고, 완성도가 있다고 생각합니다.

캡처.PNG

제가 한 것은

  • .LF2 기반의 게임 시스템을 활용하고 (랜덤으로 캐릭터가 선택되고, 컴퓨터랑 싸운다.)
  • 스팀을 연동하고 (스팀 로그인, 게임 결과에 따른 보팅)
  • 이제는 추가적으로 난이도 조정을 했습니다. (이길 때마다, 컴퓨터 추가)

이제 시작입니다!!

앞으로는 PvP를 위한 개발을 진행할 것입니다.
먼저, 캐릭터 커스터마이징을 위한 개발을 진행할 것이고
다음으로는 멀티플레이를 위한 개발을 해보고자 합니다.

아래는 완료한 것과 할 것들을 적어봤어요.

완료한 것

  • 스팀커넥트 연동
  • 스팀커넥트로 보팅
  • 관리자가 댓글 달도록 한다.

  • 랭킹 시스템 - 수동 (2018.03.10)

  • 게임을 할수록 난이도 변경 (2018.03.10)
  • 맵 확장, 플레이어 초점 맞추기 (2018.03.10)

할 것

  • 홍보

    • 영어 설명 글 작성

    • 유토피안 글 작성

    • 이벤트 글 작성


  • 피드백 & 본받기

    • 다른 스팀 기반의 게임/서비스 살펴보기

    • 특징점 파악


  • UI

    • 키 설명 페이지

    • 프로젝트 설명 페이지


  • 개발 관련 내용

    • 멀티플레이어 지원

    • 캐릭터 커스터마이징


아직 안해보신분들은 한 번 해보셔요!!

스팀파이터.oa.to
steemfighter.oa.to

위의 링크를 들어가시면 게임을 해볼 수 있습니다.

키는 wsad tyu입니다.

스팀으로 로그인을 한 후, 게임을 하시면

랭킹 안에 포함이 되시고,

주기적으로 랭킹 발표에서 보실 수 있습니다.

또한, @steemfighter로 주기적인 이벤트를 진행할 예정입니다.

많은 관심 부탁드려요~~

감사합니다.


This page is synchronized from the post: ‘[스팀파이터] 개발 과정’

[이벤트 결과 발표] 스팀 기반 격투 게임 "스팀파이터"

안녕하세요.

스팀파이터입니다.

지난 번에 아래 글을 통해 이벤트를 진행했습니다.

https://busy.org/@jacobyu/7

약소한 상금 7SBD를 걸고 했었는데요.

승률이 높은 순으로 5등까지 상금을 드리기로 했습니다!

image.png

결과

유저
승률
횟수
@ryh0505
100%
34
@j-data
94%
135
@sampling
93%
33
@danbain
85%
7
@jacobyu
76%
13
@backjungmin
66%
3

여러 버그, 오류가 있음에도..
이렇게 많이 게임을 해주셔서 너무 감사합니다.

@ryh0505 승률이 100%임에 놀랍습니다.
@j-data님 135판이나 해주셔서 너무 감사합니다.
@sampling님 2판을 지시다니! 아쉽군요. 많은 코멘트 및 버그를 찾아주셔서 감사합니다.
@danbain님 참여해주셔서 감사하고 코멘트도 감사합니다.
@backjungmin님도 정말 감사드립니다!!

5분에게는 약속한 상금을 보내드릴게요.

image.png

image.png

분석 및 유저들의 코멘트

  • 게임결과를 @steemfighter가 자신의 최신글에 작성하도록 하였다.
    그랬더니 총 179개의 댓글이 달렸다 ㅋㅋ

  • [Issue] 게임에 참여하면 최신글에 보팅을 하도록 하였는데,
    총 6명이 참여하였는데, 보팅이 4개만 찍혀있다. 가끔 오류가 있는듯 하다.

  • [Issue] 게임 결과가 제대로 반영이 안된다고도 한다. 확인 필요.

  • 컴퓨터 대전의 경우, 승률로 상금을 거는것 보다는 난이도를 조정하여,
    몇단계까지 깼는지로 하는게 좋아보인다.
    추후, 배틀모드를 개발한다면 승률로 랭킹을 만드는 것도 나쁘지 않다.

  • [Issue] 가끔 게임이 멈춘다.

  • [Issue] 컴퓨터랑 같은 캐릭일 경우, 내가 누군지 모르겠다. –> 비교가능하도록 한다.

  • Bandwith 문제가 있을 줄은 알았는데 생겨버렸다!!

image.png

  • 생각보다 참여율이 저조하다. 왜그럴까?

참여하신분들 정말 감사드리고,
@j-data님은 저보다 게임을 많이하셔서.. ㅋㅋㅋ 오셔서 많은 조언 부탁드립니다.

추후 계획

  • 이벤트 기획 및 꾸준히 하기
  • 여러 문제점 해결
  • 컴퓨터 난이도 상승
  • 맵 추가
  • 캐릭터 커스터마이징
  • 배틀 시스템

앞으로도 꾸준히 서비스를 개발할 예정이며,

종종 이벤트도 하겠습니다.

많은 관심 부탁드리고, 감사합니다.
스팀파이터.oa.to

관련 글


This page is synchronized from the post: ‘[이벤트 결과 발표] 스팀 기반 격투 게임 “스팀파이터” ‘

[Research] 지역 경로 계획 소개, teb local planner

오랜만에 로봇 관련 글을 작성합니다.

저도 공부할겸 작성중입니다.

모바일 로봇의 지역 경로 계획 알고리즘에 대해 소개하고자 합니다.

지역 경로 계획 (Local path planner)

Given a plan to follow and a costmap, the controller produces velocity commands to send to a mobile base.

즉,

  • 목적지
  • 목적지로 가기 위한 전역 경로
  • 주변의 정보 (ex - 쉽게 장애물이 있다)

위의 정보들이 있다고 가정합니다.

이 때, local path planner는 모바일 로봇을 목적지까지 갈 수 있도록 전진, 회전을 명령합니다.


예를 들어, 저는 코엑스에서 영화관을 가야하며 입구에 있습니다.

영화관까지 가기 위한 경로가 전역 경로 (global path)입니다.

이제 영화관까지 움직이는데, 중간중간 사람들도 있고, 갑자기 공사도 하더라고요.

그래서, 전역 경로를 따라 가지만, 사람들을 피해가는 경로도 생성합니다.

이게 바로 지역 경로 (local path)입니다.


여러 지역 경로 계획 알고리즘이 있지만,

좋은 지역 경로 계획 알고리즘 (TEB local planner)을 소개합니다.

TEB(Timed Elastic Band) local planner

> The teb_local_planner package implements a plugin to the base_local_planner of the 2D navigation stack. The underlying method called Timed Elastic Band locally optimizes the robot’s trajectory with respect to trajectory execution time, separation from obstacles and compliance with kinodynamic constraints at runtime.

TEB는 시간, 장애물, 역학적인 제약 등을 고려해서 최적의 지역 경로를 만든다! 라고 되어있습니다.

아래 사진에서 빨간 선은 A지점에서 B지점까지의 경로입니다.

장애물이 3개가 있지만, 경로에 전혀 영향을 주지 않습니다.

그래서 직선 경로를 만든 것을 볼 수 있습니다.

image.png

아래와 같이 장애물을 하나 두었더니, 장애물을 우회하는 경로를 만들었습니다.

두 경로를 만들었지만, 그 중에 더 낫다고 생각하는걸 선택하였고 그 경로가 빨간색입니다.

image.png

장애물 하나를 더 넣어봤습니다.

패스가 여러 개가 생겼는데 그 중에 가장 좋은 패스를 선택하였고

빨간 선입니다.

image.png

경로가 장애물과 가까이 있는 것 같아,

좀 더 우회할 수 있는 경로를 생성하고 싶어졌습니다.

경로를 생성하기 위한 다양한 파라미터가 있지만,

장애물과의 최소 거리 파라미터인 min_obstacle_dist를 0.5m에서 2.0m로 늘려봤습니다.

파라미터를 변경 후, 경로를 보면 장애물로부터 거리가 먼 것을 확인할 수 있습니다.

image.png

image.png

파라미터를 좀 더 파악을 하고, 실제로 써먹어볼 수 있도록 해볼 예정입니다.

참고 링크입니다.

읽어주셔서 감사합니다!

궁금한 점, 조언 등 환영합니다!


This page is synchronized from the post: ‘[Research] 지역 경로 계획 소개, teb local planner’

Your browser is out-of-date!

Update your browser to view this website correctly. Update my browser now

×