if (chessArr[i][j] == 0) {
drawChess(i, j, me);
if (me) {
chessArr[i][j] = 1;
} else {
chessArr[i][j] = 2;
}
me = !me;
for (var k = 0; k < count; k++) {
if (wins[i][j][k]) {
if(chessArr[i][j] == 1 ){ //这个表示我方赢了
myWin[k]++;
computerWin[k] = 6;
if (myWin[k] == 5) {
window.alert("you win !!!");
over = true;
}
}else{
myWin[k] = 6;
computerWin[k] ++ ;
if (computerWin[k] == 5) {
window.alert("计算机赢了");
over = true;
}
}
}
}
}
我知道啦,
if (myWin[k] == 5) {
setTimeout(function(){
window.alert("你赢了");
},0);
over = true;
}
这样就可以了
自己写一个上下遍历的over判断是否结束游戏的方法
..我知道了
for(var i= 0;i<15;i++){ for(var j = 0;j<11;j++){ for(var k =0;k<5;k++){ wins[j+k][i][count] = true; } count ++; } }
这些循环我都把k < 4 了
有意义
for(var i=0;i<15;i++){
myScore[i]=0;
computerScore[i]=0;
for(var j=0;j<15;j++){
myScore[i][j]=0;
computerScore[i][j]=0;
}
}
这块儿:
myScore[i]=0;
computerScore[i]=0;
应该是:
myScore[i]=[];
computerScore[i]=[];
初始化一个二维数组。
已改好 建议多写 多练
var chessBoard = [];
var me = true;
var over = false;
var count = 0;
//赢法数组
var wins = [];
//赢法的统计数组
var myWin = [];//统计我方的
var computerWin = [];//统计计算机的
for (var i = 0; i < 15; i++) {
chessBoard[i] = [];
for (var j = 0; j < 15; j++) {
chessBoard[i][j] = 0;
}
}
for (var i = 0; i < 15; i++) {
wins[i] = [];
for (var j = 0; j < 15; j++) {
wins[i][j] = [];
}
}
for (var i = 0; i < 15; i++) {
for (var j = 0; j < 11; j++) {
for (var k = 0; k < 5; k++) {
wins[j + k][i][count] = true;
}
count++;
}
}
for (var i = 0; i < 15; i++) {
for (var j = 0; j < 11; j++) {
for (var k = 0; k < 5; k++) {
wins[i][j + k][count] = true;
}
count++;
}
}
for (var i = 0; i < 11; i++) {
for (var j = 14; j > 3; j--) {
for (var k = 0; k < 5; k++) {
wins[i + k][j - k][count] = true;
}
count++;
}
}
for (var i = 0; i < 11; i++) {
for (var j = 0; j < 11; j++) {
for (var k = 0; k < 5; k++) {
wins[i + k][j + k][count] = true;
}
count++;
}
}
console.log(count);
//初始化为0
for (var i = 0; i < count; i++) {
myWin[i] = 0;
computerWin[i] = 0;
}
var chess = document.getElementById('chess');
var ctx = chess.getContext('2d');
/*..............................棋盘的画法..................*/
for (var i = 0; i < 15; i++) {
ctx.beginPath();
ctx.moveTo(15 + i * 30, 15);
ctx.lineTo(15 + i * 30, 435);
ctx.stroke();
ctx.beginPath();
ctx.moveTo(15, 15 + i * 30);
ctx.lineTo(435, 15 + i * 30);
ctx.stroke();
}
/*..........................棋子的画法..........................*/
var oneStep = function (i, j, me) {
ctx.beginPath();
ctx.arc(15 + i * 30, 15 + j * 30, 13, 0, Math.PI * 2, true);
ctx.closePath();
if (me) {
ctx.fillStyle = "black";
ctx.fill();
}
else {
ctx.fillStyle = "white";
ctx.fill();
}
ctx.stroke()
}
/*............................实现落棋..............................*/
chess.onclick = function (e) {
if (over) {
return;
}
var x = e.offsetX;
var y = e.offsetY;
var i = Math.floor(x / 30);
var j = Math.floor(y / 30);
if (chessBoard[i][j] == 0) {
oneStep(i, j, me);
if (me) {
chessBoard[i][j] = 1;
}
else {
chessBoard[i][j] = 2;
}
me = !me;
for (var k = 0; k < count; k++) {
if (wins[i][j][k]) {
myWin[k]++;
computerWin[k] = 6;
if (myWin[k] == 5) {
window.alert("您赢了");
over = true;
}
}
}
}
}
所有的赢法for(var i=0;j<15;i++){中的i写成j了
我看是将分数存到数组里,用来比较的。只要给的分等级不同就行
我是说,后面 有一个 判断语句啊,前面已经全部 是true了,后面的 判断语句有啥意义??
看好这句: for(var k =0 ;.......................)
编辑器啊,sublime
解决了,
me = !me; for (var k=0;k>count;k++) { if (wins[i][j][k]) { myWin[k]++; computerWin[k] = 6; if (myWin[k] == 5) { window.alert("你赢了"); over = true; } } }
这写成大于count了
可以在全局写两个显示alert的函数,并加上setTimeout,然后在需要的地方调用
下面是我的写法
let alertWin = function () { setTimeout(() => { window.alert('恭喜,你赢了!') }, 10) } let alertLose = function () { setTimeout(() => { window.alert("很抱歉,您输了") }, 10) }
调用位置
if (myWin[k] == 5) { over = true alertWin() }
亲测有效
不知道你是否解决了,我和你出现了一样的现象,经过调试后发现是如下原因,供你参考~
假设此时黑子满足的赢法是在第1行的3,4,5,6,7格上(并假设此种赢法是第k=23),那么在判断Mywin[23]==5时,Mywin[22]和Mywin[24]是为4的(因为旁边两种赢法也满足了4颗棋子)。判断结束后,循环继续k增加,所以Mywin[24]也会满足等于5的条件,于是会再次弹出~
解决办法:在Mywin[k]==5判断的最后加上return;,即停止循环。
alter改成alert
over是做了一个标记,是否已经赢了,如果已经赢了,over=true;
这段代码是在“棋盘onclick”中写的,如果这里直接return (什么都不写就是return false),意思就是点击了棋盘也不落子了。
不知道你问的是不是这个
你只要再建立一个判断落子是黑色还是白色的机制就可以了,比如我是这样写的
var judgement=function(x,y,color){ //judgement函数判断游戏是否结束,color 判断落子颜色
for(var i=0;i<counter;i++){
if(win[x][y][i]){ //点(x,y)处有赢法
if(color==1){ //判断落子为黑色的情况
userWin[i]++;//黑色落子累加器
if(userWin[i]==5){ //黑色落子在某种赢法中达到5个则执行以下语句
window.alert("黑子胜利!");
document.getElementById("text").innerHTML="游戏结束";
document.getElementById("end").style.visibility="visible";
over=true;
}
}
if(color==2){ //判断落子为白色的情况
pcWin[i]++; //白色落子累加器
if(pcWin[i]==5){//白色落子在某种赢法中达到5个则执行以下语句
window.alert("白子胜利!");
document.getElementById("text").innerHTML="游戏结束";
document.getElementById("end").style.visibility="visible";
over=true;
}
}
}
}
}
...
...
chess.onclick=function(e){
if(over){
return ;
}
var x=Math.floor(e.offsetX/30);
var y=Math.floor(e.offsetY/30);
if(chessBoard[x][y]==0){
oneStep(x,y,me);
if(me){
chessBoard[x][y]=1;
}
else{
chessBoard[x][y]=2;
}
judgement(x,y,chessBoard[x][y]); //调用judgement函数
me=!me;
}
}
<!--希望能帮到你-->
第79行i<15
数组初始化错误。
代码本身没有错误,之所以出现这个现象是因为到目前为止,白棋的落子也在onclick进行,这里没做特殊处理,所以白棋的落子也被统计在myWin这个赢法统计数组当中啦。所以你看看,是不是不分黑棋白棋,只要棋子连上五颗就判断成赢了呢?
在之后,白棋不会在onclick中处理,它的落子会在computerWin中统计,就不会这样啦。