扑克牌游戏-HTML5拖放API实践

2024-03-28 09:59

本文主要是介绍扑克牌游戏-HTML5拖放API实践,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

扑克牌游戏-HTML5拖放API实践

  • 实验要求
    • HTML代码
    • style.css
    • function.js

实验要求

设计一款扑克牌拖放小游戏。在网页中插入A框和B框。
要求用户拖动从A框拖动5张连续的扑克牌至B框,完成游戏。具体要求:
1.初始时,A框包含13张随机乱序后的同花色扑克牌,以背面显示。
2.用户可任意拖动其中一张扑克牌至B框,扑克牌以正面展示。
3.用户也可将扑克牌从B框拖至A框,扑克牌会自动回到初始的位置,且背面展示。
4.B框最多能够容纳5张扑克牌。在接收到5张扑克牌后,如果满足顺子要求,则提示用户游戏结束并显示用户成绩(拖动次数)。若不满足要求,用户必须先将其中不满足的牌拖回A框,游戏方可继续。

HTML代码

<!DOCTYPE html>
<html>
<head><title>扑克游戏</title><link rel="stylesheet" type="text/css" href="./css/style.css"><script src="./js/function.js"></script></head>
<p>已拖放次数: <span id="counter">0</span></p>
<body onload="imgset()"><div id="boxA" ondrop="drop2(event)" ondragover="allowDrop(event)">A框<br><img src="" id="1" draggable="true" ondragstart="drag(event)" onerror="event.target.src='./image/pk/pkb.jpg'"><img src="" id="2" draggable="true" ondragstart="drag(event)" onerror="event.target.src='./image/pk/pkb.jpg'"><img src="" id="3" draggable="true" ondragstart="drag(event)" onerror="event.target.src='./image/pk/pkb.jpg'"><img src="" id="4" draggable="true" ondragstart="drag(event)" onerror="event.target.src='./image/pk/pkb.jpg'"><img src="" id="5" draggable="true" ondragstart="drag(event)" onerror="event.target.src='./image/pk/pkb.jpg'"><img src="" id="6" draggable="true" ondragstart="drag(event)" onerror="event.target.src='./image/pk/pkb.jpg'"><img src="" id="7" draggable="true" ondragstart="drag(event)" onerror="event.target.src='./image/pk/pkb.jpg'"><img src="" id="8" draggable="true" ondragstart="drag(event)" onerror="event.target.src='./image/pk/pkb.jpg'"><img src="" id="9" draggable="true" ondragstart="drag(event)" onerror="event.target.src='./image/pk/pkb.jpg'"><img src="" id="10" draggable="true" ondragstart="drag(event)"onerror="event.target.src='./image/pk/pkb.jpg'"><img src="" id="11" draggable="true" ondragstart="drag(event)"onerror="event.target.src='./image/pk/pkb.jpg'"><img src="" id="12" draggable="true" ondragstart="drag(event)"onerror="event.target.src='./image/pk/pkb.jpg'"><img src="" id="13" draggable="true" ondragstart="drag(event)"onerror="event.target.src='./image/pk/pkb.jpg'"></div><div id="boxB" ondrop="drop(event)" ondragover="allowDrop(event)">B框<br></div></body>
</html>

style.css

div#boxA{width: 450px;height: 650px;border: solid;float: left;padding: 20px;margin: 20px 20px 20px 20px;}
div#boxB{width: 450px;height: 650px;border: solid;float: left;padding: 20px;margin: 20px 20px 20px 20px;
}img {float: left;width: 105px;height: 150px;background-image: url(../image/pk/pkb.jpg);  background-repeat: no-repeat;  background-size: cover;  display: block;}

function.js

这边的图片命名我是以a,b,c,d分为四组,然后以扑克牌面3为1,以此类推:
感觉我描述抽象的可以看图

Alt

//计数器
var counter=0;//随机数生成
function RandomNum(Min,Max){var num = Min + Math.round(Math.random() * (Max - Min)); return num;
}//判断数组是否有重复数字
function  isRepeat(arr) {var hash = {}for (var i in arr) {if (hash[arr[i]]) { return true }hash[arr[i]] = true}return false}//扑克牌生成    
var defaultImg='./image/pk/pkb.jpg';//默认牌背
var srcData=[];//储存生成后图片src路径	
function imgset() {var arr=[];  switch(RandomNum(1,4)){case 1://红桃组groupStr="a";break;case 2://方块组groupStr="b";break;case 3://黑桃组groupStr="c";break;case 4://梅花组groupStr="d";break;default:break;}for (var i=1; i <= 13; i++) { arr[i]=RandomNum(1,13);do{arr[i]=RandomNum(1,13)srcData[i]="./image/pk/"+groupStr+arr[i]+".jpg";}while(isRepeat(arr));if (isRepeat(arr)==false) {srcData[i]="./image/pk/"+groupStr+arr[i]+".jpg";  }}}//拖拽事件
function allowDrop(ev){ev.preventDefault();
}function drag(ev){ev.dataTransfer.setData("Text", ev.target.id);var imgSrc=document.getElementById(ev.target.id).src;document.getElementById(ev.target.id).src=srcData[ev.target.id];
}function drop(ev){ev.preventDefault();    var data=ev.dataTransfer.getData("Text");    var targetElement = ev.target;     // 检查目标元素的id,以确定是哪个box  if (targetElement.id == 'boxB') {  // 如果是boxB,检查子元素数量  if (targetElement.childElementCount >5) {    // 如果子元素数量大于或等于5,则不允许放置  alert("不能超过5个元素");    return;    }}  // 如果子元素数量小于5,或者目标是boxA,则允许放置  targetElement.appendChild(document.getElementById(data)); document.getElementById(data).src=srcData[data];counter++;//计数器document.getElementById("counter").innerHTML=counter;//拖放次数//src转数字并存数组let div=document.getElementById("boxB");let imgElements=div.getElementsByTagName("img");let srcValues=[];//只装入src数字for(let i=0;i<imgElements.length;i++){let imgSrc=imgElements[i].src.slice(-5);//slice取后五个字符let match=imgSrc.match(/\d+/);if(match){srcValues.push(parseInt(match[0]));}}//判断if (targetElement.id == 'boxB') {    if (targetElement.childElementCount ==6) {   //5个元素时候触发if(areNumbersConsecutive(srcValues)){alert("恭喜完成游戏,一共花费次数:"+counter);}}}  }function drop2(ev){//放回,恢复背面ev.preventDefault();    var data=ev.dataTransfer.getData("Text");    var targetElement = ev.target;targetElement.appendChild(document.getElementById(data)); document.getElementById(data).src=defaultImg;counter++;document.getElementById("counter").innerHTML=counter;
}//是否是连续
function areNumbersConsecutive(arr) {  arr.sort((a, b) => a - b); // 对数组进行排序  for (let i = 1; i < arr.length; i++) {  if (arr[i] - arr[i - 1] !== 1) { // 检查每对相邻元素的差值是否为1  return false;  }  }  return true;  
}

实现效果
效果页面
请添加图片描述

以上代码还有许多可以优化的地方,请自行对其增减优化,我就不在优化了,最后扑克图片啥的请自备哈。目前还有俩已知BUG没改,自行探索
当然不是因为懒
请添加图片描述
当然还有另外的实现方法我在这放个连接:HTML实验三: 扑克牌拖放小游戏

这篇关于扑克牌游戏-HTML5拖放API实践的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/855293

相关文章

Vue3 的 shallowRef 和 shallowReactive:优化性能

大家对 Vue3 的 ref 和 reactive 都很熟悉,那么对 shallowRef 和 shallowReactive 是否了解呢? 在编程和数据结构中,“shallow”(浅层)通常指对数据结构的最外层进行操作,而不递归地处理其内部或嵌套的数据。这种处理方式关注的是数据结构的第一层属性或元素,而忽略更深层次的嵌套内容。 1. 浅层与深层的对比 1.1 浅层(Shallow) 定义

基于MySQL Binlog的Elasticsearch数据同步实践

一、为什么要做 随着马蜂窝的逐渐发展,我们的业务数据越来越多,单纯使用 MySQL 已经不能满足我们的数据查询需求,例如对于商品、订单等数据的多维度检索。 使用 Elasticsearch 存储业务数据可以很好的解决我们业务中的搜索需求。而数据进行异构存储后,随之而来的就是数据同步的问题。 二、现有方法及问题 对于数据同步,我们目前的解决方案是建立数据中间表。把需要检索的业务数据,统一放到一张M

这15个Vue指令,让你的项目开发爽到爆

1. V-Hotkey 仓库地址: github.com/Dafrok/v-ho… Demo: 戳这里 https://dafrok.github.io/v-hotkey 安装: npm install --save v-hotkey 这个指令可以给组件绑定一个或多个快捷键。你想要通过按下 Escape 键后隐藏某个组件,按住 Control 和回车键再显示它吗?小菜一碟: <template

【 html+css 绚丽Loading 】000046 三才归元阵

前言:哈喽,大家好,今天给大家分享html+css 绚丽Loading!并提供具体代码帮助大家深入理解,彻底掌握!创作不易,如果能帮助到大家或者给大家一些灵感和启发,欢迎收藏+关注哦 💕 目录 📚一、效果📚二、信息💡1.简介:💡2.外观描述:💡3.使用方式:💡4.战斗方式:💡5.提升:💡6.传说: 📚三、源代码,上代码,可以直接复制使用🎥效果🗂️目录✍️

【前端学习】AntV G6-08 深入图形与图形分组、自定义节点、节点动画(下)

【课程链接】 AntV G6:深入图形与图形分组、自定义节点、节点动画(下)_哔哩哔哩_bilibili 本章十吾老师讲解了一个复杂的自定义节点中,应该怎样去计算和绘制图形,如何给一个图形制作不间断的动画,以及在鼠标事件之后产生动画。(有点难,需要好好理解) <!DOCTYPE html><html><head><meta charset="UTF-8"><title>06

系统架构师考试学习笔记第三篇——架构设计高级知识(20)通信系统架构设计理论与实践

本章知识考点:         第20课时主要学习通信系统架构设计的理论和工作中的实践。根据新版考试大纲,本课时知识点会涉及案例分析题(25分),而在历年考试中,案例题对该部分内容的考查并不多,虽在综合知识选择题目中经常考查,但分值也不高。本课时内容侧重于对知识点的记忆和理解,按照以往的出题规律,通信系统架构设计基础知识点多来源于教材内的基础网络设备、网络架构和教材外最新时事热点技术。本课时知识

计算机毕业设计 大学志愿填报系统 Java+SpringBoot+Vue 前后端分离 文档报告 代码讲解 安装调试

🍊作者:计算机编程-吉哥 🍊简介:专业从事JavaWeb程序开发,微信小程序开发,定制化项目、 源码、代码讲解、文档撰写、ppt制作。做自己喜欢的事,生活就是快乐的。 🍊心愿:点赞 👍 收藏 ⭐评论 📝 🍅 文末获取源码联系 👇🏻 精彩专栏推荐订阅 👇🏻 不然下次找不到哟~Java毕业设计项目~热门选题推荐《1000套》 目录 1.技术选型 2.开发工具 3.功能

Vue3项目开发——新闻发布管理系统(六)

文章目录 八、首页设计开发1、页面设计2、登录访问拦截实现3、用户基本信息显示①封装用户基本信息获取接口②用户基本信息存储③用户基本信息调用④用户基本信息动态渲染 4、退出功能实现①注册点击事件②添加退出功能③数据清理 5、代码下载 八、首页设计开发 登录成功后,系统就进入了首页。接下来,也就进行首页的开发了。 1、页面设计 系统页面主要分为三部分,左侧为系统的菜单栏,右侧

国产游戏崛起:技术革新与文化自信的双重推动

近年来,国产游戏行业发展迅猛,技术水平和作品质量均得到了显著提升。特别是以《黑神话:悟空》为代表的一系列优秀作品,成功打破了过去中国游戏市场以手游和网游为主的局限,向全球玩家展示了中国在单机游戏领域的实力与潜力。随着中国开发者在画面渲染、物理引擎、AI 技术和服务器架构等方面取得了显著进展,国产游戏正逐步赢得国际市场的认可。然而,面对全球游戏行业的激烈竞争,国产游戏技术依然面临诸多挑战,未来的

【VUE】跨域问题的概念,以及解决方法。

目录 1.跨域概念 2.解决方法 2.1 配置网络请求代理 2.2 使用@CrossOrigin 注解 2.3 通过配置文件实现跨域 2.4 添加 CorsWebFilter 来解决跨域问题 1.跨域概念 跨域问题是由于浏览器实施了同源策略,该策略要求请求的域名、协议和端口必须与提供资源的服务相同。如果不相同,则需要服务器显式地允许这种跨域请求。一般在springbo