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 相关文章推荐
JavaScript高级程序设计
Dec 29 Javascript
js修改地址栏URL参数解决url参数问题
Dec 15 Javascript
详解javascript中原始数据类型Null和Undefined
Dec 17 Javascript
第二篇Bootstrap起步
Jun 21 Javascript
js重写方法的简单实现
Jul 10 Javascript
jQuery ajax MD5实现用户注册即时验证功能
Oct 11 Javascript
Vue学习笔记进阶篇之过渡状态详解
Jul 14 Javascript
jquery对table做排序操作的实例演示
Aug 10 jQuery
微信小程序仿朋友圈发布动态功能
Jul 15 Javascript
浅谈webpack性能榨汁机(打包速度优化)
Jan 09 Javascript
Vuex,iView UI面包屑导航使用扩展详解
Nov 04 Javascript
vue中对象数组去重的实现
Feb 06 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
Protoss热键控制
2020/03/14 星际争霸
支持oicq头像的留言簿(一)
2006/10/09 PHP
用Php编写注册后Email激活验证的实例代码
2013/03/11 PHP
PHP命令行执行整合pathinfo模拟定时任务实例
2016/08/12 PHP
PHP函数按引用传递参数及函数可选参数用法示例
2018/06/04 PHP
PHP数组访问常用方法解析
2020/09/05 PHP
CSS中简写属性要注意TRouBLe的顺序问题(避免踩坑)
2021/03/09 HTML / CSS
javascript 四则运算精度修正函数代码
2010/05/31 Javascript
JS动态获取当前时间,并写到特定的区域
2013/05/03 Javascript
jQuery实现的经典竖向伸缩菜单效果代码
2015/09/24 Javascript
Jquery检验手机号是否符合规则并根据手机号检测结果将提交按钮设为不同状态
2015/11/26 Javascript
JS监控关闭浏览器操作的实例详解
2017/09/12 Javascript
vue router仿天猫底部导航栏功能
2017/10/18 Javascript
vue自动化表单实例分析
2018/05/06 Javascript
vue.js的简单自动求和计算实例
2019/11/08 Javascript
JavaScript switch语句使用方法简介
2019/12/30 Javascript
node.js中process进程的概念和child_process子进程模块的使用方法示例
2020/02/11 Javascript
jQuery HTML css()方法与css类实例详解
2020/05/20 jQuery
Element DateTimePicker日期时间选择器的使用示例
2020/07/27 Javascript
使用Python编写类UNIX系统的命令行工具的教程
2015/04/15 Python
利用Python半自动化生成Nessus报告的方法
2019/03/19 Python
使用python切片实现二维数组复制示例
2019/11/26 Python
pytorch实现线性拟合方式
2020/01/15 Python
python字符串常用方法及文件简单读写的操作方法
2020/03/04 Python
浅谈matplotlib.pyplot与axes的关系
2020/03/06 Python
Django中如何用xlwt生成表格的方法步骤
2021/01/31 Python
HTML5实践-图片设置成灰度图
2012/11/12 HTML / CSS
Mytheresa美国官网:德国知名的女性奢侈品电商
2017/05/27 全球购物
Myprotein台湾官方网站:全球领先的运动营养品牌
2018/12/10 全球购物
运动会开幕式主持词
2014/03/28 职场文书
优秀教师演讲稿
2014/05/06 职场文书
表彰大会策划方案
2014/05/13 职场文书
党建工作经验交流材料
2014/05/25 职场文书
公司离职证明样本
2014/09/13 职场文书
浅谈vue2的$refs在vue3组合式API中的替代方法
2021/04/18 Vue.js
Java数据结构之链表相关知识总结
2021/06/18 Java/Android