告诉你什么是优雅的代码(11)----html5 之XXOO棋

2023-10-27

 

 

项目结项后的一星期又两天后,我又有了写些优雅代码的欲望。在我的记忆中, AI,在这个领域,我已近乎白痴,剪枝与寻路两种剑法,就在我离开校园之后,连同那蓝天碧草,相忘于江湖。江湖中只有 SSH, 只有 SQL,只有汽车尾气,只有路人甲

 

在计算机语言的圣经中,hello world 永远写在第一页。如果没有翻开过这一页,就如少男没有翻开过少女的裙子一样充满好奇,困惑。我难以忍受这种无知,于是我的剑出鞘,翻开AI的圣经,在屏幕上刻下 XXOO 四个字。

 

 

 

XXOO棋 ,又称井字棋 。三子相连者胜 ,四子相连 ...是不可能的。

 

算法就如剑法,速度,力度都要有良好的把握。理解剑法,需要口诀。算法亦然。

 

以下为负值最大函数的伪代码:

 

    int NegaMax(int depth) {
     int best = -INFINITY;
     if (depth <= 0) {
      return Evaluate();
     }
     GenerateLegalMoves();
     while (MovesLeft()) {
      MakeNextMove();
      val = -NegaMax(depth - 1); // 注意这里有个负号。
      UnmakeMove();
      if (val > best) {
       best = val;
      }
     }
     return best;
    }
 

理解了这个伪代码,也就明白了我的代码:

 

this.getPos = function(depth){
		var best = -Chess.MAX-1;
		var index = -1;		
		var val = 0;		
		for (var i = 0 ;i < board.length; i++) {
	    	   if(board[i] == 0){   
	    		   board[i] = aiChess;  
	    		   val = -negaMax(depth -1,personChess);
	    		   board[i] = 0;
	    		   if(val > best){
	    			   best = val;
	    			   index = i;
	    		   }
	    	   }
	     }
		 return index;
	}
 	function negaMax(depth,chess) {	
 	   var best = -Chess.MAX;     
       if (depth <= 0) {
    	   return evaluate(chess);
       }
       var val = 0;
       for ( var i = 0 ;i < board.length; i++) {
    	   if(board[i] == 0){
    		   
    		   board[i] = chess;  
    		   val = -negaMax(depth -1,chess==Chess.X?Chess.O:Chess.X);
    		   board[i] = 0;
    		   if(val > best){
    			   best = val;
    			  
    		   }
    	   }
       }	       
       return best;		
	      		
	}
		function evaluate(chess) {
			var xMark = 0;
			var oMark = 0;
			var X = Chess.X;
			var O = Chess.O;
			var f = chess == X?1:-1;
			for (i = 0; i < 8; i++) {
				var sum = board[pos[i][0]] + board[pos[i][1]] + board[pos[i][2]];
				if(sum == 3*X)
					return f*Chess.MAX;
				if(sum == 3*O)
					return -f*Chess.MAX;
				if(sum < O)
					xMark++;
				if(sum % O == 0)
					oMark++;
			}
			return f*(xMark - oMark);
		}

 

 

附件有完整的代码,可直接开启你的XXOO。

 

 

 

 

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

告诉你什么是优雅的代码(11)----html5 之XXOO棋 的相关文章

  • Linux 阻塞IO(等待队列)原理及架构

    一 阻塞操作 阻塞操作是指在执行折本操作时 若不能获得自愿 则挂起进程直到满足可操作性的条件后在进行操作 被挂起的进程进入休眠状态 被从调度器的运行队列移走 直到等待的条件被满足 假设recvfrom函数是一个系统调用 阻塞不是低效率 如果
  • vue -- 验证码

随机推荐

  • 25-python函数(低阶)

    一 函数的作用 函数的本质就是将一段具有独立功能的代码块整合到一个整体并命名 在需要的时候通过调用函数名完成某种需求 以提高代码的利用率 从而在稳定系统的同时减轻程序员的工作 二 函数的使用过程 函数使用分为两个步骤 先定义 后调用 定义函
  • Java设计模式之状态模式

    本文继续介绍23种设计模式系列之策略模式 何时使用 State模式在实际使用中比较多 适合 状态 的切换 因为我们经常会使用If else if else 进行状态切换 如果针对状态的这样判断切换反复出现 我们就要联想到是否可以采取Stat
  • Android相机-架构3

    目录 引言 1 Android相机的整体架构 2 相机 HAL 2 1 AIDL相机HAL 2 2 相机 HAL3 功能 3 HAL子系统 3 1 请求 3 2 HAL和相机子系统 3 2 1 相机的管道 3 2 2 使用 Android
  • TCP的拥塞控制(详解)

    在某段时间 若对网络中某一资源的需求超过了该资源所能提供的可用部分 网络性能就要变坏 这种情况就叫做网络拥塞 在计算机网络中数位链路容量 即带宽 交换结点中的缓存和处理机等 都是网络的资源 若出现拥塞而不进行控制 整个网络的吞吐量将随输入负
  • 【6 GoldenEye渗透笔记】

    1 前言 本文仅用于技术讨论与研究 不做任何导向 对于所有笔记中复现的这些终端 服务器或者实验环境 均为自行搭建的公开靶场 请勿在现实环境中模仿 操作 本文涉及到的工具仅就用到的方面做简要描述 如果想了解更详细的信息 请自行参阅其他技术资料
  • Java的多态性

    Java的多态性多态性严格来讲有两种描述形式 一 方法的多态性 1 方法的重载 同一个方法名称 会根据传入参数的类型及个数不同执行不同的方法体 2 方法的覆写 同一个方法名称 会根据子类的不同 实现不同的功能 二 对象的多态性 指的是发生在
  • 51Nod 2094 前缀和

    题目链接 https www 51nod com Challenge Problem html problemId 2094 include
  • unity3D简答题2

    游戏对象运动的本质 游戏对象运动的本质是对象Transform属性的变化 position决定位置 rotation决定旋转角度 请用三种方法以上方法 实现物体的抛物线运动 如 修改Transform属性 使用向量Vector3的方法 第一
  • canvas drawbitmap不出现_用Flutter做桌上弹球?聊聊绘图(Canvas&CustomPaint)API

    本文是Flutter中Canvas和CustomPaint API的使用实例 首先看一下列出最终目标 在程序运行后 显示一个小球 每次程序启动后 小球的样式均发生随机性变化 体现在大小 颜色和位置三点 小球运行的规律参考桌球或三维弹球游戏
  • Convolutional Pose Machine - 卷积姿态网络

    Convolutional Pose Machine 卷积姿态网络 论文主要解决 单人单目 RGB图像姿态估计问题 本篇论文也是现在非常火热的openpose开源项目的核心之一 这篇来自CMU的论文为单人姿态估计方面研究注入新的思路 论文网
  • Flutter初体验

    背景 今天在 lt 极客 gt APP上看到一个 使用Flutter快速构建集美观与高性能于一体的移动应用 的介绍 瞬间想试试 于是找到了Flutter官网 https flutter cn 并按步骤实操起来 手册 安装和环境配置 Flut
  • Docker部署单机Zookeeper

    配置Zookeeper安装目录 在宿主机配置zookeeper安装目录 docker develop zookeeper 并且在文件夹创建 data 和logs 目录 mkdir p docker develop zookeeper dat
  • 运行paddle-gpu相关项目报错

    报错1 RuntimeError PreconditionNotMet Cannot load cudnn shared library Cannot invoke method cudnnGetVersion Hint cudnn dso
  • JS 对象 Key使用变量代替

    JS 对象 Key使用变量代替 let key aa let data key value 普通 的对象类型数据中 直接用变量名填写key 最后 key会变成变成变量名的字符串 let data key value 使用中括号 以后 就会将
  • 实现点击img图片标签触发上传文件input按钮

    点击图片上传文件 简单有效 在网上找的一些文章都是A抄B B抄C 还都没啥用 自己蠢了 其实很简单 记录一下 Html 代码 div style width 30 margin left 3 height 1 img src images
  • Kendo UI开发教程(7): Kendo UI 模板概述

    Kendo UI 框架提供了一个易用 高性能的JavaScript模板引擎 通过模板可以创建一个HTML片段然后可以和JavaScript数据合并成最终的HTML元素 Kendo 模板侧重于UI显示 支持关键的模板功能 着重于性能而不是语法
  • 并发编程系列之线程的启动终止

    前言 上节我们对线程有了个基本的概念和认识 从线程状态转变过程我们也已经知道了线程通过调用start方法进行启动 直到run方法执行线程结束 今天我们就来详细的说说启动和终止线程的细节 OK 让我们开始今天的并发之旅吧 创建线程 在使用一个
  • 云解析DNS“免费版”与“付费版”的功能对比!新手引导

    阿里云域名DNS解析是免费的 阿里云云解析DNS是付费的 那么同样是DNS解析免费版和付费版有什么区别 aliyun网分享免费版DNS和云解析DNS的区别 DNS免费版和云解析DNS付费版的区别参数分类 参数项 参数值 免费版基础配置 最低
  • 如何将电子签名透明化处理

    如何将电子签名透明化处理 1 在纸上写上自己的名字 2 用拍照设备 如手机 拍下自己的签名 3 用 WPS图片 打开图片 点击图片 将图片转为png格式保存到一个地方 图1 4 打开word 我用的是win10自带的word 点击 插入 g
  • 告诉你什么是优雅的代码(11)----html5 之XXOO棋

    项目结项后的一星期又两天后 我又有了写些优雅代码的欲望 在我的记忆中 AI 在这个领域 我已近乎白痴 剪枝与寻路两种剑法 就在我离开校园之后 连同那蓝天碧草 相忘于江湖 江湖中只有 SSH 只有 SQL 只有汽车尾气 只有路人甲 在计算机语