在我的项目中需要在里面添加一个翻牌游戏,就研究了一下,在这里只实现了基本的效果。不多说,和大家分享一下。
说到翻牌游戏,大致分为以下几个步骤:
绘制正反面卡牌-------------->洗牌----------------------->翻牌------------------->翻牌判断
这里面应用的一些图片,,,,,,额额额额,,,大家就自己下两个试试,这里也提供不了。。。嘿嘿
1.绘制正反面卡牌
function make_deck()//生成卡组并绘制 { var i;// var a_card;//a组卡牌容器 var b_card;//b组卡牌容器 var a_pic;//a组卡牌图片 var b_pic;//b组卡牌图片 var cx = first_x;//初始坐标X=50 var cy = first_y;//初始坐标Y=10 for ( i = 0; i < pairs.length/2; i++) { /*Canvas绘制图片 * var c=document.getElementById("myCanvas"); var cxt=c.getContext("2d"); var img=new Image() img.src="flower.png" cxt.drawImage(img,0,0);*/ a_pic = new Image(); a_pic.src = pairs[i][0]; //绘制卡牌a组 a_card = new Card(cx, cy, card_width, card_height, a_pic, i);//给卡牌属性即卡牌对象生成了,并绘制了背面 deck.push(a_card);//将a组卡牌装进数组deck[] //绘制与之a组卡牌面相同的b组 b_pic = new Image(); b_pic.src = pairs[i][1]; b_card = new Card(cx, cy + card_height + margin, card_width, card_height, b_pic, i); deck.push(b_card);// 将b组卡牌装进数组deck[] cx = cx + card_width + margin; //cy = cy + card_height + margin; //note a_card.draw(); b_card.draw(); } //绘制后两排 cx=first_x; cy=first_y+card_height*2+margin*2; for ( i = 4; i < pairs.length; i++) { a_pic = new Image(); a_pic.src = pairs[i][0]; //绘制卡牌a组 a_card = new Card(cx, cy, card_width, card_height, a_pic, i); deck.push(a_card); //绘制与之a组卡牌面相同的b组 b_pic = new Image(); b_pic.src = pairs[i][1]; b_card = new Card(cx, cy + card_height + margin, card_width, card_height, b_pic, i); deck.push(b_card);// cx = cx + card_width + margin; //cy = cy + card_height + margin; //note a_card.draw(); b_card.draw(); } }
function shuffle()//洗牌 { var i; var j; var temp_info; var temp_img; var deck_length = deck.length; var k; for ( k = 0; k < 9 * deck_length; k++) { i = Math.floor(Math.random() * deck_length);//0-16 j = Math.floor(Math.random() * deck_length);//0-16 temp_info = deck[i].info;//第1张 temp_img = deck[i].img;//第1张图片 deck[i].info = deck[j].info; deck[i].img = deck[j].img; deck[j].info = temp_info; deck[j].img = temp_img; } }
function choose(ev) { //var out; var mx; var my; //var pick1; //var pick2; var i; //note if (ev.layerX || ev.layerX == 0) {// Firefox mx = ev.layerX; my = ev.layerY; } else if (ev.offsetX || ev.offsetX == 0) {// Opera mx = ev.offsetX; my = ev.offsetY; } for ( i = 0; i < deck.length; i++) { card = deck[i]; if (card.sx >= 0)//牌未被消除 { //判断点击的是哪一张牌 if (mx > card.sx && mx < card.sx + card.swidth && my > card.sy && my < card.sy + card.sheight) { if (i != first_card)//如果两次点击同一张牌不做处理 break; } } } if (i < deck.length) { if (first_pick)//如果是第一次点击 { window.addEventListener("load",function(){ var myaudio=document.getElementByIdx_x("a1"); myaudio.volume=0.5;//表示的是播放音量为一半 myaudio.play(); alert("shengyin"); }); first_card = i; first_pick = false; //note ctx.drawImage(card.img, card.sx, card.sy, card.swidth, card.sheight); } else { first_pick = true; //note second_card = i; ctx.drawImage(card.img, card.sx, card.sy, card.swidth, card.sheight); tid = setTimeout(flip_back, 1000); } } }
function flip_back() { if (card.info==deck[first_card].info)//配对成功 { ctx.fillStyle = table_color; ctx.fillRect(deck[first_card].sx, deck[first_card].sy, deck[first_card].swidth, deck[first_card].sheight); ctx.fillRect(deck[second_card].sx, deck[second_card].sy, deck[second_card].swidth, deck[second_card].sheight); deck[first_card].sx = -1; deck[second_card].sy = -1; first_card = -1; gg(); } else { deck[first_card].draw(); deck[second_card].draw(); first_card = -1; } }全部代码如下
<!DOCTYPE html> <html> <head> <meta charset="utf-8" /> <title>test </title> <script type="text/javascript" src="./js/jquery.min.js"></script> <script type="text/javascript"> var i=0;//计时用到 var ctx; var canvas; var card;//卡牌 var first_pick = true;//第一次点击的标志 var first_card = -1; var second_card; var back_color = "rgb(255,0,0)";//卡片背面颜色 var table_color = "#FFF"; var deck = [];//卡牌数组 //note var first_x = 50;//初始坐标X var first_y = 10;//初始坐标Y var margin = 30;//卡牌余卡牌之间的间距 var card_width = 100;//卡牌的宽 var card_height = 100;//卡牌的高 //定义卡牌正面图片 var pairs = [["img/1_a.png", "img/1_b.png"],["img/2_a.png", "img/2_b.png"], ["img/3_a.png", "img/3_b.png"], ["img/4_a.png", "img/4_b.png"], ["img/5_a.png", "img/5_b.png"], ["img/6_a.png", "img/6_b.png"], ["img/7_a.png", "img/7_b.png"], ["img/8_a.png", "img/8_b.png"]]; //绘制卡片背面 function draw_back() { ctx.fillStyle = back_color; ctx.fillRect(this.sx, this.sy, this.swidth, this.sheight); } //定义牌的属性:x,y坐标,长宽,背景图片,信息 function Card(sx, sy, swidth, sheight, img, info)//构造函数 { this.sx = sx; this.sy = sy; this.swidth = swidth; this.sheight = sheight; this.info = info; this.img = img; this.draw = draw_back;//绘制了背面 } function make_deck()//生成卡组并绘制 { var i;// var a_card;//a组卡牌容器 var b_card;//b组卡牌容器 var a_pic;//a组卡牌图片 var b_pic;//b组卡牌图片 var cx = first_x;//初始坐标X=50 var cy = first_y;//初始坐标Y=10 for ( i = 0; i < pairs.length/2; i++) { /*Canvas绘制图片 * var c=document.getElementById("myCanvas"); var cxt=c.getContext("2d"); var img=new Image() img.src="flower.png" cxt.drawImage(img,0,0);*/ a_pic = new Image(); a_pic.src = pairs[i][0]; //绘制卡牌a组 a_card = new Card(cx, cy, card_width, card_height, a_pic, i);//给卡牌属性即卡牌对象生成了,并绘制了背面 deck.push(a_card);//将a组卡牌装进数组deck[] //绘制与之a组卡牌面相同的b组 b_pic = new Image(); b_pic.src = pairs[i][1]; b_card = new Card(cx, cy + card_height + margin, card_width, card_height, b_pic, i); deck.push(b_card);// 将b组卡牌装进数组deck[] cx = cx + card_width + margin; //cy = cy + card_height + margin; //note a_card.draw(); b_card.draw(); } //绘制后两排 cx=first_x; cy=first_y+card_height*2+margin*2; for ( i = 4; i < pairs.length; i++) { a_pic = new Image(); a_pic.src = pairs[i][0]; //绘制卡牌a组 a_card = new Card(cx, cy, card_width, card_height, a_pic, i); deck.push(a_card); //绘制与之a组卡牌面相同的b组 b_pic = new Image(); b_pic.src = pairs[i][1]; b_card = new Card(cx, cy + card_height + margin, card_width, card_height, b_pic, i); deck.push(b_card);// cx = cx + card_width + margin; //cy = cy + card_height + margin; //note a_card.draw(); b_card.draw(); } } function shuffle()//洗牌 { var i; var j; var temp_info; var temp_img; var deck_length = deck.length; var k; for ( k = 0; k < 9 * deck_length; k++) { i = Math.floor(Math.random() * deck_length);//0-16 j = Math.floor(Math.random() * deck_length);//0-16 temp_info = deck[i].info;//第1张 temp_img = deck[i].img;//第1张图片 deck[i].info = deck[j].info; deck[i].img = deck[j].img; deck[j].info = temp_info; deck[j].img = temp_img; } } function choose(ev) { //var out; var mx; var my; //var pick1; //var pick2; var i; //note if (ev.layerX || ev.layerX == 0) {// Firefox mx = ev.layerX; my = ev.layerY; } else if (ev.offsetX || ev.offsetX == 0) {// Opera mx = ev.offsetX; my = ev.offsetY; } for ( i = 0; i < deck.length; i++) { card = deck[i]; if (card.sx >= 0)//牌未被消除 { //判断点击的是哪一张牌 if (mx > card.sx && mx < card.sx + card.swidth && my > card.sy && my < card.sy + card.sheight) { if (i != first_card)//如果两次点击同一张牌不做处理 break; } } } if (i < deck.length) { if (first_pick)//如果是第一次点击 { window.addEventListener("load",function(){ var myaudio=document.getElementByIdx_x("a1"); myaudio.volume=0.5;//表示的是播放音量为一半 myaudio.play(); alert("shengyin"); }); first_card = i; first_pick = false; //note ctx.drawImage(card.img, card.sx, card.sy, card.swidth, card.sheight); } else { first_pick = true; //note second_card = i; ctx.drawImage(card.img, card.sx, card.sy, card.swidth, card.sheight); tid = setTimeout(flip_back, 1000); } } } function flip_back() { if (card.info==deck[first_card].info)//配对成功 { ctx.fillStyle = table_color; ctx.fillRect(deck[first_card].sx, deck[first_card].sy, deck[first_card].swidth, deck[first_card].sheight); ctx.fillRect(deck[second_card].sx, deck[second_card].sy, deck[second_card].swidth, deck[second_card].sheight); deck[first_card].sx = -1; deck[second_card].sy = -1; first_card = -1; gg(); } else { deck[first_card].draw(); deck[second_card].draw(); first_card = -1; } } function init() { canvas = document.getElementById('canvas'); canvas.addEventListener('click', choose, false); ctx = canvas.getContext('2d'); make_deck();//生成卡组并绘制 shuffle();//洗牌 } function jishi(){ //alert("----------") i++; //alert(i) document.getElementById("p1").innerHTML=i //alert("----------") if(i>60){ init(); document.getElementById("p1").innerHTML="时间到" } } $(window).ready(function(){ init(); $("#start").click(function(){ setInterval("jishi()", 1000); }); }); </script> </head> <body> <div> <div > <canvas id="canvas" width="600" height="550" style="border: 1px solid;"/> <audio id="a1" src="../music/nvEQ.mp3" ></audio> </div> <button id="start">开始计时</button> <p id="p1">dddddddddddd</p> </div> <section id="game"> <div id="cards"> <div class="card"> <div class="face front"></div> <div class="face back"></div> </div> <!-- .card --> </div> <!-- #cards --> </section> <!-- #game --> <!--<audio id='soundtrack'> <source src='sounds/soundtrack.mp3' type='audio/mp3'> <source src='sounds/soundtrack.ogg' type='audio/ogg'> </audio> <audio id='chimes-sound' > <source src='sounds/chimes.mp3' type='audio/mp3'> <source src='sounds/chimes.ogg' type='audio/ogg'> </audio> <audio id='whistle-down-sound' > <source src='sounds/whistledown.mp3' type='audio/mp3'> <source src='sounds/whistledown.ogg' type='audio/ogg'> </audio> <audio id='thud-sound' > <source src='sounds/thud.mp3' type='audio/mp3'> <source src='sounds/thud.ogg' type='audio/ogg'> </audio> <audio id='jump-sound' > <source src='sounds/jump.mp3' type='audio/mp3'> <source src='sounds/jump.ogg' type='audio/ogg'> </audio> <audio id='plop-sound' > <source src='sounds/plop.mp3' type='audio/mp3'> <source src='sounds/plop.ogg' type='audio/ogg'> </audio> <audio id='coin-sound' > <source src='sounds/coin.mp3' type='audio/mp3'> <source src='sounds/coin.ogg' type='audio/ogg'> </audio> <audio id='explosion-sound' > <source src='sounds/explosion.mp3' type='audio/mp3'> <source src='sounds/explosion.ogg' type='audio/ogg'> </audio> --> </body> </html>大家可以试试,挺有意思的。
原文:http://blog.csdn.net/li_li_lin/article/details/39325093