HTML5 实现扑克翻牌游戏

这篇具有很好参考价值的文章主要介绍了HTML5 实现扑克翻牌游戏。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

HTML5 实现扑克翻牌游戏,H5,游戏,html5,前端,扑克牌游戏,原力计划

 扑克翻牌游戏就是桌面24张牌,玩家翻到两张相同扑克牌则消去,如果时间2分钟到了,仍然没有成功则游戏失败。扑克翻牌游戏运行结果如图1。

HTML5 实现扑克翻牌游戏,H5,游戏,html5,前端,扑克牌游戏,原力计划

 

01、程序设计的思路

1.Html5倒计时功能

Html5倒计时功能可以使用setTimeout()函数或者setInterval()函数来实现。

1.使用setTimeout实现倒计时功能

setTimeout()会在一个指定的延迟时间之后调用一个函数或执行一段指定的代码。它的应用非常广泛,例如我们希望用户在浏览器某个页面一段时间后弹出一个对话框,或者是鼠标单击某个元素后隔几秒钟在删除这个元素。

setTimeout函数语法:

setTimeout(code,millisec)

例如:var t =setTimeout("javascript语句", 毫秒)

setTimeout() 的第一个参数code是含有JavaScript语句的字符串。这个语句可能诸如"alert('5seconds!')",或者对函数的调用,诸如alertMsg()"。第二个参数millisec指示从当前起等待多少毫秒后执行第一个参数code。

setTimeout()函数会返回某个值。在上面的语句中,值被储存在名为t的变量中。假如希望取消这个setTimeout(),可以使用clearTimeout(t)来实现。

需要强调的是,setTimeout() 只执行code一次。如果要多次调用,可以让code自身再次调用setTimeout()。

例如下面代码调用setTimeout()实现1小时倒计时。

<body>
<div id="timer"></div>
<script type="text/javascript"language="javascript">
var d1=new Date();//年月日时分秒
var d2=d1.getTime()+60*60*1000
var endDate=new Date(d2);
function daoJiShi()
{
var now=new Date();
var oft=Math.round((endDate-now)/1000)
var ofd=parseInt(oft/3600/24);                         //天
var ofh=parseInt((oft%(3600*24))/3600);        //小时
var ofm=parseInt((oft%3600)/60);                   //分
var ofs=oft%60;                                                //秒
document.getElementById('timer').innerHTML='还有'+ofd+'天'+ofh+'小时'+ofm+'分钟'+ofs+'秒';
if(ofs<0){
document.getElementById('timer').innerHTML='倒计时结束!';return;
};
setTimeout('daoJiShi()',1000);//自身再次调用daoJiShi()
};
daoJiShi();
</script>
</body>

2.使用setInterval实现倒计时功能

setTimeout()只执行代码code一次。如果要多次调用code可以使用setInterval()。setInterval ()可按照指定的周期(以毫秒计)来调用需要重复执行的函数代码。

setTimeout函数语法:

setInterval(function,interval[,arg1,arg2,......argn])

其中function参数可以是一个匿名函数或者是一个函数名,interval是设定的调用function的时间间隔,单位为毫秒(默认值为10毫秒),arg1,arg2,......argn为可选参数,是传递给function的参数。

下面的例子每隔1秒调用一次匿名函数。

setInterval(function(){trace("每隔1秒钟我就会显示一次")},1000);

这里的function(){}是没有函数名的函数,成为匿名函数,后面的1000是时间间隔,单位是毫秒,即1秒钟。

下面的例子为我们展示如何带参数运行。

function show1(){
   trace("每隔1秒显示一次");
}
function show2(str){                       //带参数函数show2
   trace(str);
}
setInterval(show1,1000);
setInterval(show2,2000,"每隔2秒我就会显示一次");
//调用带参数函数show2 setInterval()会不停地调用函数,直到clearInterval()被调用或窗口被关闭。由setInterval()返回的ID值可用作clearInterval(ID)方法的参数。在游戏开发中,常常使用setInterval()制作游戏动画或其他间隔性渲染效果时。
var intervalID = setInterval(show1,1000);
clearInterval(intervalID); //取消该定时设置

例如下面代码用setInterval()实现1小时倒计时。

<body>
<div id="timer"></div>
<script type="text/javascript"language="javascript">
var d1=new Date();//年月日时分秒
var d2=d1.getTime()+60*60*1000
var endDate=new Date(d2);
function daoJiShi()
{
var now=new Date();
var oft=Math.round((endDate-now)/1000);
var ofd=parseInt(oft/3600/24);
var ofh=parseInt((oft%(3600*24))/3600);
var ofm=parseInt((oft%3600)/60);
var ofs=oft%60;
  document.getElementById('timer').innerHTML='还有'+ofd+'天'+ofh+'小时'+ofm+'分钟'+ofs+'秒';
if(ofs<0){
   document.getElementById('timer').innerHTML='倒计时结束!';return;
};
};
setInterval('daoJiShi()',1000);//间隔1秒钟调用
</script>
</body>

2.扑克牌显示与隐藏

游戏中使用的扑克牌牌面及背面采用1张图片(deck.png)存储,如图2所示。上面4行分别为4种花色扑克牌,最后一行扑克牌背面,每行高度120px。如何分割显示某一张扑克牌,这里使用CSS3技术实现。

HTML5 实现扑克翻牌游戏,H5,游戏,html5,前端,扑克牌游戏,原力计划

例如想显示扑克牌背面图案如下写CSS类别:

.front
{
    width:80px;    height: 120px;
   background-image: url("../images/deck.png");
   background-position: 0 -480px;
    z-index:10;
}

类别.front的背景图片是deck.png,background-position设置的背景图片位置。例如:

background-position:00;背景图片的左上角将与容器元素的左上角对齐。该设置与background-position:left top;或者background-position:0% 0%;设置的效果是一致的。

background-position:0 -480px;图片以容器左上角为参考向左偏移0px,向上偏移480px,从而正好是扑克牌背面图片区域。

z-index属性设置元素的堆叠(显示)顺序。拥有更高堆叠顺序的元素总是会处于堆叠顺序较低的元素前面。

background简写属性可在一个声明中设置所有的背景属性。可以设置如下属性:background-color、background-position、background-size、background-repeat、background-origin、background-clip、background-attachment、background-image。如果不设置其中的某个值,也是允许的。比如:

   background: #999 url("../images/deck.png")0 -480px;
    background:#ff0000 url('smiley.gif');

显示扑克牌牌面图案如下写CSS类别:

 .back
{
    width:80px;    height: 120px;
   background: #efefef url("../images/deck.png");
   -webkit-transform-rotateY(-180deg); /* 其中-180 deg是旋转的角度 */
    z-index:8;
}
.cardAJ{background-position: -800px 0;}

background-position: -800px 0;图片以容器左上角为参考向左偏移800px,由于图片中每张牌宽度80px,所以正好显示出黑桃J。

.cardBJ{background-position: -800px-120px;}

background-position: -800px -120px;图片以容器左上角为参考向左偏移800px,所以正好显示出红桃J,向上偏移120px。

.cardCJ{background-position: -800px -240px;}

background-position: -800px -120px;图片以容器左上角为参考向左偏移800px,所以正好显示出梅花J,向上偏移120px。

.cardDJ{background-position: -800px -360px;}

background-position: -800px -120px;图片以容器左上角为参考向左偏移800px,所以正好显示出方块J,向上偏移120px。

<div class="back cardAJ "/>就能显示出黑桃J,<div class="back cardBJ"/>就能显示出红桃J,<div class="back cardCJ"/>就能显示出梅花J,<div class="back cardDJ"/>就能显示出方块J。其他牌的显示原理一样,仅仅background-position中的偏移量不同。

z-index设置为8,所以牌面显示在扑克牌背面下方被隐藏。

3.扑克牌删除

扑克牌删除采用设置透明度实现。

.card-removed/*移除牌*/
{
    opacity:0;
}

opacity: 0,设置div的不透明度为0。Opacity取值从0.0(完全透明)到1.0(完全不透明)。也可以使用visibility:hidden来实现,这两个效果都是让元素不显示,但visibility: hidden 意思是让元素不可见,但仍会占据页面上的空间。

4.添加删除类别Class

扑克牌的显示、隐藏和删除都是CSS中类别Class。需要将这些类别设置到HTML的标记元素(例如<div>)上,jquery中的addClass方法用于添加类别Class,而removeClass方法用于删除类别Class。

addClass( className ),className为一个字符串,为指定元素添加这个classname类别。removeClass(className ),指定元素移除的一个或多个用空格隔开的样式名或类别。

举例说明:

比如有一个<div>:

<div>
<a href="www.zut.edu.cn">武汉理工大学</a>
<a href="www.zzu.edu.cn">武汉大学</a>
</div>

使用jquery实现,当单击“武汉理工大学”的时候自动添加个class=“select”,代码自动就变成:

<div>
<aclass="select"  href="www.zut.edu.cn">武汉理工大学</a>
<a href="www.zzu.edu.cn">武汉大学</a>
</div>

然后单击“武汉大学”,又变成

<div>
<ahref="www.zut.edu.cn">武汉理工大学</a>
<a  href="www.zzu.edu.cn">武汉大学</a>
</div>

jQuery可以如下实现:

$(document).ready(function(){
  $("a").click(function(){
        $("a").each(function(){$(this).removeClass("select")}),//删除"select"类别
        $(this).addClass("select"),//当前被单击的<a>元素增加"select"类别
        return false})
})

jQuery代码中$("a")选择所有的<a>元素,在<a>元素的单击事件中,each()遍历所有的<a>元素并删除<a>元素上"select"类别。$(this)代表当前被单击的<a>元素,$(this).addClass("select")是给当前被单击的<a>元素增加"select"类别。

data() 方法向被选元素附加数据,或者从被选元素获取数据。

 

02、程序设计的步骤

1.设计CSS(matchgame.css)

根据程序设计的思路设计如下的CSS文件。

body
{
   text-align: center;
   background-image: url("../images/bg.jpg");
}
#game
{
    width:502px;    height: 462px;
    margin: 0auto;
    border:1px solid #666;
   border-radius: 10px;
   background-image: url("../images/table.jpg");
    position:relative;
    display:-webkit-box;
   -webkit-box-pack:center;
   -webkit-box-align:center;
}
#cards  /*所有的扑克牌显示区域*/
{
    width:380px;    height: 400px;  position: relative;  margin:30px auto;
}
.card
{
    width:80px;  height: 120px;  position: absolute;
}
.face
{
    width:100%;
    height:100%;
   border-radius:10px;
    position:absolute;
   -webkit-backface-visibility: hidden;
   -webkit-transition:all .3s;
}
.front
{
   background: #999 url("../images/deck.png")0 -480px;
    z-index:10;
}
.back
{
   background: #efefef url("../images/deck.png");
   -webkit-transform-rotateY(-180deg);
    z-index:8;
}
.face:hover
{
   -webkit-box-shadow: 0 0 40px #aaa;
}
/*牌面定位样式*/
.cardAJ{background-position: -800px 0;}
.cardAQ{background-position: -880px 0;}
.cardAK{background-position: -960px 0;}
.cardBJ{background-position: -800px -120px;}
.cardBQ{background-position: -880px -120px;}
.cardBK{background-position: -960px -120px;}
.cardCJ{background-position: -800px -240px;}
.cardCQ{background-position: -880px -240px;}
.cardCK{background-position: -960px -240px;}
.cardDJ{background-position: -800px -360px;}
.cardDQ{background-position: -880px -360px;}
.cardDK{background-position: -960px -360px;}
.card-flipped .front
{
    /*保证牌底在牌面下面,z-index值切换为小值*/
    z-index:8;
   -webkit-transform: rotateY(180deg);
}
.card-flipped .back
{
    /*保证牌底在牌面上面,z-index值切换为大值*/
    z-index:10;
    /*前面牌面已经翻过去,现在返回来*/
   -webkit-transform: rotateY(0deg);
}
/*移除牌*/
.card-removed{ opacity: 0;}

2.游戏页面index.htm

游戏页面中,每张牌的区域是一个id="card"的<div>,其中含上下层有两个<div>,<div class="face front">是上层显示背面,<div>是下层显示牌面。

<div>
<div></div>
<div class="face back"></div>
</div>

注意,最初仅仅有1个张牌的区域,其余的23张牌的区域是页面加载后复制实现的。页面加载后,首先利用Array.sort()将deck数组存储的牌随机排序,实现洗牌效果。调整CSS坐标属性"left","top",设置每张牌的区域<div>在屏幕上位置。最后在每张牌的区域<div>中的下层<div>添加类别(如.cardAJ,.cardBJ)就可以显示对应牌面。

<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>html5扑克翻牌消除小游戏</title>
<link href="styles/matchgame.css" rel="stylesheet">
</head>
<body>
<script type="text/javascript"src="matchgame.js"></script>
<script type="text/javascript"src="jquery-1.11.1.min.js"></script>
<section id="game">
<div id="cards">
<div>
<div></div>
<div class="face back"></div>
</div>
</div>
</section>
<script type="text/javascript">
var success=false;
$(document).ready(function(){
         //实现随机洗牌
         matchingGame.deck.sort(shuffle);
         var$card=$(".card");
         for(vari= 0;i<23;i++)
         {
                   $card.clone().appendTo($("#cards"));
         }
         //对每张牌进行设置
         $(".card").each(function(index)
         {
                   //调整坐标
                   $(this).css({
                            "left":(matchingGame.cardWidth+20)*(index%8)+"px",
                            "top":(matchingGame.cardHeight+20)*Math.floor(index/8)+"px"
                   });
                   //从数组deck取一个牌如"cardAK","cardBJ"
                   varpattern=matchingGame.deck.pop();
                   //data()方法向被选元素附加数据,这里"pattern"存储牌类别数据如"cardAK","cardBJ"。
                   $(this).data("pattern",pattern);
                   //把其翻牌后的对应牌面附加上去,
                 $(this).find(".back").addClass(pattern);//添加类别就可以显示对应牌面
                   $(this).click(selectCard);//指定单击牌事件的功能函数selectCard
         });
});
</script>
<div style="text-align:center;margin:50px0; font:normal 44px/56px ">
<p>扑克翻牌游戏</p>
<div id="timer"></div>
</div>
<script type="text/javascript"language="javascript">
var success=false;
var d1=new Date();//年月日时分秒
var d2=d1.getTime()+2*60*1000
var endDate=new Date(d2);
function daoJiShi()
{
 var now=newDate();
 varoft=Math.round((endDate-now)/1000);
 varofd=parseInt(oft/3600/24);
 varofh=parseInt((oft%(3600*24))/3600);
 varofm=parseInt((oft%3600)/60);
 varofs=oft%60;
 document.getElementById('timer').innerHTML='还有 '+ofm+ ' 分钟 ' +ofs+ ' 秒';
 if(success==true) return;//停止计时
 if(ofs<0){
    document.getElementById('timer').innerHTML='倒计时结束!';
    if(success==false)alert('你挑战失败了!');
     return;
 };
 setTimeout('daoJiShi()',1000);
};
daoJiShi();
</script>
</body>
</html>

3.设计脚本(matchgame.js)

定义存储所有的牌的数组deck。

var matchingGame={};
matchingGame.cardWidth=80;//牌宽
matchingGame.cardHeight = 120;
//存储所有的牌
matchingGame.deck=
    [
       "cardAK","cardAK","cardAQ","cardAQ", "cardAJ","cardAJ",
       "cardBK","cardBK","cardBQ","cardBQ", "cardBJ","cardBJ",
       "cardCK", "cardCK", "cardCQ","cardCQ", "cardCJ", "cardCJ",
       "cardDK", "cardDK", "cardDQ","cardDQ", "cardDJ", "cardDJ"      
    ]
//随机排序函数,返回-1或1
function shuffle()
{
   //Math.random能返回0~1之间的数
    returnMath.random()>0.5 ? -1 : 1
}

单击牌事件的功能函数selectCard()实现翻牌的功能。被翻过的牌都已添加"card-flipped"类别。所以$(".card-flipped")获取所有的翻过牌的<div>,数量超过1则说明已翻了两张牌后则不能再翻牌而退出翻牌。

若翻动了两张牌,检测是否相同。

function selectCard() {//  翻牌功能的实现
    var$fcard=$(".card-flipped");
    //翻了两张牌后退出翻牌
   if($fcard.length>1)
    {
       return;
    }
   $(this).addClass("card-flipped");
//以下是若翻动了两张牌,检测一致性
    var$fcards=$(".card-flipped");
   if($fcards.length==2)
    {
       setTimeout(function(){
checkPattern($fcards);},700);
    }
}
//检测2张牌是否一致
function checkPattern(cards)
{
    varpattern1 = $(cards[0]).data("pattern");//第1张牌牌面数据
    varpattern2 = $(cards[1]).data("pattern");//第2张牌牌面数据
   $(cards).removeClass("card-flipped");   //删除"card-flipped"类别
   if(pattern1==pattern2)//牌面数据相同
    {
       $(cards).addClass("card-removed")//透明效果
        var$fcards=$(".card-removed");
       if($fcards.length==24)
        {
      alert("恭喜你成功了!");
success=true;
        }
    }
}

至此就完成扑克翻牌游戏。文章来源地址https://www.toymoban.com/news/detail-544673.html

到了这里,关于HTML5 实现扑克翻牌游戏的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • HTML5(H5)的前生今世

    HTML5是一种用于构建和呈现网页的最新标准。它是HTML(超文本标记语言)的第五个版本,于2014年由万维网联盟(W3C)正式推出。HTML5的前身可以追溯到互联网爆发的早期,当时网页设计师们面临着许多限制和挑战。 在互联网的早期阶段,网页的设计和构建主要依赖于HTML和C

    2024年02月14日
    浏览(44)
  • 打造经典游戏:HTML5与CSS3实现俄罗斯方块

    🌟 前言 欢迎来到我的技术小宇宙!🌌 这里不仅是我记录技术点滴的后花园,也是我分享学习心得和项目经验的乐园。📚 无论你是技术小白还是资深大牛,这里总有一些内容能触动你的好奇心。🔍 🤖 洛可可白 :个人主页 🔥 个人专栏 :✅前端技术 ✅后端技术 🏠 个人

    2024年03月11日
    浏览(61)
  • HTML5期末大作业:游戏网站设计与实现——基于bootstrap响应式游戏资讯网站制作HTML+CSS+JavaScript

    🎉精彩专栏推荐👇🏻👇🏻👇🏻 ✍️ 作者简介: 一个热爱把逻辑思维转变为代码的技术博主 💂 作者主页: 【主页——🚀获取更多优质源码】 🎓 web前端期末大作业: 【📚毕设项目精品实战案例 (1000套) 】 🧡 程序员有趣的告白方式:【💌HTML七夕情人节表白网页制作

    2024年01月17日
    浏览(56)
  • Html5钢琴块游戏制作(音乐游戏)

    当年一款手机节奏音游,相信不少人都玩过或见过。最近也是将其做了出来分享给大家。 游戏的基本玩法:点击下落的黑色方块,弹奏音乐。(下落的速度会越来越快)  可以进行试玩,手机玩起来效果会更好些。 点击试玩 游戏使用了一首儿歌乐谱,听出来是啥了吗^ ^ --

    2023年04月16日
    浏览(42)
  • HTML5 游戏开发实战 | 贪吃蛇

    在该游戏中,玩家操纵一条贪吃的蛇在长方形场地里行走,贪吃蛇按玩家所按的方向键折行,蛇头吃到食物(豆)后,分数加10分,蛇身会变长,如果贪吃蛇碰上墙壁或者自身的话,游戏就结束了(当然也可能是减去一条生命)。 贪吃蛇游戏的运行界面如上图所示。 把游戏画面看

    2024年02月11日
    浏览(51)
  • 前端之html5

    html5优势:     语义化标签:             布局标签:              状态标签:         列表标签:        文本标签:          表单控件:         视频标签:          音频标签:         全局属性: article和section区别: 兼容性处理:            1 针对javascr

    2024年02月13日
    浏览(49)
  • html5前端学习

    定义HTML文档,浏览器看到后就明白这个是HTML文档,所以其他元素要包裹在它里面,标签限定了文档的开始点和结束点。 head标签用于定义文档的头部,描述了文档的各种属性和信息,包括文档的标题、在Web的位置以及和其他文档的关系等,绝大多数文档头部包含的数据都不会

    2024年02月08日
    浏览(53)
  • 前端学习——HTML5

    新增布局标签 新增状态标签 新增列表标签 新增文本标签 新增表单控件属性 input新增type属性值 新增视频标签 新增音频标签

    2024年02月12日
    浏览(58)
  • html5——前端笔记

    html页面: !DOCTYPE 不是一个 HTML 标签,它就是 文档类型声明标签,这句代码的意思是: 当前页面采取的是 HTML5 版本来显示网页 声明位于文档中的最前面的位置,处于 标签之前。 不是一个 HTML 标签,它就是 文档类型声明标签。 lang 语言种类,用来定义当前文档显示的语言。

    2024年02月10日
    浏览(41)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包