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 则爆炸- 只爆炸一次,使用语法
!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
更多关于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
插件。