こちらの記事を見て、Go言語でブラックジャックを作ってみようとなった際に、どうせならトランプの処理の部分をパッケージ化してしまおうと思い、作ってみた。
パッケージは https://github.com/x-color/gocard にMITライセンスで置いてあるので、ご自由にお使いください。
一応、パッケージの中のexampleディレクトリの中にシンプルなブラックジャックを実装したものも入れてあります。
インストールは
$ go get github.com/x-color/gocard
実装されている機能
実装されている機能は、
- カードの生成
- カードの強弱の判定
- カードのソート
- カードの強弱の変更
- 52枚組のデッキの生成
- デッキのシャッフル
- デッキからのドロー
- カードをデッキの一番上に置く
- カードをデッキの一番下に置く
カードの生成
スペードの1を生成するには
card := gocard.Card{
Rank: gocard.ACE,
Suit: gocard.SPADES,
}
カードの強弱の判定
カードを比較し、強弱を判定する。CompareByRank()
は数字優先で判定を行い、CompareBySuit()
はマーク優先で判定を行う。
戻り値は、card1 > card2でr > 0、card1 == card2でr = 0、card1 < card2でr < 0となる。
例えば、このようなカードを用意した場合、
card1 := gocard.Card{Rank: gocard.JACK, Suit: gocard.DIAMONDS} // ダイヤの11
card2 := gocard.Card{Rank: gocard.FIVE, Suit: gocard.SPADES} // スペードの5
比較結果は、
r := gocard.CompareByRank(card1, card2) // r > 0
r := gocard.CompareBySuit(card1, card2) // r < 0
カードのソート
カードのソートを行う。SortByRank()
は数字優先でソートを行い、SortBySuit()
はマーク優先でソートを行う。
例えば、このようにカードリストを用意した場合、
cards := gocard.Cards{
card1, // スペードの1
card2, // クラブの5
card3, // ハートの11
}
ソートは以下のようになる。
gocard.SortByRank(cards) // cards=[card2, card3, card1]
gocard.SortBySuit(cards) // cards=[card2, card3, card1]
カードの強弱の変更
RankとSuitのスライスを作成して、SetRankingOfRanks()
、SetRankingOfSuits()
に渡すことで、カードの強弱を変更することができる。
この例では、数字の大きさがそのまま強さとなるようにし、マークはスペード、クラブ、ハート、ダイヤの順に強くなるように設定している。
ranks := []gocard.Rank{gocard.ACE, gocard.TWO, gocard.THREE, gocard.FOUR, gocard.FIVE, gocard.SIX, gocard.SEVEN, gocard.EIGHT, gocard.NINE, gocard.TEN, gocard.JACK, gocard.QUEEN, gocard.KING}
suits := []gocard.Suit{gocard.SPADES, gocard.CLUBS, gocard.HEARTS, gocard.DIAMONDS}
gocard.SetRankingOfRanks(ranks)
gocard.SetRankingOfSuits(suits)
52枚組のデッキの生成
52枚組のデッキを生成する。
deck := gocard.NewDeck()
デッキのシャッフル
デッキをシャッフルする。
dek.Shuffle()
デッキからのドロー
デッキの一番上から一枚ドローする。戻り値には、引いたカードとデッキが空の時に引いた際に発生するエラーを返す。
card, err := deck.Draw()
カードをデッキの一番上に置く
デッキの一番上にカードを置く。
deck.PutTop(card)
カードをデッキの一番下に置く
デッキの一番下にカードを置く。
deck.PutBottom(card)
おわりに
初めてのGo言語でのパッケージ作成なので、どんなふうに実装するべきかと悩んだりして、こんな小規模なのに意外と時間がかかってしまった...