プログラミング

Go言語で麻雀プログラミング事始め

こんにちは。エイプリルフールは天鳳が絶好調で「嘘でしょ?w」と調子に乗っていたら、翌日は3ラス食らって「マジか?嘘でしょ...」と無言の悲鳴を上げてシオシオのパーになっている僕です。上げて叩き落とすとは、さすが、やってくれますね。誰とは言いませんが(笑)

そんなわけで、天鳳のモチベが地の底を這いずりまわる状態になってしまい、やる気の泉が枯渇してしまいました。でも、空いた時間を無為に過ごすのは人生の無駄です。

だから、麻雀も速く打て!

あっ、どうでも良いことでしたね(笑)

というわけで、以前から気になっていたGo言語の勉強をすることになりました。けっして天鳳から逃げたわけじゃないです。そこんところ夜露死苦(ΦωΦ=)

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で作ったプログラムを移植してみようと思います。

おすすめ麻雀本

G・ウザク

三才ブックス

-プログラミング
-,