JavaScript实现炸金花

下面的代码是用Java Script实现炸金花的功能,目前基本所有牌大小的比较都已经实现了,目前没有花色比较的功能

  • 9♠|8♠|3♠
  • 9♣|8♣|3♣

这个我就会默认取前面是最大的,除此之外其他的比较应该都已经实现了(我不确定有没有考虑到所有的情况,有发现问题欢迎指出)。

代码运行出来的结果如下:

根据老师提供的思路做了对应的修改,具体的代码如下,代码里面也做了比较详细备注,仅供参考,发现问题也欢迎指出,有什么问题也欢迎随时提问,谢谢。

<html>
<head>
	<title>Poker Game</title>
</head>
<body>
	<script type="text/javascript">

	//随机排序
	function randomsort(a, b) {
		return Math.random()>0.5 ? -1 : 1;
    	//用Math.random()函数生成0~1之间的随机数与0.5比较,返回-1或1
	}

	//生成有序的扑克牌并打乱顺序
	function getPorker(){
		var poker = [];  //打乱后的扑克牌
		var orgPoker = []; //原始有序的扑克牌
		var num = [2,3,4,5,6,7,8,9,10,11,12,13,14];
		var color = ["♠","❤","♣","♦"];
		//生成有序的扑克牌
		for (var i = 0; i < num.length; i++) {
			for (var j = 0; j < color.length; j++) {
				orgPoker.push(num[i] + color[j]);
			}
		}
		//将有序的扑克牌打乱,生成新的无序的扑克牌
		poker = orgPoker.sort(randomsort);
		//返回被打乱的扑克牌
		return poker;
	}

	//console.log(getPorker());

	//发牌,传进两个参数,玩家数量和洗好的牌,返回所有玩家的从打到小排序的手牌
	function deal (playerNum,poker) {
		var handPokers = []; //所有玩家的手牌的数组
		for (var i = 0; i < playerNum; i++) {
			var handPoker = [];  //单个玩家的手牌
			handPoker.push(poker[i], poker[i + playerNum], poker[i + (2*playerNum)]);
			//讲单个玩家的手牌按照降序排列,然后放到所有玩家手牌的数组里面
			handPokers.push(handPoker.sort(function(a,b) {
				return b.slice(0, b.length - 1) - a.slice(0, a.length - 1);
			}));
		}
		//返回所有玩家的手牌
		return handPokers;
	}

	//获取扑克牌的点数
	function getNum (str) {
		if (str.length == 2 || str.length == 3) {
			return str.slice(0, str.length - 1);
		}
		else {
			alert("扑克牌格式错误!");
		}
	}

	//获取扑克牌的花色
	function getColor (str) {
		if (str.length == 2 || str.length == 3) {
			return str.slice(-1);
		}
		else {
			alert("扑克牌格式错误!");
		}
	}
	//给玩家的手牌进行打分
	/*
	豹子:100000000000000
	顺金:1000000000000
	金花:10000000000
	顺子:100000000
	对子:1000000
	单牌:10000
	*/
	function points (playerPokers) {
		var playerPoker1 = playerPokers[0];
		var playerPoker2 = playerPokers[1];
		var playerPoker3 = playerPokers[2];
		if ((getNum(playerPoker1) == getNum(playerPoker2)) && (getNum(playerPoker2) == getNum(playerPoker3))) {
			//豹子
			return 100000000000000 * getNum(playerPoker1);
		}
		else if ((getNum(playerPoker1) - getNum(playerPoker2) == 1) && (getNum(playerPoker2) - getNum(playerPoker3) == 1)) {
			//首先肯定是个顺子
			if ((getColor(playerPoker1) == getColor(playerPoker2)) && (getColor(playerPoker2) == getColor(playerPoker1))) {
				//顺金
				return 1000000000000 * getNum(playerPoker1);
			}
			else {
				//普通顺子
				return 100000000 * getNum(playerPoker1);
			}
		}
		else if ((getColor(playerPoker1) == getColor(playerPoker2)) && (getColor(playerPoker2) == getColor(playerPoker3))) {
			//金花
			return 10000000000 * getNum(playerPoker1) + 100000000 * getNum(playerPoker2) + 1000000 * getNum(playerPoker3);
		}
		else if ((getNum(playerPoker1) == getNum(playerPoker2)) || (getNum(playerPoker2) == getNum(playerPoker1))) {
			//顺子
			if (getNum(playerPoker1) == getNum(playerPoker2)) {
				return 1000000 * getNum(playerPoker2) + 10000 * getNum(playerPoker3);
			}
			else {
				return 1000000 * getNum(playerPoker2) + 10000 * getNum(playerPoker1);
			}
		}
		else {
			return 10000 * getNum(playerPoker1) + 100 * getNum(playerPoker2) + 1 * getNum(playerPoker3);
		}
	}


	//比较手牌的分数的大小
	function comparePoints (handPokers) {
		var allPoints = []; //所有玩家手牌的分数数组
		//遍历循环每个玩家的手牌
		for (var i = 0; i < handPokers.length; i++) {
			//调用points方法来计算玩家手牌的得分
			allPoints.push(points(handPokers[i]));
		}
		//求出哪个玩家的手牌得分最高
		var maxPoints = allPoints[0]
		for (var j = 0; j < allPoints.length; j++) {
			maxPoints = maxPoints > allPoints[j] ? maxPoints : allPoints[j];
		}
		// console.log(maxPoints);
		// 返回得分最高的玩家
		return allPoints.indexOf(maxPoints) + 1;
	}

	//生成最后需要输出的内容
	function mesPrint (winner,newHandPokers) {
		var alertMes = "";
		for (var i = 0; i < newHandPokers.length; i++) {
			alertMes = alertMes + "玩家" + (i + 1) + "的手牌为:" + newHandPokers[i] + "\n";
		}
		alertMes = alertMes + "---------------------------------------\n玩家" + winner + "的手牌最大,手牌为:" + newHandPokers[winner - 1] + "\n";
		return alertMes;
	}

	//扑克牌格式转换
	/*
	11 ---> J
	12 ---> Q
	13 ---> K
	14 ---> A
	*/
	function convertPoker (handPokers) {
		for (var i = 0; i < handPokers.length; i++) {
			for (var j = 0; j < handPokers[i].length; j++) {
				handPokers[i][j] = handPokers[i][j].replace("11", "J").replace("12", "Q").replace("13", "K").replace("14", "A");
			}
		}
		return handPokers;
	}

	//定义玩家的数量
	var playerNum = 6;
	//调用getPorker方法,获取一副被打乱的扑克牌
	var poker = getPorker();
	//调用deal方法,给每个玩家发牌,获取所有玩家的手牌
	var handPokers = deal(playerNum,poker);
	//调用comparePoints方法,比较出手牌得分最高的玩家,获取到手牌得分最高的玩家
	var winner = comparePoints(handPokers);
	//调用convertPoker方法,将扑克牌格式转换
	/*
	11 ---> J
	12 ---> Q
	13 ---> K
	14 ---> A
	*/
	var newHandPokers = convertPoker(handPokers);
	//调用mesPrint方法,获取我们需要在浏览器弹框上输出的内容
	alert(mesPrint(winner,newHandPokers));


	</script>

</body>
</html>

 

  • 6
    点赞
  • 26
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值