基本信息
源码名称:js实现纸牌游戏源码
源码大小:0.73M
文件格式:.rar
开发语言:js
更新时间:2019-03-21
   友情提示:(无需注册或充值,赞助后即可获取资源下载链接)

     嘿,亲!知识可是无价之宝呢,但咱这精心整理的资料也耗费了不少心血呀。小小地破费一下,绝对物超所值哦!如有下载和支付问题,请联系我们QQ(微信同号):813200300

本次赞助数额为: 2 元 
   源码介绍

<!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>