首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

如何让敌人看起来不同于英雄画布socket.io

敌人看起来不同于英雄画布socket.io是一个关于前端开发和网络通信的问题。下面是一个完善且全面的答案:

敌人看起来不同于英雄画布socket.io是指在一个英雄画布游戏中,如何让敌人的外观与英雄的外观不同步,即敌人的动作和位置在游戏画布中与英雄不同步显示。

为了实现这个效果,可以使用socket.io库来进行实时的双向通信。socket.io是一个基于事件驱动的实时通信库,可以在浏览器和服务器之间建立持久的双向连接,实现实时数据传输。

具体实现步骤如下:

  1. 前端开发:使用前端技术(如HTML、CSS和JavaScript)创建游戏画布,并加载游戏资源(包括英雄和敌人的图片、动画等)。
  2. 后端开发:使用后端技术(如Node.js)创建一个服务器,并使用socket.io库来处理客户端和服务器之间的实时通信。
  3. 客户端与服务器通信:在客户端代码中,使用socket.io库的API来建立与服务器的连接,并监听服务器发送的事件。
  4. 服务器与客户端通信:在服务器端代码中,监听客户端发送的事件,并根据游戏逻辑处理这些事件。例如,当敌人的位置或动作发生变化时,服务器会将这些变化信息广播给所有连接的客户端。
  5. 客户端更新画布:客户端接收到服务器发送的敌人变化信息后,根据这些信息更新游戏画布上敌人的位置和动作,使其与英雄的画布不同步显示。

优势:

  • 实时性:使用socket.io库可以实现实时的双向通信,使敌人的变化能够及时地在游戏画布上显示。
  • 灵活性:socket.io库提供了丰富的API,可以根据实际需求进行定制和扩展。
  • 跨平台:socket.io库支持在多个平台上使用,包括Web、移动设备等。

应用场景:

  • 多人在线游戏:敌人的位置和动作需要实时同步显示给其他玩家。
  • 实时协作应用:敌人的变化需要实时通知给其他协作成员。

推荐的腾讯云相关产品和产品介绍链接地址:

  • 腾讯云云服务器(CVM):https://cloud.tencent.com/product/cvm
  • 腾讯云云函数(SCF):https://cloud.tencent.com/product/scf
  • 腾讯云云数据库MySQL版(CDB):https://cloud.tencent.com/product/cdb
  • 腾讯云CDN加速(CDN):https://cloud.tencent.com/product/cdn
  • 腾讯云物联网套件(IoT):https://cloud.tencent.com/product/iot
  • 腾讯云移动推送(TPNS):https://cloud.tencent.com/product/tpns
  • 腾讯云对象存储(COS):https://cloud.tencent.com/product/cos
  • 腾讯云区块链服务(BCS):https://cloud.tencent.com/product/bcs
  • 腾讯云虚拟专用网络(VPC):https://cloud.tencent.com/product/vpc
  • 腾讯云安全组(SG):https://cloud.tencent.com/product/sg

请注意,以上推荐的腾讯云产品仅供参考,具体选择应根据实际需求和项目要求进行评估和决策。

页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

《X特遣队》看不过瘾?来玩一把同系列VR游戏吧

前段时间,DC反英雄电影《X特遣队》在北美上映,玛格特·罗比饰演的小丑女性感火辣,但也挽留不了扑街的口碑。...如果相比责任重大的超级英雄们,你更青睐快意人生的反派英雄,千万不要错过同系列的VR游戏《自杀小分队》。今日,这款游戏登陆三星Gear VR,玩家可以低价甚至免费下载。 ?...小丑女武器是左轮手枪和一个看起来有点滑稽的强力拍,前者负责远射,后者负责近击,一挥就可以干掉多个敌人。复仇恶魔可以双手喷火,敌人感受烈焰的炽热。...当玩家的准星对准了敌人之后,点击Gear VR的触摸版,角色就可以用手中的武器向敌人发动攻击。 这个游戏看起来比较简单,只要在保护好自己的前提下,攻击敌人即可。...不过,要想消灭掉所有的敌人并不容易,长时间佩戴Gear VR射击容易疲劳,所以要速战速决。 值得注意的是,这只是一款不到200M的VR游戏,玩家们不要抱有过高的期望。

51630

Rxjs 响应式编程-第三章: 构建并发程序

响应式的飞船 为了展示我们如何保持一个应用程序的纯粹,我们将构建一个视频游戏,其中我们的英雄将和无尽的敌人宇宙飞船战斗。...我们的游戏将有四个主要角色:背景中的移动星球场,玩家的宇宙飞船,敌人,以及来自玩家和敌人的子弹。 它看起来像这样: ? 在屏幕截图中,红色三角形是我们的宇宙飞船,绿色三角形是敌人。...但是我们的英雄宇宙飞船在浩瀚的太空中太孤独了。 给它一些同伴怎么样? 生成敌人 如果我们没有任何敌人,这将是一个非常无聊的游戏。 所以让我们创造一个无限的流!我们想要每两秒半创造一个新的敌人。...射击 看到成群的敌人来到我们身边有点可怕;我们能做的就是走开,希望他们不要看到我们。如果让让我们的英雄有能力射击邪恶的外星人宇宙飞船会怎么样?...通过使它们以随机间隔发射而不是ENEMY_SHOOTING_FREQ中指定的固定敌人来制造更多不可预测的敌人。 如果玩家的分数越高,你可以他们更快地开火,这是额外的积分!

3.6K30
  • 这个故事有点耳熟

    考验、伙伴、敌人。一旦进入非常世界,勇者自然而然会面对未知的挑战和测验,认识朋友和敌人,学习非常世界的法则。...勇者或勇者的伙伴在这里通常会死亡或者看起来死亡了,从而给后面的复活一个伏笔。在爱情故事里,通常勇者会失去女神。...所有的英雄都会遇到阻碍,守卫属于英雄遇到的第一个困难,其主要功能是测试。他们通常看起来或者一开始很强大,显得难以克服,但只要英雄理解了他们,这一关就过了。...善变者没有固定的属性,在故事当中的功能是误导观众和英雄他们猜不透,搞不明白。...---- 书籍:游戏的设计与开发——梦开始的地方 编者:叶展 叶丁 ---- 都看到这了,留个言,点亮那个 ♡ 我开心一下吧~~_

    57540

    一起来读开源项目的代码-Agar.io为例

    image.png 技术栈: NodeJS NPM Bower Socket.IO Express 该游戏在使用Socket.IO的NodeJS环境上运行,以创建侦听端口3000的WebSocket...这只是一个简单的HTML文件,可创建画布来渲染游戏以及聊天框的一些HTML元素。 js / app.js中的游戏客户端逻辑。...游戏的渲染循环使用requestAnimationFrame而不是setInterval,这使画布具有更好的绘制性能。...服务器将比较他的质量(包括eatableMassDistance)与该敌人的质量。 如果敌人的质量更大,玩家将死亡。 服务器将向他发送RIP消息并关闭其连接。...添加gateway.js和npm run cluster命令以将服务器启动为集群 添加Redis以在服务器之间共享数据 服务器的外观如何

    2.2K20

    使用React和Node构建实时协作的白板应用

    无论地理位置如何,能够无缝地共同工作已经改变了团队的协作和沟通方式。本文将展示如何使用React和Node构建一个提供实时协作白板的Web应用程序。...一起发散思维:实时协作激发团队集思广益和分享创意,每个人共同应对挑战并创造新鲜解决方案。 效率提升:实时协作消除了沟通延迟,团队成员能够即时参与和贡献。这加快了问题解决速度并简化了工作流程。...在本文中,我们将介绍如何在白板上绘制线条和矩形。您可以在此基础上进一步了解并添加其他RoughJS支持的形状和功能。...); } // 返回一个表示元素的对象,包括其坐标和 RoughJS 表示 return { x1, y1, x2, y2, roughElement }; }; 现在,我们需要添加按钮,用户可以选择在我们的画布上使用哪种工具...增强互动性:启用拖放功能 为了用户能够在画布上拖放元素,我们将采取以下措施: 介绍选择工具:我们将为用户提供一个由单选按钮指示的选择工具。当选中按钮时,该工具将允许用户与现有元素进行交互和移动。

    56620

    DOTA 2血虐人类的OpenAI,原来靠的是作弊?

    BP发生在游戏开始前的选英雄过程,双方轮流禁掉部分英雄,然后再轮流选择英雄。 禁掉哪位强势英雄或者对方玩家擅长的英雄,选择怎样的英雄阵容,依据对方的阵容如何进行克制,是BP中玩家需要考虑的问题。...对于人脑而言,打游戏时的输入是视觉&听觉信号,人类玩家需要用眼睛和耳朵这两种“传感器”来接受信号,传送到大脑中,判断游戏中的情景,知道敌人离我有多远、队友能否来得及支援、双方经济状况如何。...比如说,当人类需要确认攻击能否打到敌人身上时,基本靠目测,如果低估了距离就会打不到敌人,如果高估了距离则容易受到敌人的攻击。...反之,AI用视觉打游戏,并不简单。DeepMind用AI打星际的主力Oriol Vinyal,就让AI用视觉打过星际。用着64x64的输入,AI吃了大亏。 ? ? ...如果,上一场5v5没有各位心服口服,OpenAI Five不日将出战TI8。希望那时,顶级人类选手和AI之间的比赛,大家能看个过瘾。 ? 你猜,和AI打比赛的会是哪支队?

    89720

    一个没有对手的英雄是什么体验?如何在你的Python游戏中添加反派

    在本系列的第5部分,从零开始的Python游戏中,添加一个坏人你的英雄去战斗!...在本系列的前几篇文章(请参阅第1部分,第2部分,第3部分和第4部分)中,您学习了如何使用Pygame和Python在尚未出现的空白游戏世界中构建可玩角色。但是,没有恶人可打的英雄岂不是很难受?...该过程与创建玩家对象是非常相似的: 1.创建一个class敌人能够生成。 2.创建一个 update 函数这样敌人就可以检测到碰撞。 3.创建一个move函数这样你的敌人就可以到处移动。...在开始之前,请确保您有敌人的图像文件,即使这只是临时图像也可以。 把图像文件放在你工程中的images目录里 (跟放置Player图片的目录是一样的). 如果画面生动活泼,那么游戏看起来会好很多。...最终,你的游戏世界将会滚动,因此当游戏世界本身在移动时,如何敌人在游戏世界中来回移动? 例如,你告诉敌人的精灵向右走10步,然后向左走10步。

    1.7K40

    DOTA2 插眼位置进行聚类分析,你也可以成为眼位大师

    例如,辅助英雄应该为Farm英雄创造发育空间,包括拉野,购买辅助物品、卖血等。 辅助英雄一个至关重要的角色是控制地图视野。正确位置的视野可以帮助团队实现关键目标。...这篇文章的目标是: 借助一些数据科学工具,探索职业玩家如何插眼和控制视野。 为休闲玩家提供指导,提升他们的游戏体验。 推断像 Dota Plus 这样的付费订阅如何提出插眼建议。...初步分数据 数据看起来如何?下图显示了数据集中所有假眼的散点图,以及按高度着色的地图。蓝点 (z=132) 对应一座小山,因此放置在小山上的眼可以提供无障碍视野。...此外,还提供了评论以解释集群如何反映参与者的策略。 开始前 - 0:00 分钟前 在第一波小兵离开基地之前,玩家会争夺河道符文。因此玩家在靠近地图中心的河流处放置假眼,以便查看敌人在做什么。...在敌人有时间阻止它之前,会在敌人的野区放置一些假眼观察敌人的活动。 最后,以红色显示的眼位对应于经济战。放置在中立野怪营地边界框内的眼会阻止也怪生成。这样敌方队伍被剥夺了金钱和拉野的能力。

    82430

    跨平台开源游戏

    精心挑选配色方案,游戏看起来风格如一。 当点击开始按钮式,卡片容器自动顺滑地滚到可视区域。 游戏进行中,自动隐藏无关元素,体验更沉浸式。 压缩图片,更快更好地加载体验。...和90经典版的坦克大战有些不同, 这里是纯坦克之间的战争, 英雄坦克并不用保护它的家。 软件功能: 游戏共设6个关卡....(支持无限关卡) 关卡设置中包括敌人坦克数量, 移动速度, 子弹速度, 以及子弹的杀伤力, 炸弹数量, 飞弹数量, 移动随机因子, 子弹发送频率因子。...英雄坦克的设置同上, 更改org.lionsoul.tankwar.LionBarriers可以加入更多关卡, 修改现有关卡选项。 游戏子弹分为三类: (1). 普通子弹(移动速度和杀伤力小)。...关于坦克: 分为两个大类, 英雄坦克(玩家), 敌人坦克. 敌人坦克分类: (1). 随机坦克. (移动和子弹发射,以及发射频率全是随机, 可以控制随机因子来控制)。 (2). 反抗坦克.

    2.7K40

    在王者荣耀角度下分析面向对象程序设计B中23种设计模式之状态模式

    应用一: 王者荣耀s19赛季新英雄镜被策划称作史上最难的最花里胡哨的英雄,在她上线后,玩家们也纷纷投身于体验镜这一英雄的热潮中。那么对于王者荣耀新英雄镜技能,研究起来也是别有一番风趣的。...鹿灵开大的话就是减速范围敌人,没有伤害控制效果,鹿灵正常持续6秒,也可以点一技能直接解除。简单来讲,瑶通过三技能,可随队友一起移动(移动状态随外部环境变化而变化)。...二、状态模式(State Pattern) 状态模式理解: 高度概括:允许一个对象在其内部状态改变时改变他的行为,对象看起来似乎修改了它的类。...状态模式的关键是将对象的状态封装成为独立的类对象,调用方法时,可以委托当前对象所具有的状态,调用相应的方法,使当前对象看起来好像修改了它的类。...环境(Context)实例所呈现的状态变得更加清晰、容易理解; ③使用状态模式可以用户程序很方便的切换环境(Context)实例的状态; ④使用状态模式不会环境(Context)的实例中出现内部状态不一致的情况

    48920

    在王者荣耀角度下分析面向对象程序设计B中23种设计模式之状态模式

    应用一: 王者荣耀s19赛季新英雄镜被策划称作史上最难的最花里胡哨的英雄,在她上线后,玩家们也纷纷投身于体验镜这一英雄的热潮中。那么对于王者荣耀新英雄镜技能,研究起来也是别有一番风趣的。...鹿灵开大的话就是减速范围敌人,没有伤害控制效果,鹿灵正常持续6秒,也可以点一技能直接解除。简单来讲,瑶通过三技能,可随队友一起移动(移动状态随外部环境变化而变化)。...二、状态模式(State Pattern) 状态模式理解: 高度概括:允许一个对象在其内部状态改变时改变他的行为,对象看起来似乎修改了它的类。...状态模式的关键是将对象的状态封装成为独立的类对象,调用方法时,可以委托当前对象所具有的状态,调用相应的方法,使当前对象看起来好像修改了它的类。...环境(Context)实例所呈现的状态变得更加清晰、容易理解; ③使用状态模式可以用户程序很方便的切换环境(Context)实例的状态; ④使用状态模式不会环境(Context)的实例中出现内部状态不一致的情况

    40400

    讲一个故事

    5)穿越极限:英雄告别普通世界,踏上冒险旅途。 6)考验、伙伴、敌人英雄面临小挑战,结识同伴,遭遇敌人,学会在冒险世界中生存。 7)抵达洞穴:英雄遭遇挫折,需要一些新的尝试。...lens #68 英雄之旅:英雄的故事都很像,如果觉得缺了什么,询问自己如下问题: 故事中拥有适合英雄之旅的元素吗? 故事结构是如何匹配英雄之旅模型的? 故事能否通过包含更多的典型元素来改进?...lens #69 古怪事物:在故事中加入古怪的事物可以你的游戏看起来很特别,但注意不要加入大量古怪的事物,为了确保你的故事不令人费解地古怪,询问自己如下问题: 我的故事中有哪些是古怪的?...如何这些古怪的东西不会困扰或让玩家疏远? 如果有很多古怪的东西,要不要考虑去掉一点? 如果我的故事当中没有古怪的东西,我的故事依然有趣吗?...故事是如何支撑美学表现、技术实现和游戏机制的?反过来,它们又是如何支撑故事的? 如何我的故事变得更好?

    58050

    Python——极客战记codecombat关卡代码

    # 寻找最近的敌人,然后他们滚蛋 enemy = hero.findNearestEnemy() if enemy: hero.say("Go away!...# 放在函数内的代码并不会立刻执行, 而是先保存好, 以备后用. # 这个函数会你的英雄收集最近的金币。...nearestCoin = hero.findNearest(items) if nearestCoin: hero.move(nearestCoin.pos) # 这个函数会你的英雄召唤一个士兵...英雄移动到moveToPos(注意:moveToPos是矢量,包含着坐标,后面不要加.pos) ####################################################...得到目标与英雄间的向量 # 2. 向量归一化 # 3. 归一向量矢量化 # 4. 检测英雄到牦牛的距离向量 # 5. 如果距离小于10,将牦牛到英雄的向量添加到英雄行走的向量中,避开牦牛。

    2.3K30

    左手持着枪,右手变成光 | 又get到一个英雄射击的新知识点!

    那么,如何定义一款游戏,尤其是底层玩法高度相似的射击游戏的游戏风格呢?外部宣传平台在形容游戏的游戏风格时经常使用类似“多人竞技创意体术射击”这样堆叠关键词式的俯瞰式概述。...辅以决斗类型的限制,我们可以尝试设计出这样一份技能demo: 被动:能够周期性地在身边随机生成全息投影,以干扰敌人视野。 主动技能:运用赛博义眼对房间进行红外扫描,扫描到敌人后将获得短暂的移速提升。...基于Role2的基础流程,我们已经选定了决斗类型,并拥有了一套基于世界观设定的脑暴式技能体系,接下来我们该如何去确保其设计具备可落地性呢?...主动技能:扫描某个持续暴露视野内的敌人,在1.5秒之后对其进行透视式位置锁定,为期5秒。...每个战斗策划在一开始设计英雄技能的时候,都会下意识最大程度地强化自己设计的“亲儿子“/"亲女儿"。 但是英雄设计是一门克制的艺术,你必须相应地去放大角色的缺陷,其一开始就尽可能有明显的强弱二象。

    73330

    MOBA英雄AI设计分享

    单体战术AI:每个英雄都会配备自己独特的战术AI,此AI将实现战斗细节,比如英雄何时该释放技能,对谁释放;如何走位规避风险或者形成Gank优势站位;怎么补兵;购买贩卖何种道具;何时追击何时逃跑等等。...,但都满足定性的设计要求): 1482394530_95_w732_h37.png 其中a,b为参数,AllyNearBy为敌方英雄600码内我方英雄数量,每增加一个盟友,敌人的诱惑程度增加b。...从另外两条兵线抽调英雄到最危险兵线。派遣数量服从规律:抽调后兵线上 我方英雄数目/敌方英雄数目>0.65(参数),尽可能多抽调英雄,但也确保不会被抽调的兵线变得很不安全。...物理护甲和魔法护甲如何?当前血量?我方集火的情况下,伤害总输出能杀死他几次?...Gank的设定AI能够有效的躲避危险,也能很精准的捕捉战机,完成很多人赞叹的绝妙击杀。 伤害量化,AI理解自己技能的特性。对AI行为收益优化帮助很大。

    6.2K263

    【Golang语言社区】H5游戏开发--从零开始开发一款H5小游戏(二) 创造游戏世界,启动发条

    Enemy为红色的敌人粒子,因为技能粒子和Enemy粒子具有很多共性,所以Skill粒子继承自Enemy粒子。 粒子之间撞击后有爆炸效果,用Paticle来表示爆炸粒子。...只不过map的render方法只是把画布涂黑,所以看起来并没有什么变化。 我们的游戏中有玩家粒子,敌人粒子,还有技能粒子,撞击爆破等效果。...它们表现出不同的效果。 这样渲染出来的画面还是死的,怎样每一帧渲染出来的图像有所不同,实现动画的效果呢?...例如player跟随鼠标移动。...至此整个游戏基本原理已经讲得差不多了,下一节要讲的是如何创建各种粒子,还有player那条会动的尾巴。敬请期待《从零开始开发一款H5小游戏(三) 攻守阵营,赋予粒子新的生命》

    1.4K30

    Dota之后,《王者荣耀》也被AI攻陷,势把人类顶级玩家拉下马

    如何开局是MOBA最重要的策略之一。 下图展示了通过模型学到不同英雄的开局注意力。每个子图由两个正方形组成。左侧方形图表示右侧MOBA mini-map的注意力分布。 ? 不同英雄的开场策略。...每个英雄都以最低金币值和等级1出生。两队都试图利用资源获得尽可能多的黄金和经验,以购买物品和升级。最终目标是摧毁敌人的基地。 MOBA的概念图如图所示。 1B。...围棋和MOBA游戏的计算复杂度比较 MOBA游戏中AI的宏观战略架构 我们设计MOBA AI宏观战略模型的动机源于人类玩家如何做出战略决策。...在每个阶段中,玩家都会关注游戏地图,并根据英雄的位置做出相应的决定。例如,在推线阶段,玩家倾向于更多地关注自己所在的路,而不是去支持队友,而在中后期阶段,玩家更多地关注团战点,并推向敌人的基地。...ts成为s的起始框架。请注意,会话以攻击行为结束,因此在英雄进行攻击的ts中存在区域y。如图所示。s-1的标签是ys,而s的标签是ys + 1。

    58340

    Dota之后,《王者荣耀》也被AI攻陷,势把人类顶级玩家拉下马

    如何开局是MOBA最重要的策略之一。 下图展示了通过模型学到不同英雄的开局注意力。每个子图由两个正方形组成。左侧方形图表示右侧MOBA mini-map的注意力分布。 不同英雄的开场策略。...每个英雄都以最低金币值和等级1出生。两队都试图利用资源获得尽可能多的黄金和经验,以购买物品和升级。最终目标是摧毁敌人的基地。 MOBA的概念图如图所示。 1B。...围棋和MOBA游戏的计算复杂度比较 MOBA游戏中AI的宏观战略架构 我们设计MOBA AI宏观战略模型的动机源于人类玩家如何做出战略决策。...在每个阶段中,玩家都会关注游戏地图,并根据英雄的位置做出相应的决定。例如,在推线阶段,玩家倾向于更多地关注自己所在的路,而不是去支持队友,而在中后期阶段,玩家更多地关注团战点,并推向敌人的基地。...ts成为s的起始框架。请注意,会话以攻击行为结束,因此在英雄进行攻击的ts中存在区域y。如图所示。s-1的标签是ys,而s的标签是ys + 1。

    53430

    2018年VRAR十大关键词(五):《头号玩家》

    在“废土”中寻找“绿洲” 同样是末日,同样是废土,但不同于其他救世的题材,《头号玩家》选择人们逃避,藏匿于虚拟。...即使是像男主那样的大废柴,也能在《绿洲》中成为超级英雄,甚至“拯救世界”。 不仅如此,男主韦德在拯救世界的间隙,还不忘拜个把子、谈个恋爱。最后“事业、爱情”双丰收,也众宅男羡慕不已了。 ?...好莱坞高超的特效技术和精致的画风,更加深了观众对《头号玩家》的好感度,从而造成口碑的极速上涨;一贯的好莱坞式商业大片内核——“个人英雄拯救世界”整个影片有了稳定和清晰的主线。...在游戏空旷的未来世界中,既有站立不动,也有朝玩家移动的敌人。玩家每击杀一个敌人敌人就会掉落一个金币袋,走到附近即可拾取(这个玩法有点像网游)。...如果是站在大红按钮的对面,面对绿洲和现实,我们又会如何选择呢? 小编不知道,斯皮尔伯格也不知道。 那么,《头号玩家》究竟带给了我们什么?

    1.1K50

    Dota2团战实力蔑视人类,解剖5只“AI英雄

    相比之下,人类这次输给的是怎样的进阶版“AI 英雄”?...此外,就应用环境而言,不同于棋牌游戏的固定规则,像 DOTA2 这样的复杂视频游戏是 5v5 对决的战略游戏,况且,DOTA 游戏已经不断开发了十几年,游戏逻辑中有数十万行代码,且每两周更新一次,游戏语义在不断产生变化...通过选择不同的行动和目标,我们可以了解 OpenAI Five 如何编码每个动作,以及如何观察世界。下图是人类会看到的场景。 ? OpenAI Five 可以对与它所看到的相关的丢失状态片段做出反应。...例如,直到最近,OpenAI Five 的观察区域才包括狙击手的技能范围(子弹落在敌人身上的区域)。...在每个训练游戏开始时,他们随机地将每个英雄“分配”到一些 lane 的子集,在到随机选择的时间之前,如果英雄偏离这些路线,就会受到惩罚。

    48950
    领券