0

저는 Go에서 언어를 배우기위한 간단한 프로그램을 작성하고 있습니다. 이 프로그램은 게임 플레이어입니다. exec.Command은 텍스트 기반 게임이며 StdinPipe/StdoutPipe을 통해 통신합니다. 어떤 사람들을 속여서 많은 온라인 문서를 읽은 후 나는 해골을 작동시킬 수있었습니다. Hello World와 같은 것으로, 양방향 통신을 구축하고 프로그램 종료와 같은 오류를 처리 할 수 ​​있습니다.Going state in Go

이제 실제 게임중인 AI 코드를 작성하려고합니다. 내 목적은 언어를 배우는 것이므로 스타일에 매우 조심해야합니다. Go에 C (또는 다른 언어)를 쓰고 싶지는 않습니다.

프로그램에서 분명한 분업 (한 번 설정이 완료되면)은 두 부분으로 나뉩니다. 먼저 프로그램은 현재 상태를보고 게임에 어떤 명령을 내야하는지 결정합니다. 둘째로, 프로그램은 반환 된 데이터를보고 이에 따라 상태를 업데이트합니다. (예, 간단한 게임입니다. 입력을 기다렸다가 응답 할 때 타이밍에 문제가 없습니다.)

이 상태 정보를 어디로 보내야할지 모르겠습니다. 모든 것을 전역 영역으로 덤핑하는 것은 잘못된 것처럼 느껴지며 대규모 싱글 톤 객체를 만드는 것은 더욱 악화됩니다 (특히 Go는 특히 OO가 아닙니다). 어쨌든 함수를 전달하고 20 개 이상의 변수를 반환하지 않으려합니다.

일반적인 조언은 괜찮지 만 Go에 대해 무엇이 관용적인지에 가장 관심이 있습니다. 요청에 따라 코드를 공유 할 수 있지만 도움이 될 것이라고 생각하지 않습니다.

답변

1

이동은 style of OO programming을 사용합니다.

게임 상태에 대한 구조체 형식을 만듭니다. 이런 종류의 값을 가리키는 포인터를 프로그램에 전달하거나 포인터가 패키지 레벨 변수에 저장되면 그런 일이 발생하지 않으면 포인터를 저장하십시오. 필요에 따라서,이 타입의 메소드를 구현합니다. 더 큰 캡슐화를 위해 자체 패키지에 넣는 것을 고려하십시오.

+1

답변 해 주셔서 감사합니다. 네가 괜찮 으면 내일까지 답변을 받아 들일 때까지 기다릴 것이다. 나는 아직도 어떤 해결책이 최선인지 궁금해하고있다. (당분간 +1) – Charles

1

나는이 목적으로 패키지를 사용하고 싶다.

사소한 예 :

package foo 

func Incr() { 
    f.incr() 
} 

func Count() int { 
    return f.count() 
} 

type foo struct { 
    sync.RWMutex 
    count int 
} 

func (f *foo) incr() { 
    f.Lock() 
    f.count++ 
    f.Unlock() 
} 

func (f *foo) count() int { 
    f.RLock() 
    defer f.RUnlock() 
    return f.count 
} 

var f = &foo{} 

이 패키지는 다른 패키지로 가져온 상태를 유지 할 수 있습니다. 경쟁 조건을 막기 위해 sync.RWMutex를 추가했습니다. 이것은 foo의 상태에 액세스하고 멋지게 포함시키는 방법을 완벽하게 제어합니다.

+0

고마워요. 당신의 제안을 이해하도록하겠습니다 : 모든 상태 변수를 담고있는'struct '를 만든 다음 전역 객체로 인스턴스화하여 업데이트 기능에서 상태를 확인하고 수정할 수 있습니다. 옳은? (그리고 물론 내가 너를 +1했다.) – Charles

+0

@Charles Correct. 원하는 경우 구조체에 원하는 상태를 저장하고 원하는 경우 해당 구조체에 메서드를 추가 할 수 있습니다. 이 접근법에 긍정적 인 점은 액세스를 완전히 제어하고 다른 패키지로 상태를 쉽게 가져올 수 있다는 것입니다. Go의 net/http 패키지는 HandlerFunc 및 Handler 메서드를 사용하여 유사한 방식으로 여러 패키지에 http 핸들러를 추가 할 수 있습니다. – jmaloney

+0

@tommywild 좀 더 자세히 설명해 주시겠습니까? foo_test를 추가하고 패키지에있는 모든 것을 테스트하는 것은 꽤 쉽습니다. 내 보낸 메소드를 사용하여 위의 기능을 쉽게 테스트 할 수도 있습니다. – jmaloney