html5 canvas 扑克牌游戏开发探索

最近想做个网页版扑克牌游戏,于是就开始探索最后实现如下效果

html5源码如下

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>510k</title>
    <script src="./superMaker.js"></script>
    <script type="text/javascript"  >

        /**
         * 定义一副牌,数组存放
         * @type {Array}
         */
        var p=new Array();
        var szp=new Array();//分配到手中的扑克
        var img=new Image();
        img.src="b.jpg";//舞台背景
        new Stage(800,600,"stage",img);
        var scan=new Scane();
        scan.playflag=true;
        scan.frame="1";
        scan.nextframe="2";
        scan.loopflag=true;

        var p4 = new player("img");
        p4.img = new Image();
        p4.img.src = "puke/0.jpg";
        p4.x =680;
        p4.y = 200;
        p4.w = 59;
        p4.h = 90;
        p4.edit=true;
        p4.mousedown=function(){
            p4.ckg=true;
            if(p4.ckg){
                p4.w=50;
                p4.h=80;

            }
        }
        p4.mouseup=function(){
            p4.ckg=false;
            if(!p4.ckg){
                p4.w=59;
                p4.h=90;

            }

        }
        scan.add(p4);
        var p5 = new player("img");
        p5.img = new Image();
        p5.img.src = "puke/pass.jpg";
        p5.x =680;
        p5.y = 100;
        p5.w = 59;
        p5.h = 90;
        p5.edit=true;
        p5.mousedown=function(){
         p5.ckg=true;
            if(p5.ckg){
                p5.w=50;
                p5.h=80;

            }

        }
        p5.mouseup=function(){
            p5.ckg=false;
            if(!p5.ckg){
                p5.w=59;
                p5.h=90;

            }


        }
        scan.add(p5);

        /**
         * 定义扑克牌
         * @param a
         * @param b
         * @param c
         */
        function pei(a,b,c){
            this.huase=a;
            this.value=b;
            this.val=c;
            this.src="";
            this.player=new player("img");
        }

        /*
        * 定义一副扑克
        *
        * */
        function zhupai(){
            var p1=new pei("大红","大王",100);
            p1.src="./puke/1.jpg";

            var p2=new pei("大黑","小王",99);
            p2.src="./puke/2.jpg";
            p.push(p1);
            p.push(p2);
            var s=["3","4","5","6","7","8","9","10","J","Q","K","A","2"];
            for(var j=0;j<4;j++) {
                for (var i = 0; i < 13; i++) {
                   if(j==0) {
                       var pp = new pei("黑桃", s[i], (i+3));
                       pp.src="./puke/"+(i+3)+".jpg";
                       p.push(pp);
                   }
                    if(j==1) {
                        var pp = new pei("红桃", s[ i], (i+3));
                        pp.src="./puke/"+(16+i)+".jpg";
                        p.push(pp);
                    }

                    if(j==2) {
                        var pp = new pei("梅花", s[ i], (i+3));
                        pp.src="./puke/"+(29+i)+".jpg";
                        p.push(pp);
                    }
                    if(j==3) {
                        var pp = new pei("方块", s[ i],(i+3));
                        pp.src="./puke/"+(42+i)+".jpg";
                        p.push(pp);
                    }
                }

            }
            console.log(p);

        }



        /**
         * 向舞台台添加扑克
         */
        function addpuke(){
            for(var i=0;i<szp.length;i++){
                szp[i].player.img=new Image();
                szp[i].player.img.src=szp[i].src;
                szp[i].player.ckg=false;
                szp[i].player.edit=true;
                szp[i].player.x =10+i*55;
                szp[i].player.y = 350;
                szp[i].player.w = 49;
                szp[i].player.h = 80;
                szp[i].player.mousedown=function() {
                    this.ckg ? this.ckg = false : this.ckg = true;
                    if (this.ckg) {
                        this.y = 300;
                    } else {
                        this.y = 350;
                    }
                }
                scan.add(szp[i].player);

            }
        }

       /**
        *
        * 分配扑克
        */
        function fp(){
            var i=0;
            while(i<13) {
             var pa = Math.floor(Math.random() * 54);
              var d = p[pa];
               if (szp.find(d) ==null) {
                szp.add(d);
                i++;
             }
                }
            sort();
               for(var k in szp) {
                  console.log("hhhh" + szp[k].huase+szp[k].value+szp[k].val);
                }
            }


        /**
         * 扑克排序
         */
        function sort(){
            for(var i=0;i<szp.length;i++){
              for(var j=0;j<szp.length-1;j++) {
               var max=szp[j].val;
                var zy=null;
                if ((max - szp[j + 1].val) > 0) {
                zy = szp[j];
                szp[j] = szp[j + 1];
                szp[j + 1] = zy;
                }
              }
          }
             //    console.log(szp);
         }





        function init() {
            zhupai();
            fp();
            addpuke();
        }


        init();





        document.addEventListener("mousedown",function(e){
            if(scaneArray.length>0) {
                for (var ks in scaneArray) {
                    if (scaneArray[ks].playflag == true && scaneArray[ks].layer.array.length > 0) {
                        for (var kp in scaneArray[ks].layer.array) {
                            if (scaneArray[ks].layer.array[kp].edit) {
                                scaneArray[ks].layer.array[kp].hitx = getMousePos(canvas, e).x;
                                scaneArray[ks].layer.array[kp].hity = getMousePos(canvas, e).y;
                                scaneArray[ks].layer.top(scaneArray[ks].layer.array[kp]);
                                if (scaneArray[ks].layer.array[kp].editflag) {
                                      scaneArray[ks].layer.array[kp].mousedown(e);


                                }
                            }

                        }
                    }
                }}
        });


        document.addEventListener("mousemove",function(e){
            if(scaneArray.length>0) {
                for (var ks in scaneArray) {

                    if (scaneArray[ks].playflag == true && scaneArray[ks].layer.array.length > 0) {
                        for (var kp in scaneArray[ks].layer.array) {
                            if (scaneArray[ks].layer.array[kp].edit) {
                                scaneArray[ks].layer.array[kp].hitx = getMousePos(canvas, e).x;
                                scaneArray[ks].layer.array[kp].hity = getMousePos(canvas, e).y;
                                if (scaneArray[ks].layer.array[kp].editflag) {
                                    scaneArray[ks].layer.array[kp].mousemove(e);
                                }
                            }
                        }

                    }
                }
            }
        });



        document.addEventListener("mouseup",function(e){
            if(scaneArray.length>0) {
                for (var ks in scaneArray) {

                    if (scaneArray[ks].playflag == true && scaneArray[ks].layer.array.length > 0) {
                        for (var kp in scaneArray[ks].layer.array) {
                            if (scaneArray[ks].layer.array[kp].edit) {
                                scaneArray[ks].layer.array[kp].hitx = getMousePos(canvas, e).x;
                                scaneArray[ks].layer.array[kp].hity = getMousePos(canvas, e).y;
                                if (scaneArray[ks].layer.array[kp].editflag) {
                                    scaneArray[ks].layer.array[kp].mouseup(e);
                                }
                            }
                        }

                    }
                }
            }
        });




    </script>
</head>

<body bgcolor="gray" style="text-align: center">

<h1 style="color:snow">五十K争霸赛</h1>
<div style="text-align: center;" id="stage"></div>

</body>
</html>
这只是一个不完整的客户端,以后会把完整的客户端和服务端都上传上来!


  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
展开扑克牌的 HTML 代码如下: ```html <div class="card"> <div class="card-face front"></div> <div class="card-face back"></div> </div> ``` 其中,`.card` 是扑克牌的容器,`.front` 和 `.back` 是扑克牌的正反面。 通过 CSS 样式设置 `.card` 的宽高、边框、背景色等属性,以及 `.front` 和 `.back` 的背景图案,就可以实现扑克牌的展开效果。 至于 HTML5 canvas 扑克牌花式洗牌动画,需要使用 canvas 的绘图 API 实现。具体的实现过程比较复杂,需要涉及到 canvas 的基本操作、动画效果、事件处理等内容。以下是一个简单的示例: ```html <canvas id="canvas"></canvas> ``` ```javascript const canvas = document.getElementById('canvas'); const ctx = canvas.getContext('2d'); const width = canvas.width = window.innerWidth; const height = canvas.height = window.innerHeight; const cards = []; // 加载扑克牌的图片资源 const cardImages = []; for (let i = 0; i < 52; i++) { const img = new Image(); img.src = `cards/${i}.png`; cardImages.push(img); } // 创建扑克牌对象 class Card { constructor(image, x, y) { this.image = image; this.x = x; this.y = y; this.angle = 0; this.spin = 0; this.targetAngle = 0; this.targetX = 0; this.targetY = 0; this.isMoving = false; } draw() { ctx.save(); ctx.translate(this.x, this.y); ctx.rotate(this.angle); ctx.drawImage(this.image, -50, -75, 100, 150); ctx.restore(); } update() { if (this.isMoving) { const dx = this.targetX - this.x; const dy = this.targetY - this.y; const distance = Math.sqrt(dx * dx + dy * dy); if (distance < 1) { this.isMoving = false; this.x = this.targetX; this.y = this.targetY; this.angle = this.targetAngle; } else { const speed = 5; const angle = Math.atan2(dy, dx); this.x += Math.cos(angle) * speed; this.y += Math.sin(angle) * speed; this.angle += this.spin * speed; } } } moveTo(x, y, angle, spin) { this.isMoving = true; this.targetX = x; this.targetY = y; this.targetAngle = angle; this.spin = spin; } } // 初始化扑克牌 for (let i = 0; i < 52; i++) { const x = width / 2 + Math.random() * 200 - 100; const y = height / 2 + Math.random() * 200 - 100; const card = new Card(cardImages[i], x, y); cards.push(card); } // 动画循环 function loop() { ctx.clearRect(0, 0, width, height); for (let i = 0; i < cards.length; i++) { cards[i].update(); cards[i].draw(); } requestAnimationFrame(loop); } // 点击画布,触发洗牌动画 canvas.addEventListener('click', () => { let delay = 0; for (let i = 0; i < cards.length; i++) { const card = cards[i]; const x = width / 2 + Math.random() * 200 - 100; const y = height / 2 + Math.random() * 200 - 100; const angle = Math.random() * Math.PI * 2; const spin = Math.random() - 0.5; setTimeout(() => { card.moveTo(x, y, angle, spin); }, delay); delay += 10; } }); // 开始动画循环 loop(); ``` 以上代码实现了一个简单的扑克牌洗牌动画。具体效果可以参考以下链接: [HTML5 扑克牌花式洗牌动画](https://www.zhangxinxu.com/study/201712/html5-poker-canvas-shuffle-animation.html)

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值