“JavaScript中国象棋程序” 这一系列教程将带你从头使用JavaScript编写一个中国象棋程序。这是教程的第2节。

程序的最终效果点击这里查看

这一系列共有9个部分:

0、JavaScript中国象棋程序(0)- 前言

这一节介绍棋子的走法。改进之后的程序,可以连续走动红方棋子,但要符合象棋规则。黑方(电脑方)暂时还不能回应。

2.1、走法表示

一个走法包括起点和终点,分别用sqSrc和pcDst表示一维棋局数组中的起点和终点。很容易想到,使用数组[sqSrc, pcDst]表示一个走法。但程序将来会处理大量的走法,使用数组表示走法太浪费内存。由于sqSrc和pcDst都是不超过255的整数(因为一维棋盘数组的大小是256),可以将sqSrc和pcDst压缩到一个整数中,算法如下:

  1. function MOVE(sqSrc, sqDst) {
  2. return sqSrc + (sqDst << 8);
  3. }

如果想从压缩后的整数中,重新获取起点和终点,可分别使用以下函数:

  1. // 获取走法的起点
  2. function SRC(mv) {
  3. return mv & 255;
  4. }
  5.  
  6. // 获取走法的终点
  7. function DST(mv) {
  8. return mv >> 8;
  9. }

2.2、判断目标位置是否有本方棋子

如果目标位置有本方棋子,那么该走法肯定是不合法的。

设置一个变量pcSelfSide。走棋方为红方时pcSelfSide=8,走棋方为黑方时pcSelfSide=16。在上一节提到过:

红方棋子 & 8 = 1

黑方棋子 & 16 = 1

(终点棋子 & pcSelfSide) != 0 就说明终止位置有本方棋子,走法不合法。

另外,我们设置七个全局变量:

  1. var PIECE_KING = 0; // 将
  2. var PIECE_ADVISOR = 1; // 士
  3. var PIECE_BISHOP = 2; // 象
  4. var PIECE_KNIGHT = 3; // 马
  5. var PIECE_ROOK = 4; // 车
  6. var PIECE_CANNON = 5; // 炮
  7. var PIECE_PAWN = 6; // 卒

来对棋子编号。例如,只要满足:

棋子数值 - pcSelfSide = PIECE_KING

那么这个棋子就是将(帅)。使用同样的方法,可以判断出其他六种棋子。

2.3、校验将(帅)的走法

将的走法有四个方向,如下图所示:

在一维数组中,1、2、3、4几个方向的起点和终点分别满足以下等式:

pcDst = sqSrc - 16

pcDst = sqSrc - 1

pcDst = sqSrc + 1

pcDst = sqSrc + 16

将(帅)的走法需要满足下面这两个条件:

(1)、终点sqSrc位于九宫

可使用一个辅助数组,标识出所有合法的位置。

  1. var IN_FORT_ = [
  2. 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
  3. 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
  4. 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
  5. 0, 0, 0, 0, 0, 0, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0,
  6. 0, 0, 0, 0, 0, 0, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0,
  7. 0, 0, 0, 0, 0, 0, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0,
  8. 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
  9. 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
  10. 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
  11. 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
  12. 0, 0, 0, 0, 0, 0, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0,
  13. 0, 0, 0, 0, 0, 0, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0,
  14. 0, 0, 0, 0, 0, 0, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0,
  15. 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
  16. 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
  17. 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
  18. ]; 

判断是否在九宫,使用函数

  1. function IN_FORT(sq) {
  2. return IN_FORT_[sq] != 0;
  3. }

(2)、pcDst - sqSrc等于-16、-1、1、16其中的一个。

设置一个数组16×32的一维数组

  1. var LEGAL_SPAN = [
  2. 0, 0, 0, 0, 0, 0, 0, 0, 0,
  3. 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
  4. 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
  5. 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
  6. 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
  7. 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
  8. 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
  9. 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
  10. 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
  11. 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
  12. 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
  13. 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
  14. 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
  15. 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
  16. 0, 0, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 0, 0, 0,
  17. 0, 0, 0, 0, 0, 0, 2, 1, 2, 0, 0, 0, 0, 0, 0, 0,
  18. 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0,
  19. 0, 0, 0, 0, 0, 0, 2, 1, 2, 0, 0, 0, 0, 0, 0, 0,
  20. 0, 0, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 0, 0, 0,
  21. 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
  22. 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
  23. 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
  24. 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
  25. 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
  26. 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
  27. 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
  28. 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
  29. 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
  30. 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
  31. 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
  32. 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
  33. 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
  34. 0, 0, 0, 0, 0, 0, 0,
  35. ];

在该数组中,(-16 + 256)、(-1 + 256)、(1 + 256)、(16 + 256)四个位置是1,其他位置都不是1。校验函数如下

  1. function KING_SPAN(sqSrc, sqDst) {
  2. return LEGAL_SPAN[sqDst - sqSrc + 256] = = 1;
  3. }

2.4、校验士的走法

士的走法也是四个方向,如下所示

士的4个方向分别满足以下等式:

pcDst = sqSrc - 17

pcDst = sqSrc - 15

pcDst = sqSrc + 15

pcDst = sqSrc + 17

士的走法需要满足下面这两个条件:

(1)、终点sqSrc位于九宫

这与将(帅)的判断方法相同

(2)、pcDst - sqSrc等于-17、-15、15、17其中的一个

在上面提到的辅助数组LEGAL_SPAN中,(-17 + 256)、(-15 + 256)、(15 + 256)、(17 + 256)四个位置是2,其他位置都不是2。检验函数如下

  1. function ADVISOR_SPAN(sqSrc, sqDst) {
  2. return LEGAL_SPAN[sqDst - sqSrc + 256] == 2;
  3. }

2.5、校验象的走法

象的四个走法如下图所示,黑三角是相应的象眼位置

象的4个方向分别满足以下等式:

pcDst = sqSrc - 34

pcDst = sqSrc - 30

pcDst = sqSrc + 30

pcDst = sqSrc + 34

象的走法需要满足下面三个条件:

(1)、象不能过河

在程序中,棋局被表示为大小为256的一维数组,一半棋盘位于0到127,另一半位于128到255。

128的二进制是1000 0000,右起第八位是1。128到255这些数的二进制,右起第8位都是1;0到127这些数的二进制,右起第8位都是0。因此,如果象没过河,也就是pcDst和sqSrc位于相同的一半棋盘,那么

(sqSrc ^ sqDst)二进制的右起第八位是0,((sqSrc ^ sqDst) & 256)等于0。判断函数如下:

  1. // 如果从起点sqSrc到终点sqDst没有过河,则返回true;否则返回false
  2. function SAME_HALF(sqSrc, sqDst) {
  3. return ((sqSrc ^ sqDst) & 0x80) == 0;
  4. }

(2)、pcDst - sqSrc等于-34、-30、34、30其中的一个

在上面提到的辅助数组LEGAL_SPAN中,(-34 + 256)、(-30 + 256)、(30 + 256)、(34 + 256)四个位置是3,其他位置都不是3。检验函数如下

  1. function BISHOP_SPAN(sqSrc, sqDst) {
  2. return LEGAL_SPAN[sqDst - sqSrc + 256] == 3;
  3. }

(3)、象眼无棋子

象眼位于sqSrc和sqDst的中点,判断(sqSrc + sqDst)/2 的位置是否有棋子即可。

2.6、校验马的走法

马的8个走法如下图所示,黑三角是相应的马脚位置

马的8个方向满足以下等式:

pcDst = sqSrc - 33

pcDst = sqSrc - 31

pcDst = sqSrc - 18

pcDst = sqSrc + 14

pcDst = sqSrc - 14

pcDst = sqSrc + 18

pcDst = sqSrc + 31

pcDst = sqSrc + 33

对应的马脚分别位于:

sqSrc - 16

sqSrc - 16

sqSrc - 1

sqSrc - 1

sqSrc + 1

sqSrc + 1

sqSrc + 16

sqSrc + 16

马的走法需要满足下面两个条件:

(1)、pcDst - sqSrc等于-33、-31、-18、14、-14、18、31、33其中的一个

(2)、对应马脚的位置没有棋子

我们使用一个新的辅助数组,来判断马的走法是否合法。

  1. var KNIGHT_PIN_ = [
  2. 0, 0, 0, 0, 0, 0, 0, 0, 0,
  3. 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
  4. 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
  5. 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
  6. 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
  7. 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
  8. 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
  9. 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
  10. 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
  11. 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
  12. 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
  13. 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
  14. 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
  15. 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
  16. 0, 0, 0, 0, 0, 0,-16, 0,-16, 0, 0, 0, 0, 0, 0, 0,
  17. 0, 0, 0, 0, 0, -1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0,
  18. 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
  19. 0, 0, 0, 0, 0, -1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0,
  20. 0, 0, 0, 0, 0, 0, 16, 0, 16, 0, 0, 0, 0, 0, 0, 0,
  21. 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
  22. 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
  23. 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
  24. 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
  25. 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
  26. 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
  27. 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
  28. 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
  29. 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
  30. 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
  31. 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
  32. 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
  33. 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
  34. 0, 0, 0, 0, 0, 0, 0,
  35. ];

该数组在(-33 + 256)、(-31 + 256)、(-18 + 256)、(14 + 256)、(-14 + 256)、(18 + 256)、(31 + 256)、(33 + 256)这8个位置分别存放了-1、-1、-16、-16、1、1、16、16,其他位置都是0。

设置变量sqPin满足:

sqPin = sqSrc + KNIGHT_PIN_[sqDst - sqSrc + 256]

如果马的走法满足条件(1),那么spPin就是马脚的位置;否则sqPin = sqSrc。

因此马的走法合法,只需要满足sqPin != sqSrc并且sqPin位置无棋子。

2.7、校验车、炮的走法

车的走法如下图所示:

沿着四条直线走,每个方向可一直向前走,直到:

(1)、走出棋盘

(2)、碰到本方棋子

(3)、吃掉对方棋子

例如方向1,每走一步都是在起点基础上-1;方向2是在起点基础上-16;方向3是在起点基础上+1;方向4是在起点基础上+16。

炮与车的行棋规则类似,也可以沿一个方向一直向前走,不过遇到棋子时,要越过去(也就是翻山)。翻山后,炮只能吃对方棋子,不能落到空位置。

具体校验算法可参看代码。

2.8、校验卒(兵)的走法

红兵的走法如下图所示:

过河前,只能向前走。过河后,可以左右走。

(1)、判断是否过河

以红方为例,红方是向上走。如果红方过河,则会走到棋盘0到127的位置,此时所处位置的二进制表示,右起第8位是0。(因为128的二进制是1000 0000,这与之前讲过的SAME_HALF函数类似)

判断函数如下:

  1. // sp是棋子位置,sd是走棋方(红方0,黑方1)。如果该位置已过河,则返回true;否则返回false。
  2. function AWAY_HALF(sq, sd) {
  3. return (sq & 0x80) == (sd << 7);
  4.  
  5. }

如果兵已经过河,是可以左右走的,满足下面条件的走法一定合法:

AWAY_HALF(sq, sd) && (sqDst == sqSrc - 1 || sqDst == sqSrc + 1)

(2)、判断兵(卒)是否是向前走了一步

红兵向前走一步是sqSrc - 16,黑卒向前走一步是sqSrc + 16。可用如下函数得到兵(卒)向前一步的位置:

  1. // sp是棋子位置,sd是走棋方(红方0,黑方1)。返回兵(卒)向前走一步的位置。
  2. function SQUARE_FORWARD(sq, sd) {
  3. return sq - 16 + (sd << 5);
  4. }

因此,只要sqDst = = SQUARE_FORWARD(sq, sd),说明兵(卒)是向前走了一步,走法合法。

2.9、核心代码说明

本节的代码可以在 Github 下载,也可以直接clone

git clone -b step-2 https://github.com/Royhoo/write-a-chinesechess-program

Board中新增或修改的主要属性和方法

(1)、sqSelected

当前被选中棋子的位置。

(2)、clickSquare(sq_)

用户点击棋盘时,我们分两种情况进行讨论:

1、当前棋盘上没有棋子被选中

也就是说sqSelected为0。如果点击的是己方棋子,那么直接选中该子

sqSelected = 点击的位置

2、当前棋盘上有棋子被选中

也就是说sqSelected不为0。如果这次点击的仍然是己方棋子,这说明用户重新选择了要走的棋子,

sqSelected = 新的点击的位置

如果这次点击的是对方棋子,或者是一个空位置,这说明用户是在走棋。起点是原来选中的位置,终点是当前选中的位置。

(3)、addMove(mv)

判断一步棋是否合法,如果合法,就执行这步棋。

Position中新增或修改的主要属性和方法

(1)、legalMove(mv)

判断步骤是否合法。合法返回true,非法返回false。

JavaScript中国象棋程序(2) - 校验棋子走法的更多相关文章

  1. JavaScript中国象棋程序(0) - 前言

    “JavaScript中国象棋程序” 这一系列教程将带你从头使用JavaScript编写一个中国象棋程序.希望通过这个系列,我们对博弈程序的算法有一定的了解.同时,我们也将构建出一个不错的中国象棋程序 ...

  2. JavaScript中国象棋程序(1) - 界面设计

    "JavaScript中国象棋程序" 这一系列教程将带你从头使用JavaScript编写一个中国象棋程序.这是教程的第1节. 这一系列共有9个部分: 0.JavaScript中国象 ...

  3. JavaScript中国象棋程序(3) - 电脑自动走棋

    "JavaScript中国象棋程序" 这一系列教程将带你从头使用JavaScript编写一个中国象棋程序.这是教程的第3节. 这一系列共有9个部分: 0.JavaScript中国象 ...

  4. JavaScript中国象棋程序(4) - 极大极小搜索算法

    "JavaScript中国象棋程序" 这一系列教程将带你从头使用JavaScript编写一个中国象棋程序.这是教程的第4节. 这一系列共有9个部分: 0.JavaScript中国象 ...

  5. JavaScript中国象棋程序(5) - Alpha-Beta搜索

    "JavaScript中国象棋程序" 这一系列教程将带你从头使用JavaScript编写一个中国象棋程序.这是教程的第5节. 这一系列共有9个部分: 0.JavaScript中国象 ...

  6. JavaScript中国象棋程序(6) - 克服水平线效应、检查重复局面

    "JavaScript中国象棋程序" 这一系列教程将带你从头使用JavaScript编写一个中国象棋程序.这是教程的第6节. 这一系列共有9个部分: 0.JavaScript中国象 ...

  7. JavaScript中国象棋程序(7) - 置换表

    "JavaScript中国象棋程序" 这一系列教程将带你从头使用JavaScript编写一个中国象棋程序.这是教程的第2节. 这一系列共有9个部分: 0.JavaScript中国象 ...

  8. JavaScript中国象棋程序(8) - 进一步优化

    在这最后一节,我们的主要工作是使用开局库.对根节点的搜索分离出来.以及引入PVS(Principal Variation Search,)主要变例搜索. 8.1.开局库 这一节我们引入book.js文 ...

  9. 中国象棋程序的设计与实现(六)--N皇后问题的算法设计与实现(源码+注释+截图)

    八皇后问题,是一个古老而著名的问题,是回溯算法的典型例题. 该问题是十九世纪著名的数学家高斯1850年提出:在8X8格的国际象棋上摆放八个皇后,使其不能互相攻击,即任意两个皇后都不能处于同一行.同一列 ...

随机推荐

  1. 【转】50条大牛C++编程开发学习建议

    每个从事C++开发的朋友相信都能给后来者一些建议,但是真正为此进行大致总结的很少.本文就给出了网上流传的对C++编程开发学习的50条建议,总结的还是相当不错的,编程学习者(不仅限于C++学习者)如果真 ...

  2. CSS长度单位详解

    序言 长度单位可以总体的分为绝对长度单位和相对长度单位.CSS中最为大家熟知的无疑是px和em,但与此同时还存在pt, rem, vw, vh等其他计量单位,使用好它们可以大大增长我们的开发效率.本篇 ...

  3. CCF 201612-1 中间数

    试题编号:201612-1 试题名称:中间数 时间限制:1.0s 内存限制:256.0MB 问题描述 在一个整数序列a1, a2, -, an中,如果存在某个数,大于它的整数数量等于小于它的整数数量, ...

  4. 如何使用python timeit模块使用实践

    其实平时使用测试应用运行时间的情况 细算一下还真的很少.很久没有做性能优化的工作,不管是cProfile还是timeit模块都已经生疏了很久没有使用,我在以前的文章里面有提到过cPfile的性能测试使 ...

  5. UVa 11172 - Relational Operator

    题目大意:给两个数,比较大小... #include <cstdio> int main() { int T; scanf("%d", &T); int a, ...

  6. TortoiseSVN使用简介(收藏)

    TortoiseSVN使用简介 1.安装及下载client 端 2.什么是SVN(Subversion)? 3.为甚么要用SVN? 4.怎么样在Windows下面建立SVN Repository? 5 ...

  7. 微信小程序来了,小程序都能做些什么

    2017年的微信大动作就是微信小程序了,到底小程序都能做些什么?这是很多人关注的热点,小程序开发对企业又有什么帮助呢?下面让厦门微信小程序开发公司来为你就分析下.       微信小程序与APP的关系 ...

  8. 天兔(Lepus)监控邮件推送安装配置

    好吧,我承认官网的邮件配置教程我又没看懂,这里记录下我的配置方法 [root@HE3]# vi /usr/local/lepus/test_send_mail.py #!/usr/bin/envpyt ...

  9. 进度条(ProgressBar)的功能与用法

    进度条也是UI界面中一种非常实用的组件,通常用于向用户显示某个耗时操作完成的的百分比.进度条可以动态的显示进度,因此避免长时间的执行某个耗时的操作,让用户感觉程序失去了响应,从而更好的提高用户界面的友 ...

  10. ACE首页更改

    @{ Layout = null; } <!DOCTYPE html> <html lang="zh-cn"> <head> <meta ...