こんにちは。エイプリルフールは天鳳が絶好調で「嘘でしょ?w」と調子に乗っていたら、翌日は3ラス食らって「マジか?嘘でしょ...」と無言の悲鳴を上げてシオシオのパーになっている僕です。上げて叩き落とすとは、さすが、やってくれますね。誰とは言いませんが(笑)
そんなわけで、天鳳のモチベが地の底を這いずりまわる状態になってしまい、やる気の泉が枯渇してしまいました。でも、空いた時間を無為に過ごすのは人生の無駄です。
だから、麻雀も速く打て!
あっ、どうでも良いことでしたね(笑)
というわけで、以前から気になっていたGo言語の勉強をすることになりました。けっして天鳳から逃げたわけじゃないです。そこんところ夜露死苦(ΦωΦ=)
Go言語で麻雀プログラミング事始め(2)~コマンドラインオプションの実装
Go言語で麻雀プログラミング事始めで作った点数計算プログラムは、符・翻・親子・アガリ方の値が固定されて、汎用性に欠けるも ...
Go言語とは?
Go言語とはGoogleが開発したプログラミング言語です。旧来の言語よりもシンプルで開発がしやすいという噂です。コンパイルと実効速度も速いとの評判です。安全性も高く、しかも、オープンソース。これは期待できそうな予感がします。
あのGoogleが開発したのだから、うん(とりあえず、納得する)
一つのプログラムコードからWindows、MacOS X、Linux、Androidなど、複数のOS用の実行ファイルを生成できます。
生産性が高いですね。素敵。
僕は普段はJavaScriptでプログラミングをしています。JavaScriptは、スクリプト言語です。一方のGO言語は、コンパイラ言語です。
なんか、とってもカッコいいっぽい?
コンパイル系の言語は、ほぼ初心者の自分でもできるのか?案ずるより産むが易し。やってみるのが一番の早道です。誰が言ったかしらないが、<b>論より証拠金</b>という迷言もあります。
というわけで、簡単な点数計算プログラムを作ってみることにしました。
Go言語で点数計算プログラムを作ってみた
ざっと、こんな感じです。ファイル名は「tensu.go」です。Go言語書いたプログラムには「go」という拡張子を付けます。
変数の型でつまずかなければ、JavaScriptからの移行もスムーズにできそうです。switch文は、Go言語のほうが応用が効いて、逆に書きやすかったです。今回は使ってないけど、関数の戻り値を複数指定できるのも嬉しいですね。
package main import ( "fmt" "math" ) func main() { var hu float64 = 50 //符 var han float64 = 3 //翻 oyakoFlg := 1 //1の時は「子」、2の時は「親」 agariFlg := 1 //1の時は「出アガリ」、2の時は「ツモアガリ」 var cf float64 //調整用 var tensu float64 //アガリ点数 var msg string if (agariFlg == 1) && (oyakoFlg == 1) { cf = 4 //子出アガリ } else if (agariFlg == 1) && (oyakoFlg == 2) { cf = 6 //親出アガリ } else if (agariFlg == 2) && (oyakoFlg == 1) { cf = 1 //子ツモアガリ } else if (agariFlg == 2) && (oyakoFlg == 2) { cf = 2 //親ツモアガリ } else { cf = 4 //初期値は「子出アガリ」 } switch { case han >= 13: //13翻以上 tensu = 8000 * cf case (han >= 11 && han <= 12): //11翻以上 tensu = 6000 * cf case (han >= 8 && han <= 10): //8翻以上 tensu = 4000 * cf case (han >= 6 && han <= 7): //6翻以上 tensu = 3000 * cf case (han == 5): //5翻 tensu = 2000 * cf // case (han == 4): //切り上げマンガン // tensu = 2000 * cf case (hu >= 130 && han >= 2) || (hu >= 70 && han >= 3) || (hu >= 40 && han >= 4): //マンガン tensu = 2000 * cf default: tensu = hu * math.Pow(2, han) * 4 * cf //通常の点数計算 } switch cf { case 1: msg = "子ツモアガリ" case 2: msg = "親ツモアガリ" case 4: msg = "子出アガリ" case 6: msg = "親出アガリ" default: msg = "子出アガリ" //初期値は「子出アガリ」 } fmt.Println("符:", hu) fmt.Println("翻:", han) fmt.Println("結果1:"+msg+"(切り上げ前)", tensu) fmt.Println("結果2:"+msg+"(切り上げ後)", math.Ceil(tensu/100)*100) }
では、コンパイルしてプログラムを実行してみます。
C:\Users\nyang\go\src\tensu02>go build tensu.go
何もメッセージが出なければコンパイルは成功です。「成功」を意味するメッセージは一切出ません。硬派で無骨です。
男は黙ってサッポロなんとか
という懐かしいCMを思い出しました。
コードに問題があると、メッセージがズラズラ出てきます。黙ってくれるまで、修正しましょう。
コンパイルは、噂通りの速さでした。無駄に待たされないのは嬉しいです。
「tensu.exe」という実行ファイルがが一つだけ生成されます。他には一切ありません。この辺もシンプルで好感が持てます。シンプルイズベストですね。
C:\Users\nyang\go\src\tensu02>tensu 符: 50 翻: 3 結果1:子出アガリ(切り上げ前) 6400 結果2:子出アガリ(切り上げ後) 6400
ちゃんと動きました。
このプログラムは符・翻・親子判定・アガリ判定は固定になっています。数値を変更する場合は、プログラムを直接書き換えて、コンパイルする必要があります。
符・翻・親子判定・アガリ判定を引数付きで実行できるように手直しすれば、そこそこ実用的なものに仕上がりそうです。今後の課題にしたいと思います。
今回は、Go言語の体験学習が目的です。何かしらの言語を学んでいいれば、学習時間はかなり短縮できそうな感じでした。当面は、勉強がてらに、今までJavaScriptで作ったプログラムを移植してみようと思います。