首页 > 编程语言 >五子棋html游戏代码与算法介绍

五子棋html游戏代码与算法介绍

时间:2023-01-16 17:35:28浏览次数:42  
标签:isPolluted1 五子棋 state 算法 html let && stateNum points


五子棋html游戏代码与算法介绍

  • 运行图片
  • 目录路径
  • 五子棋.html
  • 五子棋算法
  • 进行下一个游戏的开发!
  • 注意事项

我会把html文件、css文件提供下载地址,文件夹路径也展示给大家。但是图片就没法一一放在博客里面了。

运行图片

五子棋html游戏代码与算法介绍_元组

目录路径

五子棋html游戏代码与算法介绍_web版五子棋_02

五子棋.html

<html>
<head>
<title>五子棋-黑子电脑</title>
<link rel="stylesheet" type="text/css" href="css/style.css"/>
<script src="jquery-3.3.1.js" type="text/javascript"></script>
</head>
<body>
<div id=container>
<div id=chessboard>

</div>
</div>
</body>

<script type="text/javascript">
/**********************自定义便捷函数*******************************/
function getRandom(min,max){//获取在区间[min.max]内的int数
let s;
s=parseInt(Math.random()*max+1);
while(s<min)
{
s=parseInt(Math.random()*max+1);
}
return s;
}
/**************************定义初始化数据*****************************************/
/***封装棋盘里面的点 类*****/
function Point(index,hang,lie){
this.idnex=index;
this.hang=hang;
this.lie=lie;
this.state=0;
this.pointX=-17+(this.lie-1)*52;
this.pointY=-17+(14-this.hang+1)*52;
}
var pointsScore=new Array(226);
var points=new Array(226);
for(let i=1;i<=225;i++)
{
points[i]=new Point(i,parseInt((i-1)/15+1),i-parseInt((i-1)/15)*15);
pointsScore[i]=0;
}
console.log(points[15].pointX);

/**************************系统设置*****************************************/
/*
* 封装游戏容器居中
*/
(() => {
let screenHeight=parseInt($(window).height()); //浏览器时下窗口可视区域高度
let screenWidth=parseInt($(window).width()); //浏览器时下窗口可视区域高度
let cnotallow=parseInt($("#container").height());//container容器高度
let cnotallow=parseInt($("#container").width());//container容器宽度

$("#container").css({
'marginLeft':(screenWidth-containerWidth)/2+'px',
'marginTop':(screenHeight-containerHeigth)/2+'px',
})
})();




/** 根据鼠标相对于棋盘坐标轴的位置,以30*30px大小的正方形位界限,
** 搜索在矩形内是否有point点存在,然后根据坐标确定points的index
*/
let getPointsIndex = (movex,movey) => {
let hang=-1,lie=-1;
for(let i=1;i<=15;i++){
if(movex<=points[i].pointX+32&&movex>=points[i].pointX+2) lie=i;
if(movey<=points[i].pointX+32&&movey>=points[i].pointX+2) hang=16-i;
}

if(hang==-1||lie==-1) return 0;
return (hang-1)*15+lie;
}
addChess(1,113);
/***对点击事件,获取相对于棋盘坐标轴的位置,然后根据坐标确定points的index*****/
$("#container").on("click",function(e){
console.log("--------点击了!");
e = e || window.event;
if(e.pageX || e.pageY) {
movex = e.pageX-parseInt($("#container").css("marginLeft"))-37;
movey = e.pageY-parseInt($("#container").css("marginTop"))-12;
}
console.log("--------检索到坐标的index为:"+getPointsIndex(movex,movey));
addChess(-1,getPointsIndex(movex,movey));
addChess(1,computer(getPointsIndex(movex,movey)));


})


/*******添加棋子********/
function addChess(state,index){//state代表状态,1黑子 -1白子
var img=$(new Image());
img.attr({
'src':'css/img/'+(state==1?'black':'white')+'.png',
'class':'chess'
});
img.css({
'margin-left':points[index].pointX+'px',
'margin-top':points[index].pointY+'px',
});

points[index].state=state;

$("#chessboard").append(img);

}




/**************************电脑算法*****************************************/
/***评分表***/
var score1={//白子为电脑 电脑主…… 我也不知道主进攻还是防守
empty : 7,
b_1 : 35,
b_2 : 800,
b_3 : 15000,
b_4 : 80000,
w_1 : 15,
w_2 : 400,
w_3 : 1800,
w_4 : 10000,
polluted : 0
}



function getScore(isEmpty,isPolluted,stateNum,state,i){//白棋为电脑,主防守
let fen=score1;
if(points[i].state!=0) pointsScore[i]=0;
else{
if(isPolluted) pointsScore[i]+=fen.polluted;
else if(isEmpty) pointsScore[i]+=fen.empty;
else {
if(stateNum==1&&state==1) pointsScore[i]+=fen.b_1;
else if(stateNum==2&&state==1) pointsScore[i]+=fen.b_2;
else if(stateNum==3&&state==1) pointsScore[i]+=fen.b_3;
else if(stateNum==4&&state==1) pointsScore[i]+=fen.b_4;

if(stateNum==1&&state==-1) pointsScore[i]+=fen.w_1;
else if(stateNum==2&&state==-1) pointsScore[i]+=fen.w_2;
else if(stateNum==3&&state==-1) pointsScore[i]+=fen.w_3;
else if(stateNum==4&&state==-1) pointsScore[i]+=fen.w_4;
}
}
}


function computer(index){
for(let i=1;i<=225;i++) pointsScore[i]=0;

for(let q=1;q<=225;q++){

let hangPointIndex=q;//得到此点的index

for(let j=1;j<=5;j++)//遍历与此点横相关的五元组,理论上有五个五元组
{
if(points[hangPointIndex].lie>=j&&points[hangPointIndex].lie<=10+j)//筛选可成立的五元组
{
let isEmpty=1,isPolluted=0,isPolluted1=0,isPolluted2=0,stateNum=0,state=0;
for(let k=1;k<=5;k++)
{
if(points[hangPointIndex+k-j].state!=0) {isEmpty=0;stateNum++;}
if(points[hangPointIndex+k-j].state==1) isPolluted1=1;
if(points[hangPointIndex+k-j].state==-1) isPolluted2=1;
}
if(isPolluted1==1&&isPolluted2==1) isPolluted=1;
if(isPolluted1==1&&isPolluted2==0) state=1;
if(isPolluted1==0&&isPolluted2==1) state=-1;

getScore(isEmpty,isPolluted,stateNum,state,hangPointIndex);
}
}

let liePointIndex=q;//得到此点的index

for(let j=1;j<=5;j++)//遍历与此点纵相关的五元组,理论上有五个五元组
{
if(points[liePointIndex].hang>=j&&points[liePointIndex].hang<=10+j)//筛选可成立的五元组
{
var isEmpty=1,isPolluted=0,isPolluted1=0,isPolluted2=0,stateNum=0,state=0;
for(var k=1;k<=5;k++)
{
if(points[liePointIndex+(k-j)*15].state!=0) {isEmpty=0;stateNum++;}
if(points[liePointIndex+(k-j)*15].state==1) isPolluted1=1;
if(points[liePointIndex+(k-j)*15].state==-1) isPolluted2=1;
}
if(isPolluted1==1&&isPolluted2==1) isPolluted=1;
if(isPolluted1==1&&isPolluted2==0) state=1;
if(isPolluted1==0&&isPolluted2==1) state=-1;
getScore(isEmpty,isPolluted,stateNum,state,liePointIndex);
}
}



let nowIndex=q;//获取此时point的索引index

for(var j=1;j<=5;j++)//遍历与此点正斜(形如“/”)相关的五元组,理论上有五个五元组
{
if(points[nowIndex].hang>=j&&points[nowIndex].hang<=10+j&&points[nowIndex].lie>=j&&points[nowIndex].lie<=10+j)//筛选可成立的五元组
{
var isEmpty=1,isPolluted=0,isPolluted1=0,isPolluted2=0,stateNum=0,state=0;
for(var k=1;k<=5;k++)
{
if(points[nowIndex+(k-j)*16].state!=0) {isEmpty=0;stateNum++;}
if(points[nowIndex+(k-j)*16].state==1) isPolluted1=1;
if(points[nowIndex+(k-j)*16].state==-1) isPolluted2=1;
}
if(isPolluted1==1&&isPolluted2==1) isPolluted=1;
if(isPolluted1==1&&isPolluted2==0) state=1;
if(isPolluted1==0&&isPolluted2==1) state=-1;

getScore(isEmpty,isPolluted,stateNum,state,nowIndex);
}
}


for(var j=1;j<=5;j++)//遍历与此点反斜(形如“\”)相关的五元组,理论上有五个五元组
{
if(points[nowIndex].hang>=6-j&&points[nowIndex].hang<=16-j&&points[nowIndex].lie>=j&&points[nowIndex].lie<=10+j)//筛选可成立的五元组
{
var isEmpty=1,isPolluted=0,isPolluted1=0,isPolluted2=0,stateNum=0,state=0;
for(var k=1;k<=5;k++)
{
if(points[nowIndex-(k-j)*14].state!=0) {isEmpty=0;stateNum++;}
if(points[nowIndex-(k-j)*14].state==1) isPolluted1=1;
if(points[nowIndex-(k-j)*14].state==-1) isPolluted2=1;
}
if(isPolluted1==1&&isPolluted2==1) isPolluted=1;
if(isPolluted1==1&&isPolluted2==0) state=1;
if(isPolluted1==0&&isPolluted2==1) state=-1;

getScore(isEmpty,isPolluted,stateNum,state,nowIndex);
}
}
}

let maxIndex=[],max=0;
for(let val of pointsScore) if(val>max) max=val;
for(let i=1;i<=225;i++) if(pointsScore[i]==max) maxIndex.push(i);


return maxIndex[parseInt(Math.random()*(maxIndex.length))];


}

</script>
</html>

五子棋算法

五子棋有15行、15列,一共225个点。假设每个点都有自己的分数。

我们遍历每个点。

五子棋html游戏代码与算法介绍_h5游戏_03


如上图,对于每个点来说,它在横、竖、正斜(“/”)、反斜(“\”)四个方向上,都会有包含此点的五元组,一共20个。

我们遍历这20个五元组。

对于每个五元组来说,如果里面有黑子有白子,我们称五元组被污染了,如果五元组是空的,或者有1个到4个白子或黑子,我们都给出相应的分数。评分表如下:

/***评分表***/
empty : 7,
b_1 : 35,
b_2 : 800,
b_3 : 15000,
b_4 : 80000,
w_1 : 15,
w_2 : 400,
w_3 : 1800,
w_4 : 10000,
polluted : 0

最后20个五元组得出的分数,都加再这一点上面。
之后遍历225个点的分数,得出最大分数的点,下棋。

算法结构大致画为:

五子棋html游戏代码与算法介绍_web版五子棋_04

进行下一个游戏的开发!

指尖大冒险、跳一跳是男人就下一百层

注意事项

【1】 原创博客,转载本篇请与我联系,尊重版权。
【2】 关于阅读本篇博客的所有问题、代码源码、图片素材、编程技巧、编程经历都可联系我,与我交流讨论。
【3】 本人部分时间承接各种毕业设计、网站编写、微信小程序编写、数据库作业编写。

标签:isPolluted1,五子棋,state,算法,html,let,&&,stateNum,points
From: https://blog.51cto.com/u_15942590/6010578

相关文章

  • 寒假算法学习第二周
    动态规划这个东西3步走首先给一个例子配合理解一只青蛙一次可以跳上1级台阶,也可以跳上2级。求该青蛙跳上一个n级的台阶总共有多少种跳法。1:首先确定数组含义a[N]这个东......
  • HTML:页面可见性
    页面可见性:用来判断用户是否正在浏览某个指定标签页HTML5提供了这样一个方法:visibilitychange页面事件来判断当前页面可见状态,并针对性的执行某些任务。同时还有新的docum......
  • HTML:SEO
    什么是SEO?seo中文译为针对搜索引擎优化,是指从自然搜索结果获得网站流量的技术和过程,是在了解搜索引擎自然排名机制的基础上,对网站内部外部的调整优化,改进网站在搜索引擎......
  • 算法学习01—Java底层的正整数与负整数
    算法学习01—Java底层的正整数与负整数本节课学到的知识编写一个方法,打印出int类型数字的二进制长什么样为什么int类型的最大值是2^32-1,最小值是-2^32......
  • 代码随想录算法训练营第一天 | 有效的字母异位词、两个数组的交集,快乐数,两数之和
    day6242.有效的字母异位词classSolution{public:boolisAnagram(strings,stringt){std::unordered_map<char,int>ma;for(inti=0;i......
  • HTML之元素、属性、标题、段落【笔记小结】
    (HTML之元素、属性、标题、段落【笔记小结】)1元素1.1语法示例:开始标签元素内容结束标签<p>段落</p><a>链接</a><br>换行语法:#以开......
  • 跳跃表数据结构与算法分析
    作者:京东物流纪卓志目前市面上充斥着大量关于跳跃表结构与Redis的源码解析,但是经过长期观察后发现大都只是在停留在代码的表面,而没有系统性地介绍跳跃表的由来以及各种常量......
  • 又一重要进展发布!OpenMMLab算法仓支持昇腾AI训练加速
    摘要:上海人工智能实验室的浦视开源算法体系(OpenMMLab)团队基于昇腾AI发布了MMDeploy0.10.0版本,该版本已支持OpenMMLab算法仓库在昇腾异构计算架构CANN上的推理部署。本文......
  • HTML5 以上超大文件上传和断点续传服务器的实现
    ​ IE的自带下载功能中没有断点续传功能,要实现断点续传功能,需要用到HTTP协议中鲜为人知的几个响应头和请求头。 一. 两个必要响应头Accept-Ranges、ETag     ......
  • HTML:W3C标准组织
    W3C指的是万维网联盟(WorldWideWebConsortium),主要工作是对web进行标准化。早期不同浏览器厂商对于解析网页的标准是不同的,开发人员需要做大量的兼容,于是制定w3c标准,统一......