二维数组的定义 , canvas对象的使用

二维数组:以下用new,其实简化 [] 即可,

var tArray = new Array();  //先声明一维
for(var k=0;k<i;k++){ //一维长度为i,i为变量,可以根据实际情况改变
tArray[k]=new Array(); //声明二维,每一个一维数组里面的一个元素都是一个数组;
for(var j=0;j<p;j++){ //一维数组里面每个元素数组可以包含的数量p,p也是一个变量;
tArray[k][j]=""; //这里将变量初始化,我这边统一初始化为空,后面在用所需的值覆盖里面的值
}
}

--------
for(var a=0;a<i;a++){

tArray[a]=[ matArray[a],addArray[a] ];  两个 组成一个二维数组

};

 
var tArray = new Array();  //先声明一维
for(var k=0;k<i;k++){ //一维长度为i,i为变量,可以根据实际情况改变 tArray[k]=new Array(); //声明二维,每一个一维数组里面的一个元素都是一个数组; for(var j=0;j<p;j++){ //一维数组里面每个元素数组可以包含的数量p,p也是一个变量; tArray[k][j]=""; //这里将变量初始化,我这边统一初始化为空,后面在用所需的值覆盖里面的值
}
}

五子棋代码如下:曾经把它看懂,现在再看感觉又有点忘了,尴尬  2018-11-26 16:57:07

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<title>人工智能五子棋</title>
<meta charset="UTF-8" />
<meta name="author" content="张" />
<meta name="keywords" content="五子棋" />
<meta name="description" content="五子棋" />
<style>
*{margin:0;}
canvas{
background:#fff;margin:120px auto;display:block;border-radius:4px;box-shadow:0px 0px 10px #000;
}
</style>
</head>
<body>
<canvas width="450" height="450" id="canvas"></canvas>
<script> var over = false; var chess = document.getElementById("canvas");
//拿到权限 上下文 2d平面
var context = chess.getContext("2d"); context.strokeStyle="#a8a8a8";
//定义方法
var drawChessboard = function(){
//线条 起点终点坐标(x,y)
/*
context.moveTo(0,0);//起点坐标
context.lineTo(450,450);//终点坐标
context.stroke();//两点坐标相连
*/
for (var i=0; i<15; i++) {
context.moveTo((15+30*i),15);
context.lineTo((15+30*i),435);
context.stroke();
context.moveTo(15,(15+30*i));
context.lineTo(435,(15+30*i));
context.stroke();
}
}
drawChessboard(); //绘制棋子
var onStep = function(i,j,me) {
//绘制棋子 圆形 圆心(x,y) 半径
//开始路径 区分大小写
context.beginPath();
context.arc(15+i*30,15+j*30,13,0,Math.PI*2);
//结束路径
context.closePath(); //渐变色 看文档,两个圆心 半径,
var gradient = context.createRadialGradient(15+i*30,15+j*30,0,15+i*30,15+j*30,13);
if (me) {
gradient.addColorStop(0,"#0a0a0a");
gradient.addColorStop(1,"#636363");
} else {
gradient.addColorStop(0,"#d1d1d1");
gradient.addColorStop(1,"#f9f9f9");
}
//填充颜色
context.fillStyle=gradient;
context.fill();
context.stroke();
} //建立一个二维数组判断棋盘上的落子情况
var chessBoard = [];
//把棋盘上面所有的点全部存进去
for (var i=0; i<15; i++) {
chessBoard[i] = []; //一维中存入还是数组
for (var j=0; j<15; j++) {
chessBoard[i][j] = 0;//等于0的地方没有下棋
}
} //下棋
var me = true;
chess.onclick = function(e) {
if(over) {
return false;
}
if(!me) {
return false;
}
//获取鼠标坐标
var x = e.offsetX;
var y = e.offsetY;
//点击范围30都可以下棋 向下取整
var i = Math.floor(x/30);
var j = Math.floor(y/30);
//把落的子放到数组中存储
if (chessBoard[i][j] == 0) { onStep(i,j,me);
chessBoard[i][j] = 1; for (var k=0; k<count; k++) {
if (wins[i][j][k]) {
//* 这里应该加多一个判断myWin[k]等于或大于6了,直接不用往下操作了。
if(myWin[k]!=6){
myWin[k]++;
computerWin[k] = 6;
if (myWin[k] == 5) {
alert("恭喜你赢了!");
over = true;
}
}
}
}
if (!over) {
me = !me;
computerAI();
}
}
} //统计赢法的种类
var wins = [];
//遍历棋盘
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++;
}
}
//本棋盘 有572中赢发,
//统计赢法组
var myWin = [];//全局,用于记录 每在此赢法上下子一个即加一,判断每一种赢法是否达到了5,
var computerWin = [];
for (var i=0; i<count; i++) {
myWin[i] = 0;
computerWin[i] = 0;
} //计算机AI算法
var computerAI = function () {
//统计分数
var mySource = [];//局部数组,我方分数,每次计算机下棋都计算一遍
var computerSource = [];//计算机分数
var max = 0; //最高点分数
var u = 0,v = 0;//最高点分数坐标
//初始化我方和计算机分数
for (var i=0; i<15; i++) {
mySource[i] = [];
computerSource[i] = [];
for (var j=0; j<15; j++) {
mySource[i][j] = 0;
computerSource[i][j] = 0;
}
}
for (var i=0; i<15; i++) {
for (var j=0; j<15; j++) { //这里的两个for是遍历棋盘
if (chessBoard[i][j] == 0) {//这里对每一个没有下过子的 坐标分析,计算该落子的可能性多大
for (var k=0; k<count; k++) { //遍历所有赢法 572钟
if (wins[i][j][k]) { //遍历和该坐标有关的赢法,有关往下执行
if (myWin[k] == 1) { //若该赢法上 落子为1,加一定的分数;myWin[k]这个值是在我方下棋时累加的
mySource[i][j] += 200;
} else if (myWin[k] == 2) { //若该赢法上 落子为2,再加一定的分数
mySource[i][j] += 400;
} else if (myWin[k] == 3) { //若该赢法上 落子为3,再加一定的分数
mySource[i][j] += 2000;
} else if (myWin[k] == 4) {
mySource[i][j] += 10000;
} if (computerWin[k] == 1) { //同理,对计算机下的期判断,累加分数
computerSource[i][j] += 420;
} else if (computerWin[k] == 2) {
computerSource[i][j] += 820;
} else if (computerWin[k] == 3) {
computerSource[i][j] += 4100;
} else if (computerWin[k] == 4) {
computerSource[i][j] += 20000;
}
}
}
if (mySource[i][j] > max) { //这个坐标对于我赢的概率和之前最大的比
max = mySource[i][j];
u = i;
v = j;
} else if (mySource[i][j] == max) {//如果两个点对自己相同,那两个点对敌方哪个更有利?
if (computerSource[i][j]>computerSource[u][v]) {
u = i;
v = j;
}
} if (computerSource[i][j] > max) { //这个坐标对于计算机的概率和之前最大的比
max = computerSource[i][j];
u = i;
v = j;
} else if (computerSource[i][j] == max) {
if (mySource[i][j]>mySource[u][v]) {
u = i;
v = j;
}
}
}
}
}
onStep(u,v,false);
chessBoard[u][v] = 2;
for (var k=0; k<count; k++) {
if (wins[u][v][k]) {
//* 这里应该加多一个判断computerWin[k]等于或大于6了,直接不用往下操作了。
if(computerWin[k]!=6){
computerWin[k]++;
myWin[k] = 6;
if (computerWin[k] == 5) {
alert("计算机赢了!");
over = true;
}
} }
}
if (!over) {
me = !me;
}
} </script>
</body>
</html>

五子棋.html的更多相关文章

  1. 自己写的HTML5 Canvas + Javascript五子棋

    看到一些曾经只会灌水的网友,在学习了前端之后,已经能写出下载量几千几万的脚本.样式,帮助大众,成为受欢迎的人,感觉满羡慕的.我也想学会前端技术,变得受欢迎呀.于是心血来潮,开始学习前端知识,并写下了这 ...

  2. java swing 双人五子棋源代码

    import java.awt.Color; import java.awt.Font; import java.awt.Graphics; import java.awt.Toolkit; impo ...

  3. HTML5 五子棋 - JS/Canvas 游戏

    背景介绍 因为之前用c#的winform中的gdi+,java图形包做过五子棋,所以做这个逻辑思路也就驾轻就熟,然而最近想温故html5的canvas绘图功能(公司一般不用这些),所以做了个五子棋,当 ...

  4. [收藏]C++简单五子棋

    #include<iostream> #include<iomanip> using namespace std; ; //棋盘行数 ; //棋盘列数 char p[X][Y] ...

  5. jQuery网页版五子棋小游戏源码下载

    体验效果:http://hovertree.com/texiao/game/4/ 网页五子棋源代码: <!DOCTYPE html> <html> <head> & ...

  6. js+html5双人五子棋(源码下载)

    代码如下: <!DOCTYPE html> <html> <head> <meta http-equiv="Content-Type" c ...

  7. jquery在线五子棋

    在线五子棋试玩地址:http://keleyi.com/game/12/ 以下是完整代码,保存到html文件打开也可以玩: <!DOCTYPE html> <html> < ...

  8. 五子棋AI清月连珠开源

    经过差不多两年的业余时间学习和编写,最近把清月连珠的无禁手部分完善得差不多了.这中间进行了很多思考,也有很多错误认识,到现在有一些东西还没有全面掌握,所以想通过开源于大家共同交流. 最近一直发表一些五 ...

  9. PyQt写的五子棋

    技术路线 GUI的实现 使用PyQt技术作为基础.PyQt是一个支持多平台的客户端开发SDK,使用它实现的客户端可以运行在目前几乎所有主流平台之上. 使用PyQt,Qt设计器实现UI,通过pyuic4 ...

  10. 浅析基本AI五子棋算法

    五子棋是所有棋类博弈中比较简单的了,这里介绍的也只是一种非常基本的AI策略.其实,包括之前的AI贪吃蛇,感觉这两个AI其实体现的都是一种建模思想,把一个现实中的问题模型化,抽象化,得到其一般特征,再设 ...

随机推荐

  1. JS深度判断两个对象字段相同

    代码: /** * 判断此对象是否是Object类型 * @param {Object} obj */ function isObject(obj){ return Object.prototype. ...

  2. Linux启动时间优化-内核和用户空间启动优化实践

    关键词:initcall.bootgraph.py.bootchartd.pybootchart等. 启动时间的优化,分为两大部分,分别是内核部分和用户空间两大部分. 从内核timestamp 0.0 ...

  3. c# winform 多屏显示

    using System;using System.Collections.Generic;using System.ComponentModel;using System.Data;using Sy ...

  4. [properJavaRDP]在网页中实现远程连接

    内容摘要: 利用开源软件properJavaRDP实现远程桌面连接 如何让Applet嵌入到网页中正常运行 如何处理连接win7时的异常:Wrong modulus size! Expected 64 ...

  5. 不要再被骗了------QQ盗号原理大揭秘

    前言 相信大家在懵懂无知的时候都有被盗号的经历吧,QQ胡乱的加好友,突然有个好友传了个文件给你,打开以后发现QQ竟然显示强制下线,然后再也上不去了QAQ,很明显,QQ号被人盗了.最近也是很多小伙伴私信 ...

  6. AtCoDeerくんと選挙速報 / AtCoDeer and Election Report AtCoder - 2140 (按比例扩大)

    Problem Statement AtCoDeer the deer is seeing a quick report of election results on TV. Two candidat ...

  7. docker(三) 镜像和容器常用命令

    一.镜像操作 1.搜索镜像 可以直接在Docker Hub 直接搜索镜像,当然也可以使用命令来搜索. docker search 名称 docker search tomcat 2.拉取镜像 dock ...

  8. 洛谷P3957 跳房子(Noip2017普及组 T4)

    今天我们的考试就考到了这道题,在考场上就压根没有思路,我知道它是一道dp的题,但因为太弱还是写不出来. 下来评讲的时候知道了一些思路,是dp加上二分查找的方式,还能够用单调队列优化. 但看了网上的许多 ...

  9. Nginx 11阶段的顺序处理

    L49

  10. 爬虫简介与request模块

    一 爬虫简介 概述 近年来,随着网络应用的逐渐扩展和深入,如何高效的获取网上数据成为了无数公司和个人的追求,在大数据时代,谁掌握了更多的数据,谁就可以获得更高的利益,而网络爬虫是其中最为常用的一种从网 ...