开发工具与关键技术: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