Flutter数独游戏插件fludoku的使用

Flutter数独游戏插件fludoku的使用

Dart包用于生成和解决数独谜题。

支持尺寸为4、9、16和25的谜题。这些尺寸表示每个组中位置的数量。

最常见的(也是默认的)尺寸9生成的谜题由9个3x3组组成。每个组有9个位置,需要填充从1到9的数字。

类似地,尺寸为16的谜题将由16个4x4组组成。每个组有16个位置,需要填充从1到16的数字。

目前,PuzzleDifficulty枚举仅影响尺寸为4和9生成的谜题的空位数量。对于更大的谜题,如果空位数量没有限制在天花板值(当前为81),生成单个谜题所需的时间可能会变得过长(通常为几分钟)。

测试

单元测试可用于boardgeneratorsolver库。

可以使用dart testflutter test运行测试。

示例

以下是该包的一个使用示例:

import 'package:fludoku/fludoku.dart';

void main() {
  var board = Board();
  board.setAt(row: 0, col: 0, value: 4);
  board.setAt(row: 3, col: 1, value: 6);
  try {
    board.setAt(row: 1, col: 2, value: 4); // 这将抛出异常,因为这会使棋盘无效
  } on ArgumentError catch (e) {
    print('Exception: $e');
  }
  final valueSet = board.trySetAt(row: 1, col: 2, value: 4); // 尝试设置一个已存在的值,返回false
  assert(valueSet == false);
  print('board:\n$board\n'); // 打印当前棋盘状态

  final (smallPuzzle, _) = generateBoard(level: PuzzleDifficulty.hard, dimension: 4); // 生成一个小尺寸的数独谜题
  if (smallPuzzle != null) {
    print("Small puzzle:\n$smallPuzzle\n"); // 打印小数独谜题
    var smallPuzzleSolution = findSolutions(smallPuzzle); // 查找小数独谜题的解决方案
    print("Small puzzle solution:\n$smallPuzzleSolution\n"); // 打印小数独谜题的解决方案
  }

  final (puzzle, _) = generateBoard(level: PuzzleDifficulty.hard, dimension: 9); // 生成一个标准尺寸的数独谜题
  if (puzzle != null) {
    print("Puzzle:\n$puzzle\n"); // 打印标准数独谜题
    var puzzleSolution = findSolutions(puzzle); // 查找标准数独谜题的解决方案
    print("Puzzle solution:\n$puzzleSolution\n"); // 打印标准数独谜题的解决方案
  }

  final (bigPuzzle, _) = generateBoard(level: PuzzleDifficulty.medium, dimension: 16); // 生成一个大尺寸的数独谜题
  if (bigPuzzle != null) {
    print("Big puzzle:\n$bigPuzzle\n"); // 打印大数独谜题
    var bigPuzzleSolution = findSolutions(bigPuzzle); // 查找大数独谜题的解决方案
    print("Big puzzle solution:\n$bigPuzzleSolution\n"); // 打印大数独谜题的解决方案
  }
}

上述示例程序的输出:

❯ dart run example/fludoku_example.dart
Exception: Invalid argument(s): Cannot set (1, 2) to "4" as it would invalidate the board
board:

 4  -  -    -  -  -    -  -  -
 -  -  -    -  -  -    -  -  -
 -  -  -    -  -  -    -  -  -


 -  6  -    -  -  -    -  -  -
 -  -  -    -  -  -    -  -  -
 -  -  -    -  -  -    -  -  -


 -  -  -    -  -  -    -  -  -
 -  -  -    -  -  -    -  -  -
 -  -  -    -  -  -    -  -  -


Small puzzle:

 3  4    1  -
 1  -    -  -


 -  -    -  1
 -  -    4  -


Small puzzle solution:
[
 3  4    1  2
 1  2    3  4


 4  3    2  1
 2  1    4  3
]

Puzzle:

 -  8  2    4  9  6    -  -  -
 3  -  -    1  -  -    -  -  6
 -  -  -    -  -  2    -  1  -


 8  3  -    -  -  -    5  2  -
 -  -  -    2  -  -    1  3  8
 2  7  5    -  -  -    4  -  9


 4  -  7    6  -  5    -  -  1
 5  -  -    -  -  -    6  4  -
 -  -  -    -  -  -    -  -  5


Puzzle solution:
[
 1  8  2    4  9  6    7  5  3
 3  5  4    1  7  8    2  9  6
 7  6  9    5  3  2    8  1  4


 8  3  1    9  6  4    5  2  7
 9  4  6    2  5  7    1  3  8
 2  7  5    8  1  3    4  6  9


 4  9  7    6  2  5    3  8  1
 5  1  3    7  8  9    6  4  2
 6  2  8    3  4  1    9  7  5
]

Big puzzle:

 8 12 15  3    9 11 13  1    6  - 10  7    -  5  -  4
 - 11 13  1   14 12  -  3    8  5 16  4    6  - 10  7
 6  2 10  -    -  5  -  4    - 12 15  3    9 11 13  -
 -  -  -  -    6  2 10  7    - 11 13  -    -  - 15  3


12 14  3  -    -  9  1  -    -  -  7 10    -  -  - 16
11  9  1  -   15 14 12  -    5  8  - 16    3 10  -  2
 -  6  - 10    5  8  - 16   12 14  3  -    -  9  1 13
 -  8  4  -    3 10  -  2   11  -  1 13   12 14  6 15


15  - 14  9   12 13  - 10    1  7  -  2    -  4  8  5
 -  - 12  -    2  - 14  9   16  4  8  5   10  7  3  6
 -  -  -  8    -  4  3  5   15 13  - 12    2  1  9 11
16  -  2  5    -  7  -  8    - 10  - 11    - 13 14 12


 3 15  -  -    -  1  - 12    7 16 11  8    4  -  5 10
 - 13 11  -    -  3  9  -    4  -  5  6    7 16  2  8
 7 10  8  6    4  -  - 11   13  3  2  -    1 15  -  -
 4 16  -  2    7  6  8  -   10  1  -  9   13  - 11 14


Big puzzle solution:
[
 8 12 15  3    9 11 13  1    6  2 10  7   14  5 16  4
 9 11 13  1   14 12 15  3    8  5 16  4    6  2 10  7
 6  2 10  7    8  5 16  4   14 12 15  3    9 11 13  1
14  5 16  4    6  2 10  7    9 11 13  1    8 12 15  3


12 14  3 15   11  9  1 13    2  6  7 10    5  8  4 16
11  9  1 13   15 14 12  6    5  8  4 16    3 10  7  2
 2  6  7 10    5  8  4 16   12 14  3 15   11  9  1 13
 5  8  4 16    3 10  7  2   11  9  1 13   12 14  6 15


15  3 14  9   12 13 11 10    1  7  6  2   16  4  8  5
13  1 12 11    2 15 14  9   16  4  8  5   10  7  3  6
10  7  6  8   16  4  3  5   15 13 14 12    2  1  9 11
16  4  2  5    1  7  6  8    3 10  9 11   15 13 14 12


 3 15  9 14   13  1  2 12    7 16 11  8    4  6  5 10
 1 13 11 12   10  3  9 14    4 15  5  6    7 16  2  8
 7 10  8  6    4 16  5 11   13  3  2 14    1 15 12  9
 4 16  5  2    7  6  8 15   10  1 12  9   13  3 11 14
]

更多关于Flutter数独游戏插件fludoku的使用的实战教程也可以访问 https://www.itying.com/category-92-b0.html

1 回复

更多关于Flutter数独游戏插件fludoku的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html


当然,下面是一个关于如何在Flutter项目中使用fludoku插件来创建数独游戏的示例代码。fludoku是一个用于Flutter的数独游戏引擎插件,它提供了生成数独谜题、验证解答等功能。

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

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

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

接下来,我们编写一个简单的Flutter应用来展示如何使用fludoku插件。

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

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

class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      title: 'Flutter Sudoku Game',
      theme: ThemeData(
        primarySwatch: Colors.blue,
      ),
      home: SudokuPage(),
    );
  }
}

class SudokuPage extends StatefulWidget {
  @override
  _SudokuPageState createState() => _SudokuPageState();
}

class _SudokuPageState extends State<SudokuPage> {
  late SudokuPuzzle _puzzle;
  late SudokuSolver _solver;

  @override
  void initState() {
    super.initState();
    // 创建一个新的数独谜题
    _puzzle = SudokuPuzzle.generateEasy();
    // 创建一个数独求解器
    _solver = SudokuSolver(_puzzle.board);
  }

  void _solvePuzzle() {
    // 使用求解器解决谜题
    _solver.solve();
    setState(() {
      // 更新谜题板为已解决的谜题
      _puzzle.board = _solver.board;
    });
  }

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text('Flutter Sudoku Game'),
        actions: <Widget>[
          IconButton(
            icon: Icon(Icons.check),
            onPressed: _solvePuzzle,
            tooltip: 'Solve Puzzle',
          ),
        ],
      ),
      body: GridView.builder(
        gridDelegate: SliverGridDelegateWithFixedCrossAxisCount(
          crossAxisCount: 9,
          crossAxisSpacing: 2.0,
          mainAxisSpacing: 2.0,
        ),
        itemCount: 81,
        itemBuilder: (BuildContext context, int index) {
          int row = index ~/ 9;
          int col = index % 9;
          int value = _puzzle.board[row][col];
          return GestureDetector(
            onTap: () {
              setState(() {
                // 在这里添加用户输入逻辑,为了简单起见,我们仅允许清空单元格
                if (value != 0) {
                  _puzzle.board[row][col] = 0;
                }
              });
            },
            child: Container(
              color: value == 0 ? Colors.grey[300] : Colors.blue[900],
              child: Center(
                child: Text(
                  value == 0 ? '' : value.toString(),
                  style: TextStyle(color: Colors.white, fontSize: 20),
                ),
              ),
            ),
          );
        },
      ),
    );
  }
}

在这个示例中,我们做了以下几件事:

  1. 初始化谜题和求解器:在initState方法中,我们生成了一个简单的数独谜题,并创建了一个求解器。
  2. 构建数独界面:使用GridView.builder来构建一个9x9的数独网格。每个单元格都是一个GestureDetector,允许用户点击清空单元格(为了简化,这里没有实现完整的用户输入逻辑)。
  3. 解决谜题:点击AppBar上的“Solve Puzzle”按钮,使用求解器解决谜题并更新界面。

请注意,这个示例是一个简化的版本,没有实现完整的用户输入逻辑(如数字键盘、验证输入等)。在实际应用中,你可能需要进一步完善这些功能。

回到顶部