Flutter麻将计分插件mahjong_score的使用

Flutter麻将计分插件mahjong_score的使用

mahjong_score 是一个用于计算麻将分数的包。分数是基于“符”(Hu)和“番”(Fan)来计算的。需要注意的是,该包不会分配每个玩家的得分,因此你需要自己实现这部分功能。

使用方法

BasePoint 类

BasePoint 是一个处理由“符”和“番”计算得出的基础分数的类。

import 'package:mahjong_score/score.dart';

final basePoint = BasePoint(hu: 30, fan: 4);
参数 描述
hu 符点数
fan 翻点数

FixedPoint 类

FixedPoint 处理不计算“符”和“番”的基础分数,例如“满贯”(Mangan)和“役满”(Yakuman)。你可以通过 FixedPointType 枚举定义的值获取实例。

import 'package:mahjong_score/score.dart';

final fixed = FixedPointType.value;
final mangan = FixedPointType.Mangan.detail;

Score 类

Score 类是从计算出的基础分数开始,考虑游戏结束的方式,最终处理要传递的分数。

import 'package:mahjong_score/score.dart';

final score = Score(
  abstractPoint: basePoint,
  isHost: false,
  isPicked: false,
  consecutivelyCount: 0,
);
参数 描述
abstractPoint 继承自 abstractPoint 的类
isHost 胜者是否为庄家
isPicked 胜者是否通过“自摸”(Tsumo)结束比赛
consecutivelyCount 连续庄家的数量

完整示例 Demo

以下是一个完整的示例,展示如何使用 mahjong_score 包来计算麻将分数。

示例代码

import 'package:flutter/cupertino.dart';
import 'package:flutter/material.dart';
import 'package:mahjong_score/base.dart';
import 'package:mahjong_score/fixed.dart';
import 'package:mahjong_score/score.dart';

class PointSelector extends StatelessWidget {
  final bool? isHost;
  final bool? isPicked;
  final int? consecutivelyCount;
  final List<int> hus = [20, 25, 30, 40, 50, 60, 70];
  final List<int> hons = [1, 2, 3, 4];
  final List<int> specialHans = [5, 6, 7, 8, 9, 10, 11, 12, 13, 14];

  PointSelector({
    this.isHost,
    this.isPicked,
    this.consecutivelyCount,
  });

  String get playerGrade => isHost! ? '亲' : '子';

  String get finishMethod => isPicked! ? '自摸' : '荣和';

  [@override](/user/override)
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(title: Text('分数')),
      body: Column(
        children: [
          Text('$playerGrade  $finishMethod'),
          MahjongPointTable(
            isHost: isHost,
            isPicked: isPicked,
            noMoreReaderCount: consecutivelyCount,
          ),
          Expanded(
            child: ListView.builder(
              itemCount: FixedPointType.values.length,
              itemBuilder: (context, i) {
                final score = Score(
                  basePoint: FixedPointType.values[i].detail,
                  isHost: isHost,
                  isPicked: isPicked,
                  consecutivelyCount: consecutivelyCount,
                );
                return ListTile(
                  title: Text(score.toString()),
                  onTap: () => Navigator.pop(context, score),
                );
              },
            ),
          ),
        ],
      ),
    );
  }
}

class MahjongPointTable extends StatelessWidget {
  final bool? isHost;
  final bool? isPicked;
  final int? noMoreReaderCount;
  final List<int> hus = [20, 25, 30, 40, 50, 60, 70];
  final List<int> fans = [1, 2, 3, 4];
  final List<int> specialHans = [5, 6, 7, 8, 9, 10, 11, 12, 13, 14];

  MahjongPointTable({
    this.isHost,
    this.isPicked,
    this.noMoreReaderCount,
  });

  [@override](/user/override)
  Widget build(BuildContext context) {
    return Table(
      border: TableBorder.all(),
      children: [
        TableRow(
          children: [
            _buildHeaderCell('符\\翻'),
            ...List.generate(
              fans.length,
              (i) => _buildHeaderCell('${fans[i].toString()}'),
            ),
          ],
        ),
        ...List.generate(hus.length, (index) {
          final hu = hus[index];
          return TableRow(
            children: [
              _buildBodyCell('$hu'),
              ...List.generate(fans.length, (index) {
                final score = Score(
                  basePoint: BasePoint(hu: hu, fan: fans[index]),
                  isHost: isHost,
                  isPicked: isPicked,
                  consecutivelyCount: noMoreReaderCount,
                );
                if (score.isNotDisplay) {
                  return Container();
                }
                return GestureDetector(
                  child: _buildBodyCell(score.toString()),
                  onTap: () => Navigator.pop(context, score),
                );
              }),
            ],
          );
        }),
      ],
    );
  }

  Widget _buildHeaderCell(String label) {
    return Container(
      padding: EdgeInsets.only(top: 2.0, bottom: 2.0),
      child: Center(child: Text(label, textAlign: TextAlign.center)),
    );
  }

  Widget _buildBodyCell(String label) {
    return Container(
      padding: EdgeInsets.only(top: 10.0, bottom: 10.0),
      child: Center(child: Text(label, textAlign: TextAlign.center)),
    );
  }
}

更多关于Flutter麻将计分插件mahjong_score的使用的实战教程也可以访问 https://www.itying.com/category-92-b0.html

1 回复

更多关于Flutter麻将计分插件mahjong_score的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html


mahjong_score 是一个用于 Flutter 的麻将计分插件,它可以帮助开发者轻松地在应用中实现麻将游戏的计分功能。以下是如何使用 mahjong_score 插件的基本步骤:

1. 添加依赖

首先,你需要在 pubspec.yaml 文件中添加 mahjong_score 插件的依赖:

dependencies:
  flutter:
    sdk: flutter
  mahjong_score: ^1.0.0  # 请使用最新版本

然后运行 flutter pub get 来获取依赖。

2. 导入插件

在你的 Dart 文件中导入 mahjong_score 插件:

import 'package:mahjong_score/mahjong_score.dart';

3. 使用插件

mahjong_score 插件提供了多种方法来计算麻将的分数。以下是一些基本的使用示例:

3.1 计算基本分数

你可以使用 MahjongScore 类来计算基本的麻将分数。例如,计算一个玩家的得分:

void main() {
  // 创建一个 MahjongScore 实例
  MahjongScore score = MahjongScore();

  // 设置玩家的手牌和和牌方式
  score.setHandTiles(['1m', '2m', '3m', '4m', '5m', '6m', '7m', '8m', '9m', '1p', '2p', '3p', '4p', '5p']);
  score.setWinningTile('6p');
  score.setWinningType(WinningType.Ron);

  // 计算分数
  int playerScore = score.calculateScore();

  print('玩家的得分是: $playerScore');
}

3.2 计算多个玩家的分数

如果你需要计算多个玩家的分数,可以创建多个 MahjongScore 实例,并分别计算每个玩家的得分。

void main() {
  // 创建多个 MahjongScore 实例
  MahjongScore player1Score = MahjongScore();
  MahjongScore player2Score = MahjongScore();

  // 设置玩家1的手牌和和牌方式
  player1Score.setHandTiles(['1m', '2m', '3m', '4m', '5m', '6m', '7m', '8m', '9m', '1p', '2p', '3p', '4p', '5p']);
  player1Score.setWinningTile('6p');
  player1Score.setWinningType(WinningType.Ron);

  // 设置玩家2的手牌和和牌方式
  player2Score.setHandTiles(['1s', '2s', '3s', '4s', '5s', '6s', '7s', '8s', '9s', '1p', '2p', '3p', '4p', '5p']);
  player2Score.setWinningTile('6p');
  player2Score.setWinningType(WinningType.Tsumo);

  // 计算分数
  int player1FinalScore = player1Score.calculateScore();
  int player2FinalScore = player2Score.calculateScore();

  print('玩家1的得分是: $player1FinalScore');
  print('玩家2的得分是: $player2FinalScore');
}

3.3 自定义规则

mahjong_score 插件允许你自定义一些规则,例如设置是否计算役满、是否计算宝牌等。

void main() {
  MahjongScore score = MahjongScore();

  // 设置自定义规则
  score.setYakumanEnabled(true);  // 启用役满计算
  score.setDoraCount(3);  // 设置宝牌数量

  // 设置手牌和和牌方式
  score.setHandTiles(['1m', '2m', '3m', '4m', '5m', '6m', '7m', '8m', '9m', '1p', '2p', '3p', '4p', '5p']);
  score.setWinningTile('6p');
  score.setWinningType(WinningType.Ron);

  // 计算分数
  int playerScore = score.calculateScore();

  print('玩家的得分是: $playerScore');
}
回到顶部