在好例子网,分享、交流、成长!
您当前所在位置:首页js 开发实例Ajax框架/RIA → js实现纸牌游戏源码

js实现纸牌游戏源码

Ajax框架/RIA

下载此实例
  • 开发语言:js
  • 实例大小:0.73M
  • 下载次数:29
  • 浏览次数:261
  • 发布时间:2019-03-21
  • 实例类别:Ajax框架/RIA
  • 发 布 人:crazycode
  • 文件格式:.rar
  • 所需积分:2
 相关标签: 游戏 js 纸牌 源码

实例介绍

【实例简介】

【实例截图】

from clipboard

【核心代码】

<!DOCTYPE html>
<html>
	<head>
		<meta charset="utf-8">
		<title></title>
		<style>
			body {
				margin: 0;
				padding: 0;
				background: url(img/bg.png);
			}

			#main {
				width: 100%;
				height: 100%;
			}

			.nav {
				width: 100%;
				height: 200px;
				display: flex;
				justify-content: space-around;
				align-items: center;
			}

			#allPoker,
			#fourPokers {
				display: flex;
				justify-content: space-around;
				align-items: center;
			}

			#fourPokers div,
			#sevenPokers div,
			#allPoker div {
				width: 105px;
				height: 150px;
				margin: 0 20px;
				box-sizing: border-box;
				border: 2px solid rgba(255, 255, 255, 0.6);
				border-radius: 5px;
				cursor: pointer;
				position: relative;
			}

			#fourPokers div img,
			#sevenPokers div img,
			#allPoker div img {
				position: relative;
				border-radius: 5px;
			}

			#allPoker div:nth-child(1).active:after {
				content: "";
				width: 105px;
				height: 150px;
				position: absolute;
				left: 0;
				top: 0;
				background: url(img/01.png);
			}

			#sevenPokers {
				display: flex;
				justify-content: space-around;
				align-items: center;
			}

			#fourPokers div img,
			#sevenPokers div img,
			#allPoker div img {
				position: absolute;
				left: 0;
				top: 0;
			}
		</style>
	</head>
	<body>
		<div id="main">
			<!-- 顶部牌堆 -->
			<div class="nav">
				<!-- 左侧牌堆 -->
				<div id="allPoker">
					<div class="active"></div>
					<div></div>
				</div>
				<!-- 右侧4个牌堆 -->
				<div id="fourPokers">
					<div></div>
					<div></div>
					<div></div>
					<div></div>
				</div>
			</div>
			<!-- 底部 7个牌堆-->
			<div id="sevenPokers">
				<div></div>
				<div></div>
				<div></div>
				<div></div>
				<div></div>
				<div></div>
				<div></div>
			</div>
		</div>

		<script>
			// 循环遍历将poker图片添加到数组中
			var pokersList = [];
			var flower = 0;
			for (var i = 1; i <= 52; i  ) {
				var poker = new Image();
				poker.src = "img/"   i   ".jpg"
				poker.setAttribute("data-i",i-flower*13); //保存扑克的值
				poker.setAttribute("data-flower",flower); //保存扑克的花色
				pokersList.push(poker);
				if(i%13==0){flower  }
			}

			console.log(pokersList);

			//随机生成长度为52的数组 保存下标,0~51;
			var pokerObjI = [];
			for (var i = 0; pokerObjI.length < 52; i  ) {
				var num = Math.floor(Math.random() * 52);
				var isRepeat = false;
				for (var item of pokerObjI) {
					if (item == num) {
						isRepeat = true;
					}
				}
				if (!isRepeat) {
					pokerObjI.push(num);
				}
			}

			// -----------------向所有牌堆中添加扑克-----------------
			// 创建全局变量 pokerNum 来保存以添加过的最后一个下标
			var pokerNum = 0;
			// 获取牌堆对象
			var allPoker = document.getElementById('allPoker').children[0];
			// 向牌堆中插入24张扑克
			for (var i = 0; i < 24; i  ) {
				allPoker.appendChild(pokersList[pokerObjI[i]]);
				pokerNum  ; //同时样poker的下标增加
			}
			// 向下方7个牌堆中分别保存 1,2,3,4,5,6,7张扑克(共28张)
			// 获取7个牌堆对象
			var sevenObj = document.getElementById('sevenPokers').children;
			// console.log(sevenObj)
			// 循环向牌堆中添加扑克
			for (var i = 1; i <= 7; i  ) {
				for (var j = 1; j <= i; j  ) {
					sevenObj[i - 1].appendChild(pokersList[pokerObjI[pokerNum]]);
					pokerNum  ;
				}
			}

			// ----------------为下方7个牌堆添加层叠样式-----------------
			// 给除最后一张扑克外添加active样式
			function addClass(){
				for (var item of sevenObj) {
					var items = item.children;
					try{
						for(var j of items){
							var src = j.getAttribute("data-src");
							if(src !==null){j.src = src;j.removeAttribute("data-src")};
						}
					}catch(e){
						//TODO handle the exception
					}
					if (items.length > 1) {
						for (var i = items.length - 2; i >= 0; i--) {
							items[i].setAttribute("data-src", items[i].src);
							items[i].src = "img/01.png";
						}
					}
				}	
			}
			
			// 判断7个牌堆中如果有最后一个扑克均为背面,则让最后一个变为正面,
			// 如果最后一个为正面,则什么都不改变
			function changeClass(){
				for (var item of sevenObj){
					var lastItem = item.children[item.children.length-1];
					var penultimate = item.children[item.children.length-2];
					if(item.children.length>0){
						if(penultimate==undefined){
							if(lastItem.dataset.src!=null){
								console.log(lastItem);
								console.log(lastItem.src);
								console.log(lastItem.dataset.src);
								lastItem.src = lastItem.dataset.src;
							}
						}else if(penultimate.src == lastItem.src){
							// 如果倒数第二个扑克和倒数第一个扑克src相等,让最后一个变为正面
							lastItem.src = lastItem.dataset.src;
						}
					}
				}
			}
			
			// 给扑克添加上外边距 让他们分开
			function addMarginTop() {
				for (var item of sevenObj) {
					var items = item.children;
					for(var i of items){
						i.removeAttribute("style");
					}
					if (items.length > 1) {
						for (var i = 1; i < items.length; i  ) {
							items[i].style.marginTop = i * 30   "px";
						}
					}
				}
			}
			
			
			addClass();
			addMarginTop();

			// ----------在所有扑克分发结束后绑定事件----------

			//为牌堆中poker绑定点击事件 [点击显示一张,全部显示完后再次点击让所有牌回到牌堆]
			// 1.获取到所有牌堆中的扑克
			var AllpokerObj = allPoker.getElementsByTagName('img');
			// 2.获取牌堆展示的div
			var AllpokerDiv = allPoker.nextElementSibling;
			// 创建变量保存被拖动的扑克和展示区域当前已添加的扑克数
			var thisPoker, pakerListNum;
			// 创建变量保存当前被拖动扑克的花色和值
			var thisI,thisFlower;
			// 为牌堆添加点击事件
			allPoker.onclick = function() {
				// 将展示区域的所有扑克保存在list中
				var pokerList = AllpokerDiv.getElementsByTagName('img');
				// 创建变量保存展示区域扑克个数
				pakerListNum = pokerList.length;
				// console.log(pokerList);
				if (AllpokerObj.length > 0) {
					AllpokerDiv.appendChild(AllpokerObj[AllpokerObj.length - 1]); //将最后一张扑克(最上方的),移动到展示区域
					if (AllpokerObj.length == 0) {
						allPoker.classList.remove('active')
					} //如果牌堆没有扑克了,去掉active样式(取消扑克背面样式)
				} else {
					allPoker.classList.add('active') //为牌堆添加active样式
					for (var i = pakerListNum - 1; i >= 0; i--) {
						allPoker.appendChild(pokerList[i]); //循环遍历将展示区域扑克添加到牌堆中
					}
				}
				// console.log(pakerListNum);

				// 为牌堆展示框中所有扑克绑定拖动事件  写在点击事件里,每次点击都更新
				// 创建变量保存鼠标位置
				var left, top;
				for (item of pokerList) {

					item.ondragstart = function(e) {
						console.log("拖动开始")
						thisPoker = this;
						thisI = this.dataset.i;
						thisFlower = this.dataset.flower;
						//保存当前鼠标在扑克上的位置
						left = e.clientX - this.offsetLeft;
						top = e.clientY - this.offsetTop;
					}
					item.ondrag = function(e) {
						// console.log("拖动ing~")
						// 设置当前扑克的位置
						//this.style.position = "fixed"
						this.style.top = e.clientY - top   "px";
						this.style.left = e.clientX - left   "px";
					}
					item.ondragend = function() {
						console.log("拖动结束")
						// 移除之前添加的样式
						this.removeAttribute("style")
					}
				}
			}
			// 为7个牌堆的最后一个扑克添加拖动事件
			function addDrag(){
				for (var item of sevenObj) {
					var list = item.children[item.children.length - 1];
					var left,op,style;
					if(list){
						list.ondragstart = function(e) {
							console.log("拖动开始")
							thisPoker = this;
							thisI = this.dataset.i;
							thisFlower = this.dataset.flower;
							//保存当前鼠标在扑克上的位置
						}
						list.ondrag = function(e) {
						}
						list.ondragend = function() {
							console.log("拖动结束")
							// 移除之前添加的样式
							//this.removeAttribute("style");
							//this.setAttribute("style",style);
						}
					}
					
				}		
			}
			addDrag();
			// 为4个牌堆添加拖动释放事件
			// 获取4个牌堆
			var fourPokers = document.getElementById('fourPokers').children;
			for (var item of fourPokers) {
				item.ondragenter = function() {
					console.log("拖动进入")
				}
				item.ondragover = function(e) {
					e.preventDefault();
					console.log("拖动悬停")
				}
				item.ondragleave = function() {
					console.log("拖动离开")
				}
				item.ondrop = function() {
					console.log(this.children.length)
					// 当本牌堆里没有扑克时,只可放入A,即thisI为1的扑克
					if(this.children.length==0){
						// 判断当前拖动的扑克的值不等于1则停止运行 return
						if(thisI != 1){
							console.log("只可放入A");
							return;
						}
					}else{ // 当牌堆中有扑克时,先判断当前拖动扑克的值和花色,如果与牌堆中的花色不同and值不大于最后一个扑克1时,停止运行
						// 获取当前牌堆的data-i和data-flower
						var itemI = parseInt(this.dataset.i);
						var itemFlower = this.dataset.flower;
						if(thisFlower != itemFlower || (thisI - itemI) != 1){
							console.log("仅可放入同花色且值仅能比当前值大1")
							return;
						}
					}
					
					console.log("拖动释放")
					console.log(thisPoker);
					console.log(thisI);
					console.log(thisFlower);
					console.log(this);
					this.appendChild(thisPoker);
					this.setAttribute("data-i",thisI);
					this.setAttribute("data-flower",thisFlower);
					for(var i of this.children){
						i.removeAttribute("style");
					}
					addDrag();
					changeClass();
					// pakerListNum--;
				}
			}
			
			// 为下方7个牌堆添加拖动释放事件
			for(var item of sevenObj){
				item.ondragenter = function() {
					console.log("拖动进入")
				}
				item.ondragover = function(e) {
					e.preventDefault();
					console.log("拖动悬停")
				}
				item.ondragleave = function() {
					console.log("拖动离开")
				}
				item.ondrop = function() {
					console.log(this.children.length)
					if(this.children.length==0){
						// 当本牌堆里没有扑克时,只可放入K,即thisI为13的扑克
						// 判断当前拖动的扑克的值不等于1则停止运行 return
						if(thisI != 13){
							console.log("只可放入K");
							return;
						}
					}else{
						var thisItem = this.children[this.children.length-1];
						var itemI = parseInt(thisItem.dataset.i);
						var itemFlower = parseInt(thisItem.dataset.flower);
						if(thisFlower%2 == itemFlower%2 || itemI - thisI !=1){
							console.log("只能放置不同的花色,并且值执行相差1")
							return;
						}
					}
					console.log("拖动释放");
					this.appendChild(thisPoker)
					for(var i of this.children){
						i.removeAttribute("style");
					}
					addDrag();
					addMarginTop();
					changeClass();
					// pakerListNum--;
				}
			}
		</script>
	</body>
</html>

标签: 游戏 js 纸牌 源码

实例下载地址

js实现纸牌游戏源码

不能下载?内容有错? 点击这里报错 + 投诉 + 提问

好例子网口号:伸出你的我的手 — 分享

网友评论

发表评论

(您的评论需要经过审核才能显示)

查看所有0条评论>>

小贴士

感谢您为本站写下的评论,您的评论对其它用户来说具有重要的参考价值,所以请认真填写。

  • 类似“顶”、“沙发”之类没有营养的文字,对勤劳贡献的楼主来说是令人沮丧的反馈信息。
  • 相信您也不想看到一排文字/表情墙,所以请不要反馈意义不大的重复字符,也请尽量不要纯表情的回复。
  • 提问之前请再仔细看一遍楼主的说明,或许是您遗漏了。
  • 请勿到处挖坑绊人、招贴广告。既占空间让人厌烦,又没人会搭理,于人于己都无利。

关于好例子网

本站旨在为广大IT学习爱好者提供一个非营利性互相学习交流分享平台。本站所有资源都可以被免费获取学习研究。本站资源来自网友分享,对搜索内容的合法性不具有预见性、识别性、控制性,仅供学习研究,请务必在下载后24小时内给予删除,不得用于其他任何用途,否则后果自负。基于互联网的特殊性,平台无法对用户传输的作品、信息、内容的权属或合法性、安全性、合规性、真实性、科学性、完整权、有效性等进行实质审查;无论平台是否已进行审查,用户均应自行承担因其传输的作品、信息、内容而可能或已经产生的侵权或权属纠纷等法律责任。本站所有资源不代表本站的观点或立场,基于网友分享,根据中国法律《信息网络传播权保护条例》第二十二与二十三条之规定,若资源存在侵权或相关问题请联系本站客服人员,点此联系我们。关于更多版权及免责申明参见 版权及免责申明

;
报警