Html5 Canvas斗地主游戏

          过完年来公司,没什么事,主管说研究下html5 游戏,然后主管就给了一个斗地主的demo,随后我就开始看代码,

现在我看了html5以及canvas相关知识和斗地主的demo后,自己用demo上的素材试着写了个斗地主,代码没重构好,欢迎赐教。

          演示地址:CanVas斗地主

          话不多说,下面就一步一步解释下吧

          只有一个common.js文件

1、资源类

 1 var Resource = Class.create();
 2 $.extend(Resource.prototype, {
 3     initialize: function () { },
 4     Images: [
 5         { path: 'img/bg1.png', x: 0, y: 0, w: 800, h: 480, data: null, type: 61, visible: true },
 6         { path: 'img/BeiMian.jpg', x: 320, y: 5, w: 100, h: 121, data: null, type: 62, visible: true },
 7         { path: 'img/btn.jpg', x: 300, y: 281, w: 140, h: 50, data: null, type: 63, visible: true, text: '开始', textX: 366, textY: 310 },
 8         { x: 0, y: 0, type: 66, isText: true, visible: false },
 9         { path: 'img/1.jpg', data: null, type: 16, visible: false },
10         { path: 'img/2.jpg', data: null, type: 17, visible: false },
11         { path: 'img/3.jpg', data: null, type: 3, visible: false, se: 1 },
12         { path: 'img/4.jpg', data: null, type: 4, visible: false, se: 1 },
13         { path: 'img/5.jpg', data: null, type: 5, visible: false, se: 1 },
14         { path: 'img/6.jpg', data: null, type: 6, visible: false, se: 1 },
15         { path: 'img/7.jpg', data: null, type: 7, visible: false, se: 1 },
16         { path: 'img/8.jpg', data: null, type: 8, visible: false, se: 1 },
17         { path: 'img/9.jpg', data: null, type: 9, visible: false, se: 1 },
18         { path: 'img/10.jpg', data: null, type: 10, visible: false, se: 1 },
19         { path: 'img/11.jpg', data: null, type: 11, visible: false, se: 1 },
20         { path: 'img/12.jpg', data: null, type: 12, visible: false, se: 1 },
21         { path: 'img/13.jpg', data: null, type: 13, visible: false, se: 1 },
22         { path: 'img/14.jpg', data: null, type: 14, visible: false, se: 1 },
23         { path: 'img/15.jpg', data: null, type: 15, visible: false, se: 1 },
24         { path: 'img/16.jpg', data: null, type: 3, visible: false, se: 4 },
25         { path: 'img/17.jpg', data: null, type: 4, visible: false, se: 4 },
26         { path: 'img/18.jpg', data: null, type: 5, visible: false, se: 4 },
27         { path: 'img/19.jpg', data: null, type: 6, visible: false, se: 4 },
28         { path: 'img/20.jpg', data: null, type: 7, visible: false, se: 4 },
29         { path: 'img/21.jpg', data: null, type: 8, visible: false, se: 4 },
30         { path: 'img/22.jpg', data: null, type: 9, visible: false, se: 4 },
31         { path: 'img/23.jpg', data: null, type: 10, visible: false, se: 4 },
32         { path: 'img/24.jpg', data: null, type: 11, visible: false, se: 4 },
33         { path: 'img/25.jpg', data: null, type: 12, visible: false, se: 4 },
34         { path: 'img/26.jpg', data: null, type: 13, visible: false, se: 4 },
35         { path: 'img/27.jpg', data: null, type: 14, visible: false, se: 4 },
36         { path: 'img/28.jpg', data: null, type: 15, visible: false, se: 4 },
37         { path: 'img/29.jpg', data: null, type: 3, visible: false, se: 3 },
38         { path: 'img/30.jpg', data: null, type: 4, visible: false, se: 3 },
39         { path: 'img/31.jpg', data: null, type: 5, visible: false, se: 3 },
40         { path: 'img/32.jpg', data: null, type: 6, visible: false, se: 3 },
41         { path: 'img/33.jpg', data: null, type: 7, visible: false, se: 3 },
42         { path: 'img/34.jpg', data: null, type: 8, visible: false, se: 3 },
43         { path: 'img/35.jpg', data: null, type: 9, visible: false, se: 3 },
44         { path: 'img/36.jpg', data: null, type: 10, visible: false, se: 3 },
45         { path: 'img/37.jpg', data: null, type: 11, visible: false, se: 3 },
46         { path: 'img/38.jpg', data: null, type: 12, visible: false, se: 3 },
47         { path: 'img/39.jpg', data: null, type: 13, visible: false, se: 3 },
48         { path: 'img/40.jpg', data: null, type: 14, visible: false, se: 3 },
49         { path: 'img/41.jpg', data: null, type: 15, visible: false, se: 3 },
50         { path: 'img/42.jpg', data: null, type: 3, visible: false, se: 2 },
51         { path: 'img/43.jpg', data: null, type: 4, visible: false, se: 2 },
52         { path: 'img/44.jpg', data: null, type: 5, visible: false, se: 2 },
53         { path: 'img/45.jpg', data: null, type: 6, visible: false, se: 2 },
54         { path: 'img/46.jpg', data: null, type: 7, visible: false, se: 2 },
55         { path: 'img/47.jpg', data: null, type: 8, visible: false, se: 2 },
56         { path: 'img/48.jpg', data: null, type: 9, visible: false, se: 2 },
57         { path: 'img/49.jpg', data: null, type: 10, visible: false, se: 2 },
58         { path: 'img/50.jpg', data: null, type: 11, visible: false, se: 2 },
59         { path: 'img/51.jpg', data: null, type: 12, visible: false, se: 2 },
60         { path: 'img/52.jpg', data: null, type: 13, visible: false, se: 2 },
61         { path: 'img/53.jpg', data: null, type: 14, visible: false, se: 2 },
62         { path: 'img/54.jpg', data: null, type: 15, visible: false, se: 2 }
63     ]
64 });
Resource.Images是素材数组(几个按钮,文本,54张牌,背景图片等),大家可以下载demo看看 
2、Lables类,在Canvas画布上画文本的,比如按钮文字,相关知识请看canvas教程
 1 var Labels = Class.create();
 2 $.extend(Labels.prototype, {
 3     initialize: function (cxt) {
 4         this.cxt = cxt;
 5     },
 6     setText: function (text, postion) {
 7         this.cxt.font = 'bold 20px serif';
 8         this.cxt.fillStyle = '#000000';
 9         this.cxt.textAlign = 'center';
10         this.cxt.fillText(text, postion.x, postion.y);
11     }
12 });

这个类的方法setText主要是根据设置的字体,字体大小,字体颜色,在Canvas上画文本的,this.cxt这个是canvas上下文(每个教程的叫法不一样),首先this.cxt.font = 'bold 20px serif';这个是设置字体大小,样式等,this.cxt.fillStyle = '#000000';这个

是设置字体颜色,this.cxt.textAlign = 'center';这个是设置字体对齐方式,this.cxt.fillText(text, postion.x, postion.y);这个是开始在canvas上画文本,postion.x, postion.y分别是x坐标和y坐标。

3、DdZGame游戏类,主要功能就是初始化斗地主,发牌,抢地主等,出牌未完待续,后续更新

  1 var DdZGame = Class.create();
  2 DdZGame.Statics = { DealedNums: 0, isLeftFirstDeal: true };
  3 $.extend(DdZGame.prototype, {
  4     initialize: function () {
  5         DdZGame.Statics.IsGetLander = false;
  6         DdZGame.Statics.DealTime = 66;
  7         this.leftPokers = [];
  8         this.rightPokers = [];
  9         this.myPokers = [];
 10         this.LastPokers = [];//最后3张牌
 11 
 12         this.leftPlays = [];
 13         this.rightPlays = [];
 14         this.myPlays = [];
 15 
 16         this.myBtnPostion = { y: 245, x: 162 };
 17 
 18         this.isStart = false;
 19 
 20         this.Res = new Resource();
 21 
 22         this.allPokers = new Array();
 23 
 24         this.Lander = 0;//地主,1右边,2My,3左边
 25         this.isGetLander = {};
 26         this.GmCanvas = document.getElementById('gmCanvas');
 27 
 28 
 29         this.cxt = this.GmCanvas.getContext('2d');
 30         this.Lbl = new Labels(this.cxt);
 31         this.init();
 32         this.initEvt();
 33     },
 34     initEvt: function () {
 35         this.GmCanvas.onclick = $.proxy(function (e) {
 36             var box = this.GmCanvas.getBoundingClientRect();
 37 
 38             DdZGame.Statics.MousePostion = { x: e.pageX - box.left, y: e.pageY - box.top };
 39             this.onControlClick();
 40         }, this);
 41     },
 42     onControlClick: function () {
 43         var isClick = false;
 44         for (var i = 0; i < this.Controls.length; i++) {
 45             var c = this.Controls[i];
 46             var postion = DdZGame.Statics.MousePostion;
 47             if (c.onClick) {
 48                 if (postion.x >= c.x && postion.x <= c.x + c.w && postion.y >= c.y && postion.y <= c.y + c.h) {
 49                     c.onClick();
 50                     isClick = true;
 51                     break;
 52                 }
 53             }
 54         }
 55         if (!isClick) {
 56             for (var i = 0; i < this.myPokers.length; i++) {
 57                 var c = this.myPokers[i];
 58                 var postion = DdZGame.Statics.MousePostion;
 59                 if (c.onClick) {
 60                     if (postion.x >= c.x && postion.x <= c.x + c.w && postion.y >= c.y && postion.y <= c.y + c.h) {
 61                         c.onClick();
 62                         isClick = true;
 63                         break;
 64                     }
 65                 }
 66             }
 67         }
 68     },
 69     loadImages: function (callback) {
 70         var loadedNums = 0;
 71         var totalNums = this.Res.Images.length - 1;
 72         this.Controls = [];
 73         $.each(this.Res.Images, $.proxy(function (i, o) {
 74             if (!o.path) {
 75                 return true;
 76             }
 77             o.data = new Image();
 78             o.data.src = o.path;
 79             o.data.onload = $.proxy(function () {
 80                 if (o.type <= 17) {
 81                     this.allPokers.push(o);
 82                 }
 83                 else
 84                     this.Controls.push(o);
 85 
 86 
 87                 loadedNums++;
 88                 if (loadedNums >= totalNums) {
 89                     callback.call(this);
 90                 }
 91             }, this);
 92         }, this));
 93     },
 94     drawImage: function (callback, isUnVisibleLast) {//isVisibleLast 是否让底牌不可见
 95         $.each(this.Controls, $.proxy(function (i, o) {
 96             if (!o.visible)
 97                 return true;
 98             if (o.type == 62) {
 99                 var x = 0;
100                 for (var i = 0; i < 54 - DdZGame.Statics.DealedNums ; i++) {
101                     if (i == 0) x = o.x;
102                     this.cxt.drawImage(o.data, o.x, o.y, o.w, o.h);
103                     o.x++;
104                 }
105                 o.x = x;
106             }
107             else if (!o.isText) {
108                 this.cxt.drawImage(o.data, o.x, o.y, o.w, o.h);
109             }
110             if (o.type == 63) {
111                 this.Lbl.setText(o.text, { x: o.textX, y: o.textY });
112 
113 
114 
115                 if (!o.onClick)
116                     o.onClick = $.proxy(function () {
117                         o.onClick = null;
118                         o.visible = false;
119                         this.drawImage();
120                         this.Dealing();
121                     }, this);
122             }
123 
124             if (o.type == 66) {
125                 this.Lbl.setText(o.text, { x: o.x, y: o.y });
126             }
127         }, this));
128 
129 
130         /*克隆*/
131         var copyLeftPokers = this.leftPokers.slice();
132         var copyRightPokers = this.rightPokers.slice();
133         var copyMyPokers = this.myPokers.slice();
134         var copyLastPokers = this.LastPokers.slice();
135 
136         var isDealEndLeft = false;
137         var isDealEndRight = false;
138         var isDealEndMy = false;
139         var isDealEndLast = false;
140 
141         var beiMain = $.grep(this.Res.Images, $.proxy(function (o, i) { return o.type == 62; }, this))[0];
142         var DrawPokers = function (arry, direction, isBeiMian, identiy, axis) {
143             if (arry && arry.length > 0) {
144                 var o = arry[0];
145                 var x = 0, y = 0;
146 
147 
148 
149 
150 
151 
152 
153 
154 
155 
156 
157 
158 
159                 if (!DdZGame.Statics[direction]) {
160                     DdZGame.Statics[direction] = this[direction];
161                 }
162 
163                 if (!o.x) {
164                     x = DdZGame.Statics[direction].x;
165                     y = DdZGame.Statics[direction].y;
166 
167                     o.x = this[direction].x;
168                     o.y = this[direction].y;
169                 }
170                 else {
171                     x = o.x;
172                     y = o.y;
173                 }
174 
175 
176                 if (!o.visible) {
177                     return true;
178                 }
179 
180 
181 
182                 o.w = 18;
183                 o.h = 129;
184                 if (arry.length == 1) {
185                     o.w = 105;
186                     o.h = 150;
187                 }
188 
189 
190 
191 
192 
193 
194 
195                 var img = o.data;
196                 if (isBeiMian) {
197                     img = beiMain.data;
198                 }
199                 else if (direction == 'myPannel') {
200                     o.onClick = $.proxy(function () {
201                         if (!this.isStart)
202                             return;
203                         if (!o.isPlay) {
204                             o.isPlay = true;
205                             o.y -= 30;
206                         }
207                         else {
208                             o.isPlay = false;
209                             o.y += 30;
210                         }
211 
212                         DdZGame.Statics.DealTime = 0;
213                         this.drawImage();
214                     }, this);
215                 }
216                 this.cxt.drawImage(img, x, y);
217                 DdZGame.Statics[direction][axis] += identiy;
218 
219                 arry.splice(0, 1);
220                 if (DdZGame.Statics.DealTime > 0)
221                     DdZGame.Statics[direction + 'handle'] = setTimeout($.proxy(function () {
222                         DrawPokers.call(this, arry, direction, isBeiMian, identiy, axis);
223                     }, this), DdZGame.Statics.DealTime);
224                 else
225                     DrawPokers.call(this, arry, direction, isBeiMian, identiy, axis);
226             }
227             else if (DdZGame.Statics[direction + 'handle'] || DdZGame.Statics.DealTime == 0) {
228                 clearTimeout(DdZGame.Statics[direction + 'handle']);
229 
230 
231                 if (direction == 'leftPannel' && copyLeftPokers.length == 0) {
232                     isDealEndLeft = true;
233                 }
234                 if (direction == 'rightPannel' && copyRightPokers.length == 0) {
235                     isDealEndRight = true;
236                 }
237                 if (direction == 'myPannel' && copyMyPokers.length == 0) {
238                     isDealEndMy = true;
239                 }
240                 if (direction == 'lastPannel' && copyLastPokers.length == 0) {
241                     isDealEndLast = true;
242                 }
243                 if (isDealEndLeft && isDealEndRight && isDealEndMy && isDealEndLast) {
244                     /*发牌完毕*/
245                     /*抢地主*/
246                     if (callback)
247                         callback();
248                 }
249             }
250         };
251 
252 
253         DrawPokers.call(this, copyLeftPokers, 'leftPannel', true, 26, 'y');
254         DrawPokers.call(this, copyRightPokers, 'rightPannel', true, 26, 'y');
255         DrawPokers.call(this, copyMyPokers, 'myPannel', false, 19, 'x');
256 
257         DrawPokers.call(this, copyLastPokers, 'lastPannel', isUnVisibleLast, 126, 'x');
258     },
259     init: function () {
260         this.loadImages(this.drawImage);
261     },
262     Dealing: function () {//发牌        
263         this.leftPannel = { x: 5, y: 18 };
264         this.rightPannel = { x: 691, y: 18 };
265         this.myPannel = { x: 198, y: 330 };
266         this.lastPannel = { x: 243, y: 5 };
267 
268 
269         if (DdZGame.Statics.DealedNums >= 51) { //发牌完毕 
270 
271             $.each(this.allPokers, $.proxy(function (i, o) {
272                 o.visible = true;
273                 this.LastPokers.push(o);
274             }, this));
275 
276 
277             this.myPokers.sort(function (a, b) {
278                 if (a.type != b.type)
279                     return b.type - a.type;
280                 return b.se - a.se;
281             });
282             $.grep(this.Res.Images, $.proxy(function (o, i) { return o.type == 62; }, this))[0].visible = false;
283             this.drawImage($.proxy(function () { this.GetLander(); }, this), true);
284 
285         }
286         else {
287             /*1、left*/
288             var index = Math.floor(Math.random() * (this.allPokers.length - 1) + 0);
289             var c = this.allPokers.splice(index, 1);
290             c[0].visible = true;
291             this.leftPokers.push(c[0]);
292             DdZGame.Statics.DealedNums++;
293 
294             /*2、right*/
295             index = Math.floor(Math.random() * (this.allPokers.length - 1) + 0);
296             c = this.allPokers.splice(index, 1);
297             c[0].visible = true;
298             this.rightPokers.push(c[0]);
299             DdZGame.Statics.DealedNums++;
300 
301             index = Math.floor(Math.random() * (this.allPokers.length - 1) + 0);
302             c = this.allPokers.splice(index, 1);
303             c[0].visible = true;
304             this.myPokers.push(c[0]);
305             DdZGame.Statics.DealedNums++;
306 
307             this.Dealing();
308         }
309     },
310     GetLander: function (firstGet, minScore, curScore) {
311         /*随机出谁先叫地主*/
312 
313         //if (curScore && !this.isGetLander[1] && !this.isGetLander[2] && !this.isGetLander[3]) {
314         //    //**Game Over !
315         //    alert('无人抢地主');
316         //    return;
317         //}
318 
319 
320         var postion = { 1: { y: 100, x: 640 }, 3: { y: 100, x: 126 }, 2: { x: 216, y: 297 } };
321         if (!curScore) {
322             if (!minScore)
323                 minScore = 1;
324             if (!firstGet)
325                 firstGet = Math.floor(Math.random() * (3 - 1 + 1) + 1);
326             if (firstGet == 1 || firstGet == 3) {  //电脑抢地主
327                 if (this.isGetLander[firstGet] == -1 || this.isGetLander[firstGet]) {
328                     $.each(this.Controls, $.proxy(function (i, o) {
329                         if (o.Lander) {
330                             o.visible = false;
331                         }
332                     }, this));
333 
334                     var max = 0;
335                     if (this.isGetLander[1] > this.isGetLander[2]) {
336                         max = this.isGetLander[1];
337                         this.Lander = 1;
338                     }
339                     else {
340                         max = this.isGetLander[2];
341                         this.Lander = 2;
342                     }
343                     if (max < this.isGetLander[3]) {
344                         max = this.isGetLander[3];
345                         this.Lander = 3;
346                     }
347                     if (max == 0) {
348                         alert('Game Over !');
349                         return;
350                     }
351 
352                     var txt = max + '分';
353                     var t = {};
354                     var tObj = $.grep(this.Res.Images, function (o, i) { return o.type == 66; })[0];
355                     $.extend(t, tObj);//复制对象
356                     if (this.CurScore == 4) {
357                         txt = '不抢';
358                     }
359                     t.text = txt;
360                     t.x = postion[this.Lander].x;
361                     t.y = postion[this.Lander].y;
362                     t.visible = true;
363                     this.Controls.push(t);
364 
365 
366 
367                     //this.drawImage($.proxy(function () {
368 
369                     //    this.FanDiPai(this.Lander);
370                     //}, this));
371                     this.FanDiPai(this.Lander);
372                     return;
373                 }
374                 console.log('电脑抢地主');
375                 this.CurScore = Math.floor(Math.random() * (4 - minScore + 1) + minScore);
376 
377                 this.isGetLander[firstGet] = this.CurScore == 4 ? -1 : this.CurScore;
378 
379                 var txt = this.CurScore + '分';
380                 var t = {};
381                 var tObj = $.grep(this.Res.Images, function (o, i) { return o.type == 66; })[0];
382                 $.extend(t, tObj);//复制对象
383                 if (this.CurScore == 4) {
384                     txt = '不抢';
385                 }
386 
387                 t.text = txt;
388                 t.x = postion[firstGet].x;
389                 t.y = postion[firstGet].y;
390                 t.visible = true;
391 
392                 this.Controls.push(t);
393 
394                 if (this.CurScore == 3) {
395                     this.Lander = firstGet;
396                     //DdZGame.Statics.IsGetLander = true;
397                     //DdZGame.Statics.DealTime = 0;
398 
399                     var dz = {};
400                     $.extend(dz, tObj);//复制对象
401                     dz.text = '地主';
402                     dz.x = t.x + 30;
403                     dz.y = t.y;
404                     dz.visible = true;
405 
406                     this.Controls.push(dz);
407 
408                     //this.drawImage($.proxy(function () { this.Play(this.Lander, '电脑地主'); }, this));//电脑抢到地主优先出牌
409                     this.FanDiPai(this.Lander);
410                     return;
411                 }
412                 else {
413                     if (this.CurScore == 4) {
414                         var test = 'abcdefg';
415                     }
416                     var nextGet = firstGet == 1 ? 2 : 1;
417                     minScore = this.CurScore == 4 ? minScore : this.CurScore + 1;
418                     this.CurScore = this.CurScore == 4 ? 0 : this.CurScore;
419 
420 
421                     DdZGame.Statics.DealTime = 0;
422                     this.drawImage($.proxy(function () { this.GetLander(nextGet, minScore); }, this), true);//电脑抢到地主优先出牌
423                     return;
424                 }
425             }
426         }
427         if (curScore) {
428             /*代码写的很垃圾,这点没用面向对象*/
429             /*My已经叫过地主,按钮需要隐藏*/
430             $.each(this.Controls, $.proxy(function (i, o) {
431                 if (o.Lander) {
432                     o.visible = false;
433                 }
434             }, this));
435 
436             this.CurScore = curScore;
437             var txt = this.CurScore + '分';
438             var t = {};
439             var tObj = $.grep(this.Res.Images, function (o, i) { return o.type == 66; })[0];
440             $.extend(t, tObj);//复制对象
441             if (this.CurScore == 4) {
442                 txt = '不抢';
443             }
444             t.text = txt;
445             t.x = postion[2].x;
446             t.y = postion[2].y;
447             t.visible = true;
448             this.Controls.push(t);
449 
450             this.isGetLander[2] = curScore == 4 ? -1 : curScore;
451 
452             if (this.CurScore == 3 || (this.isGetLander[1] && this.isGetLander[3] && this.CurScore != 4)) {
453                 this.Lander = 2;
454                 //DdZGame.Statics.IsGetLander = true;
455                 //DdZGame.Statics.DealTime = 0;
456 
457                 var dz = {};
458                 $.extend(dz, tObj);//复制对象
459                 dz.text = '地主';
460                 dz.x = t.x + 50;
461                 dz.y = t.y;
462                 dz.visible = true;
463 
464                 this.Controls.push(dz);
465 
466                 //this.drawImage($.proxy(function () { this.Play(this.Lander, '我是地主'); }, this), false);//电脑抢到地主优先出牌
467                 this.FanDiPai(this.Lander);
468                 return;
469             }
470             else {
471                 minScore = this.CurScore == 4 ? minScore : this.CurScore + 1;
472                 this.CurScore = this.CurScore == 4 ? 0 : this.CurScore;
473                 if (!this.isGetLander[3]) {
474                     DdZGame.Statics.DealTime = 0;
475                     this.drawImage($.proxy(function () { this.GetLander(3, minScore) }, this), true);
476                     return;
477                 }
478                 else {  //已经转了一圈,则比较抢地主的分数大小
479                     var max = 0;
480                     if (this.isGetLander[1] > this.isGetLander[2]) {
481                         max = this.isGetLander[1];
482                         this.Lander = 1;
483                     }
484                     else {
485                         max = this.isGetLander[2];
486                         this.Lander = 2;
487                     }
488                     if (max < this.isGetLander[3]) {
489                         max = this.isGetLander[3];
490                         this.Lander = 3;
491                     }
492                     if (max == 0) {
493                         alert('Game Over !');
494                         return;
495                     }
496 
497                     var txt = '地主';
498                     var t = {};
499                     var tObj = $.grep(this.Res.Images, function (o, i) { return o.type == 66; })[0];
500                     $.extend(t, tObj);//复制对象                   
501                     t.text = txt;
502                     t.x = postion[this.Lander].x;
503                     t.y = postion[this.Lander].y;
504                     if (this.Lander != 2) {
505                         t.x += 30;
506                     }
507                     else {
508                         t.x += 50;
509                     }
510                     t.visible = true;
511                     this.Controls.push(t);
512 
513 
514                     //DdZGame.Statics.DealTime = 0;
515                     //this.drawImage($.proxy(function () { this.Play(this.Lander, '抢地主啊'); }, this), false);
516                     this.FanDiPai(this.Lander);
517                     return;
518                 }
519             }
520         }
521         else if (this.isGetLander[2] == -1 || this.isGetLander[2]) {
522             $.each(this.Controls, $.proxy(function (i, o) {
523                 if (o.Lander) {
524                     o.visible = false;
525                 }
526             }, this));
527 
528             var max = 0;
529             if (this.isGetLander[1] > this.isGetLander[2]) {
530                 max = this.isGetLander[1];
531                 this.Lander = 1;
532             }
533             else {
534                 max = this.isGetLander[2];
535                 this.Lander = 2;
536             }
537             if (max < this.isGetLander[3]) {
538                 max = this.isGetLander[3];
539                 this.Lander = 3;
540             }
541             if (max == 0) {
542                 alert('Game Over !');
543                 return;
544             }
545 
546             var txt = max + '分';
547             var t = {};
548             var tObj = $.grep(this.Res.Images, function (o, i) { return o.type == 66; })[0];
549             $.extend(t, tObj);//复制对象
550             if (this.CurScore == 4) {
551                 txt = '不抢';
552             }
553             t.text = txt;
554             t.x = postion[this.Lander].x;
555             t.y = postion[this.Lander].y;
556             t.visible = true;
557             this.Controls.push(t);
558 
559 
560             //DdZGame.Statics.DealTime = 0;
561             //this.drawImage($.proxy(function () { this.Play(this.Lander, '抢地主啊'); }, this), false);
562             this.FanDiPai(this.Lander);
563             return;
564         }
565         //if (DdZGame.Statics.IsGetLander) {
566         //    return;
567         //}
568         //DdZGame.Statics.IsGetLander = true;//是否在抢地主
569         console.log('我抢地主');
570         var btnObj = $.grep(this.Res.Images, $.proxy(function (o, i) {
571             return o.type == 63;
572         }, this))[0];
573         if (!this.CurScore) {
574             this.CurScore = 0;
575         }
576         var txtX = 0;
577         for (var i = 1; i <= 3; i++) {
578             if (i > this.CurScore) {
579                 var btn = {};
580                 $.extend(btn, btnObj);
581                 btn.text = i + '分';
582                 btn.x = this.myBtnPostion.x;
583                 btn.y = this.myBtnPostion.y;
584                 btn.visible = true;
585                 btn.type = 63;
586                 btn.textX = this.myBtnPostion.x + 30;
587                 btn.textY = 286;
588                 btn.h = 50;
589                 btn.w = 81;
590                 btn.Lander = true;
591                 btn.onClick = (function (i, obj) { return function () { obj.GetLander(3, i + 1, i); }; })(i, this)
592                 DdZGame.Statics.DealTime = 0;
593                 this.Controls.push(btn);
594                 this.myBtnPostion.x += btn.w + 10;
595             }
596         }
597         if (DdZGame.Statics.DealTime == 0) {
598             var btn = {};
599             $.extend(btn, btnObj);
600             btn.text = '不抢';
601             btn.x = this.myBtnPostion.x;
602             btn.y = this.myBtnPostion.y;
603             btn.visible = true;
604             btn.type = 63;
605             btn.textX = this.myBtnPostion.x + 30;
606             btn.textY = 286;
607             btn.h = 50;
608             btn.w = 81;
609             btn.Lander = true;
610             btn.onClick = $.proxy(function () { this.GetLander(3, minScore, 4); }, this);
611             this.Controls.push(btn);
612             this.drawImage(null, true);
613         }
614     },
615     FanDiPai: function (lander) {//翻底牌
616         DdZGame.Statics.DealTime = 0;
617         var p = '';
618         if (lander == 1) {
619             p = 'rightPokers';
620         }
621         else if (lander == 2) {
622             p = 'myPokers';
623         }
624         else if (lander == 3) {
625             p = 'leftPokers';
626         }
627         /*谁抢到地主,底牌归谁*/
628         $.each(this.LastPokers, $.proxy(function (i, o) {
629             var c = {};
630             $.extend(c, o);
631             c.x = null;
632             c.y = null;
633             this[p].push(c);
634             test = c.path;
635         }, this));
636         if (lander == 2) {
637             this.myPokers.sort(function (a, b) {
638                 a.x = null;
639                 a.y = null;
640                 b.x = null;
641                 b.y = null;
642                 if (a.type != b.type)
643                     return b.type - a.type;
644                 return b.se - a.se;
645             });
646             this.myPannel = { x: 198, y: 330 };
647             DdZGame.Statics['myPannel'] = null;
648         }
649         this.drawImage($.proxy(function () { this.isStart = true; this.Play(lander, '是地主啊'); }, this), false);
650     },
651     Play: function (lander, msg) {//出牌
652         //alert('');
653     }
654 });
View Code

initialize:这个函数是构造函数,初始化一些起始变量。

initEvt这个里是初始化canvas事件,canvas点击事件不像svg那样,因为canvas是一帧一帧画上去的,html dom里是看不到里面的每个元素,javascript自然也无法获取到canvas里的某个元素,那canvas元素点击事件是怎么处理的了?

首先定义下canvas这个画布的事件,然后定义获取鼠标的坐标,再算出在canvas相对坐标,因为每个元素也都有自己的坐标和宽高,所以可以根据这个坐标判断这个坐标是否在某个元素内。

onControlClick:这个函数是根据上面算出的坐标,判断此坐标在哪个元素内,如果在元素内,并且定义了onclick函数(注:此处并不是真正的元素事件,只是对象的一个函数属性),然后调用onclick函数,执行相应的代码。

loadImages:这个是加载所有图片,图片加载完成之后,就开始在canvas上画初始的元素。

init:这个函数就是调用loadImages函数,然后所有图片加载完毕之后,调用回调函数,在canvas上画初始的元素

Dealing :这个是发牌,每方的牌都是随机的,if(DdZGame.Statics.DealedNums >= 51)发了51张牌之后,就剩3张底牌,然后再把这51张牌和3张底牌画在canvas上

GetLander :这个是抢地主,谁先抢地主是随机的,如果是先随机到电脑抢地主,那抢地主的分数也是随机的。

 

...................................未完待续

 



转载于:https://www.cnblogs.com/ChengPuYuan/p/4311772.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/257595.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

mysql的查询、子查询及连接查询

一、mysql查询的五种子句 where子句&#xff08;条件查询&#xff09;&#xff1a;按照“条件表达式”指定的条件进行查询。 group by子句&#xff08;分组&#xff09;&#xff1a;按照“属性名”指定的字段进行分组。group by子句通常和count()、sum()等聚合函数一起使用。 h…

WebLogic11g-常用运维操作

转自&#xff1a;https://dead-knight.iteye.com/blog/1940399 希望这篇能把weblogic运维时经常遇到的问题、常用的配置汇总到一起。 1、配置jvm参数&#xff1a; 一般在domain启动过程中会看到以下启动的日志信息&#xff0c;如下图所示&#xff1a; 图中红色方框部分为启动we…

当安全遇到大数据 “永恒之蓝”也将无所遁形!

文章讲的是当安全遇到大数据 “永恒之蓝”也将无所遁形&#xff01;5月12日&#xff0c;席卷全球的勒索病毒“永恒之蓝”让全世界都为之震动&#xff0c;这是迄今为止全球最大规模的勒索病毒网络攻击&#xff0c;100多个国家受到病毒感染&#xff0c;国内中石油、公安内网、高校…

[ES] 安装

1.ElasticSearch安装的准备工作 Linux&#xff1a;CentOS6.4 Elasticsearc:elasticsearch-2.2.0 JDK:jdk-7u79-linux-x64 IK:1.8.0 MAVEN:apache-maven-3.3.3-bin 2.配置网络静态文件 虚拟机设置桥接模式 配置&#xff1a;vim /etc/sysconfig/network-scripts/ifcfg-eth0 DEVIC…

基于Eclipse搭建STM32开源开发环境

最近项目不忙&#xff0c;想着没事看看简单的嵌入式&#xff0c;弄弄物联网什么的。于是就从廉价的STM32开刀了。因为一直是做PC软件开发的&#xff0c;那VS的智能感知那叫一个爽啊&#xff0c;相比之下&#xff0c;觉得这个Keil简直就像文本编辑器一样low。于是想换一个开发环…

数据中心不再有空调、风扇等冷却装置会怎样?

数据中心的变革有望依赖移动设备实现&#xff0c;手机里轻便设备或将成为下一代数据中心的基础设施&#xff0c;服务Google和Facebook等大型的应用程序服务企业。同时&#xff0c;这种商业模式也会构建新一代企业的发展形态&#xff0c;为初创企业带来前所未有的机遇。 CSDN大数…

.NET 数据库缓存依赖策略实现

处理大型门户网站 一般都需要 使用缓存技术这个web加速器在 PHP 和 java 一般 使用的是 基于squid 来做. 当然在 windows .NET 平台也是可以的 squid有 windows版本.这个以后再去研究,现在 就介绍一下 .NET 自带的 缓存策略.Microsoft的petshop就用到了它;  一、基于数据库触…

设计模式之PHP项目应用——单例模式设计Memcache和Redis操作类

1 单例模式简单介绍 单例模式是一种经常使用的软件设计模式。在它的核心结构中仅仅包括一个被称为单例类的特殊类。通过单例模式能够保证系统中一个类仅仅有一个实例并且该实例易于外界訪问。从而方便对实例个数的控制并节约系统资源。假设希望在系统中某个类的对象仅仅能存…

【转】康拓展开

———本文转自&#xff1a;http://www.cnblogs.com/1-2-3/archive/2011/04/25/generate-permutation-part2.html 1、康托展开  康托展开的公式是 Xan*(n-1)!an-1*(n-2)!...ai*(i-1)!...a2*1!a1*0! 其中&#xff0c;ai为当前未出现的元素中是排在第几个&#xff08;从0开始&a…

java jni so_java 用jni调用so全过程

这几天一直在研究JNI的开发过程&#xff0c;顺便把NDK环境搭建一起总结下。在windows环境下开发jni需要c/c编译器的支持&#xff0c;网络上我看很多人使用cygwin。呵呵我不是很喜欢使用它&#xff0c;感觉安装起来挺麻烦的。我使用GNUStep&#xff0c;下载地址http://www.gnust…

Linux下安装jdk

参考于&#xff1a;http://www.cnblogs.com/caosiyang/archive/2013/03/14/2959087.html 一、准备阶段 ①下载jdk-6u45-linux-i586.bin&#xff0c;通过xftp上传至Linux系统中 ②在命令行执行 ./jdk-6u45-linux-i586.bin&#xff0c;生成目录jdk1.6.0_45 ③移动到/usr/share下&…

为Tiny4412设备驱动在proc目录下添加一个可读版本信息的文件

http://blog.csdn.net/morixinguan/article/details/77808088 上节&#xff0c;我们明白了proc文件系统的作用&#xff0c;接下来我们在友善之臂已经写好的led驱动的基础上&#xff0c;在proc目录下创建一个文件夹&#xff0c;然后加入led驱动的版本信息读取。 我们在init函数的…

java audiorecord_Android 录音实现(AudioRecord)

上一篇文章介绍了使用 MediaRecorder 实现录音功能 Android录音实现(MediaRecorder) &#xff0c;下面我们继续看看使用 AudioRecord 实现录音功能。AudioRecord首先看看Android帮助文档中对该类的简单概述: AndioRecord 类的主要功能是让各种 Java 应用能够管理音频资源&#…

《架构探险——从零开始写Java Web框架》这书不错,能看懂的入门书

这书适合我。 哈哈&#xff0c;结合 以前的知识点&#xff0c;勉强能看懂。 讲得细&#xff0c;还可以参照着弄出来。 希望能坚持 完成啦。。。 原来&#xff0c;JSTL就类似于DJANGO中的模板。 而servlet类中的res,req&#xff0c;玩了DJANGO就觉得好熟悉啦。。。&#xff1a;&…

java 生成 tar.gz_一文教您如何通过 Java 压缩文件,打包一个 tar.gz Filebeat 采集器包...

一、背景最近&#xff0c;小哈主要在负责日志中台的开发工作, 等等&#xff0c;啥是日志中台&#xff1f;俺只知道中台概念&#xff0c;这段时间的确很火&#xff0c;但是日志中台又是用来干啥的&#xff1f;这里小哈尽量地通俗的说下日志中台的职责&#xff0c;再说日志中台之…

poj1741 Tree 点分治

入门题&#xff0c;算是对树分治有了初步的理解吧。 #include<iostream> #include<cstdio> #include<cstring> #include<cstdlib> #include<algorithm> #include<vector> #define REP(i,a,b) for(int ia;i<b;i) #define MS0(a) memset(…

深入理解 ajax_xhr 对象

2019独角兽企业重金招聘Python工程师标准>>> ajax技术的核心是XMLHttpRequest对象(简称XHR)&#xff0c;这是由微软首先引入的一个特性&#xff0c;其他浏览器提供商后来都提供了相同的实现。 IE5是第一款引入XHR对象的浏览器。在IE5中&#xff0c;XHR对象是通过MSX…

组函数及分组统计

分组函数 SQL中经常使用的分组函数 Count(): 计数 Max()&#xff1a;求最大值 Min()&#xff1a;求最小值 Avg()&#xff1a;求平均值 Sum()&#xff1a;求和 -- 统计emp表中的人数 select count(*) from emp; -- 统计获得奖金的人数 select count(comm) from emp;-- 求全部雇…

两张神图介绍python3和 2.x与 3.x 的区别

有感与第一张图, 做了第二张图.转载于:https://www.cnblogs.com/Vito2008/p/5280393.html

Factorial Trailing Zeroes

https://leetcode.com/problems/factorial-trailing-zeroes/ Given an integer n, return the number of trailing zeroes in n!. Note: Your solution should be in logarithmic time complexity. 解题思路&#xff1a; 再次遇见最讨厌的Math题。 开始的思路&#xff0c;结尾的…