扑克牌游戏-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

相关文章

Spring事务传播机制最佳实践

《Spring事务传播机制最佳实践》Spring的事务传播机制为我们提供了优雅的解决方案,本文将带您深入理解这一机制,掌握不同场景下的最佳实践,感兴趣的朋友一起看看吧... 目录1. 什么是事务传播行为2. Spring支持的七种事务传播行为2.1 REQUIRED(默认)2.2 SUPPORTS2

Java中的雪花算法Snowflake解析与实践技巧

《Java中的雪花算法Snowflake解析与实践技巧》本文解析了雪花算法的原理、Java实现及生产实践,涵盖ID结构、位运算技巧、时钟回拨处理、WorkerId分配等关键点,并探讨了百度UidGen... 目录一、雪花算法核心原理1.1 算法起源1.2 ID结构详解1.3 核心特性二、Java实现解析2.

MySQL 中 ROW_NUMBER() 函数最佳实践

《MySQL中ROW_NUMBER()函数最佳实践》MySQL中ROW_NUMBER()函数,作为窗口函数为每行分配唯一连续序号,区别于RANK()和DENSE_RANK(),特别适合分页、去重... 目录mysql 中 ROW_NUMBER() 函数详解一、基础语法二、核心特点三、典型应用场景1. 数据分

深度解析Spring AOP @Aspect 原理、实战与最佳实践教程

《深度解析SpringAOP@Aspect原理、实战与最佳实践教程》文章系统讲解了SpringAOP核心概念、实现方式及原理,涵盖横切关注点分离、代理机制(JDK/CGLIB)、切入点类型、性能... 目录1. @ASPect 核心概念1.1 AOP 编程范式1.2 @Aspect 关键特性2. 完整代码实

前端如何通过nginx访问本地端口

《前端如何通过nginx访问本地端口》:本文主要介绍前端如何通过nginx访问本地端口的问题,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录一、nginx安装1、下载(1)下载地址(2)系统选择(3)版本选择2、安装部署(1)解压(2)配置文件修改(3)启动(4)

HTML中meta标签的常见使用案例(示例详解)

《HTML中meta标签的常见使用案例(示例详解)》HTMLmeta标签用于提供文档元数据,涵盖字符编码、SEO优化、社交媒体集成、移动设备适配、浏览器控制及安全隐私设置,优化页面显示与搜索引擎索引... 目录html中meta标签的常见使用案例一、基础功能二、搜索引擎优化(seo)三、社交媒体集成四、移动

HTML input 标签示例详解

《HTMLinput标签示例详解》input标签主要用于接收用户的输入,随type属性值的不同,变换其具体功能,本文通过实例图文并茂的形式给大家介绍HTMLinput标签,感兴趣的朋友一... 目录通用属性输入框单行文本输入框 text密码输入框 password数字输入框 number电子邮件输入编程框

HTML img标签和超链接标签详细介绍

《HTMLimg标签和超链接标签详细介绍》:本文主要介绍了HTML中img标签的使用,包括src属性(指定图片路径)、相对/绝对路径区别、alt替代文本、title提示、宽高控制及边框设置等,详细内容请阅读本文,希望能对你有所帮助... 目录img 标签src 属性alt 属性title 属性width/h

CSS3打造的现代交互式登录界面详细实现过程

《CSS3打造的现代交互式登录界面详细实现过程》本文介绍CSS3和jQuery在登录界面设计中的应用,涵盖动画、选择器、自定义字体及盒模型技术,提升界面美观与交互性,同时优化性能和可访问性,感兴趣的朋... 目录1. css3用户登录界面设计概述1.1 用户界面设计的重要性1.2 CSS3的新特性与优势1.

HTML5 中的<button>标签用法和特征

《HTML5中的<button>标签用法和特征》在HTML5中,button标签用于定义一个可点击的按钮,它是创建交互式网页的重要元素之一,本文将深入解析HTML5中的button标签,详细介绍其属... 目录引言<button> 标签的基本用法<button> 标签的属性typevaluedisabled