2019年5月

js的一款五子棋算法

这个五子棋算法是从一篇博客上看的,我解决了当五子棋下到两边时,数组越界的问题。

过程:当一方棋子下到棋盘上时,判断左右,上下,左上右下,左下右上 的本方棋子个数,当为5时游戏结束,一方胜出。

	
	function draw_board(){
		var tmp=document.getElementById('canvas1');

		var canva=tmp.getContext('2d');
		canva.clearRect(0,0,600,600);
		
		for(var i=0;i<=15;i++){
		canva.beginPath();
		canva.fillText(i,30+i*30,15);
		canva.moveTo(30+i*30,30);
		canva.lineTo(30+i*30,480);
		canva.stroke();
		if(i!=0){
		canva.fillText(i,0,30+i*30);
		}
		canva.moveTo(30,30+i*30);
		canva.lineTo(480,30+i*30);
		canva.closePath();
		canva.stroke();
	}
	}
	
	
	function start(){
	var over=false;
	var Chessboard=[];//-1 黑,0无,1白
	var chess_num=0;
	var nownow=0;
	document.getElementById('canvas1').setAttribute("height","500px");
	document.getElementById('canvas1').setAttribute("width","500px");
	var tmp=document.getElementById('canvas1');
	
	var canva=tmp.getContext('2d');
	canva.fillStyle="#000";
	
	for(var i=0;i<=15;i++){
		canva.beginPath();
		
		canva.fillText(i,30+i*30,15);
		canva.moveTo(30+i*30,30);
		canva.lineTo(30+i*30,480);
		canva.stroke();
		if(i!=0){
		canva.fillText(i,0,30+i*30);
		}
		canva.moveTo(30,30+i*30);
		canva.lineTo(480,30+i*30);
		canva.closePath();
		canva.stroke();
	}
	
	//初始化棋盘信息,将二维数组所有项全部初始化为0
	for (var i = -1; i <= 16; i++) {
	Chessboard[i]=[];
	for (var j = -1; j <= 16; j++) {
		Chessboard[i][j]=0;
	}
}

	var now_chess=true;
	
	var drawChess=function(i,j){
		
		canva.beginPath();
		canva.arc(30+i*30,30+j*30,13,0,2*Math.PI,true);
		canva.closePath();
		
		if(now_chess){
		canva.fillStyle="#000000";
		}else{
			canva.fillStyle="#fff";
		}
		canva.fill();
		
	}
	
	$('#canvas1').mousemove(function(e){
	// 悬浮事件

		
	});

	tmp.onclick=function(e){
		if(over){
			window.alert("本轮游戏已经结束了,请刷新浏览器重新开始!");
		}else{
		
		var x=e.offsetX;
		var y=e.offsetY;
		console.log(x+"  "+y);
		var i=Math.floor(x/32);
		var j=Math.floor(y/30);
		
		
		if(Chessboard[i][j]===0){
			if(i>=0&&j>=0&&i<=15&&j<=15){
			drawChess(i,j);
			
			chess_num++;
			if(now_chess){ //黑子
				Chessboard[i][j]=-1;
				nownow=-1;
				now_chess=false;//将下一步棋的颜色进行反转
				
			}else{
				Chessboard[i][j]=1;
				nownow=1;
				now_chess=true;//将下一步棋的颜色进行反转
			}
			console.log(nownow);
			//遍历是否赢
			if(chess_num>9){
				var count1=0;
				var count2=0;
				var count3=0;
				var count4=0;
				console.log(chess_num);
				//横向,参考博客 陶伟基
				for(var cc=i;cc>=0;cc--){
					if(Chessboard[cc][j]!=nownow){
						break;
					}
					count1++;
				}//左
				
				for(var dd=i+1;dd<=15;dd++){
					if(Chessboard[dd][j]!=nownow){
						break;
					}
					count1++;
				}//右
				console.log("横向:"+count1);
				
				for(var ee=j;ee>=0;ee--){
					if(Chessboard[i][ee]!=nownow){
						break;
					}
					count2++;
				}//上
				for(var ff=j+1;ff<=15;ff++){
					if(Chessboard[i][ff]!=nownow){
						break;
					}
					count2++;
				}//下
				console.log("竖向:"+count2);
				
			
				for(var gg=i,hh=j;gg>=0,hh>=0;gg--,hh--){
					if(Chessboard[gg][hh]!=nownow){
						break;
					}
					count3++;
					
				}//左上,todo 解决越界问题?
				for(var jj=i+1,kk=j+1;jj<=15,kk<=15;jj++,kk++){
					if(Chessboard[jj][kk]!=nownow){
						break;
					}
					count3++;
				}//右下
				console.log("左上右下:"+count3);
				
				for(var ll=i,mm=j;ll>=0,mm<=15;ll++,mm--){
					if(Chessboard[ll][mm]!=nownow){
						break;
					}
					count4++;
				}
	
							
				for(var nn=i-1,oo=j+1;nn<=15,oo>=0;nn--,oo++){
					if(Chessboard[nn][oo]!=nownow){
						break;
					}
					count4++;
				}
				console.log("右上左下:"+count4);
				
				if(count1>=5||count2>=5||count3>=5||count4>=5){
					if(nownow==-1){
						window.alert("黑棋赢了");
					}else if(nownow==1){
						window.alert("白棋赢了");
						}
					over=true;
				}


				}
			}
			
		}
	}
		}
}

有的地方缩进可能有点问题。写的着急了。

效果可看兰兰想的五子棋网页
https://lanhaoo.club/lab/game_board33.html

使用js ( javascript ) 来计算html表格的中的数字

function test() {
	
	var rows_c =document.getElementById("table1").getElementsByTagName("tr").length;
//找到id为table1的表格

	//alert(rows_c);
//变量na是要跳过第一行的标题
	var na=1;
	var magic_power=[];
	var money=[]
	while(na < rows_c){
		var rows = document.getElementsByTagName("table")[0].rows;
		var now = rows[na];

		var cell = now.cells[1];//money
		//alert(cell.innerHTML)
  		var money_sp = cell.innerHTML.split(" ");

		//alert(money_sp[0])
		if(money_sp[0]=="¥"){
			var cell2 = now.cells[4];//power

			var value = cell.innerHTML;
			var value2 = cell2.innerHTML;


			var hi = parseFloat(money_sp[1]);
			//js tracking https://lanhaoo.club/;
			money.push(hi);
			
			hi=hi/169.02;

		}else if(money_sp[0]=="$"){
			var cell2 = now.cells[4];//power
			var value = cell.innerHTML;
			var value2 = cell2.innerHTML;

			var hi = parseFloat(money_sp[1]);
			//alert(hi);
			hi=hi*6.7;
			hi=hi.toString().substr(0,4);
			cell.innerHTML=cell.innerHTML+'<br><p style='+'"'+'font-size: 10px'+'"'+'>换算¥'+hi+'</p>';
			
			hi= parseFloat(hi);
			money.push();
			hi=hi/169.02;

		}
		hi=hi*100;
		hi=hi.toString().substr(0,5);
		hi=parseFloat(hi);
		magic_power.push(hi);
		cell2.innerHTML="+"+hi+"%";
		//alert(cell.innerHTML);
		//js tracking https://lanhaoo.club/;
		na=na+1;
		
}
var sum = magic_power.reduce(function(a, b) { return a + b; }, 0);
			/*if(sum>=100){
		document.getElementById("ifsuccess").innerHTML="完成";
	}else{
		document.getElementById("ifsuccess").innerHTML="未完成";
	}*/
	sum=sum.toString().substr(0,5);
	document.getElementById("magic_total").innerHTML=sum+"%";

}

具体的效果可以参考本站的捐助界面

代码也已上传github的gist,如果你想从github上收藏一下的话

研究这个主要是因为本站的捐助界面

下面第一个表格中的值原先每个都是我手动输入的

不仅要把金额打入,还要要写美元的换算以及百分比

是一个非常繁琐的过程,而通过Js,就能让我只写入一个捐助数值,其他都可以自动计算出来。

总体思路就是将每个金额都加入数组,最后再把数组整个加起来。

金额在加入数组时会进行美元或人民币的判断,

如果是人民币,直接加入数组,

如果是美元,先换算人民币,再加入数组。

参考韩艺博的博客)) view English version

在nginx配置中插入

ssl on;
ssl_certificate       /path/to/your/certificate.crt;
ssl_certificate_key  /path/to/your/private.key;
ssl_protocols TLSv1 TLSv1.1 TLSv1.2 TLSv1.3;
ssl_ciphers 'TLS13-AES-256-GCM-SHA384:TLS13-CHACHA20-POLY1305-SHA256:TLS13-AES-128-GCM-SHA256:TLS13-AES-128-CCM-8-SHA256:TLS13-AES-128-CCM-SHA256:EECDH+CHACHA20:EECDH+CHACHA20-draft:EECDH+ECDSA+AES128:EECDH+aRSA+AES128:RSA+AES128:EECDH+ECDSA+AES256:EECDH+aRSA+AES256:RSA+AES256:EECDH+ECDSA+3DES:EECDH+aRSA+3DES:RSA+3DES:!MD5;';
ssl_session_cache    shared:SSL:1m;
ssl_session_timeout  5m;
ssl_session_tickets off;
ssl_ecdh_curve X25519:sect571r1:secp521r1:secp384r1;
ssl_prefer_server_ciphers  on;

注意ssl_session_cache等配置不要和vhost中的配置有冲突!