Flutter骰子解析插件dart_dice_parser的使用
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 !=5或4d6!5:如果等于 5 则爆炸4d6 !>=4:如果大于等于 4 则爆炸4d6 !<=2:如果小于等于 2 则爆炸4d6 !>5:如果大于 5 则爆炸4d6 !<2:如果小于 2 则爆炸- 只爆炸一次,使用语法 
!o4d6 !o<5
 
复合骰子
类似于爆炸骰子,但额外的掷骰结果被加在一起作为一个单独的“掷骰”。原始掷骰结果被替换为其与任何额外掷骰结果之和。
5d6 !!:投掷 5 个 6 面骰子,复合5d6 !!5:如果等于 5 则复合5d6 !!>=4:如果大于等于 4 则复合5d6 !!<=4:如果小于等于 4 则复合5d6 !!>5:如果大于 5 则复合5d6 !!<3:如果小于 3 则复合- 只复合一次,使用语法 
!!o5d6 !!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 的骰子- 只重掷一次,使用语法 
ro4d4 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+52d6 + 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
更多关于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),然后点击按钮来解析这个表达式。解析结果会显示在屏幕上。
关键点解释:
DiceParser类:这是dart_dice_parser库中的主要类,用于解析骰子表达式。parse方法:接受一个字符串形式的骰子表达式,并返回一个包含解析结果的列表。- UI部分:我们使用
TextField来接受用户输入,ElevatedButton来触发解析动作,Text来显示结果。 
你可以根据具体需求扩展这个示例,比如添加更多的错误处理、支持更多的骰子表达式格式等。希望这个示例能帮助你理解如何在Flutter项目中使用dart_dice_parser插件。
        
      
            
            
            
