JAVA五子棋人机之战

开发工具与关键技术:DW Java
作者:陈芝番
撰写时间:2019.10.7

显示初始棋盘:棋盘是正方形的,那么就得有行和列,当然行和列是相同的,因此我们首先得定义一个用于 (存储棋盘规格大小的值:450*450) ,有了这个值之后,我们就能绘制初始棋盘了效果图如下:
五子棋布局// 绘制棋盘

function drawBoard(){
ctx.strokeStyle="#bbbbbb"
for(var i=0;i<rows;i++){
ctx.moveTo(offset,offset+size*i);
ctx.lineTo(size*rows-offset,offset+size*i);
ctx.stroke();
ctx.moveTo(size*i+offset,offset);
ctx.lineTo(size*i+offset,size*rows-offset);
ctx.stroke();
}
}
  • 黑方与白方下棋:判断当前位置是否为白方或黑方下的棋子即可,然后对白方与
  • 黑方下的棋子分别保存。绘制棋盘时,只需在内部循环,判断当前位置是否存在 两个相同的值的数组,有就打印对应的图形,没还是默认的图形。
// 绘制棋子
function drawChess(x,y,player){
			x = offset +size*x;
			y = offset +size*y;
			var grd = ctx.createRadialGradient(x,y,size/2-2,x,y,0);
			if(player == '黑'){
				grd.addColorStop(0,'#0a0a0a');
				grd.addColorStop(1,'#636766');
			}else{
				grd.addColorStop(0,'#d1d1d1');
				grd.addColorStop(1,'#f9f9f9');
			}
			ctx.beginPath();
			ctx.fillStyle=grd;
			ctx.arc(x,y,size/2-1,0,Math.PI*2,true);
			ctx.fill();
		}
		
		function dropChess(x,y){
			if(over)
				return;
			if(chess[x][y]!=null)
				return;
			drawChess(x,y,player);
			chess[x][y]=player;
			checkWin(x,y,player);
			player = (player=='黑'?'白':'黑');
			if(player == '白'){
				var xy = AIChess();
				dropChess(xy[0],xy[1]);
			}
		}

		function checkWin(x,y,player){
			for( var i= 0;i<wins.length;i++){
				if(wins[i].indexOf(x+'_'+y)==-1)
					continue;
				var count = 0;
				for( var j= 0;j<wins[i].length;j++){
					var xy = wins[i][j].split('_');
					if(chess[xy[0]][xy[1]]==player) 
						count++;
				}
				if(count == 5){
					over = true;
					alert(player+"方赢!");
					return;
				}
			}
		}

		function initWin(){
			for(var x= 0;x <rows ;x++){
				for(var y= 0;y < rows-4; y++){
					var im = [];
					for(var k = 0; k<5;k++){
						im.push(x+'_'+(y+k));
					}
					wins.push(im);
				}
			}
			for(var y= 0;y <rows ;y++){
				for(var x= 0;x < rows-4; x++){
					var im = [];
					for(var k = 0; k<5;k++){
						im.push((x+k)+'_'+y);
					}
					wins.push(im);
				}
			}

			for(var x= 0;x <rows-4 ;x++){
				for(var y= 0;y < rows-4; y++){
					var im = [];
					for(var k = 0; k<5;k++){
						im.push((x+k)+'_'+(y+k));
					}
					wins.push(im);
				}
			}

			for(var x= rows-1;x>=4 ;x--){
				for(var y= 0;y < rows-4; y++){
					var im = [];
					for(var k = 0; k<5;k++){
						im.push((x-k)+'_'+(y+k));

					}
					wins.push(im);
				}
			}
		}

人类与人机对战从判断输赢这个程序 :判断输赢是最困难的一步
从当前位置向四周查找:
判断 当前位置 和 当前位置的左边 以及 右边 的棋子相连总数(横向查找);
判断 当前位置 和 当前位置的上边 以及 下边 的棋子相连总数(纵向查找);
判断 当前位置 和 当前位置的左上 以及 右下 的棋子相连总数(左上斜右下查找);
判断 当前位置 和 当前位置的左下 以及 右上 的棋子相连总数(左下斜右上查找);
// 计算落子的位置

function getScore(x,y,player){
			var score = 0;
			// 遍历赢法
			for(var i=0;i<wins.length;i++){
				if(wins[i].indexOf(x+'_'+y)==-1)
					continue;
				//给每个赢法一个初始分数10分
				var mscore = 10;
				for(var j = 0;j<wins[i].length;j++){
					var xy = wins[i][j].split('_');
					// 如果存在对方棋子,分数记为0分
					if(chess[xy[0]][xy[1]]!=null && chess[xy[0]][xy[1]]!=player){
						mscore = 0;
						break;
					}

					// 如果全是己方棋子,每加一个子,分数翻三倍
					if(chess[xy[0]][xy[1]] == player){
						mscore =mscore*3;
					}
}
// 累计每种赢法的总分,总分越大说明位置也有利
				score = score+mscore;
			}
			return score;
	}

总结:当然还有一种做法:可以从全局方位来查找,选择哪一种做法都可以。通过评分,得出各自的得分,就可以判断出占分高,占优势。
链接下载:https://download.csdn.net/download/qq_44554890/11839756

  • 3
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值