二进制棋盘描述与胜利判断

基础知识

按位与运算符(&)

参加运算的两个数据,按二进制位进行“与”运算。
运算规则:0&0=0;0&1=0;1&0=0;1&1=1;
即:两位同时为“1”,结果才为“1”,否则为0
例如:
3&5即 0000 0011 & 0000 0101 = 0000 0001因此,3&5的值得1。

按位与运算符(|)

参加运算的两个数据,按二进制位进行“或”运算。
运算规则:1|1=1;1|0=1;0|1=1;0|0=0;
即:只要对应的二个二进位有一个为1时,结果位就为1
例如:
9|5可写算式如下: 00001001|00000101 00001101 (十进制为13)可见9|5=13

实现思路

棋盘描述

以BingoCard为例:
这里写图片描述
棋盘上共25个格子,抛弃free还有24个,即将每个格子定义下标0~23;

格子下标十进制二进制
02^0000000000000000000000001
12^1000000000000000000000010
………………
222^22010000000000000000000000
232^23100000000000000000000000

由上表易见,格子[i]转换为2^i的二进制,就是第(i+1)位上是1,那么假如我格子[0]和格子[1]同时被使用了,用二进制如何表示?

2^0|2^1=000000000000000000000011

通过或运算,实现了每使用一个格子就把对应位上的数字变成1,如此就可以用二进制描述棋盘了。

胜利判断

假如胜利条件为格子[0]和格子[1]同时被使用,当前棋盘上格子[0]、格子[1]、格子[22]与格子[23]都被使用了,我们该如何判定胜利呢?

先将胜利条件描述出来:

2^0|2^1=000000000000000000000011

再将战场情况描述出来

2^0|2^1|2^22|2^23=110000000000000000000011

与运算

 110000000000000000000011
&000000000000000000000011
=000000000000000000000011

可见,如果战场描述中存在胜利情况,将胜利情况与当前战场与运算,就会返回胜利情况,所以,我们只需要将战场描述和胜利情况进行与运算,如果返回胜利情况,那就是胜利了。

JavaScript代码

function checkWin(){
	var winningOption = -1;
	var setSqares=0;
	var winners= new Array(31,992,15360,507904,541729,557328,1083458,2162820,4329736,8519745,8659472,16252928);
	for(var i=0;i<24;i++)
	{
		var currSquare = "square"+i
		thisSquare=document.getElementById(currSquare);
		if(thisSquare.className!=""){
			thisSquare.className=="pickedBG";
			setSqares=setSqares|Math.pow(2,i);
		}
		
	}
	for(var i=0;i<winners.length;i++)
	{
		if((winners[i]&setSqares)==winners[i]){
			document.getElementById("winnertip").innerHTML = "YOU WIN";
			break;
		}
	}

}

实例:
BingoCard:http://logicforeach.net/bingocard/index.html

思路源于JavaScript基础教程(第九版)

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值