AI五子棋 第七步

恭喜你到达第七步!

到这一步,你对战场环境就有了充分的了解。下面我们准备打造机器大脑了。你可能已经有你自己的想法了,不过别着急,先跟着我的思路做。我会提示你解决一些基本的问题。

棋局的分析关键在于分析棋型,在五子棋中,我们仅需要考虑一条线上的棋子分布,一个点同时属于4条线,如下图红线所示,其中交点为要考察的点:

由于五子棋仅需要考虑五个棋子成为一条线的情况,我们只需要考虑要考察的点周围5个格子范围内的点。

想一想

任务 7

实现棋型算法,通过服务器的检验。

访问http://2**.2**.**.1**:9012/step_07服务器会给你一个棋盘的坐标表示(board字段),以及一系列要考察的点的坐标(coord字段),坐标之间用逗号,隔开,整体用[]包围,事实上它是一个JSON的数组。

  • 请给出每个考察点的四条线上的棋型
  • 只考虑周围5个格子的范围
  • 用.表示空白位置,x表示黑棋,o表示白棋。
  • 每个考察点返回四个表示棋型的字符串
  • 所有考察点的棋型字符串按顺序返回,其中单个考察点的棋型字符串顺序、棋型字符串中棋子的顺序不做规定
  • 返回值写入ans字段,提交到http://2**.2**.**.1**:9012/step_07

如上例中,问题为:

考察点IG的四条线上的棋型分别为

. . . o x . o . .

. . . . x o . . .

. . . . x . x . .

. . o x x x x x .

上面的棋型按照下图中标出的顺序给出,不过你可以自己选择你觉得方便的顺序。

我们最后把所有的棋型字符串用逗号隔开,依次写入ans字段。

待处理信息

{"is_success": true, "board": "ghhggggfgigjhhfhiijjfghiihigjhkhhjgkjgffhfkgjijfiejdjeheidkfkikekdlfmgmfifnf", "coord": ["nk", "ok", "bn", "ef", "lk", "im", "gb", "fd", "ha"]}

Python实现

import requests as re

def getIndex(coords):
""" 将字符下标转换为数字下标"""
"""coords y x"""
# 0行 [0]='.'--- [14]='.'[15]='\n'
# 1行 [16]='.'--- [30]='.'[31]='\n'
# 2行 [32]='.'--- [46]='.'[47]='\n'
# 15行 [240]='.'--- [254]='.'[255]='\n'
return (ord(coords[0]) - ord('a'))*16 + ord(coords[1]) - ord('a') def getLine(coord,board):
"""
获得中心点的四周点情况 返回一个字符串列表
coord[0] y 纵坐标 coord[1] x 控制横坐标
board 棋局
"""
line = ['', '' , '' , '']
i =0
""" 核心思想就是 将周围点两个坐标x,y的限制 转化为一个位置index的限制 """
while(i != 9):
if ord(coord[1])-ord('a')- 4 + i in range(0, 15) : # line[0]是横线 只需保证 横坐标在棋盘里就好
line[0] +=board[(ord(coord[0])-ord('a'))*16 + ord(coord[1])-ord('a')- 4 + i]
else:
line[0] += ' '
if ord(coord[0])-ord('a') -4 + i in range(0, 15) : # line[2]是竖线 只需保证 纵坐标在棋盘里就好
line[2] +=board[(ord(coord[0])-ord('a')- 4 + i)*16 + ord(coord[1])-ord('a')]
else:
line[2] += ' '
# - 4 + i 是从最小值上升判断 + 4 - i 是从最大值下降判断 两者没有什么不同 根据index的求法而定
if ord(coord[1])-ord('a')- 4 + i in range(0, 15) and ord(coord[0])-ord('a') -4 + i in range(0, 15) : # line[1]是\线 保证 横纵坐标都在棋盘里就好
line[1] +=board[(ord(coord[0])-ord('a')- 4 + i)*16 + ord(coord[1])-ord('a')- 4 + i]
else:
line[1] += ' '
if ord(coord[1])-ord('a') + 4 - i in range(0, 15) and ord(coord[0])-ord('a') -4 + i in range(0, 15) : # line[3]是/线 保证 横纵坐标都在棋盘里就好
line[3] +=board[(ord(coord[0])-ord('a')- 4 + i)*16 + ord(coord[1])-ord('a')+ 4 - i]
else:
line[3] += ' ' i += 1
return line getHtml = re.get("http://2**.2**.**.1**:9012/step_07/") testOrder = getHtml.json()['board'] # 命令序列
coords = getHtml.json()['coord'] # 待计算四条线的点坐标集 board = '' # 初始化棋板
for i in range(0,15):
board += '...............' + '\n' step = 0 # 步数 用于判断黑白 黑方先走 answer = '' for i in range(0, len(testOrder), 2): # i = 0 2 4 6 8 index = getIndex(testOrder[i:i+2]) # Python不允许直接修改字符串 只能用拼接的方法
if (step % 2) == 0:
board = board[0: index] + 'x' + board[index + 1:]
else:
board = board[0: index] + 'o' + board[index + 1:]
step += 1
print(board) # 展示根据命令序列生成的棋板 for coord in coords: # 开始计算
print(coord)
print(getLine(coord,board))
answer += ','.join(getLine(coord,board)) + ',' param = {
'ans' : answer[:-1]
} getHtml = re.get('http://2**.2**.**.1**:9012/step_07', params=param)
print(getHtml.text)

直接运行即可获得下一关地址

tips

这个程序的核心就在于 getline()这个函数

一开始想用一个条件(四种条件的聚合),同时执行四条线的拼接。

但是事实可能没有这么美好。

0线横线,只需要考虑横坐标在不在棋盘里即可,纵坐标根本与横线没什关系。

1线斜线,横坐标不在棋盘里,那么纵坐标一定不在棋盘里。横坐标在棋盘里,纵坐标不一定在棋盘里。具体为什么可以在棋盘上画一画。横纵坐标增长方向相同。

2线竖线,只需要考虑纵坐标在不在棋盘里即可,横坐标根本与纵线没什关系。

3线斜线,同1线判定相同,但因为斜率为负,横纵坐标的增长不是同一个方向,而是一方增大,一方减小。注意算法的不同。

加油吧少年,根据这个博客你也可以写出一个相对智能的五子棋程序,甚至更强的AI算法!

文章会随时改动,注意到博客里去看。一些网站会爬取本文章,但是可能会有出入。

https://www.cnblogs.com/asmurmur/

AI五子棋_07 落子点四周棋形获取的更多相关文章

  1. 人机ai五子棋 ——五子棋AI算法之Java实现

    人机ai五子棋 下载:chess.jar (可直接运行) 源码:https://github.com/xcr1234/chess 其实机器博弈最重要的就是打分,分数也就是权重,把棋子下到分数大的地方, ...

  2. AI五子棋需求规格说明书

    AI-Gobang AI五子棋小程序 github地址:https://github.com/holidaysss/AI-Gobang 程序简介 AlphaGo Zero在世界舞台上取得的巨大成功体现 ...

  3. AI五子棋第四周——接近尾声

    欢乐时光过得特别快~ 真是快乐的一周,就是项目进展几乎纹丝不动. 燃尽图?? (添加了背景音乐,找到了一个很好的音乐素材网站!) (添加了俩图标:重开,和音乐.) (调了一下前后端通讯,基本能通话了, ...

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

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

  5. 欢迎订阅AI科技导读微信公众号,获取人工智能的最新技术解读教程!

    微信扫一扫关注,获取最新AI技术教程!

  6. Python:游戏:五子棋之人机对战

    本文代码基于 python3.6 和 pygame1.9.4. 五子棋比起我之前写的几款游戏来说,难度提高了不少.如果是人与人对战,那么,电脑只需要判断是否赢了就可以.如果是人机对战,那你还得让电脑知 ...

  7. x01.AntWorld: An Python AI Game

    1. 学习了一下 AI 五子棋,顺手改作 19 路的棋盘,便于围棋通用.render.py 主要修改如下: # 常量部分: IMAGE_PATH = 'img/' StoneSize = 32 WID ...

  8. 技能节-AI人脸识别

    我们收到技能节项目的通知是在两周之前,项目要求做个人脸评分系统. 两周时间写一个"人脸评分系统",好像时间比较紧了,还好我们完成了~这个项目是将摄像头捕获到的包含人脸的图像传输到百 ...

  9. Seeing AI:计算机视觉十年磨一剑,打造盲人的“瑞士军刀”

    Mary Bellard(左)和AnneTaylor(右)是Seeing AI开发团队的成员,SeeingAI成果的背后是计算机视觉数十年研究的支持. 当Anne Taylor走进一个房间时,她像其 ...

  10. A星寻路算法入门(Unity实现)

    最近简单学习了一下A星寻路算法,来记录一下.还是个萌新,如果写的不好,请谅解.Unity版本:2018.3.2f1 A星寻路算法是什么 游戏开发中往往有这样的需求,让玩家控制的角色自动寻路到目标地点, ...

随机推荐

  1. 除了Ubuntu以外的Linux系统可以安装Tensorflow/Pytorch的GPU版本吗???

    废话: 平时没事有用到的Linux系统有Centos/Redhat/Ubuntu/UOS/Deepin,其中Ubuntu系统主要是用来工作生产的,UOS就是看看国家队的进展如何,Deepin就是看看民 ...

  2. jQuery Eazyui的学习和使用(二)

    既然这么优秀,我们赶紧来学学吧~ 下载地址 解压得到这些文件夹: 下面开始学习使用.(根据提供的demo学习常用基础控件的使用) 基础面板 引入对应样式文件和js文件后就可以直接使用了. 代码: &l ...

  3. keycloak~关于社区登录的过程说明

    keycloak将第三方登录(社区登录)进行了封装,大体主要会经历以下三个过程: 打开社区认证页面,输入账号密码或者扫码,完成社区上的认证 由社区进行302重定向,回到keycloak页面 keycl ...

  4. 彻底解决ROS1安装问题,一键解决远离rosdep init 和rosdep update出错

    彻底解决ROS1安装问题 相信很多小伙伴在刚入门ROS的时候就遇到ROS安装这个拦路虎. 普遍出错的环节在rosdep init 和rosdep update,由于要访问国外的站点就导致国内访问很容易 ...

  5. .netcore生命周期、消息管道

    .NET Core 的初始化过程涉及多个步骤,这些步骤从应用程序的启动开始,一直到应用程序准备好处理请求.下面是一个简化的概述,描述了 .NET Core 应用程序(特别是 ASP.NET Core ...

  6. Linux基础优化与常用软件包说明

    1.安装常用工具 1.1CentOS(7) 1.1.1 是否联网 ping qq.com 1.1.2 配置yum源(安装软件的软件仓库) 默认情况下yum下载软件的时候是从随机地址下载. 配置yum从 ...

  7. XeLaTeX 无法编译含有经过 pdfcrop 裁剪的 PDF 文件的文档

    今天在写 LaTeX 文档时踩了个大坑,我在文档里插入了一个 PDF 图片之后文档无法编译了. 于是我去掉多余代码,做了一个最小工作示例: \documentclass{article} \usepa ...

  8. 使用go+gin编写日志中间,实现自动化收集http访问信息,错误信息等,自动化生成日志文件

    1.首先在logger包下 点击查看代码 package logger import ( "fmt" "io" "net/http" &qu ...

  9. PHP转Go系列 | ThinkPHP与Gin框架之Redis延时消息队列技术实践

    大家好,我是码农先森. 我们在某宝或某多多上抢购商品时,如果只是下了订单但没有进行实际的支付,那在订单页面会有一个支付倒计时,要是过了这个时间点那么订单便会自动取消.在这样的业务场景中,一般情况下就会 ...

  10. 必应每日壁纸API封装

    简介 这个类封装了必应首页的每日壁纸查看功能,提供了查看.保存壁纸的方法,最大支持查看近8天的壁纸 使用方法 async Task Main() { try { var bing = BingWall ...