weixin_慕丝4233278
慕勒5135046
把开始的数据的DOM清除一下
ensheart
me先等于false,然后先调用一次computerAI函数
qq_慕用6401962
qq_面朝黄土_0
Cosy_0328
同问,这算AI的一种吗?
慕UI6139813
计算有问题,就会,
qq_慕沐3338836
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;
}
}
}
}
}
qq_慕沐3338836
我知道啦,
if (myWin[k] == 5) {
setTimeout(function(){
window.alert("你赢了");
},0);
over = true;
}
这样就可以了
qq_慕田峪5101710
自己写一个上下遍历的over判断是否结束游戏的方法
qq_阿法狗狗狗_04402230
可以的
1 在 ia 计算得分前 判断 棋盘上是否 有子
如果有
那么就走正常流程
如果没有
就随机挑选一个坐标 就可以了
scj_wcl
..我知道了
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 了
慕圣8509492
那个位置的赢法数组里包含了这两个赢法。计算的时候都进行了加分处理,这个位置的分数最高,肯定被找出来了
Elias丿纯黑
有意义
慕瓜1580735
qq_宸星_0
canvas的原点是在左上角开始,那么i=0的时候,j从0到14,那么就是最上面的一条横线了,[0][0] ,[0][1].... ,[0][14]
qq_我的世界_11
完整代码地址:
https://gitee.com/yanglilong127/ai_manmachine_war_chess
该游戏演示地址:
https://yanglilong127.gitee.io/ai_manmachine_war_chess
qq_永不言弃_27
下一层是k<5,j+k就是边界
该种树啦
最好放点代码或者console的报错出来 这么干说也没法看呀,
话说你可以换个浏览器试试,我之前用chrome 棋子渲染一直不对,换IE就好了
该种树啦
这代码两不多照着写。没问题的。
/**
*
*/
var me = true;
var chessBorad = [];
var over = false;
//赢法数组
var wins = [];
//赢法统计数组
var myWin = [];
var computerWin = [];
for(var i = 0;i < 15;i++){
chessBorad[i] =[];
for(var j = 0;j < 15;j++){
chessBorad[i][j] =0;
}
}
//赢法数组初始化
for(var i = 0;i < 15;i++){
wins[i] =[];
for(var j = 0;j < 15;j++){
wins[i][j] =[];
}
}
var count = 0;
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 < 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 < 11;i++){
for(var j = 0;j < 11;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 = 14;j > 3;j--){
for(var k = 0;k < 5;k++){
wins[i+k][j-k][count]=true;
}
count++;
}
}
for(var i = 0;i<count ;i++){
myWin[i] = 0;
computerWin[i] = 0;
}
var chess = document.getElementById('chess');
var context = chess.getContext('2d');
context.strokeStyle = "#BFBFBF";
var logo = new Image();
logo.src="images/8.jpg";
logo.onload = function(){
context.drawImage(logo,0,0,450,450);
drawChessBoard();
}
var drawChessBoard=function(){
for(var i=0;i<15;i++){
context.moveTo(15+i*30,15);
context.lineTo(15+i*30,435);
context.stroke();
context.moveTo(15,15+i*30);
context.lineTo(435,15+i*30);
context.stroke();
}
}
var onStep = function(i,j,me){
context.beginPath();
context.arc(15 + i * 30,15 + j * 30, 13, 0, 2 * Math.PI);
context.closePath();
var gradient = context.createRadialGradient(15+i*30+2,15+i*30-2,13,15+i*30+2,15+i*30-2,0);
if(me){
gradient.addColorStop(0,"#0A0A0A");
gradient.addColorStop(1,"#636766");
}else{
gradient.addColorStop(0,"#D1D1D1");
gradient.addColorStop(1,"#F9F9F9");
}
context.fillStyle = gradient;
context.fill();
}
chess.onclick = function(e){
if(over){
return;
}
if(!me){
return;
}
var x = e.offsetX;
var y = e.offsetY;
var i = Math.floor(x / 30);
var j = Math.floor(y / 30);
if(chessBorad[i][j] == 0){
onStep(i,j,me);
chessBorad[i][j]=1;
for(var k=0;k<count;k++){
if(wins[i][j][k]){
myWin[k]++;
computerWin[k]=6;
if(myWin[k]==5){
alert("你赢了");
over = true;
}
}
}
if(!over){
me = !me;
computer();
}
}
}
var computer = function(){
var myScore = [];
var computerScore = [];
var u =0;
var v = 0;
var max = 0;
for(var i=0;i<15;i++){
myScore[i]=[];
computerScore[i]=[];
for(var j=0;j<15;j++){
myScore[i][j]=0;
computerScore[i][j]=0;
}
}
for(var i=0;i<15;i++){
for(var j=0;j<15;j++){
if(chessBorad[i][j]==0){
for(var k=0;k<count;k++){
if(wins[i][j][k]){
if(myWin[k]==1){
myScore[i][j]+=200;
}else if(myWin[k]==2){
myScore[i][j]+=400;
}else if(myWin[k]==3){
myScore[i][j]+=2000;
}else if(myWin[k]==4){
myScore[i][j]+=10000;
}
if(computerWin[k]==1){
computerScore[i][j]+=220;
}else if(computerWin[k]==2){
computerScore[i][j]+=420;
}else if(computerWin[k]==3){
computerScore[i][j]+=2100;
}else if(computerWin[k]==4){
computerScore[i][j]+=20000;
}
}
}
if(myScore[i][j]>max){
max = myScore[i][j];
u = i;
v = j;
}else if(myScore[i][j]==max){
if(computerScore[i][j]>computerScore[u][v]){
u = i;
v = j;
}
}
if(computerScore[i][j]>max){
max = computerScore[i][j];
u = i;
v = j;
}else if(computerScore[i][j]==max){
if(myScore[i][j]>myScore[u][v]){
u = i;
v = j;
}
}
}
}
}
onStep(u,v,false);
chessBorad[u][v]=2;
for(var k=0;k<count;k++){
if(wins[u][v][k]){
computerWin[k]++;
myWin[k]=6;
if(computerWin[k]==5){
alert("你输了");
over = true;
}
}
}
if(!over){
me = !me;
}
};
月下不知十年后的八月
一生安好
一生安好
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]=[];
初始化一个二维数组。
一生安好
let chessBoard = [];
let me = true;
let over = false;
let wins = [];
let 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] = []
}
}
var count = 0
for (var i = 0; i < 15; i++) {
for (var j = 0; j < 11; j++) {
for (k = 0; k < 5; k++) {
wins[i][j + k][count] = true
}
count++
}
}
for (var i = 0; i < 15; i++) {
for (var j = 0; j < 11; j++) {
for (k = 0; k < 5; k++) {
wins[j + k][i][count] = true
}
count++
}
}
for (var i = 0; i < 11; i++) {
for (var j = 0; j < 11; j++) {
for (k = 0; k < 5; k++) {
wins[i + k][j + k][count] = true
}
count++
}
}
for (var i = 0; i < 11; i++) {
for (var j = 14; j > 3; j--) {
for (k = 0; k < 5; k++) {
wins[i + k][j - k][count] = true
}
count++
}
}
console.log(count)
for (var i = 0; i < count; i++) {
myWin[i] = 0
computerWin[i] = 0
}
var chess = document.getElementById('chess')
var context = chess.getContext('2d')
context.strokeStyle = '#BFBFBF'
var logo = new Image()
logo.src = " " //image path
window.onload = function () {
// context.drawImage(null, 0, 0, 450, 450)
drawChessBoard()
// oneStep(0, 0, true)
// oneStep(1, 1, false)
// context.beginPath()
// context.arc(200,200,100,0,2*Math.PI)
// context.closePath()
// var gradient = context.createRadialGradient(200,200,50,200,200,20)
// gradient.addColorStop(0,'#0A0A0A')
// gradient.addColorStop(1,'#636766')
// context.fillStyle = gradient
// context.fill()
}
var drawChessBoard = function () {
for (var i = 0; i < 15; i++) {
context.moveTo(15 + i * 30, 15) //15
context.lineTo(15 + i * 30, 435) //435
context.stroke()
context.moveTo(15, 15 + i * 30) //15
context.lineTo(435, 15 + i * 30) //435
context.stroke()
}
}
//
// context.moveTo(0,0)
// context.lineTo(450,450)
// context.stroke()
var oneStep = function (i, j, me) {
context.beginPath()
context.arc(15 + i * 30, 15 + j * 30, 13, 0, 2 * Math.PI)
context.closePath()
var gradient = context.createRadialGradient(15 + i * 30 + 2, 15 + j * 30 - 2, 13, 15 + i * 30, 15 + j * 30, 0)
if (me) {
gradient.addColorStop(0, '#0A0A0A')
gradient.addColorStop(1, '#636766')
} else {
gradient.addColorStop(0, '#D1D1D1')
gradient.addColorStop(1, '#F9F9F9')
}
context.fillStyle = gradient
context.fill()
}
chess.onclick = function (e) {
if (over) {
return
}
if (!me) {
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
// }
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
}
}
}
if (!over) {
me = !me
computerAI()
}
}
// oneStep(i,j,me)
}
var computerAI = function () {
var myScore = []
var computerScore = []
var max = 0
var u = 0
var v = 0
for (var i = 0; i < 15; i++) {
myScore[i] = []
computerScore[i] = []
for (var j = 0; j < 15; j++) {
myScore[i][j] = 0
computerScore[i][j] = 0
}
}
for (var i = 0; i < 15; i++) {
for (var j = 0; j < 15; j++) {
if (chessBoard[i][j] === 0) {
for (var k = 0; k < count; k++) {
if (wins[i][j][k]) {
if (wins[k] === 1) {
myScore[i][j] += 200
} else if (myWin[k] === 2) {
myScore[i][j] += 400
} else if (myWin[k] === 3) {
myScore[i][j] += 2000
} else if (myWin[k] === 4) {
myScore[i][j] += 10000
}
if (computerWin[k] === 1) {
computerScore[i][j] += 220
} else if (computerWin[k] === 2) {
computerScore[i][j] += 420
} else if (computerWin[k] === 3) {
computerScore[i][j] += 2100
} else if (computerWin[k] === 4) {
computerScore[i][j] += 20000
}
}
}
if (myScore[i][j] > max) {
max = myScore[i][j]
u = i
v = j
} else if (myScore[i][j] === max) {
if (computerScore[i][j] > computerScore[u][v]) {
u = i
v = j
}
}
if (computerScore[i][j] > max) {
max = computerScore[i][j]
u = i
v = j
} else if (computerScore[i][j] > max) {
if (computerScore[i][j] > computerScore[u][v]) {
u = i
v = j
}
}
}
}
}
oneStep(u, v, false)
chessBoard[u][v] = 2
for (var k = 0; k < count; k++) {
if (wins[u][v][k]) {
computerWin[k]++
myWin[k] = 6
if (computerWin[k] === 5) {
window.alert('AI赢了')
over = true
}
}
}
if (!over) {
me = !me
// computerAI()
}
}
慕的地2359295
把不同难度的计算权重分值更改一下,比如简单电脑,专注进攻,不防守,防守分值调低。
qq_留待天明_0
斜着不能赢,我也是的
qq_孤岛_12
简单,你在alert之前在执行一次画棋子的操作,就是这个drawChessBoard();放在弹出消息前,就Ok了。
qq_我是我_7
这个不是在加入Ai前的那节课就实现了么。
慕粉3170877
同问,看不懂老师所说的。
qq_一个人的路上_0
---