Goを新たに触ることになったので、せっかくだからブラックジャックを実装してみました。
ルールは上記投稿の「開発するブラックジャックのルール」に従います。
Aの得点の扱いや、その他のルールに関してもまずは忘れることにします。
実行結果
それっぽい感じになっているのではなかろうかと思うのですが。ソースコード
「とりあえず動く」程度のものは4時間くらいで出来た気がします。
だいぶゴチャゴチャしたコードだったので、調べながらの再実装が6時間くらい。
合計10時間くらい掛かりました。結構時間を要したな……。
補足
ブラックジャックのルール関連はmain.goに記述
主に下記などの得点関連の処理ですね。
func CardScore(card Card) int {
score := 0
switch card.Number {
case 11, 12, 13:
score = 10
default:
score = card.Number
}
return score
}
「カードの得点」ということで最初は card.go
に記述していたのですが、「あくまでカードはスートと値しか情報は持っていない」「得点をどう扱うかはルールの問題」なので main.go
に移しました。
judge.go
とかにルール関連処理をまとめる、でもよかったかもしれません。
(追加でルールを実装する際にはそうしていくほうがよいかも)
カードを重複なく引く方法
調べていく中で上記の投稿を発見したため、「52枚のカードを予め用意してからシャッフル、先頭から1枚ずつ引く」という実装にしました。
最初は「カードを引くたびにプレイヤーとディーラーの手札に同じスート・値の組み合わせがないかをチェックする」という実装でした。
for {
suit := rand.Intn(4)
value := rand.Intn(13)
// isDrawed()で同じsuitとvalueの組み合わせが手札に存在していないかチェック
if isDrawed(suit, value) == false {
// 手札にカードを追加する処理
break
}
}
みたいな。
苦労した点
ポインタ
これまで触ったことのある言語が主にPHPとJava、最近Rubyと経由して、この中であまりポインタを意識して取り扱ったことがなかったため、苦労しました。
こちらの投稿と、その参考サイトあたりを主に参照していました。
他者に説明しろと言われると無理そうなので、もっとちゃんとした理解が必要そうです。
(すごく大まかには「Javaで言うところの、"いわゆる" 値渡し・参照渡し、に近い概念」という方面の理解をしつつあるのですが、それで良いのかな……)
構造体
主にこちらの投稿を参考にしました。
とはいえ、構造体それ自体に苦労したというよりは、構造体を取り扱うにあたってのポインタの扱いに苦労した、というほうが正確かもしれません。
感想
やっぱり作るものが明確だと楽しいし、調べるにしても散漫にならなくてよいですね!