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. RabbitMq消息可靠性之回退模式 通俗易懂 超详细 【内含案例】

    RabbitMq保证消息可靠性之回退模式 介绍 生产者生产的消息没有正确的到达队列就会触发回退模式,进行二次发送 前提 完成SpringBoot 整合 RabbitMq 中的Topic通配符模式 一. ...

  2. 【CDQ分治】[P5094 [USACO04OPEN] MooFest G 加强版

    P5094 [USACO04OPEN] MooFest G 加强版 - 洛谷 | 计算机科学教育新生态 (luogu.com.cn) #include <bits/stdc++.h> us ...

  3. springboot2集成oauth2坑一(Possible CSRF detected - state parameter was required but no state could )

    码云地址:https://gitee.com/lpxs/lp-springcloud.git 有问题可以多沟通:136358344@qq.com. 刚开始用springboot1.5集成oauth2没 ...

  4. Linux查看硬件信息超强命令sar,以及可视化工具ksar

    一.概述 sar(System Activity Reporter,系统活动情况报告)是Linux下系统运行状态统计工具,可从多方面对系统的活动进行报告,包括:文件的读写情况.系统调用的使用情况.磁盘 ...

  5. Java 读取 IP 地址

    使用 InetAddress 类 可以利用 Java 自带的 InetAddress 类来检查一个字符串是否为有效的 IP 地址: import java.net.InetAddress; // 导入 ...

  6. 【Python自动化】之运用Git+jenkins集成来运行展示pytest+allure测试报告

    目录: 一.安装allure 二.生成allure报告 三.结合jenkins来集成pytest+allure 四.结合Git集成Jenkins+Pytest+Allure测试报告 五.附录 一.安装 ...

  7. 【Mac + Appium + Java1.8(一)】之Android自动化环境安装配置以及IDEA配置(附录扩展Selenium+Java自动化)

    配置环境: MacOS:10.13.6 java:1.8 IntelliJ IDEA:2018.3 Android SDK:25 Appium:1.9.1 Appium-desktop:1.7.1 j ...

  8. Session的运行机制

    浏览器通过web访问服务器,服务器的web服务开启后,第一步就是开启session,这也是session的第一阶段: session_start() 这个函数的作用:开启session,然后根据以前设 ...

  9. 传染病模型 SI

    参考了这篇写的很好的[1],讲了各种模型 因为是各种模型都是用微分方程写的,所以又去学习了一下微分方程 ,真的忘了有没有学过这个,反正一点印象也没有了. 好在[2] 这个文章又把我带回去了. SI 的 ...

  10. vim命令之多行注释

    vim常用命令之多行注释和多行删除 vim中多行注释和多行删除命令,这些命令也是经常用到的一些小技巧,可以大大提高工作效率. 1.多行注释: 1. 首先按esc进入命令行模式下,按下Ctrl + v, ...