我的项目 6 js实现翻牌游戏

在我的项目中需要在里面添加一个翻牌游戏,就研究了一下,在这里只实现了基本的效果。不多说,和大家分享一下。

说到翻牌游戏,大致分为以下几个步骤:

绘制正反面卡牌-------------->洗牌----------------------->翻牌------------------->翻牌判断

这里面应用的一些图片,,,,,,额额额额,,,大家就自己下两个试试,这里也提供不了。。。嘿嘿

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();
				}
			}

2.洗牌

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;
				}
			}

3.翻牌判断

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>

大家可以试试,挺有意思的。

时间: 2024-10-10 08:36:02

我的项目 6 js实现翻牌游戏的相关文章

js之翻牌游戏中的一个深刻感悟

先“上菜”: 1 <!DOCTYPE html> 2 <html lang="en"> 3 <head> 4 <meta charset="UTF-8"> 5 <title>记忆方块</title> 6 <script src="randomNum.js"></script> 7 <script src="Card.js"&g

JS贪吃蛇游戏

<!DOCTYPE html><html> <head>    <meta charset="utf-8">    <meta http-equiv="X-UA-Compatible" content="IE=edge">    <title>JS贪吃蛇游戏</title>    <style>    * {        margin: 0;    

项目中js的工具类

js工具类的功能有: 1.去掉字符串前后空格 2.清空select 3.验证手机号 4.字符串转换int型数字 5.获取checkbox的选中的值 6.去掉左边的空白 7.去掉邮编的空白 源码如下: /** * 去掉字符串前后空格 * * @param str * @returns */ function trim(str){ return str.replace(/^(\s|\xA0)+|(\s|\xA0)+$/g, ''); } /** * 清空select * * @param selec

Vue.js实现拼图游戏

Vue.js实现拼图游戏 之前写过一篇<基于Vue.js的表格分页组件>的文章,主要介绍了Vue组件的编写方法,有兴趣的可以访问这里进行阅读:http://www.cnblogs.com/luozhihao/p/5516065.html 前言 为了进一步让大家了解Vue.js的神奇魅力,了解Vue.js的一种以数据为驱动的理念,本文主要利用Vue实现了一个数字拼图游戏,其原理并不是很复杂,效果图如下: demo展示地址为:https://luozhihao.github.io/vue-puzz

JS开发HTML5游戏《神奇的六边形》(四)

近期出现一款魔性的消除类HTML5游戏<神奇的六边形>,今天我们一起来看看如何通过开源免费的青瓷引擎(www.zuoyouxi.com)来实现这款游戏. (点击图片可进入游戏体验) 因内容太多,为方便大家阅读,所以分成四部分来讲解. 本文为第四部分,主要包括: 16.分数往上飘动画 17.形状飞入动画 18.其他动画表现添加 19.游戏结束界面 20. 添加LOGO 21. 渲染优化 若要一次性查看所有文档,也可点击这里. 十六. 分数往上飘的动画 在表现加分时,分数会有个缩放的效果,然后往上

JS经典拼板游戏

原文链接:http://www.guimigame.com/thread-49-1-1.html,对于代码有什么不明白的地方,可以到这里给我发问哦! 效果演示 废话不多说了,直接上代码! <!doctype html> <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> <title>JS重现

JAVA记忆翻牌游戏制作

游戏功能需求说明 代码编写 1 框架搭建 2 主要技术难点 21 图片面板对应的图片索引获取 22 图片面板 3 完整代码 游戏截图 1启动后界面 2开始游戏界面 3游戏结束界面 1 游戏功能需求说明 该游戏主要模拟常见的翻牌游戏,即找到所有两两相同的牌认为游戏成功,主要需求包含: 初始化面板后显示所有图片网格,图片默认显示为背景色: 点击图片后显示图片,再次点击后显示背景: 点击另一张图片,如果与前一张图片相同,则两张图片一直显示,再次点击不会再显示为背景,表示配对成功:如果与前一张图片不同,

Web项目去掉Js文件红叉

项目用到jquery,但将Jquery拷进去后,js文件有个红叉,看上去非常不爽.如下图: 解决方法: 1.找到项目下的.project文件 2.去掉Javascript验证 1 <?xml version="1.0" encoding="UTF-8"?> 2 <projectDescription> 3 <name>Struts2_Jquery_Json</name> 4 <comment></co

原生js canvas 碰撞游戏的开发笔记2

随着碰撞游戏一的开发成功! 我们的ae小伙子也大胆尝试很多新方案h5.. 所以就诞生了下面个比较变态的游戏. 先体验下吧 类似坦克大战 开发的过程异常的艰辛 不过也很好玩 修正了很多一的错误 和改良了一些思路 1. 原先的canvas的_this存在的全局污染 改良后避免了99% 为了获取windowtouch属性 还是有1%的 希望在三修正 2. 所有的递归函数变缓动函数requestAnimationFrame 增强性能 使动画更流畅 3. 数据和图像分离的更彻底 结构更清晰 对象的创建 对