Flutter随机迷宫生成和解迷宫小游戏功能的源码

此博客旨在帮助大家更好的了解图的遍历算法,通过Flutter移动端平台将图的遍历算法运用在迷宫生成和解迷宫上,让算法变成可视化且可以进行交互,最终做成一个可进行随机迷宫生成和解迷宫的APP小游戏。本人是应届毕业生,希望能与大家一起讨论和学习~

注:由于这是本人第一次写博客,难免排版或用词上有所欠缺,请大家多多包涵。
注:如需转载文章,请注明出处,谢谢。

一、项目介绍:

1.概述
项目名:方块迷宫
作者:沫小亮。
编程框架与语言:Flutter&Dart
开发环境:Android Studio 3.6.2
学习参考:慕课网-看得见的算法
项目完整源码地址:(待更新)
游戏截图:

2.迷宫生成原理
1.采用图的遍历进行迷宫生成,其本质就是生成一棵树,树中每个节点只能访问一次,且每个节点之间没有环路(迷宫的正确路径只有一条)。
2.初始化:设置起点和终点位置,并给所有行坐标为奇数且列坐标为奇数的位置设置为路。其余位置设置为墙。(坐标从0…开始算)

(如下图,蓝色位置为墙,橙色位置为路,橙色线条为可能即将打通的路,此图来源于慕课网-看得见的算法)

3.在遍历过程中,不断遍历每个位置,同时遍历过的位置设为已访问位置,结合迷宫生成算法(见迷宫特点第6点)让相邻某个墙变成路,使之路径联通。直至所有位置都遍历完成则迷宫生成结束(每个节点只能遍历一次)。

(如下图,蓝色位置为墙,橙色位置为路,橙色线条为可能即将打通的路,此图来源于慕课网-看得见的算法)

3.迷宫特点(可根据需求自行扩展)
1.迷宫只有一个起点、一个终点,且起点和终点的位置固定。
2.迷宫的正确路径只有一条。
3.迷宫的正确路径是连续的。
4.迷宫地图是正方形,且方块行数和列数都为奇数。
5.迷宫中每个方块占用一个单元格。
6.迷宫生成算法:图的深度优先遍历和广度优先遍历相结合 + 随机队列(入队和出队随机在队头或队尾)+ 随机方向遍历顺序(提高迷宫的随机性)。
7.迷宫自动求解算法:图的深度优先遍历(递归方法)。

4.玩法介绍(可根据需求自行扩展)
1.游戏共设置有10个关卡,到达终点可以进入下一关,随着关卡数的增加,迷宫地图大小(方块数)增加,但限定时间也会增加。
2.点击方向键可对玩家角色的位置进行控制。
2.每个关卡都有限定时间,超过限定时间仍未到达终点则闯关失败,可从本关继续挑战。
3.每个关卡都可以使用一次提示功能,可展示2秒的正确路径,便于小白玩家入门。
4. 颜色对应:
蓝灰色方块->墙(不可经过)
蓝色方块->玩家角色(可控制移动)
白色方块->路(可经过)
深橘色->终点(通关)
橙色->正确路径(提示功能)

二、项目源码(主要部分):

pubspec.yaml //flutter配置清单

dependencies:
 flutter:
 sdk: flutter
 //toast库
 fluttertoast: ^3.1.3
 //Cupertino主题图标集
 cupertino_icons: ^0.1.2

maze_game_model.dart //迷宫游戏数据层

class MazeGameModel {
 int _rowSum; //迷宫行数
 int _columnSum; //迷宫列数
 int _startX, _startY; //迷宫入口坐标([startX,startY])
 int _endX, _endY; //迷宫出口坐标([endX,endY])
 static final int MAP_ROAD = 1; //1代表路
 static final int MAP_WALL = 0; //0代表墙
 List<List<int>> mazeMap; //迷宫地形(1代表路,0代表墙)
 List<List<bool>> visited; //是否已经访问过
 List<List<bool>> path; //是否是正确解的路径
 List<List<int>> direction = [
 [-1, 0],
 [0, 1],
 [1, 0],
 [0, -1]
 ]; //迷宫遍历的方向顺序(迷宫趋势)
 int spendStepSum = 0; //求解的总步数
 int successStepLength = 0; //正确路径长度
 int playerX, playerY; //当前玩家坐标

 MazeGameModel(int rowSum, int columnSum) {
 if (rowSum % 2 == 0 || columnSum % 2 == 0) {
 throw "model_this->迷宫行数和列数不能为偶数";
 }
 this._rowSum = rowSum;
 this._columnSum = columnSum;
 mazeMap = new List<List<int>>();
 visited = new List<List<bool>>();
 path = new List<List<bool>>();

 //初始化迷宫起点与终点坐标
 _startX = 1;
 _startY = 0;
 _endX = rowSum - 2;
 _endY = columnSum - 1;

 //初始化玩家坐标
 playerX = _startX;
 playerY = _startY;

 //初始化迷宫遍历的方向(上、左、右、下)顺序(迷宫趋势)
 //随机遍历顺序,提高迷宫生成的随机性(共12种可能性)
 for (int i = 0; i < direction.length; i++) {
 int random = Random().nextInt(direction.length);
 List<int> temp = direction[random];
 direction[random] = direction[i];
 direction[i] = temp;
 }

 //初始化迷宫地图
 for (int i = 0; i < rowSum; i++) {
 List<int> mazeMapList = new List();
 List<bool> visitedList = new List();
 List<bool> pathList = new List();

 for (int j = 0; j < columnSum; j++) {
 //行和列都为基数则设置为路,否则设置为墙
 if (i % 2 == 1 && j % 2 == 1) {
 mazeMapList.add(1); //设置为路
 } else {
 mazeMapList.add(0); //设置为墙
 }
 visitedList.add(false);
 pathList.add(false);
 }
 mazeMap.add(mazeMapList);
 visited.add(visitedList);
 path.add(pathList);
 }
 //初始化迷宫起点与终点位置
 mazeMap[_startX][_startY] = 1;
 mazeMap[_endX][_endY] = 1;
 }

 //返回迷宫行数
 int getRowSum() {
 return _rowSum;
 }

 //返回迷宫列数
 int getColumnSum() {
 return _columnSum;
 }

 //返回迷宫入口X坐标
 int getStartX() {
 return _startX;
 }

 //返回迷宫入口Y坐标
 int getStartY() {
 return _startY;
 }

 //返回迷宫出口X坐标
 int getEndX() {
 return _endX;
 }

 //返回迷宫出口Y坐标
 int getEndY() {
 return _endY;
 }

 //判断[i][j]是否在迷宫地图内
 bool isInArea(int i, int j) {
 return i >= 0 && i < _rowSum && j >= 0 && j < _columnSum;
 }
}

position.dart //位置类(实体类)
注:x对应二维数组中的行下标,y对应二维数组中的列下标(往后也是)

class Position extends LinkedListEntry<Position>{
 int _x, _y; //X对应二维数组中的行下标,y对应二维数组中的列下标
 Position _prePosition; //存储上一个位置

 Position(int x, int y, { Position prePosition = null } ) {
 this._x = x;
 this._y = y;
 this._prePosition = prePosition;
 }

 //返回X坐标()
 int getX() {
 return _x;
 }

 //返回Y坐标()
 int getY() {
 return _y;
 }

 //返回上一个位置
 Position getPrePosition() {
 return _prePosition;
 }
}

random_queue.dart //随机队列
入队:头部或尾部(各50%的概率)
出队:头部或尾部(各50%的概率)
底层数据结构:LinkedList

class RandomQueue {
 LinkedList<Position> _queue;

 RandomQueue(){
 _queue = new LinkedList();
 }

 //往随机队列里添加一个元素
 void addRandom(Position position) {
 if (Random().nextInt(100) < 50) {
 //从头部添加
 _queue.addFirst(position);
 }
 //从尾部添加
 else {
 _queue.add(position);
 }
 }

 //返回随机队列中的一个元素
 Position removeRandom() {
 if (_queue.length == 0) {
 throw "数组元素为空";
 }
 if (Random().nextInt(100) < 50) {
 //从头部移除
 Position position = _queue.first;
 _queue.remove(position);
 return position;
 } else {
 //从尾部移除
 Position position = _queue.last;
 _queue.remove(position);
 return position;
 }
 }

 //返回随机队列元素数量
 int getSize() {
 return _queue.length;
 }

 //判断随机队列是否为空
 bool isEmpty() {
 return _queue.length == 0;
 }
}

main.dart //迷宫游戏视图层和控制层

1. APP全局设置

void main() => runApp(MyApp());

class MyApp extends StatelessWidget {
 @override
 Widget build(BuildContext context) {
 if (Platform.isAndroid) {
 // 以下两行 设置android状态栏为透明的沉浸。写在组件渲染之后,是为了在渲染后进行set赋值,覆盖状态栏,写在渲染之前MaterialApp组件会覆盖掉这个值。
 SystemUiOverlayStyle systemUiOverlayStyle = SystemUiOverlayStyle(statusBarColor: Colors.transparent);
 SystemChrome.setSystemUIOverlayStyle(systemUiOverlayStyle);
 }
 return MaterialApp(
 title: '方块迷宫', //应用名
 theme: ThemeData(
 primarySwatch: Colors.blue, //主题色
 ),
 debugShowCheckedModeBanner: false, //不显示debug标志
 home: MyHomePage(), //主页面
 );
 }
}

2.界面初始化

 class MyHomePage extends StatefulWidget {
 MyHomePage({Key key}) : super(key: key);

 @override
 _MyHomePageState createState() => _MyHomePageState();
}

class _MyHomePageState extends State<MyHomePage> {
 int gameWidth, gameHeight; //游戏地图宽度和高度
 double itemWidth, itemHeight; //每个小方块的宽度和高度
 int level = 1;  //当前关卡数(共10关)
 int rowSum = 15; //游戏地图行数
 int columnSum = 15; //游戏地图列数
 int surplusTime; //游戏剩余时间
 bool isTip = false; //是否使用提示功能
 Timer timer;  //计时器
 MazeGameModel _model; //迷宫游戏数据层

 //初始化状态
 @override
 void initState() {
 super.initState();
 _model = new MazeGameModel(rowSum, columnSum);

 //新建一个事件循环队列,确保不堵塞主线程
 new Future(() {
 //生成一个迷宫
 _doGenerator(_model.getStartX(), _model.getStartY() + 1);
 });

 //设置倒计时
 _setSurplusTime(level);
 }

3.界面整体结构

 @override
 Widget build(BuildContext context) {
 //获取手机屏幕宽度,并让屏幕高度等于屏幕宽度(确保形成正方形迷宫区域)
 //结果向下取整,避免出现实际地图宽度大于手机屏幕宽度的情况
 gameHeight = gameWidth = MediaQuery.of(context).size.width.floor();
 //每一个小方块的宽度和长度(屏幕宽度/列数)
 itemHeight = itemWidth = (gameWidth / columnSum);
 return Scaffold(
 appBar: PreferredSize(
 //设置标题栏高度
 preferredSize: Size.fromHeight(40),
 //标题栏区域
 child: _appBarWidget()),
 body: ListView(
 children: <Widget>[
 //游戏地图区域
 _gameMapWidget(),
 //游戏提示与操作栏区域
 _gameTipWidget(),
 //游戏方向控制区域
 _gameControlWidget(),
 ],
 ),
 );
 }

4.游戏地图区域

注:由于游戏提示与操作栏区域、游戏方向键控制区域不是本文章要讲的重点,故不详细介绍,有兴趣的朋友可以到完整项目源码地址中查看。

 //游戏地图区域
 Widget _gameMapWidget(){
 return Container(
 width: gameHeight.toDouble(),
 height: gameHeight.toDouble(),
 color: Colors.white,
 child: Center(
 //可堆叠布局(配合Positioned绝对布局使用)
 child: Stack(
 //按行遍历
 children: List.generate(_model.mazeMap.length, (i) {
 return Stack(
 //按列遍历
  children: List.generate(_model.mazeMap[i].length, (j) {
  //绝对布局
  return Positioned(
  //每个方块的位置
  left: j * itemWidth.toDouble(),
  top: i * itemHeight.toDouble(),
  //每个方块的大小和颜色
  child: Container(
  width: itemWidth.toDouble(),
  height: itemHeight.toDouble(),
  //位于顶层的颜色应放在前面进行判断,避免被其他颜色覆盖
  //墙->蓝灰色
  //路->白色
  //玩家角色->蓝色
  //迷宫终点-> 深橘色
  //迷宫正确路径->橙色
  color: _model.mazeMap[i][j] == 0
  ? Colors.blueGrey
  : (_model.playerX == i && _model.playerY == j)
  ? Colors.blue
  : (_model.getEndX() == i && _model.getEndY() == j)
  ? Colors.deepOrange
  : _model.path[i][j] ? Colors.orange : Colors.white));
  }));
 }),
 ),
 ));
 }

5.生成迷宫

//开始生成迷宫地图
 void _doGenerator(int x, int y) {
 RandomQueue queue = new RandomQueue();
 //设置起点
 Position start = new Position(x, y);
 //入队
 queue.addRandom(start);
 _model.visited[start.getX()][start.getY()] = true;
 while (queue.getSize() != 0) {
 //出队
 Position curPosition = queue.removeRandom();
 //对上、下、左、右四个方向进行遍历,并获得一个新位置
 for (int i = 0; i < 4; i++) {
 int newX = curPosition.getX() + _model.direction[i][0] * 2;
 int newY = curPosition.getY() + _model.direction[i][1] * 2;
 //如果新位置在地图范围内且该位置没有被访问过
 if (_model.isInArea(newX, newY) && !_model.visited[newX][newY]) {
 //入队
 queue.addRandom(new Position(newX, newY, prePosition: curPosition));
 //设置该位置为已访问
 _model.visited[newX][newY] = true;
 //设置该位置为路
 _setModelWithRoad(curPosition.getX() + _model.direction[i][0], curPosition.getY() + _model.direction[i][1]);
 }
 }
 }
 }

6.自动解迷宫(提示功能)

//自动解迷宫(提示功能)
 //从起点位置开始(使用递归的方式)求解迷宫,如果求解成功则返回true,否则返回false
 bool _doSolver(int x, int y) {
 if (!_model.isInArea(x, y)) {
 throw "坐标越界";
 }
 //设置已访问
 _model.visited[x][y] = true;
 //设置该位置为正确路径
 _setModelWithPath(x, y, true);

 //如果该位置为终点位置,则返回true
 if (x == _model.getEndX() && y == _model.getEndY()) {
 return true;
 }
 //对四个方向进行遍历,并获得一个新位置
 for (int i = 0; i < 4; i++) {
 int newX = x + _model.direction[i][0];
 int newY = y + _model.direction[i][1];
 //如果该位置在地图范围内,且该位置为路,且该位置没有被访问过,则继续从该点开始递归求解
 if (_model.isInArea(newX, newY) &&
 _model.mazeMap[newX][newY] == MazeGameModel.MAP_ROAD &&
 !_model.visited[newX][newY]) {
 if (_doSolver(newX, newY)) {
 return true;
 }
 }
 }

 //如果该位置不是正确的路径,则将该位置设置为非正确路径所途径的位置
 _setModelWithPath(x, y, false);
 return false;
 }

7.控制玩家角色移动

移动到新位置

//控制玩家角色移动
 void _doPlayerMove(String direction) {
 switch (direction) {
 case "上":
 //如果待移动的目标位置在迷宫地图内,且该位置是路,则进行移动
 if (_model.isInArea(_model.playerX - 1, _model.playerY) && _model.mazeMap[_model.playerX - 1][_model.playerY] == 1) {
 setState(() {
 _model.playerX--;
 });
 }
 break;
//省略其他三个方向的代码

玩家到达终点位置

//如果玩家角色到达终点位置
if (_model.playerX == _model.getEndX() && _model.playerY == _model.getEndY()) {
 isTip = false; //刷新可提示次数
 timer.cancel(); //取消倒计时
 //如果当前关是第10关
 if (level == 10) {
 showDialog(
 barrierDismissible: false,
 context: context,
 builder: (BuildContext context) {
 return AlertDialog(
 content: Text("骚年,你已成功挑战10关,我看你骨骼惊奇,适合玩迷宫(狗头"),
 actions: <Widget>[
  new FlatButton(
  child: new Text('继续挑战第10关(新地图)', style: TextStyle(fontSize: 16)),
  onPressed: () {
  setState(() {
  _model.playerX = _model.getStartX();
  _model.playerY = _model.getStartY();
  });
  //重新初始化数据
  _model = new MazeGameModel(rowSum, columnSum);
  //生成迷宫和设置倒计时
  _doGenerator(_model.getStartX(), _model.getStartY() + 1);
  _setSurplusTime(level);
  Navigator.of(context).pop();
  },
  )
 ],
 );
 });
 }
 //如果当前关不是第10关
 else {
 showDialog(
 barrierDismissible: false,
 context: context,
 builder: (BuildContext context) {
 return AlertDialog(
 content: Text("恭喜闯关成功"),
 actions: <Widget>[
  new FlatButton(
  child: new Text('挑战下一关', style: TextStyle(fontSize: 16)),
  onPressed: () {
  setState(() {
  //关卡数+1,玩家角色回到起点
  level++;
  _model.playerX = _model.getStartX();
  _model.playerY = _model.getStartY();
  });
  //重新初始化数据
  _model = new MazeGameModel(rowSum = rowSum + 4, columnSum = columnSum + 4);
  //生成迷宫和设置倒计时
  _doGenerator(_model.getStartX(), _model.getStartY() + 1);
  _setSurplusTime(level);
  Navigator.of(context).pop();
  },
  )
 ],
 );
 });
 }
 }

注:其他与控制逻辑相关的方法不在此文中详细介绍,有兴趣的朋友可以到完整项目源码地址中浏览。

总结

到此这篇关于Flutter随机迷宫生成和解迷宫小游戏功能的源码的文章就介绍到这了,更多相关Flutter迷宫小游戏内容请搜索我们以前的文章或继续浏览下面的相关文章希望大家以后多多支持我们!

(0)

相关推荐

  • 最常见的猜拳小游戏Android代码实现

    本文实例为大家分享了Android猜拳小游戏,供大家参考,具体内容如下 简单的 页面跳转 和 点击事件 的实现... --> AndroidManifest.xml <?xml version="1.0" encoding="utf-8"?> <manifest xmlns:android="http://schemas.android.com/apk/res/android" package="com.drag

  • Android 实现扫雷小游戏实例代码

    Android 实现扫雷小游戏实例 最近学习Android 应用编程,抽空做个小应用,大家熟悉的扫雷应用,练手用, 以下是实现代码: MainActivity 类 public class MainActivity extends Activity implements OnClickListener, OnLongClickListener { // 最外层布局 LinearLayout textviews; LinearLayout buttons; int[][] map = new in

  • Android版微信跳一跳小游戏利用技术手段达到高分的操作方法

    本文主要来讲个个好玩的东西,近来微信刚出的跳一跳微信小程序的游戏很火,看到很多人都达到了二三百分就各种刷朋友圈了. 甩手一个表情 最终我们达到的分数却是这样的: 羡慕吧 一定会有人拍手叫好,"黄金右手"!说真的,我已经不用右手好多年,而且我玩这个游戏压根就没用手,而是意念!哈哈,别喷我,开个玩笑而已,肯定是利用技术手段啦,什么技术?python喽-哈哈,不过不是我写的,我自己是做Android开发的,我对于python从来没有接触,只是恰好在蛋哥公众号看到关于这个游戏的文章,觉得有意思

  • Android实现2048小游戏

    本文实例介绍了Android实现2048小游戏的相关代码,分享给大家供大家参考,具体内容如下 根据界面,主要实现4*4的格子方块比较麻烦,其他的都挺简单的.总体为实现4*4的格子,自定义GridLayout,并在其中添加触摸监听事件,进行一系列的操作,从而实现游戏的逻辑,最后再添加动画效果即可完成. 下面是设计思路: 一.GameView的设计 首先自定义一个类,继承GridLayout,添加两个构造方法 public class GameView extends GridLayout { //

  • Android高仿2048小游戏实现代码

    刚开始进入Splash界面: 1.SplashActivity.Java(两秒后进入开始界面,Splash界面的布局只有一个图片,在博客后,会展示给大家看) public class SplashActivity extends Activity { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.a

  • android自定义view实现推箱子小游戏

    本文实例为大家分享了android推箱子游戏的具体实现代码,供大家参考,具体内容如下 自定义view: package com.jisai.materialdesigndemo.tuixiangzhi; import android.content.Context; import android.graphics.Bitmap; import android.graphics.BitmapFactory; import android.graphics.Canvas; import androi

  • Flutter随机迷宫生成和解迷宫小游戏功能的源码

    此博客旨在帮助大家更好的了解图的遍历算法,通过Flutter移动端平台将图的遍历算法运用在迷宫生成和解迷宫上,让算法变成可视化且可以进行交互,最终做成一个可进行随机迷宫生成和解迷宫的APP小游戏.本人是应届毕业生,希望能与大家一起讨论和学习- 注:由于这是本人第一次写博客,难免排版或用词上有所欠缺,请大家多多包涵. 注:如需转载文章,请注明出处,谢谢. 一.项目介绍: 1.概述 项目名:方块迷宫 作者:沫小亮. 编程框架与语言:Flutter&Dart 开发环境:Android Studio 3

  • Python迷宫生成和迷宫破解算法实例

    迷宫生成 1.随机PRIM 思路:先让迷宫中全都是墙,不断从列表(最初只含有一个启始单元格)中选取一个单元格标记为通路,将其周围(上下左右)未访问过的单元格放入列表并标记为已访问,再随机选取该单元格与周围通路单元格(若有的话)之间的一面墙打通.重复以上步骤直到列表为空,迷宫生成完毕.这种方式生成的迷宫难度高,岔口多. 效果: 代码: import random import numpy as np from matplotlib import pyplot as plt def build_tw

  • Java实战之贪吃蛇小游戏(源码+注释)

    一.工程文件 二.Main.java package com.company; import javax.swing.*; public class Main { public static void main(String[] args) { //创建窗体对象 JFrame frame = new JFrame(); //创建窗体参数() frame.setBounds(10,10,900,720); //设置不允许更改大小 //frame.setResizable(false); //设置关

  • Java实现贪吃蛇大作战小游戏(附源码)

    目录 1.开发环境及游戏展示 1.1 游戏主界面 1.2 移动界面 1.3 奖励界面 1.4 F加速功能界面 1.5 死亡界面 2.需求分析 3.系统设计 3.1 系统总体功能设计 3.2 系统总体流程设计 4.功能设计 4.1 贪吃蛇移动及加速功能设计 4.2 贪吃蛇吃食物加速及死亡判定功能的设计 4.3 贪吃蛇主动加速功能的设计 4.4 贪吃蛇奖励机制功能的设计 5.项目结构与项目实现 5.1 项目结构及类间关系 5.2 项目完整源码 1.开发环境及游戏展示 贪吃蛇大作战在设计与实验的过程中

  • 基于Python实现贪吃蛇小游戏(附源码)

    目录 前言 主要设计 应用知识点 1.python知识点 2.pygamezero知识点 功能截图 代码实现 1.蛇的表示 2.蛇的前进移动 3.控制移动方向 4.游戏失败 5.食物的随机出现 6.游戏得分 源码 总结 前言 这几年人工智能技术大发展,Python因此几乎成了第一位的语言.实际上,多年来,它不仅在软件工程师中得到广泛使用,也是各行业通用的专家语言,就是说,不管孩子以后做什么,都可能用得着.准备针对我自己上小学的孩子,每周抽出些时间,通过学习他们感兴趣的小游戏,逐步把python知

  • 使用Python给头像加上圣诞帽或圣诞老人小图标附源码

    随着圣诞的到来,想给给自己的头像加上一顶圣诞帽.如果不是头像,就加一个圣诞老人陪伴. 用Python给头像加上圣诞帽,看了下大概也都是来自2017年大神的文章:https://zhuanlan.zhihu.com/p/32283641 主要流程 素材准备 人脸检测与人脸关键点检测 调整大小,添加帽子 用dlib的正脸检测器进行人脸检测,用dlib提供的模型提取人脸的五个关键点 调整帽子大小,带帽 选取两个眼角的点,求中心作为放置帽子的x方向的参考坐标,y方向的坐标用人脸框上线的y坐标表示.然后我

  • 微信 小程序前端源码详解及实例分析

    微信小程序前端源码逻辑和工作流 看完微信小程序的前端代码真的让我热血沸腾啊,代码逻辑和设计一目了然,没有多余的东西,真的是大道至简. 废话不多说,直接分析前端代码.个人观点,难免有疏漏,仅供参考. 文件基本结构: 先看入口app.js,app(obj)注册一个小程序.接受一个 object 参数,其指定小程序的生命周期函数等.其他文件可以通过全局方法getApp()获取app实例,进而直接调用它的属性或方法,例如(getApp().globalData) //app.js App({ onLau

  • 6款经典实用的jQuery小插件及源码(对话框/提示工具等等)

    jQuery是一款当之无愧的JS开源框架,凭借其小巧实用占领了很大的开发市场,jQuery另外一个优势就是拥有丰富多彩的插件,这些插件可以帮助你简化很多的开发过程.下面介绍的6款实用jQuery小插件及源码,希望大家喜欢. 1.jQuery智能单词提示工具 这是一款可以根据当前输入智能提示单词的插件,效果很棒. 在线演示 /源码下载 2.CSS3实现的Photoshop按钮效果 这是用jQuery和CSS3实现的Photoshop按钮效果. 在线演示 /源码下载 3.jQuery自定义确认对话框

  • 小米5s微信跳一跳小程序python源码

    本文实例为大家分享了微信跳一跳小程序python源码,供大家参考,具体内容如下 微信跳一跳小程序小米5s源码python,搭建环境后亲测可用. # coding: utf-8 import os import sys import subprocess import shutil import time import math from PIL import Image, ImageDraw import random import json import re # === 思路 === # 核

  • 基于jsbarcode 生成条形码并将生成的条码保存至本地+源码

    引言 JsBarcode是一个用JavaScript编写的条形码生成器.它支持多种条形码格式,可在浏览器和Node.js中使用.如果你在项目中使用了jquery也可以使用jquery,但它不是依赖项. 导读 以前生成条码都是外网网站上生成,因生产环境在内网中,上不了外网,只能在项目中生成相应规则,故将此方法整理下来. html <!DOCTYPE html> <html> <head> <meta charset="utf-8" /> &

随机推荐