javascript实例--教你实现扑克牌洗牌功能


Posted in Javascript onMay 15, 2014

我们一般都会按照顺序把随机摸过来的牌从小到大的顺序在手上理整齐(记得小时候打牌两副牌手都抓不过来),这篇随笔就是想通过实现这个功能来熟悉下js中排序数组等相关知识。

用到知识点:

1.工厂方式创建对象

2.js数组sort()方法

  var testArr = [1, 3, 4, 2];
     testArr.sort(function (a,b) {
         return a - b;
     })
     alert(testArr.toString());//1,2,3,4
     testArr.sort(function (a, b) {
         return b- a;
     })
     alert(testArr.toString());//4,3,2,1

3.js-Math.radom()随机数

Math.random();//0-1 取得的随机数大于等于0且小于1

4.js数组splice用法

//第一个参数是插入的起始位置
//第二个参数是从起始位置开始删除元素的个数
//第三个参数是在起始位置开始插入的元素   
//例子
var testArr = [1, 3, 4, 2];
testArr.splice(1, 0, 8);
alert(testArr.toString());//1,8,3,4,2
var testArr1 = [1, 3, 4, 2];
testArr1.splice(1, 1, 8);
alert(testArr1.toString());//1,8,3,4,2

5.js数组shift用法

    //取出数组中的首个元素返回,数组删除第一个元素
   //例子 
    var testArr = [1, 3, 4, 2];
     var k=  testArr.shift();
     alert(testArr.toString());//3,4,2
     alert(k);//1

有了这些基础知识,咱们可以开始打牌了,假设就一个人摸牌,底牌是随机的,我们每次摸来一张牌的时候就要把他插到手上的牌中,保证顺序是从小到大!

第一步:首先我们要写一个生产扑克牌对象的方法:

/*工厂模式创建各种牌
*number:牌上的数字
*type:牌的花色
*/
var Cards = (function () {
var Card = function (number, type) {
this.number = number;
this.type = type;
}
return function (number, type) {
return new Card(number, type);
}
})()

第二步:创建扑克牌,洗牌,存储

    var RadomCards = [];//随机牌存储数组
    var MyCards = [];//存储摸过来的牌 
    //花色0-黑桃 1-梅花 2-方块  3-红桃 4-大鬼  5-小鬼
    //数值0-13代表 鬼,1,2,3,4,5,6,7,8,9,10,J,Q,K;
    function CreatCompeleteCard() {
        var index = 2;
        var arr = [];
        for (var i = 0; i <= 13; i++) {
            if (i == 0) {
                arr[0] = new Cards(i, 4);
                arr[1] = new Cards(i, 5);
            } else {
                for (var j = 0; j <= 3; j++) {
                    arr[index] = new Cards(i, j);
                    index++;
                }
            }
        }
        RadomCards = SortCards(arr);
        Show();//在页面上显示当前的牌
    }
    //洗牌
    function SortCards(arr) {
        arr.sort(function (a, b) {
            return 0.5 - Math.random();
        })
        return arr;
    }

第三步:开始摸牌,摸牌的时候我们首先要判断插入的位置,然后把新牌插入到指定位置,形成新的整齐的顺序

//摸牌方法
    function GetCards(CardObj) {
        var k = InCardsIndex(MyCards, CardObj);//考虑下插入的位置
        MyCards.splice(k, 0, CardObj); // 插入形成新的顺序
    }
    /*【获取牌应该插入的位置】
     *arr:当前手里的牌
     *obj:新摸到的牌
     */
    function InCardsIndex(arr, obj) {
        var len = arr && arr.length || 0;
        if (len == 0) {
            return 0;
        }else if (len == 1) {
            if (obj.number >= arr[0].number) {
                return 1;
            } else {
                return 0;
            }
        } else {
            var backi = -1;
            for (var i = 0; i < len; i++) {                if (obj.number <= arr[i].number) {
                    backi = i;
                    break;
                } 
            }
            if (backi == -1) {
                backi = len;
            }
            return backi;
        }
    }

好啦!通过html上的button按钮出发Start来摸牌,点一次摸一张牌!并展示出来

  function Start() {//摸牌方法,一次摸一张
        if (RadomCards.length > 0) {
            GetCards(RadomCards.shift());
            Show();
        } else {
            alert("没有了");
        }
    }
//该show方法是用来在页面展示当前牌的动向
    function Show() {
        var lenOld = RadomCards.length;
        var lenNew = MyCards.length;
        var html = "";
        for (var i = 0; i < lenOld; i++) {
            html += "<div class='pai'><b>" + RadomCards[i].type + "</b>-<div class='nu'>" + RadomCards[i].number + "</div></div>";
        }
        document.getElementById("old").innerHTML=html;
        html = "";
        for (var i = 0; i < lenNew; i++) {
            html += "<div class='pai new'><b>" + MyCards[i].type + "</b>-<div class='nu'>" + MyCards[i].number + "</div></div>";
        }
        document.getElementById("new").innerHTML=html;
    }

上html和css的代码

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html>
<head>
    <meta http-equiv="content-type" content="text/html;charset=utf-8" />
    <style type="text/css">
        .boom{
            width: 50px;
            height: 50px;
            border: solid 1px red;
            position: absolute;
            top: 5px;
            left: 5px;
        }
        .pai
        {
            width: 50px;
            height: 100px;
            border: solid 1px red;
            margin-left: 3px;
            float: left;
        }
        .new
        {
            border: solid 1px blue;
        }
        .nu
        {
            text-align:center;
            font-size:24px;
            margin-top:25px;         
        }
    </style>
</head>
<body>
    <!-- <div class="boom"></div>-->
    <input type="button" value="开始" onclick="CreatCompeleteCard()" />
    <input type="button" value="摸牌" onclick="Start()" />
    <br/>
    底牌:<div id="old"></div>
    <div style="clear: both"></div>
    <hr />
    我摸到的牌:<div id="new"></div>
</body>
</html>
Javascript 相关文章推荐
动态加载iframe
Jun 16 Javascript
javaScript 数值型和字符串型之间的转换
Jul 25 Javascript
JS 中document.URL 和 windows.location.href 的区别
Nov 11 Javascript
jQuery开发者都需要知道的5个小技巧
Jan 08 Javascript
jquery实现鼠标拖拽滑动效果来选择数字的方法
May 04 Javascript
JavaScript实现的伸展收缩型菜单代码
Oct 14 Javascript
javascript实现无缝上下滚动特效
Dec 16 Javascript
基于chosen插件实现人员选择树搜索自动筛选功能
Sep 24 Javascript
vue.js学习笔记之绑定style样式和class列表
Oct 31 Javascript
Bootstrap导航条学习使用(二)
Feb 08 Javascript
jquery+css实现侧边导航栏效果
Jun 12 jQuery
解决vue+elementui项目打包后样式变化问题
Aug 03 Javascript
javascript常用的正则表达式实例
May 15 #Javascript
js生成缩略图后上传并利用canvas重绘
May 15 #Javascript
Jquery性能优化详解
May 15 #Javascript
js获取网页可见区域、正文以及屏幕分辨率的高度
May 15 #Javascript
Javascript小技巧之生成html元素
May 15 #Javascript
javascript屏蔽右键代码
May 15 #Javascript
js获取窗口相对于屏幕左边和上边的位置坐标
May 15 #Javascript
You might like
php,不用COM,生成excel文件
2006/10/09 PHP
服务器端解压缩zip的脚本
2006/12/22 PHP
如何正确配置Nginx + PHP
2016/07/15 PHP
Aster vs KG BO3 第一场2.19
2021/03/10 DOTA
JavaScript Konami Code 实现代码
2009/07/29 Javascript
浅谈Node.js中的定时器
2015/06/18 Javascript
深入浅析JavaScript中的作用域和上下文
2016/03/26 Javascript
Immutable 在 JavaScript 中的应用
2016/05/02 Javascript
深入分析node.js的异步API和其局限性
2016/09/05 Javascript
KnockoutJS 3.X API 第四章之click绑定
2016/10/10 Javascript
JS 对java返回的json格式的数据处理方法
2016/12/05 Javascript
Vue-resource拦截器判断token失效跳转的实例
2017/10/27 Javascript
浅谈KOA2 Restful方式路由初探
2019/03/14 Javascript
Vue内部渲染视图的方法
2019/09/02 Javascript
layui关闭弹窗后刷新主页面和当前更改项的例子
2019/09/06 Javascript
vue实现简单瀑布流布局
2020/05/28 Javascript
node运行js获得输出的三种方式示例详解
2020/07/02 Javascript
NodeJS配置CORS实现过程详解
2020/12/02 NodeJs
Python导出数据到Excel可读取的CSV文件的方法
2015/05/12 Python
python 类对象和实例对象动态添加方法(分享)
2017/12/31 Python
Python结合ImageMagick实现多张图片合并为一个pdf文件的方法
2018/04/24 Python
python bmp转换为jpg 并删除原图的方法
2018/10/25 Python
在Python中增加和插入元素的示例
2018/11/01 Python
使用Python制作简单的小程序IP查看器功能
2019/04/16 Python
python 搜索大文件的实例代码
2019/07/08 Python
python机器学习包mlxtend的安装和配置详解
2019/08/21 Python
win10安装python3.6的常见问题
2020/07/01 Python
Django中template for如何使用方法
2021/01/31 Python
Html5适配iphoneX刘海屏的简单实现
2019/04/09 HTML / CSS
美国最大的香水出口:FragranceX.com
2017/11/04 全球购物
大学生活学习的自我评价
2013/12/03 职场文书
公司培训心得体会
2014/01/03 职场文书
高中生班主任评语
2014/04/25 职场文书
大学生村官个人对照检查材料(群众路线)
2014/09/26 职场文书
物业保洁员管理制度
2015/08/05 职场文书
应届毕业生的自我评价
2019/06/21 职场文书