Flutter骰子解析插件dart_dice_parser的使用

发布于 1周前 作者 phonegap100 来自 Flutter

Flutter骰子解析插件 dart_dice_parser 的使用

dart_dice_parser 是一个用于解析骰子记号(如 2d6+4)的 Dart 库。它支持优势/劣势、成功/失败计数、爆炸、复合以及其他变体。

安装

首先,在 pubspec.yaml 文件中添加依赖:

dependencies:
  dart_dice_parser: ^latest_version

然后运行 flutter pub get 来安装依赖。

示例代码

以下是一个简单的示例,演示如何创建一个骰子表达式并进行投掷:

import 'dart:io';
import 'package:dart_dice_parser/dart_dice_parser.dart';

void main() {
  // 创建一个 D20 优势骰子(投掷 2d20,保留最高值)
  final d20adv = DiceExpression.create('2d20 kh');

  stdout.writeln(d20adv.roll());
  // 输出类似:
  // ((2d20) kh ) ===> RollSummary(total: 16, results: [16], metadata: {rolled: [4, 16], discarded: [4]})

  stdout.writeln(d20adv.roll());
  // 输出类似:
  // ((2d20) kh ) ===> RollSummary(total: 19, results: [19], metadata: {rolled: [13, 19], discarded: [13]})
}

骰子记号支持

基本示例

  • 2d20 #cf #cs:投掷 2d20,并记录关键成功(20)和关键失败(1)的数量。
  • 优势:
    • 2d20-L:丢弃最低值
    • 2d20k, 2d20kh:保留最高值
  • 劣势:
    • 2d20-H:丢弃最高值
    • 2d20-kl:保留最低值

支持的记号

  • 2d6:投掷 2 个 6 面骰子
  • 特殊骰子变体:
    • 4dF:投掷 4 个 Fudge 骰子(面为 [-1, -1, 0, 0, 1, 1]
    • 1d%:投掷 1 个百分骰子(等同于 1d100
    • 1D66:投掷 1 个 D66,即 1d6*10 + 1d6
      • 注意:必须使用大写 D66,小写 d66 会被解释为 66 面骰子
    • 2d[2,3,5,7]:投掷 2 个带有值 [2,3,5,7] 的骰子

爆炸骰子

  • 4d6!:投掷 4 个 6 面骰子,如果掷出最大值(6),则重新掷并计入结果
    • 4d6 !=54d6!5:如果等于 5 则爆炸
    • 4d6 !>=4:如果大于等于 4 则爆炸
    • 4d6 !<=2:如果小于等于 2 则爆炸
    • 4d6 !>5:如果大于 5 则爆炸
    • 4d6 !<2:如果小于 2 则爆炸
    • 只爆炸一次,使用语法 !o
      • 4d6 !o<5

复合骰子

类似于爆炸骰子,但额外的掷骰结果被加在一起作为一个单独的“掷骰”。原始掷骰结果被替换为其与任何额外掷骰结果之和。

  • 5d6 !!:投掷 5 个 6 面骰子,复合
    • 5d6 !!5:如果等于 5 则复合
    • 5d6 !!>=4:如果大于等于 4 则复合
    • 5d6 !!<=4:如果小于等于 4 则复合
    • 5d6 !!>5:如果大于 5 则复合
    • 5d6 !!<3:如果小于 3 则复合
    • 只复合一次,使用语法 !!o
      • 5d6 !!o<2

重掷骰子

  • 4d4 r2:投掷 4d4,重掷任何结果等于 2 的骰子
  • 4d4 r=2:投掷 4d4,重掷任何结果等于 2 的骰子
  • 4d4 r<=2:投掷 4d4,重掷任何小于等于 2 的骰子
  • 4d4 r>=3:投掷 4d4,重掷任何大于等于 3 的骰子
  • 4d4 r<2:投掷 4d4,重掷任何小于 2 的骰子
  • 4d4 r>3:投掷 4d4,重掷任何大于 3 的骰子
  • 只重掷一次,使用语法 ro
    • 4d4 ro<2

保留骰子

  • 3d20 k 2:投掷 3d20,保留 2 个最高值
  • 3d20 kh 2:投掷 3d20,保留 2 个最高值
  • 3d20 kl 2:投掷 3d20,保留 2 个最低值

丢弃骰子

  • 4d6 -H:投掷 4d6,丢弃 1 个最高值
  • 4d6 -L:投掷 4d6,丢弃 1 个最低值
  • 4d6 -H2:投掷 4d6,丢弃 2 个最高值
  • 4d6 -L2:投掷 4d6,丢弃 2 个最低值
  • 4d6 ->5:投掷 4d6,丢弃任何大于 5 的结果
  • 4d6 -<2:投掷 4d6,丢弃任何小于 2 的结果
  • 4d6 ->=5:投掷 4d6,丢弃任何大于等于 5 的结果
  • 4d6 -<=2:投掷 4d6,丢弃任何小于等于 2 的结果
  • 4d6 -=1:投掷 4d6,丢弃任何等于 1 的结果

计分骰子

  • 计数:
    • 4d6 #:有多少结果?
    • 4d6 #>3:投掷 4d6,计数任何大于 3 的结果
    • 4d6 #<3:投掷 4d6,计数任何小于 3 的结果
    • 4d6 #>=5:投掷 4d6,计数任何大于等于 5 的结果
    • 4d6 #<=2:投掷 4d6,计数任何小于等于 2 的结果
    • 4d6 #=5:投掷 4d6,计数任何等于 5 的结果

算术操作

  • 括号用于强制特定的操作顺序
  • 加法可以是整数之和,也可以用于合并多个骰子投掷的结果
    • 整数加法是通常的和
      • 4+5
      • 2d6 + 1
    • 加法运算符用于合并骰子投掷的结果(使用括号确保操作顺序)
      • (5d6+5d10)-L2:投掷 5d6 和 5d10,从聚合结果中丢弃最低的 2 个
      • 5d6+5d10-L2:投掷 5d6 和 5d10,仅从 5d10 结果中丢弃最低的 2 个

随机数生成器

默认情况下,使用 Random.secure()。你可以在创建骰子表达式时选择其他随机数生成器。如果你需要更快的性能且安全性不重要,可以使用 Random()

例如:

final diceExpr_SecureRNG = DiceExpression.create('2d6');
final diceExpr_FastRNG = DiceExpression.create('2d6', Random());

// 在按钮点击时进行投掷
final roll = diceExpr_SecureRNG.roll();

// 当骰子表达式更改时更新统计图表
final stats = await diceExpr_FastRNG.stats();
// 输出统计信息:{mean: 6.98, stddev: 2.41, min: 2, max: 12, count: 10000, histogram: {...}}

CLI 使用

虽然没有可执行文件在 bin 中,但有一个示例 CLI 在 example/main.dart 中。

用法:

❯ dart run example/main.dart -h
Usage:
-n, --num                       Number of times to roll the expression
                                (defaults to "1")
-o, --output                    output type

          [json]                output JSON
          [plain] (default)     output using toString
          [pretty]              output result summary and detailed results of evaluating the expression tree

-r, --random                    Random number generator to use.

          [<integer>]           pseudorandom generator initialized with given seed
          [pseudo] (default)    pseudorandom generator
          [secure]              secure random

-v, --[no-]verbose              Enable verbose logging
-s, --[no-]stats                Output statistics for the given dice expression. Uses n=10000 unless overridden
-h, --[no-]help                 

示例:

❯ dart example/main.dart '3d6'
(3d6) ===> RollSummary(total: 13, results: [3, 6, 4], metadata: {rolled: [3, 6, 4]})

# 运行 N 次投掷
❯ dart run example/main.dart -n5 '3d6'
(3d6) ===> RollSummary(total: 10, results: [2, 2, 6], metadata: {rolled: [2, 2, 6]})
...

总结

dart_dice_parser 提供了丰富的骰子记号解析功能,适用于各种游戏场景。你可以通过不同的记号组合来实现复杂的骰子投掷逻辑,并根据需要选择合适的随机数生成器。希望这个指南对你有所帮助!


更多关于Flutter骰子解析插件dart_dice_parser的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html

1 回复

更多关于Flutter骰子解析插件dart_dice_parser的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html


当然,以下是一个关于如何在Flutter项目中使用dart_dice_parser插件的示例代码。dart_dice_parser是一个用于解析骰子表达式的Dart库,适用于各种桌面和移动应用,特别是在需要处理复杂骰子逻辑的游戏中。

首先,确保你已经在pubspec.yaml文件中添加了dart_dice_parser依赖:

dependencies:
  flutter:
    sdk: flutter
  dart_dice_parser: ^最新版本号  # 替换为当前最新版本号

然后,运行flutter pub get来安装依赖。

接下来,我们可以编写一个Flutter应用来演示如何使用dart_dice_parser。以下是一个简单的示例:

import 'package:flutter/material.dart';
import 'package:dart_dice_parser/dart_dice_parser.dart';

void main() {
  runApp(MyApp());
}

class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      title: 'Dice Parser Demo',
      theme: ThemeData(
        primarySwatch: Colors.blue,
      ),
      home: DiceParserDemo(),
    );
  }
}

class DiceParserDemo extends StatefulWidget {
  @override
  _DiceParserDemoState createState() => _DiceParserDemoState();
}

class _DiceParserDemoState extends State<DiceParserDemo> {
  final TextEditingController _controller = TextEditingController();
  String _result = '';

  void _parseDice() {
    setState(() {
      try {
        final expression = _controller.text;
        final parser = DiceParser();
        final result = parser.parse(expression);
        _result = result.map((die) => die.toString()).join(', ');
      } catch (e) {
        _result = 'Error: ${e.toString()}';
      }
    });
  }

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text('Dice Parser Demo'),
      ),
      body: Padding(
        padding: const EdgeInsets.all(16.0),
        child: Column(
          mainAxisAlignment: MainAxisAlignment.center,
          children: <Widget>[
            TextField(
              controller: _controller,
              decoration: InputDecoration(
                labelText: 'Enter dice expression (e.g., 2d6 + 3d4)',
                border: OutlineInputBorder(),
              ),
              keyboardType: TextInputType.multiline,
              maxLines: 3,
            ),
            SizedBox(height: 16),
            ElevatedButton(
              onPressed: _parseDice,
              child: Text('Parse Dice'),
            ),
            SizedBox(height: 16),
            Text(
              _result,
              style: TextStyle(fontSize: 18),
            ),
          ],
        ),
      ),
    );
  }
}

在这个示例中,我们创建了一个简单的Flutter应用,它允许用户输入一个骰子表达式(例如2d6 + 3d4),然后点击按钮来解析这个表达式。解析结果会显示在屏幕上。

关键点解释:

  1. DiceParser:这是dart_dice_parser库中的主要类,用于解析骰子表达式。
  2. parse 方法:接受一个字符串形式的骰子表达式,并返回一个包含解析结果的列表。
  3. UI部分:我们使用TextField来接受用户输入,ElevatedButton来触发解析动作,Text来显示结果。

你可以根据具体需求扩展这个示例,比如添加更多的错误处理、支持更多的骰子表达式格式等。希望这个示例能帮助你理解如何在Flutter项目中使用dart_dice_parser插件。

回到顶部