struct 배열을 초기화 하는 더 좋은 방법이 있을까요?

176 views
Skip to first unread message

Homin Lee

unread,
Dec 14, 2011, 1:46:20 AM12/14/11
to golang...@googlegroups.com
안녕하세요 go로 고도리를 만들어 보고 있습니다.

go 언어가 익숙하지 않다 보니 기본 문법 마저 이게 올바른 길이 맞는지
확신이 서지 않는 경우가 있어 도움을 요청 드립니다.

우선 아래와 같이 Card 타입을 만들고,

type Card struct {
idx int
power int
name string
}

스택 용 타입도 만들어 봤습니다.

type GodoriStack [48 + 2]Card // 48 Cards and 2 Jockers

> 여기부터 질문 입니다.

그리고 스택 GodoriStack을 초기화 할 생성자?를 아래 처럼 구현하고 있습니
다.

func NewGodoriStack() GodoriStack {
var stack GodoriStack

stack[0] = Card{idx: 0, name: "송학", power: (GWANG)}
stack[1] = Card{idx: 1, name: "송학", power: (RED_BAND)}
stack[2] = Card{idx: 2, name: "송학", power: (PI)}
stack[3] = Card{idx: 3, name: "송학", power: (PI)}
...
stack[48] = Card{idx: 48, name: "조커", power: (JOKER | DUAL_PI)}
stack[49] = Card{idx: 49, name: "조커", power: (JOKER | TRIPLE_PI)}

return stack
}

이렇게 stack 을 초기화 하는게 맞을까요?

stack[N] = Card...

라는 절을 50번이나 반복하고 있으려니, 또 어짜피 카드는 섞을거라서 stack

인덱스 N은 중요하지도 않거든요, 더 깔끔한 방법이 있지 않나 궁금합니다.

더 좋은 방법을 조언해 주세요.
답변에 미리 감사 드립니다.

이호민 드림.
signature.asc

jhan

unread,
Dec 14, 2011, 2:48:04 AM12/14/11
to golang...@googlegroups.com
저라면 그냥 index (int) 만 사용할 것 같습니다.
그러자면 정렬 규칙이 정해져 있어야겠죠?

48은 투피, 49는 쓰리피 처럼.. :-)


Jongmin Kim

unread,
Dec 14, 2011, 4:23:16 AM12/14/11
to golang...@googlegroups.com
호민님 오늘 휴가신가요? 로레벨 하시는 분이 업무시간에 이런 걸 던지시다니요.. 
저는 아래처럼 만들어봤습니다. 저도 정답은 아니겠지만 사용할 카드는 고정되어 있으니 미리 일괄적으로 고정해두고
새로운 카드 스택을 달라고 할 때, 그걸 섞어서 쓰는 방법으로요. 카드 12개만 넣어서 해봤습니다.

===========================================================================
package main

import (
        "fmt"
        "rand"
        "time"
)

type Card struct {
        idx int
        power int
        name string
}

const (
        WEAK = iota
        NORMAL
        STRONG
        JOKER
        GOD
)

// 게임에 사용할 카드 종류는 고정되어 있으므로 미리 정의해둔다.
var CardPool = map[int]Card{
        0: {0, JOKER, "1광"}, 1: {0, NORMAL, "1-10점"}, 2: {0, NORMAL, "1-5점"}, 3: {0, WEAK, "1-피"},
        4: {0, JOKER, "똥광"}, 5: {0, NORMAL, "똥-5점"}, 6: {0, STRONG, "똥쌍피"}, 7: {0, STRONG, "똥쓰리피"},
        8: {0, JOKER, "비광"}, 9: {0, NORMAL, "비-5점"}, 10: {0, STRONG, "비쌍피"}, 11: {0, WEAK, "비껍데기"}}

// CardPool의 카드들을 섞은 새로운 카드 스택을 리턴한다.
func NewGodoriStack() []Card {
        // 새로 순서가 정해진 카드 슬라이스를 CardPool 개수만큼 미리 만들어둔다
        cards := make([]Card, 0, len(CardPool))

        // 0 ~ len(CardPool) 범위 안의 자연수를 랜덤하게 가진다
        rand.Seed(time.Nanoseconds())
        keys := rand.Perm(len(CardPool))

        // 랜덤하게 생성된 CardPool 키 값으로 리턴할 cards 슬라이스를 차례로 채운다
        for idx, key := range keys {
                one := CardPool[key]
                one.idx = idx
                cards = append(cards, one)
        }

        return cards
}

func main() {
        cards := NewGodoriStack()
        fmt.Printf("== Card count: %d\n", len(cards))
        fmt.Printf("== Card info\n")
        for _, v := range cards {
                fmt.Printf("%v\n", v)
        }
}
===========================================================================


2011년 12월 14일 오후 4:48, jhan <jooyu...@gmail.com>님의 말:
저라면 그냥 index (int) 만 사용할 것 같습니다.
그러자면 정렬 규칙이 정해져 있어야겠죠?

48은 투피, 49는 쓰리피 처럼.. :-)


--
* 이 그룹에 이메일로 게시하려면 다음 주소로 이메일을 보내시면 됩니다.
golang...@googlegroups.com
* 추가 옵션을 보려면 http://groups.google.com/group/golang-korea?hl=ko?hl=ko의 그룹을 방문하세요.



--
Jongmin Kim 

Homin Lee

unread,
Dec 14, 2011, 8:20:13 AM12/14/11
to golang...@googlegroups.com
혹시 알아요? 안드로이드 HAL에서 go쓰는 날이 올지.
그래서, 선행학습 하는 겁니다.

소프트웨어쟁이가 프로그래밍 하면서 논다고
쇠고랑 안 찹니다. 경찰 출동 안해요. :)

종민 님이 알려주신 내용 참고하여 이렇게 코딩 했습니다.

stack := GodoriStack{
Card{idx: 0, name: "뽀나스-쌍피", power: JOKER | DOUBLE_PI},
Card{idx: 0, name: "뽀나스-쓰리피", power: JOKER | TRIPLE_PI},
Card{idx: 1, name: "일광", power: GWANG},
...
}

훨씬 깔끔해 졌어요. 감사합니다!

----

제 구상은 카드 뭉치, GodoriStack은 Card 50 개 짜리 배열로 하고,

func (stack GodoriStack) Shuffle() {
...
}

이렇게 멤버 Shuffle()로 안에서 섞은 다음에,
슬라이스로 각 사용자들에게 떼어서 주는 방식을 생각하고 있습니다.

----

막힐 때 마다 종종 어처구니 없는 질문을 물으러 오겠습니다.
잘 부탁 드립니다.

이호민 드림.

2011-12-14 (수), 18:23 +0900, Jongmin Kim:
signature.asc

Leonardo Kim

unread,
Dec 14, 2011, 8:33:03 AM12/14/11
to golang...@googlegroups.com
안드로이드의 HAL을 만들기 위해 GO 언어로 공유 라이브러를 만들 수 있을까요?

전에 발표 때는 힘들었던 것 같은데 요즘은 가능한가요? :)

Regards,
Leonardo YongUk KIM

2011/12/14 Homin Lee <ff4...@gmail.com>:
> 학습 하는 겁니다.

Jongmin Kim

unread,
Dec 14, 2011, 11:12:06 AM12/14/11
to golang...@googlegroups.com
이게 현시점에서는 가장 적합한 답변이지 않나 싶습니다.

2011년 12월 14일 수요일 오후 10시 33분 3초 UTC+9, Leonardo YongUk KIM 님의 말:
Reply all
Reply to author
Forward
0 new messages