Javascript和HTML5利用canvas构建Web五子棋游戏实现算法


Posted in Javascript onJuly 17, 2013

这只是一个简单的JAVAscript和HTML5小程序,没有实现人机对战。
五子棋棋盘落子点对应的二维数组。数组的元素对应落子点。比如数组元素值为0表示该元素对应的落子点没有棋子,数组元素值为1表示该元素对应的落子点有白棋子,数组元素值为2表示该元素对应的落子点有黑棋子;
判断五子棋赢棋的算法是通过对五子棋棋盘落子点对应的二维数组的操作来实现的。

判断五子棋赢棋算法
下边的函数可以实现判断五子棋赢棋的算法,也可以按照教材中相应的算法实现。
其中函数的参数xx.yy为数组下标,chess数组实现五子棋棋盘落子点的数据结构映射。
算法的思想方法是:以当前落子点对应的下标为基点,向其周围8个方向进行搜索,如果有同色子连五子,返回1,或2,否则返回0。返回1代表白棋方胜,返回2代表黑棋方胜。返回0代表没有发生赢棋数据结构状态。
Javascript和HTML5利用canvas构建Web五子棋游戏实现算法 
Javascript和HTML5利用canvas构建Web五子棋游戏实现算法
Javascript和HTML5利用canvas构建Web五子棋游戏实现算法 

<!DOCTYPE html> 
< html xmlns="http://www.w3.org/1999/xhtml"> 
< head> 
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> 
<title></title> 
<style type="text/css"> 
body { 
margin: 10px; 
} 
</style> 
<script type="text/javascript"> 
var canvas; 
var context; 
var isWhite = true;//设置是否该轮到白棋 
var isWell = false;//设置该局棋盘是否赢了,如果赢了就不能再走了 
var img_b = new Image(); 
img_b.src = "images/b.png";//白棋图片 
var img_w = new Image(); 
img_w.src = "images/w.png";//黑棋图片 
var chessData = new Array(15);//这个为棋盘的二维数组用来保存棋盘信息,初始化0为没有走过的,1为白棋走的,2为黑棋走的 
for (var x = 0; x < 15; x++) { 
chessData[x] = new Array(15); 
for (var y = 0; y < 15; y++) { 
chessData[x][y] = 0; 
} 
} 
function drawRect() {//页面加载完毕调用函数,初始化棋盘 
canvas = document.getElementById("canvas"); 
context = canvas.getContext("2d"); 
for (var i = 0; i <= 640; i += 40) {//绘制棋盘的线 
context.beginPath(); 
context.moveTo(0, i); 
context.lineTo(640, i); 
context.closePath(); 
context.stroke(); 
context.beginPath(); 
context.moveTo(i, 0); 
context.lineTo(i, 640); 
context.closePath(); 
context.stroke(); 
} 
} 
function play(e) {//鼠标点击时发生 
var x = parseInt((e.clientX - 20) / 40);//计算鼠标点击的区域,如果点击了(65,65),那么就是点击了(1,1)的位置 
var y = parseInt((e.clientY - 20) / 40); 
if (chessData[x][y] != 0) {//判断该位置是否被下过了 
alert("你不能在这个位置下棋"); 
return; 
} 
if (isWhite) { 
isWhite = false; 
drawChess(1, x, y); 
} 
else { 
isWhite = true; 
drawChess(2, x, y); 
} 
} 
function drawChess(chess, x, y) {//参数为,棋(1为白棋,2为黑棋),数组位置 
if (isWell == true) { 
alert("已经结束了,如果需要重新玩,请刷新"); 
return; 
} 
if (x >= 0 && x < 15 && y >= 0 && y < 15) { 
if (chess == 1) { 
context.drawImage(img_w, x * 40 + 20, y * 40 + 20);//绘制白棋 
chessData[x][y] = 1; 
} 
else { 
context.drawImage(img_b, x * 40 + 20, y * 40 + 20); 
chessData[x][y] = 2; 
} 
judge(x, y, chess); 
} 
} 
function judge(x, y, chess) {//判断该局棋盘是否赢了 
var count1 = 0; 
var count2 = 0; 
var count3 = 0; 
var count4 = 0; 
//左右判断 
for (var i = x; i >= 0; i--) { 
if (chessData 
[y] != chess) { 
break; 
} 
count1++; 
} 
for (var i = x + 1; i < 15; i++) { 
if (chessData 
[y] != chess) { 
break; 
} 
count1++; 
} 
//上下判断 
for (var i = y; i >= 0; i--) { 
if (chessData[x] 
!= chess) { 
break; 
} 
count2++; 
} 
for (var i = y + 1; i < 15; i++) { 
if (chessData[x] 
!= chess) { 
break; 
} 
count2++; 
} 
//左上右下判断 
for (var i = x, j = y; i >= 0, j >= 0; i--, j--) { 
if (chessData 
[j] != chess) { 
break; 
} 
count3++; 
} 
for (var i = x + 1, j = y + 1; i < 15, j < 15; i++, j++) { 
if (chessData 
[j] != chess) { 
break; 
} 
count3++; 
} 
//右上左下判断 
for (var i = x, j = y; i >= 0, j < 15; i--, j++) { 
if (chessData 
[j] != chess) { 
break; 
} 
count4++; 
} 
for (var i = x + 1, j = y - 1; i < 15, j >= 0; i++, j--) { 
if (chessData 
[j] != chess) { 
break; 
} 
count4++; 
} 
if (count1 >= 5 || count2 >= 5 || count3 >= 5 || count4 >= 5) { 
if (chess == 1) { 
alert("白棋赢了"); 
} 
else { 
alert("黑棋赢了"); 
} 
isWell = true;//设置该局棋盘已经赢了,不可以再走了 
} 
} 
</script> 
< /head> 
< body onload="drawRect()"> 
<div> 
<canvas width="640" id="canvas" onmousedown="play(event)" height="640">你的浏览器不支持HTML5 canvas,请使用 google chrome 浏览器 打开. 
</canvas> 
</div> 
< /body> 
< /html>

Javascript 相关文章推荐
Ajax+Json 级联菜单实现代码
Oct 27 Javascript
javascript与CSS复习(《精通javascript》)
Jun 29 Javascript
input输入框的自动匹配(原生代码)
Mar 19 Javascript
js判断选择时间不能小于当前时间的示例代码
Sep 24 Javascript
jQuery与JavaScript节点创建方法的对比
Nov 18 Javascript
基于canvas粒子系统的构建详解
Aug 31 Javascript
js自定义trim函数实现删除两端空格功能
Feb 09 Javascript
详解实现一个通用的“划词高亮”在线笔记功能
Apr 23 Javascript
layer.open的自适应及居中及子页面标题的修改方法
Sep 05 Javascript
Vue 解决多级动态面包屑导航的问题
Nov 04 Javascript
JS函数本身的作用域实例分析
Mar 16 Javascript
js最全的数组的降维5种办法(小结)
Apr 28 Javascript
javascript和HTML5利用canvas构建猜牌游戏实现算法
Jul 17 #Javascript
js中如何把字符串转化为对象、数组示例代码
Jul 17 #Javascript
js函数setTimeout延迟执行的简单介绍
Jul 17 #Javascript
JavaScript地图拖动功能SpryMap的简单实现
Jul 17 #Javascript
js导出格式化的excel 实例方法
Jul 17 #Javascript
js检查页面上有无重复id的实现代码
Jul 17 #Javascript
基于pthread_create,readlink,getpid等函数的学习与总结
Jul 17 #Javascript
You might like
星际流派综述
2020/03/04 星际争霸
开启CURL扩展,让服务器支持PHP curl函数(远程采集)
2011/03/19 PHP
destoon数据库表说明汇总
2014/07/15 PHP
PHP XML Expat解析器知识点总结
2019/02/15 PHP
laravel orm 关联条件查询代码
2019/10/21 PHP
php 使用 __call实现重载功能示例
2019/11/18 PHP
PHP实现笛卡尔积算法的实例讲解
2019/12/22 PHP
QQ邮箱的一个文本编辑器代码
2007/03/14 Javascript
js每次Title显示不同的名言
2008/09/25 Javascript
使用iojs的jsdom库实现同步系统时间
2015/04/20 Javascript
jQuery下拉美化搜索表单效果代码分享
2015/08/25 Javascript
两款JS脚本判断手机浏览器类型跳转WAP手机网站
2015/10/16 Javascript
利用jsonp跨域调用百度js实现搜索框智能提示
2016/08/24 Javascript
Bootstrap基本插件学习笔记之Alert警告框(20)
2016/12/08 Javascript
微信小程序开发之麦克风动画 帧动画 放大 淡出
2017/04/18 Javascript
Vue.js递归组件实现组织架构树和选人功能
2019/07/04 Javascript
分享8个JavaScript库可更好地处理本地存储
2020/10/12 Javascript
解决vue-cli输入命令vue ui没效果的问题
2020/11/17 Javascript
Python的Flask框架中实现登录用户的个人资料和头像的教程
2015/04/20 Python
在Python中操作文件之truncate()方法的使用教程
2015/05/25 Python
Python中标准模块importlib详解
2017/04/16 Python
Python实现中一次读取多个值的方法
2018/04/22 Python
Flask web开发处理POST请求实现(登录案例)
2018/07/26 Python
利用CSS3的线性渐变linear-gradient制作边框的示例
2016/06/02 HTML / CSS
阿根廷网上配眼镜:SmartBuyGlasses阿根廷
2016/08/19 全球购物
Scholastic父母商店:儿童书籍
2017/01/01 全球购物
Lungolivigno Fashion官网:高级时装在线购物
2020/10/17 全球购物
.NET程序员的数据库面试题
2012/10/10 面试题
大学军训感言
2014/01/10 职场文书
放飞蜻蜓反思
2014/02/05 职场文书
爱国口号
2014/06/19 职场文书
个人自我剖析材料
2014/09/30 职场文书
2014年法院工作总结
2014/11/24 职场文书
刑事附带民事上诉状
2015/05/23 职场文书
Redis Cluster 字段模糊匹配及删除
2021/05/27 Redis
Python天气语音播报小助手
2021/09/25 Python