首页 web前端 js教程 原生js结合html5制作简易的双色子游戏_javascript技巧

原生js结合html5制作简易的双色子游戏_javascript技巧

May 16, 2016 pm 04:07 PM
html5 js

想转html5游戏开,这是学习练手的东西,最开始是用面向过程的方式实现,后面用面向对象的方式实现(被坑了)……

演示地址:http://runjs.cn/detail/ss8pkzrc

html代码

<html>
  <head>
    <meta charset="utf-8"/>
    <title>掷色子的游戏</title>
  </head>
  <body>
    <table>
      <tr>
        <td align="center">
          <canvas id="game" width="400" height="300" style="border:1px solid #c3c3c3">
            你的游览器不支持html5的画布元素,请升级到IE9+或使用firefox、chrome这类高级的智能游览器!
          </canvas><br/>
          <input id="button" type="button" onclick="javascript:stage.play();" value="开始掷骰子"/>
        </td>
        <td>
          游戏规则:<br/>
          1、一个玩家、两个色子,每个色子有1-6个点,点数随机出现,点数是2-12中的任意数字<br/>
          2、如果玩家第一次抛出 7 或者 11,则本回合胜利 进行下一回合<br/>
          3、如果玩家抛出2、3、12 则回合失败 进行下一回合<br/>
          4、抛出其他数字4、5、6、7、8、9、10 记录点数和,并继续掷色子<br/>
          5、当玩家掷出7 则本回合失败 进行下一回合<br/>
          6、当玩家抛出的点数和与上一次的相同,本局胜利 进行下一回合<br/>
          7、当玩家抛出的点数和与上一次的不同,本局失败,进行下一回合<br/>
          后期扩展:<br/>
          这个游戏有押注和积分的功能,尚无思路,所以没有实现<br/>
           
        </td>
      </tr>
      <tr>
        <td colspan="2">
          <div id="log"></div>
        </td>
      </tr>
    </table>
    <br/>
    <script>
      /**
        游戏规则:
          一个玩家、两个色子,每个色子有1-6个点,点数随机出现,点数是2-12中的任意数字
          如果玩家第一次抛出 7 或者 11,则本回合胜利 进行下一回合
          如果玩家抛出2、3、12 则回合失败 进行下一回合
          抛出其他数字4、5、6、7、8、9、10 记录点数和,并继续掷色子
          当玩家掷出7 则本回合失败 进行下一回合
          当玩家抛出的点数和与上一次的相同,本局胜利 进行下一回合
          当玩家抛出的点数和与上一次的不同,本局失败,进行下一回合
           
        game:{游戏对象
           
        }
        Stage={场景对象
          add(thing) //添加一个物件
          addEvent(type,handler)
          redraw() //重绘所有thing对象
        }
        Thing = {//物件对象
          draw(canvas)//传入一个canvas画板对象用于绘制thing
          isScope(x,y) //传入鼠标相对于canvas的位置,返回boolean,
                 //用于判断鼠标是否在thing的范围 true在,false不在
          addEvent(type,handler) //公开方法 //给物件设置时间
        }
         
        定义我们自己的场景对象
        掷色子的场景内需要:
          1、两个色子 色子一号 色子二号
          2、一个公告板 显示本局信息
          3、三个按钮 重现开始 
      **/
       
      function Stage(canvas){
        this.canvas = document.getElementById(canvas);
        this.ctx = this.canvas.getContext('2d');
        this.ctx.lineWidth = 1;
        this.ctx.strokeStyle = 'rgb(255,0,0)';
        this.width = this.canvas.width;
        this.height = this.canvas.height;
        this.things = [];
        this.addEvent = [];
        this.rule = {};
      }
      Stage.prototype.setings = function(){};
      Stage.prototype.draw = function(){
        for(var thing in this.things){
          if(this.things[thing] instanceof Array){
            for(var i=0;i<this.things[thing].length;i++){
              this.things[thing][i].init();
            }
          }
        }
      }
      Stage.prototype.add = function(thing){
        if(!thing){return;}
        if(this.things['disc'] == undefined){
          this.things['disc'] = [];
        }
        if(this.things['callBoard'] == undefined){
          this.things['callBoard'] = [];
        }
        if(thing instanceof Disc){
          this.things['disc'].push(thing);
        }
        if(thing instanceof CallBoard){
          this.things['callBoard'].push(thing);
        }
      }
      Stage.prototype.play = function(){
        this.clean();
        for(var i=0;i<this.things['disc'].length;i++){
          this.things['disc'][i].random_porints();
        }
        this.rule.init(this);
        this.rule.run();
        this.log();
        if(!this.rule.hasNext){
          var self = this;
          document.getElementById('button').onclick = function(){
            self.redraw();
          }
          document.getElementById('button').value = '重置游戏';
        }else{
          document.getElementById('button').value = '再抛一次';
        }
      }
      Stage.prototype.redraw = function(){
        this.clean();
        this.things = {};
        this.setings();
        var self = this;
        document.getElementById('button').onclick = function(){
          self.play();
        }
        document.getElementById('button').value = '开始掷骰子';
      }
      Stage.prototype.log = function(){
        var html = document.getElementById('log').innerHTML;
        var tmp = this.rule.notice1.str +' '+ this.rule.notice2.str +' '+ this.rule.notice3.str +'  ';
        tmp += (this.rule.integral.length > 0 &#63; ('上一次点数[<font color="red">'+this.rule.integral.join(',')+'</font>]'):'')+this.rule.hasNext+'<br/>';
        document.getElementById('log').innerHTML = html + tmp;
      }
      Stage.prototype.clean = function(){
        for(var i=0;i<this.things['disc'].length;i++){
          this.things['disc'][i].clean();
        }
        for(var i=0;i<this.things['callBoard'].length;i++){
          this.things['callBoard'][i].clean();
        }
      }
      function Disc(x,y,stage){
        this.x = x;
        this.y = y;
        this.stage = stage;
        this.init();
      }
      Disc.prototype.init = function(){
        this.width = 170;
        this.height = this.width;
        this.porints = 1;
        this.draw();
        this.draw_porints();
      }
      Disc.prototype.draw = function(){
        this.stage.ctx.beginPath();
        this.stage.ctx.strokeRect(this.x,this.y,this.width,this.height);
        this.stage.ctx.closePath();
        this.stage.ctx.stroke();
      }
       
      Disc.prototype.random_porints = function(){
        this.clean();
        var tmp = 0;
        do{
          tmp = Math.floor(Math.random() * 7);
        }while(tmp <= 0 || tmp > 6)
        this.porints = tmp;
        this.draw_porints();
      }
      Disc.prototype.draw_porints = function(){
        var radius = this.width/7;
        if(this.porints == 1){//当只有1个点的时候,点位于正方形的正中间(width/2,height/2) 半径为width/4
          draw_porint(this.x + (this.width/2),this.y + (this.height/2),this.width/4,this.stage);
        }else if(this.porints == 2){//当有两个点时,第一个点位于(width/2,(height/7)*2,第二个点位于(width/2,(height/7)*5)
          draw_porint(this.x + (this.width/2),this.y + ((this.height/7)*2),radius,this.stage);
          draw_porint(this.x + (this.width/2),this.y + ((this.height/7)*5),radius,this.stage);;
        }else if(this.porints == 3){
          draw_porint(this.x + ((this.width/10)*2),this.y + ((this.height/10)*2),radius,this.stage);
          draw_porint(this.x + ((this.width/10)*5),this.y + ((this.height/10)*5),radius,this.stage);
          draw_porint(this.x + ((this.width/10)*8),this.y + ((this.height/10)*8),radius,this.stage);
        }else if(this.porints == 4){
          draw_porint(this.x + ((this.width/7)*2),this.y + ((this.height/7)*2),radius,this.stage);
          draw_porint(this.x + ((this.width/7)*5),this.y + ((this.height/7)*2),radius,this.stage);
          draw_porint(this.x + ((this.width/7)*2),this.y + ((this.height/7)*5),radius,this.stage);
          draw_porint(this.x + ((this.width/7)*5),this.y + ((this.height/7)*5),radius,this.stage);
        }else if(this.porints == 5){
          draw_porint(this.x + ((this.width/10)*2),this.y + ((this.height/10)*2),radius,this.stage);
          draw_porint(this.x + ((this.width/10)*2),this.y + ((this.height/10)*8),radius,this.stage);
          draw_porint(this.x + ((this.width/10)*5),this.y + ((this.height/10)*5),radius,this.stage);
          draw_porint(this.x + ((this.width/10)*8),this.y + ((this.height/10)*2),radius,this.stage);
          draw_porint(this.x + ((this.width/10)*8),this.y + ((this.height/10)*8),radius,this.stage);
        }else if(this.porints == 6){
          draw_porint(this.x + ((this.width/7)*2),this.y + ((this.height/10)*2),radius,this.stage);
          draw_porint(this.x + ((this.width/7)*5),this.y + ((this.height/10)*2),radius,this.stage);
          draw_porint(this.x + ((this.width/7)*2),this.y + ((this.height/10)*5),radius,this.stage);
          draw_porint(this.x + ((this.width/7)*5),this.y + ((this.height/10)*5),radius,this.stage);
          draw_porint(this.x + ((this.width/7)*2),this.y + ((this.height/10)*8),radius,this.stage);
          draw_porint(this.x + ((this.width/7)*5),this.y + ((this.height/10)*8),radius,this.stage);
        }
      }
      Disc.prototype.redraw = function(){
        this.clean();
        this.porints = 1;
        this.draw_porints();
      }
      Disc.prototype.clean = function(){
        this.stage.ctx.clearRect(this.x,this.y,this.width,this.height);
      }
      function draw_porint(x,y,radius,stage){
        stage.ctx.beginPath();
        stage.ctx.arc(x,y,radius,0,2*Math.PI,false);
        stage.ctx.closePath();
        stage.ctx.fill();
      }
       
      function CallBoard(x,y,stage){
        this.x = x;
        this.y = y;
        this.width = 360;
        this.height = 50;
        this.stage = stage;
        this.notices = [];
        this.init();
      }
      CallBoard.prototype.init = function(){
        this.stage.ctx.beginPath();
        this.stage.ctx.strokeRect(this.x,this.y,this.width,this.height);
        this.stage.ctx.closePath();
        this.stage.ctx.stroke();
        this.draw();
      }
      CallBoard.prototype.draw = function(){
        for(var i =0;i<this.notices.length;i++){
          this.notices[i].init();
        }
      }
      CallBoard.prototype.redraw = function(){
        this.clean();
        this.init();
        this.draw();
      }
      CallBoard.prototype.clean = function(){
        this.stage.ctx.clearRect(this.x,this.y,this.width,this.height);
      }
      CallBoard.prototype.add = function(notice){
        if(!notice){return;}
        this.notices.push(notice);
      }
       
      function Notice(x,y,str,callBoard){
        this.x = x;
        this.y = y;
        this.str = str;
        this.width = 150;
        this.height = 10;
        this.stage = callBoard.stage;
        if(str == undefined){
          this.init();
        }else{
          this.init(str);
        }
      }
      Notice.prototype.init = function(){
        this.stage.ctx.fillText('暂无',this.x,this.y);
      }
      Notice.prototype.init = function(str){
        if(str != ''){
          this.str = str;
        }
        this.stage.ctx.fillText(this.str,this.x,this.y);
      }
      Notice.prototype.draw = function(str){
        this.init(str);
      }
      Notice.prototype.redraw = function(str){
        this.stage.ctx.clearRect(this.x,this.y-9,this.width,this.height);
        this.draw(str);
      }
       
      function Rule(){
        this.disc1 = {};
        this.disc2 = {};
        this.notice1 = {};
        this.notice2 = {};
        this.notice3 = {};
        this.count = 0;
        this.integral = [];
        this.hasNext = false;
         
      }
      Rule.prototype.init = function(stage){
        this.disc1 = stage.things['disc'][0];
        this.disc2 = stage.things['disc'][1];
        this.notice1 = stage.things['callBoard'][0].notices[0];
        this.notice2 = stage.things['callBoard'][0].notices[1];
        this.notice3 = stage.things['callBoard'][0].notices[2];
        this.count = this.disc1.porints + this.disc2.porints;
        this.notice1.redraw('色子1号当前点数为: '+this.disc1.porints+' 点');
        this.notice2.redraw('色子2号当前点数为: '+this.disc2.porints+' 点');
        this.notice3.redraw('当前点数和为:'+this.count+'点。');
      }
      Rule.prototype.run = function(){
        var str = this.notice3.str;
        this.notice3.width = 348;
        if(this.integral.length == 0){
          if(this.count == 7 || this.count == 11){
            str += '你的运气真好一把就赢了,继续加油哦!';
            this.notice3.redraw(str);
            this.hasNext = false;
            return this;
          }
          if(this.count == 2 || this.count == 3 || this.count == 12){
            str += '你也太衰了吧!第一把就输了,再来一把试试!';
            this.notice3.redraw(str)
            this.hasNext = false;
            return this;
          }
          if(this.count >=4 && this.count <= 10){
            this.integral.push(this.count);
            str += '请再抛一次骰子!';
            this.notice3.redraw(str);
            this.hasNext = true;
            return this;
          }
        }else{
          if(this.count == 7 || this.count != this.integral[this.integral.length - 1]){
            str += '不好意思,你输了……!';
            this.notice3.redraw(str);
            this.hasNext = false;
            return this;
          }
          if(this.count == this.integral[this.integral.length - 1]){
            str += '你太厉害了,竟然抛出和上一次一样的点数!恭喜你赢了!';
            this.notice3.redraw(str);
            this.hasNext = false;
            return this;
          }
        }
      }
       
      var stage = new Stage('game');
      stage.setings = function(){
        var x1 = 20,y1 = 20;
        var x2 = 210,y2 = 20;
        var callBoard = new CallBoard(20,200,stage);
        callBoard.add(new Notice(30,220,'色子1号,尚无点数。',callBoard));
        callBoard.add(new Notice(220,220,'色子2号,尚无点数。',callBoard));
        callBoard.add(new Notice(30,240,'当前尚无点数和。',callBoard));
       
        stage.add(new Disc(x1,y1,stage));
        stage.add(new Disc(x2,y2,stage));
        stage.add(callBoard);
        stage.rule = new Rule();
      }
      stage.setings();
       
    </script>
  </body>
</html>
登录后复制

演示图片

以上所述就是本文的全部内容了,希望能够对大家学习js+html5有所帮助。

本站声明
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn

热AI工具

Undresser.AI Undress

Undresser.AI Undress

人工智能驱动的应用程序,用于创建逼真的裸体照片

AI Clothes Remover

AI Clothes Remover

用于从照片中去除衣服的在线人工智能工具。

Undress AI Tool

Undress AI Tool

免费脱衣服图片

Clothoff.io

Clothoff.io

AI脱衣机

Video Face Swap

Video Face Swap

使用我们完全免费的人工智能换脸工具轻松在任何视频中换脸!

热门文章

<🎜>:泡泡胶模拟器无穷大 - 如何获取和使用皇家钥匙
3 周前 By 尊渡假赌尊渡假赌尊渡假赌
北端:融合系统,解释
3 周前 By 尊渡假赌尊渡假赌尊渡假赌
Mandragora:巫婆树的耳语 - 如何解锁抓钩
3 周前 By 尊渡假赌尊渡假赌尊渡假赌

热工具

记事本++7.3.1

记事本++7.3.1

好用且免费的代码编辑器

SublimeText3汉化版

SublimeText3汉化版

中文版,非常好用

禅工作室 13.0.1

禅工作室 13.0.1

功能强大的PHP集成开发环境

Dreamweaver CS6

Dreamweaver CS6

视觉化网页开发工具

SublimeText3 Mac版

SublimeText3 Mac版

神级代码编辑软件(SublimeText3)

热门话题

Java教程
1664
14
CakePHP 教程
1423
52
Laravel 教程
1321
25
PHP教程
1269
29
C# 教程
1249
24
HTML 中的表格边框 HTML 中的表格边框 Sep 04, 2024 pm 04:49 PM

HTML 表格边框指南。在这里,我们以 HTML 中的表格边框为例,讨论定义表格边框的多种方法。

HTML 中的嵌套表 HTML 中的嵌套表 Sep 04, 2024 pm 04:49 PM

这是 HTML 中嵌套表的指南。这里我们讨论如何在表中创建表以及相应的示例。

HTML 左边距 HTML 左边距 Sep 04, 2024 pm 04:48 PM

HTML 左边距指南。在这里,我们讨论 HTML margin-left 的简要概述及其示例及其代码实现。

HTML 表格布局 HTML 表格布局 Sep 04, 2024 pm 04:54 PM

HTML 表格布局指南。在这里,我们详细讨论 HTML 表格布局的值以及示例和输出。

HTML 输入占位符 HTML 输入占位符 Sep 04, 2024 pm 04:54 PM

HTML 输入占位符指南。在这里,我们讨论 HTML 输入占位符的示例以及代码和输出。

HTML 有序列表 HTML 有序列表 Sep 04, 2024 pm 04:43 PM

HTML 有序列表指南。在这里我们还分别讨论了 HTML 有序列表和类型的介绍以及它们的示例

HTML onclick 按钮 HTML onclick 按钮 Sep 04, 2024 pm 04:49 PM

HTML onclick 按钮指南。这里我们分别讨论它们的介绍、工作原理、示例以及各个事件中的onclick事件。

在 HTML 中移动文本 在 HTML 中移动文本 Sep 04, 2024 pm 04:45 PM

HTML 中的文本移动指南。在这里我们讨论一下marquee标签如何使用语法和实现示例。

See all articles