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 相关文章推荐
HTML TO JavaScript 转换
Jun 26 Javascript
filters.revealTrans.Transition使用方法小结
Aug 19 Javascript
js获取浏览器的可视区域尺寸的实现代码
Nov 30 Javascript
JS数组操作(数组增加、删除、翻转、转字符串、取索引、截取(切片)slice、剪接splice、数组合并)
May 20 Javascript
jQuery序列化表单成对象的简单实现
Nov 29 Javascript
jquery实现拖动效果(代码分享)
Jan 25 Javascript
基于Jquery Ajax type的4种类型(详解)
Aug 02 jQuery
10 种最常见的 Javascript 错误(频率最高)
Feb 08 Javascript
vue2 全局变量的设置方法
Mar 09 Javascript
angular6的响应式表单的实现
Oct 10 Javascript
layui实现下拉复选功能的例子(包括数据的回显与上传)
Sep 24 Javascript
vue2.* element tabs tab-pane 动态加载组件操作
Jul 19 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制作图型计数器的例子
2006/10/09 PHP
开启CURL扩展,让服务器支持PHP curl函数(远程采集)
2011/03/19 PHP
解析isset与is_null的区别
2013/08/09 PHP
PHP封装的XML简单操作类完整实例
2017/11/13 PHP
laravel 错误处理,接口错误返回json代码
2019/10/25 PHP
js验证表单大全
2006/11/25 Javascript
JavaScript Cookie显示用户上次访问的时间和次数
2009/12/08 Javascript
jquery实现左右滑动菜单效果代码
2015/08/27 Javascript
分享我的jquery实现下拉菜单心的
2015/11/29 Javascript
JQuery在循环中绑定事件的问题详解
2016/06/02 Javascript
Angular工具方法学习
2016/12/26 Javascript
jQuery Password Validation密码验证
2016/12/30 Javascript
JavaScript评论点赞功能的实现方法
2017/03/13 Javascript
ES6数组的扩展详解
2017/04/25 Javascript
微信小程序 监听手势滑动切换页面实例详解
2017/06/15 Javascript
Node.js EventEmmitter事件监听器用法实例分析
2019/01/07 Javascript
vue radio单选框,获取当前项(每一项)的value值操作
2020/09/10 Javascript
vue制作toast组件npm包示例代码
2020/10/29 Javascript
vant中的toast轻提示实现代码
2020/11/04 Javascript
Python PyQt5标准对话框用法示例
2017/08/23 Python
Tensorflow 利用tf.contrib.learn建立输入函数的方法
2018/02/08 Python
Numpy数组的保存与读取方法
2018/04/04 Python
python使用MQTT给硬件传输图片的实现方法
2019/05/05 Python
python opencv捕获摄像头并显示内容的实现
2019/07/11 Python
Django使用中间件解决前后端同源策略问题
2019/09/02 Python
Django自定义全局403、404、500错误页面的示例代码
2020/03/08 Python
python中strip(),lstrip(),rstrip()函数的使用讲解
2020/11/17 Python
使用css3制作动感导航条示例
2014/01/26 HTML / CSS
详解Html5原生拖拽操作
2018/01/12 HTML / CSS
意大利专业化妆品品牌:KIKO MILANO
2017/02/01 全球购物
Foot Locker意大利官网:全球领先的运动鞋和服装零售商
2017/05/30 全球购物
中科软笔试题和面试题
2014/10/07 面试题
优良学风班申请材料
2014/02/13 职场文书
2014年资料员工作总结
2014/11/18 职场文书
MySQL系列之十四 MySQL的高可用实现
2021/07/02 MySQL
在js中修改html body的样式
2021/11/11 Javascript