マージャンCalc

気まぐれでマージャン電卓を作ってみた。いまどきコンソールアプリなので実用性は考えていない。本当に使うならエクセルマクロにしたりウェブアプリにしたり、履歴が残るといいかもね。

仕様というかなんというか。一応博多の4人うちではメジャーなルール。
ドボン、焼き鳥はプレイヤーの指定があるのでまんどくさかったので採用していない。
あとチップもチップをその場でやり取りするのでかんがえずともよかろう。

  1. 各自3万返し
  2. 100の位は五捨六入
  3. 沈み馬適用
  4. ドボン、焼き鳥などは不採用
  5. トップ以外の3人の素点を入力する


実用化のためにすること

  1. GUI化。エクセルでも十分実用になる気がする。
  2. 設定がいろいろ変えられること。関東だと5・10が普通だろうし。
  3. 設定もGUI対応がよい
  4. 履歴が残るとなおよい。仲間内の成績がデータベースで残るといいかもね。
  5. webアプリ化もまたよし。ユニークユーザーが増えてDBが充実すると東風荘みたいなランキング化ができたりして
use strict;

#初期設定
#原点 30000点
my $BASEPOINT = 30000;

# ------------------------------------
#5捨6入
sub round5sha6nyuu($)
{
    my ($point) = @_;
    $point += 400;
    return int($point / 1000);
}

# ------------------------------------
# 馬適用
sub applyShizumiUma($$)
{
    my ($refPointArray, $shizumiNum) = @_;

    if ($shizumiNum == 3) {
        #3人沈み マルA
        $refPointArray->[0] -= 7;
        $refPointArray->[1] -= 5;
        $refPointArray->[2] -= 3;
        $refPointArray->[3] += 15;
    } elsif ($shizumiNum == 2) {
        #二人浮き
        $refPointArray->[0] -= 10;
        $refPointArray->[1] -= 5;
        $refPointArray->[2] += 5;
        $refPointArray->[3] += 10;
    } elsif ($shizumiNum == 1) {
        #一人沈み
        $refPointArray->[0] -= 15;
        $refPointArray->[1] += 3;
        $refPointArray->[2] += 5;
        $refPointArray->[3] += 7;
    }
}
# ------------------------------------
# リスト表示
sub dispList($)
{
    my ($refList) = @_;

    for (@$refList) {
        print;
        print "\n";
    }
}

# ===========================================
#      以下メイン
# ===========================================
my @basePoint = ();
my $i;

print "トップ以外の3人の得点(現在の持ち点)を入力してください。\n";
for ($i = 0; $i < 3; $i++) {
	printf "%d人目>", $i + 1;
	$basePoint[$i] = <>;
    chomp $basePoint[$i];
}

# 昇順ソート
@basePoint = sort{$a <=> $b} @basePoint;

#沈みは何人?
my $shizumiNum;
for ($shizumiNum = 0; $shizumiNum < 3; $shizumiNum++) {
    if ($basePoint[$shizumiNum] > $BASEPOINT) {
        last;
    }
}

# 五捨六入
for ($i = 0; $i < 3; $i++) {
    $basePoint[$i] = round5sha6nyuu($basePoint[$i]) - 30;
}

#topの点数計算
$basePoint[3] = 0;
for ($i = 0; $i < 3; $i++) {
    $basePoint[3] -= $basePoint[$i];
}

#馬
applyShizumiUma(\@basePoint, $shizumiNum);

# 現在のリストを表示
print "$shizumiNum人沈み\n";
dispList(\@basePoint);

__END__