纯汇编实现打飞机小游戏的示例代码

汇编暑假作业要求做一个大项目,题目可以自拟。我思来想去,还是觉得做一个小游戏比较有意思。最后选择了做打飞机游戏。

这里采用的是VGA模式320x200 4色。

打飞机游戏的游戏逻辑比较简单。首先,飞机可以移动,也可以发射炮弹;其次,会有敌人不断地从前方飞过来,如果撞上飞机游戏结束;最后,飞机发射的炮弹可以击落敌人。

既然是打飞机,我们就必须首先造一台飞机,代码如下:

Comment/***********
	 function:  draw a horizontal line
	 parameters: horizontal position
	       vertical position
	 			 length of the line
	 			 color
	 return:   void
	 description:draw some points horizontally.
	 			 color '0001h' represents drawing a line while
	 			 color '0000h' which is black means erase the line.
**********/
drawALine PROC NEAR
    PUSH BP
    MOV BP, SP
    PUSH AX
    PUSH CX
    PUSH DX
    PUSH SI

    MOV AH, 0Ch
    MOV CX, [BP+4]
    MOV DX, [BP+6]
    MOV SI, [BP+8]
    MOV AL, Byte Ptr [BP+10]
drawALineLoop:
	  INT 10h
	  INC CX
	  DEC SI
	  JNZ drawALineLoop

    POP SI
    POP DX
    POP CX
    POP AX
    MOV SP, BP
    POP BP
    RET
drawALine ENDP  

Comment/***********
	 function:  draw a plane or a missile
	 parameters: horizontal position
	       vertical position
	       color
	       type (plane or missile or enemy)
	       map length
	 return:   void
	 description:call "drawALine" function repeatedly.
**********/
drawCraft PROC NEAR

	  PUSH BP
	  MOV BP, SP
	  SUB SP, 8

	  PUSH AX
	  PUSH DX
	  PUSH SI
	  PUSH DI
	  MOV DI, 0

	  MOV AX, [BP+12]
	  MOV [BP-8],AX
	  MOV SI, [BP+10]
	  MOV AX, [BP+8]
	  MOV [BP-6], AX
	  MOV AX, [BP+6]
	  MOV [BP-4], AX
	  MOV AX, [BP+4]
	  MOV [BP-2], AX
drawCraftLoop:
		PUSH Word Ptr [BP-6]
	  MOV DX, Word Ptr [SI]
	  PUSH DX
	  PUSH Word Ptr [BP-4]
	  MOV AX, [BP-2]
	  SHR DX, 1
	  SUB AX, DX
	  PUSH AX
	  CALL drawALine
	  ADD SP, 8
	  ADD Word Ptr [BP-4], 1
	  ADD SI, 2
	  INC DI
	  CMP DI, [BP-8]
	  JB drawCraftLoop

	  POP DI
	  POP SI
	  POP DX
	  POP AX
	  MOV SP, BP
	  POP BP
		RET
drawCraft ENDP

PLANEMAP DW 1,1,3,3,3,3,3,3,7,14,16,14,6,2,2,6,6
N1 EQU ($-PLANEMAP)/2

这里之所以做的这么复杂是出于代码重用的考虑,相同的代码只要输入不同的参数,就能制造出不一样的东西。这是抽象的思想。

drawCraft 根据输入的不同的数组,可以绘制出不同的东西,比如飞机,导弹,敌人。而不必画飞机一个函数,画导弹又是另一个函数了。

drawCraft主要是一条线一条线地画,就像3D打印一样。不过这里是2D的版本。

光画了飞机不行,我们还需要让它动起来。动起来的方法很简单,只需要用黑色覆盖原图,然后再在新的位置上建立一个新的即可:

Comment/***********
	 function:  move a plane
	 parameters: original horizontal position
	       original vertical position
	 			 direction(left-a up-w right-d bottom-s)
	 return:   rectify POS_X, POS_Y
	 description:destory the original and then create a new one
**********/
movePlane PROC NEAR
		 PUSH BP
		 MOV BP, SP

		 PUSH AX
		 PUSH BX
		 PUSH CX

		 MOV AX,N1
		 PUSH AX
		 MOV AX, Offset PLANEMAP
		 PUSH AX
		 MOV AX, 0000h
		 PUSH AX ;black color
		 MOV AX, [BP+6]
		 PUSH AX
		 MOV AX, [BP+4]
		 PUSH AX
		 CALL drawCraft
		 ADD SP, 10

		 MOV CX, CS:MoveItems
		 MOV AH, Byte Ptr [BP+9]
		 MOV BX, Offset MoveCase
movePlaneLoop1:
		 CMP AH, Byte Ptr CS:[BX]
		 JE ToCase
		 ADD BX, 4
		 LOOP movePlaneLoop1

ToCase:	 JMP Word Ptr CS: [BX+2]
MoveItems DW 4
MoveCase DW 75,Case1,72,Case2,77,Case3,80,Case4, 0, Default
Default: JMP EndSwitch
Case1:  SUB POS_X, 5
		 JMP EndSwitch
Case2:	 SUB POS_Y, 5
		 JMP EndSwitch
Case3:	 ADD POS_X, 5
		 JMP EndSwitch
Case4:  ADD POS_Y, 5

EndSwitch:
;draw a new plan in new position
		 MOV CX, N1
		 PUSH CX
		 MOV CX, Offset PLANEMAP
		 PUSH CX
		 MOV CX, 0001h
		 PUSH CX
	   PUSH POS_Y
	   PUSH POS_X
	   CALL drawCraft
		 ADD SP, 10
EndMovePlane:

		 POP CX
		 POP BX
		 POP AX
		 MOV SP, BP
		 POP BP
		 RET
movePlane ENDP

有了飞机,还要发射炮弹啊。我所期望的飞机,应该是可以多连发的,而且是无限发!那玩起来才爽。于是我设计了这样的数组。

MISSILE  DW 512 DUP('$$')
MISSILESNUM DW 0 

这是什么意思呢?我们一步一步来看。首先这是存储每次发射炮弹,炮弹所在的位置(横坐标和纵坐标)。

每当玩家按下空格键,就向数组里添加位置信息。这是为了方便后面让导弹一起上升。

在没有键盘输入的时候。我们想让导弹自己上升。为了做到这点,我们需要遍历这个MISSILE数组,每找到一个位置信息,就读出来,删除它,然后更新数组位置信息(只需要更新纵坐标),然后再在新的位置上画一个导弹就行了。

以下是具体实现代码

Comment/***********
	 function:
	 parameters: horizontal position
	       vertical position
	 return:   rectify 'MISSILE' and 'MISSILESNUM'
	 description:When press the space key, this program will put
	       the position into the 'MISSILE' array.
	       Then call 'drawMissile' to display it.
**********/
fireMissile PROC NEAR
		 PUSH BP
	   MOV BP, SP

	   PUSH CX
	   PUSH DX
	   PUSH SI
	   PUSH DI

	   MOV CX, [BP+4]
	   MOV DX, [BP+6]
	   SUB DX, 5
		 MOV SI, Offset MISSILE
fireMissileLoop:
		 CMP Word Ptr [SI], '$$'
		 JZ fireMissileIf
		 ADD SI, 4
		 JMP fireMissileLoop
fireMissileIf:
     MOV [SI], CX
     MOV [SI+2], DX

     MOV DI, N2
     PUSH DI
     MOV DI, Offset MISSILEMAP
     PUSH DI
     MOV DI, 0003h
     PUSH DI
     PUSH DX
     PUSH CX
     CALL drawCraft
     ADD SP, 10

		 INC MISSILESNUM
		 POP DI
	   POP SI
	   POP DX
	   POP CX
	   MOV SP, BP
	   POP BP
	   RET
fireMissile ENDP

Comment/***********
	 function:  rise all the existing missiles
	 parameters: void
	 return:   rectify MISSILE and MISSILESNUM
	 description:When there is no input event, this program will
	 			 rise all the existing missiles which stored in
	 			 the 'MISSILE' array unless there is no missile.
**********/
riseMissile PROC NEAR
		 PUSH BP
		 MOV BP, SP

		 PUSH SI
		 PUSH CX
		 PUSH DX

		 MOV SI, Offset MISSILE
		 MOV CX, 256
riseMissileLoop:
		 CMP Word Ptr [SI], '$$'
		 JZ riseMissileIf

		 MOV DX, N2
		 PUSH DX
		 MOV DX, Offset MISSILEMAP
		 PUSH DX
		 MOV DX, 0000h
		 PUSH DX
		 MOV DX, Word Ptr [SI+2]
		 PUSH DX
		 MOV DX, Word Ptr [SI]
		 PUSH DX
		 CALL drawCraft
		 ADD SP, 10

		 SUB Word Ptr [SI+2],2
		 JLE riseMissileIf2

		 MOV DX, N2
		 PUSH DX
		 MOV DX, Offset MISSILEMAP
		 PUSH DX
		 MOV DX, 0003h
		 PUSH DX
		 MOV DX, Word Ptr [SI+2]
		 PUSH DX
		 MOV DX, Word Ptr [SI]
		 PUSH DX
		 CALL drawCraft
		 ADD SP, 10

		 JMP riseMissileIf
riseMissileIf2:
		 MOV Word Ptr [SI], '$$'
		 MOV Word Ptr [SI+2], '$$'
		 DEC MISSILESNUM
riseMissileIf:
		 ADD SI, 4
		 LOOP riseMissileLoop

		 POP DX
		 POP CX
		 POP SI
		 POP AX	

		 MOV SP, BP
		 POP BP
		 RET
riseMissile ENDP

以上做的都是具体的例程。做到这里,回过头看一下我们主程序的实现。

整个游戏是依靠主程序调用一个个例程来运作的。

Start:
	  MOV AX, _DATA
	  MOV DS, AX
	  CLI
	  MOV AX, _STACK
	  MOV SS, AX
	  MOV SP, Offset TOS
	  STI

	  CALL init

	  MOV AH, 00h
	  MOV AL, 04h
	  INT 10h
	  MOV CX, N1
	  PUSH CX
	  MOV SI, Offset PLANEMAP
	  PUSH SI
	  MOV CX, 0001h
	  PUSH CX
	  PUSH POS_Y
	  PUSH POS_X
	  CALL drawCraft
	  ADD SP, 10
Again:
	  MOV AH,01h
	  INT 16h
Next:
	  JZ Process
	  MOV AH, 00h
 	  INT 16h
	  CMP AL, 27
	  JZ EndMain
	  CMP AL, ' '
	  JZ Shoot
	  PUSH AX
	  PUSH POS_Y
	  PUSH POS_X
	  CALL movePlane
	  ADD SP, 6
	  JMP Again
Shoot:
	  PUSH POS_Y
	  PUSH POS_X
	  CALL fireMissile
	  ADD SP, 4
	  JMP Again
Process:
	  CALL showScoreByDemical
	  CALL checkCollision
	  INC TIMER
	  MOV DX, DIFFICULTY
	  CMP TIMER, DX
	  JBE Loc1
	  CALL dropEnemy
	  MOV DX, MAX
	  SUB DX, TIMER
	  MOV TIMER, 0
	  CMP ENEMYNUM, DX
	  JA Loc1
	  CALL generateEnemy
Loc1:
	  CMP MISSILESNUM, 0
	  JZ Again
	  CALL riseMissile
	  JMP Again

解释一下:Again开始是主程序。先判断有没有键盘输入,如果有,判断是不是ESC(退出),然后再判断是不是空格(攻击),如果都不是,就执行 movePlane,在movePlane中实现具体的移动过程。

如果没有键盘输入,就执行Process后面的代码。这段代码稍后解释。

有了飞机,有了导弹,还需要有敌人啊。敌人的制作过程和导弹类似。也建立一个ENEMY数组来存储每一个敌人的位置信息,并在没有键盘输入的时候进行更新。只要注意导弹是上升,敌人是下降。

之后是检测碰撞,我是用二重循环遍历了MISSILE 和 ENEMY两个数组。一开始我写的是严格相等才算碰撞,后来玩的时候发现这条件太苛刻了,于是改成了在一定范围内就行。

Comment/***********
	 function:  check if there is any collision
	 parameters: void
	 return:   void
	 description:check vertical pos and horizontal pos, if both are
	       equel, delete one of them.
**********/
checkCollision PROC NEAR
		 PUSH BP
		 MOV BP, SP	

		 PUSH AX
		 PUSH BX
		 PUSH CX
		 PUSH DX
		 PUSH SI
		 PUSH DI

		 MOV SI, Offset ENEMY
		 MOV DI, Offset MISSILE
		 MOV AX, 0
		 MOV BX, 0
checkCollisionLoop1:
		 CMP Word Ptr [SI], '$$'
		 JZ checkCollisionIf

		 MOV CX, POS_X
		 SUB CX, Word Ptr[SI]
		 JGE checkCollisionLoc1
		 NEG CX
checkCollisionLoc1:
		 CMP CX, 8
		 JA checkCollisionLoop2

		 MOV DX, POS_Y
		 SUB DX, Word Ptr[SI+2]
		 JGE checkCollisionLoc2
		 NEG DX
checkCollisionLoc2:
		 CMP DX, 1
		 JA checkCollisionLoop2

		 ;game over
		 PUTS GAMEOVER
		 CALL delay
		 MOV AX, 4C00h
		 INT 21h 

	checkCollisionLoop2:
		 CMP Word Ptr [DI], '$$'
		 JZ checkCollisionIf3

		 MOV CX, Word Ptr[SI]
		 SUB CX, Word Ptr[DI]
		 JGE checkCollisionLoc3
		 NEG CX
	checkCollisionLoc3:
		 CMP CX, 5
		 JA checkCollisionIf3

		 MOV DX, Word Ptr[SI+2]
		 SUB DX, Word Ptr[DI+2]
		 JGE checkCollisionLoc4
		 NEG DX
	checkCollisionLoc4:
		 CMP DX, 5
		 JA checkCollisionIf3

		 JMP deleteEnemy
	checkCollisionIf3:
		 INC BX
		 ADD DI, 4
		 CMP BX, 256
		 JB checkCollisionLoop2

checkCollisionIf:
		 ADD SI, 4
		 MOV BX, 0
		 INC AX
		 CMP AX, 256
		 MOV DI, Offset MISSILE
		 JB checkCollisionLoop1
		 JMP checkCollisionEnd

deleteEnemy:
		 MOV DX, N3
		 PUSH DX
		 MOV DX, Offset ENEMYMAP
		 PUSH DX
		 MOV DX, 0000h
		 PUSH DX
		 MOV DX, Word Ptr [SI+2]
		 PUSH DX
		 MOV DX, Word Ptr [SI]
		 PUSH DX
		 CALL drawCraft
		 ADD SP, 10
		 MOV Word Ptr [SI], '$$'
		 MOV Word Ptr [SI+2], '$$'
		 DEC ENEMYNUM
		 ADD SCORE, 2

		 JMP checkCollisionIf3

checkCollisionEnd:

		 POP DI
		 POP SI
		 POP DX
		 POP CX
		 POP BX
		 POP AX
		 MOV SP, BP
		 POP BP
		 RET
checkCollision ENDP

到这里,主要的例程都已经结束了。

再回过头看一下主程序的代码。

Again:
	  MOV AH,01h
	  INT 16h
Next:
	  JZ Process
	  MOV AH, 00h
 	  INT 16h
	  CMP AL, 27
	  JZ EndMain
	  CMP AL, ' '
	  JZ Shoot
	  PUSH AX
	  PUSH POS_Y
	  PUSH POS_X
	  CALL movePlane
	  ADD SP, 6
	  JMP Again
Shoot:
	  PUSH POS_Y
	  PUSH POS_X
	  CALL fireMissile
	  ADD SP, 4
	  JMP Again
Process:
	  CALL showScoreByDemical
	  CALL checkCollision
	  INC TIMER
	  MOV DX, DIFFICULTY
	  CMP TIMER, DX
	  JBE Loc1
	  CALL dropEnemy
	  MOV DX, MAX
	  SUB DX, TIMER
	  MOV TIMER, 0
	  CMP ENEMYNUM, DX
	  JA Loc1
	  CALL generateEnemy
Loc1:
	  CMP MISSILESNUM, 0
	  JZ Again
	  CALL riseMissile
	  JMP Again

从Process开始,首先调用的是显示分数的例程(比较容易我没放上来),然后先检测是否碰撞。这里设置了一个DIFFICULTY变量,是适应不同难度(DIFFICULTY)。TIMER是用来定时的。每次都+1,加到DIFFICLUTY的值才执行敌人下降的例程。

难度大的话,敌人移动速度快,只需要把DIFFICULTY的值设小一点,就可以更快的使敌人下降;反之亦然。

附上一些效果图。

附上源码:https://github.com/zhongyuchen/hitplanegame

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持我们。

(0)

相关推荐

  • JavaScript用200行代码制作打飞机小游戏实例

    我去,我的图片分数被这个录屏软件的水印盖上了,扎心. 这个程序的文件以及代码全部上传到了github 程序下载链接传送门 这是自己第一次通过js写的小游戏,那个时候对象的原理跟结构体的概念不是特别的清晰,所以没用对象来写,所以直接导致后期我对这个程序进行修改的时候出现问题,太过于复杂了,我终于了解什么叫做牵一发动全身了.所以这个程序教会我一定一定要用对象的思想处理以后的问题,尤其是这种带属性明显的东西. 当然你要问我图片怎么来的我只能说都是我自己画的所以这可是原创的原创. 代码部分我是通过一个大

  • Java实现打飞机小游戏(附完整源码)

    写在前面 技术源于分享,所以今天抽空把自己之前用java做过的小游戏整理贴出来给大家参考学习.java确实不适合写桌面应用,这里只是通过这个游戏让大家理解oop面向对象编程的过程,纯属娱乐.代码写的很简单,也很容易理解,并且注释写的很清楚了,还有问题,自己私下去补课学习. 效果如下 完整代码 敌飞机 import java.util.Random; 敌飞机: 是飞行物,也是敌人 public class Airplane extends FlyingObject implements Enemy

  • 纯javascript模仿微信打飞机小游戏

    七夕情人节也不要忘了打游戏喔喔-,下面小编为大家准备的情人节礼物之纯javascript模仿微信打飞机小游戏分享给天下的情人们. 首先给大家展示效果图: 查看演示      源码下载 纯JavaScript模仿微信打飞机游戏,做网页小游戏的借鉴下,界面设计是竖长形仿手机屏幕风格,游戏效果流畅.具有分数统计,里面的JS封装类中包括有创建飞机类.飞机移动行为控制,创建子弹类,产生min到max之间的随机数,判断本方飞机是否移出边界,如果移出边界,则取消mousemove事件,反之加上mousemov

  • 纯汇编实现打飞机小游戏的示例代码

    汇编暑假作业要求做一个大项目,题目可以自拟.我思来想去,还是觉得做一个小游戏比较有意思.最后选择了做打飞机游戏. 这里采用的是VGA模式320x200 4色. 打飞机游戏的游戏逻辑比较简单.首先,飞机可以移动,也可以发射炮弹:其次,会有敌人不断地从前方飞过来,如果撞上飞机游戏结束:最后,飞机发射的炮弹可以击落敌人. 既然是打飞机,我们就必须首先造一台飞机,代码如下: Comment/*********** function: draw a horizontal line parameters:

  • Java实现接月饼小游戏的示例代码

    目录 前言 主要设计 功能截图 代码实现 游戏启动类 核心类 画面绘制 总结 前言 <接月饼小游戏>是一个基于java的自制游戏,不要被月亮砸到,尽可能地多接月饼. 此小项目可用来巩固JAVA基础语法,swing的技巧用法. 主要设计 设计游戏界面,用swing实现 设计背景 设计得分物体-月饼,碰到加一分 设计障碍物-月亮,碰到会死亡 监听鼠标的左右键,用来控制篮子左右移动 设计积分系统 将resource文件夹设为resource(Project Manage中可以设置),因为要用里面的图

  • Matlab实现别踩白块小游戏的示例代码

    目录 游戏效果 游戏说明 完整代码 pianoKeys.m(主函数) getMusic.m(用于获取音乐数据) 游戏效果 游戏说明 ‘A’,‘S’,‘D’,F’按键代表四条通路(点击S开始),按错按钮或黑块接触底限均为失败. 完整代码 分两个m文件,应放在同一文件夹 pianoKeys.m(主函数) function pianoKeys %======================%======== [v1,notes,fs]=getMusic;%读取音乐 %=================

  • Matlab实现贪吃蛇小游戏的示例代码

    由于老师说如果拿MATLAB制作出游戏或者有趣的动画的话.. 平时成绩可以拿满分 于是..开始尝试制作各种matlab小游戏 最初通过Alex的贪吃蛇学到了一些东西,然后制作了一个类似的俄罗斯方块在课堂上展示的(都是动的方块嗯哒). 后来自己也尝试写着玩了一些其他版本的贪吃蛇,并做出了一些改进. 补动图: 没错这就有点类似贪吃蛇大作战里的蛇啦 然后做出的改进包括: 在关闭窗口时不报错的设置,因为用了timer这个函数,在关闭图像时他会报错,我们就可以加入一个回调函数: set(gcf,'tag'

  • 基于Unity3D实现3D迷宫小游戏的示例代码

    目录 一.前言 二.构思 三.正式开发 3-1.搭建场景 3-2.设置出入口 3-3.添加角色 3-4.实现角色移动 3-5.出入口逻辑 四.总结 一.前言 闲来无事,从零开始整个<3D迷宫>小游戏. 本篇文章会详细介绍构思.实现思路,希望可以帮助到有缘人. 二.构思 首先,要实现一个小游戏,心里肯定要有一个大概的想法,然后就是将想法完善起来. 我的想法就是一个用立体的墙搭建的迷宫,然后控制人物在迷宫中移动,最后找到出口,就这么简单. 当然,这是一个雏形,比如可以加点音效.背景.关卡.解密等.

  • Vue实现红包雨小游戏的示例代码

    目录 0 写在前面 1 准备工作 2 设计HTML+CSS样式 3 设计JavaScript逻辑 4 完整代码 0 写在前面 红包也叫压岁钱,是过农历春节时长辈给小孩儿用红纸包裹的礼金.据传明清时期,压岁钱大多数是用红绳串着赐给孩子.民国以后,则演变为用红纸包裹.中国的红包传统民族文化在民间如此,社区.公司也奉行如仪.除了春节以外,在其他喜庆场合,例如婚礼.新店开张等亦有送红包的习俗. 本期迎新春专题用代码制作一个 红包雨小游戏 ,效果如下所示.看完本文相信你也可以完成这样一个小游戏设计. 1

  • 基于Python实现开心消消乐小游戏的示例代码

    目录 前言 一.准备 1.1 图片素材 1.2 音频素材 二.代码 2.1 导入模块 2.2 游戏音乐设置 2.3 制作树类 2.4 制作鼠标点击效果 2.5 制作出现元素 2.6 数组 2.7 制作人物画板 三.效果展示(仅部分) 3.1 初始页面 3.2 第一关画面 3.3 失败画面 3.4 第十关画面 穿过云朵升一级是要花6个金币的,有的时候金币真的很重要 前言 嗨喽,大家好呀!这里是魔王~ 一天晚上,天空中掉下一颗神奇的豌豆种子,正好落在了梦之森林的村长屋附近. 种子落地后吸收了池塘的水

  • 基于JS实现接粽子小游戏的示例代码

    目录 游戏设计 游戏实现 添加粽子元素 粽子掉落 难度选择 开始游戏 总结 端午节马上就到了,听说你们公司没发粽子大礼包?没关系,这里用 JS 实现了一个简单的接粽子小游戏,能接到多少粽子,完全看你手速,不用担心端午没粽子了. 游戏设计 在游戏屏幕内,会随机的从顶部掉落粽子,通过鼠标移动到粽子上并点击,成功接住粽子,得到积分.在设置面板中,可以设置游戏难度,分为简单.很难.超级难三种等级,不同等级的积分也是不同的,玩家可根据自己的手速进行设置.游戏结束后,可看到自己的成绩.实现出来的效果如下(可

  • JS+Canvas实现接球小游戏的示例代码

    目录 写在最前 git地址 成果展示 实现思路 详细说明 写在最后 写在最前 看了canvas的动画系列,已经抑制不住内心的冲动想写个小游戏了,还是那个套路——多写写,你才能了解它.加上这两天下班后我都没有机会去摸摸篮球,所以就写了个接球的小游戏(准确的说不能叫游戏,太简单了,叫动画吧...). 都是一些基础的实现,有时间你也可以试试,废话说到这里,我们开始吧. git地址 https://github.com/ry928330/ballGame.git 成果展示 实现思路 这里我们采用疑问的句

  • 基于JS实现飞机大战游戏的示例代码

    目录 演示 技术栈 源码 定义敌方战机 定义我方战机 碰撞检测 演示 技术栈 今天没有什么特别要讲的,要不我们提前介绍下次要做的技术吧.你不说话就是同意了.我们开始了. 下图是正则表达式的一些总结大家可以先看看哦 (function() { /** * 1. JavaScript使用正则式的函数 */ const str = "abchelloasdasdhelloasd"; // 1. 查找 console.log(str.search("h")); // 3 /

随机推荐