AI五子棋_06 坐标表示到图形表示的算法 Python实现

AI五子棋 第六步

恭喜你到达第六步!

你已经成功实现了公钥体系最为关键的部分。现在服务器相信你就是你了,下面开始你的战斗。

五子棋的棋盘有15×15个交点,一共有225个交点,我们可以在每一个交点上放置棋子。方便起见,我们为每一个交点起一个名字。

image

在上面的图上,我们为每一行标上一个字母从A到O,每一列标上一个数字,从1到15。我们用行和列的标号表示一个交点,比如图上的白棋的坐标是G7

这种编码策略有一个问题,它是变长的,比如左上角的交点的坐标是A1有2个字符,而右上角的交点的坐标是A15有3个字符。我们把每一列也标上一个字母从A到O,这样不管是哪个交点的坐标都是两个字符了。左上角的交点的坐标是AA、右上角的交点的坐标是AO、那个白棋的坐标是GG

游戏开始前,棋盘是空的,根据规则,黑方先落子,每落一子我们就记录一下它的坐标,最后就会得到类似这样的字符串

HHJHKGIILFHJJFJJKFIFKEKHIGGILD

它对应的棋局是这样的:
image

你可以逐步跟踪它的落子顺序。

注意这里的标号和游戏中是不同的。给考生增加困扰是所有出题人的本意,才不承认是犯了错呢!image(内心OS:看图片 ... 这出题大大难不成是一位 盐甜兼备美少女?

为了保证你和服务器使用相同的棋盘约定,我们把上面的坐标形式转换为图形形式,我们用.表示空白位置,x表示黑棋,o表示白棋。那么上面的坐标表示就是这样的:

  • ...............
    ...............
    ...............
    ...............
    ...............
    ...............
    ........o......
    .......x.o.....
    .....ox.o......
    .....x.o.o.....
    ....xxxo.......
    ...x.x.........
    ...............
    ...............
    ...............

待处理信息

{"is_success": true, "questions": "ggffhggfhffgiefhfeheidehdidhghegcidfgiefcfeeeied"}

任务 6

实现从坐标表示到图形表示的算法,通过服务器的检验。

访问http://2**.2**.**.1**:9012/step_06 服务器会给你一个坐标表示,请给出每一步的棋盘图形表示,如上面的例子共有15步,其中第1步:

...............
...............
...............
...............
...............
...............
...............
.......x.......
...............
...............
...............
...............
...............
...............
...............

第2步:

...............
...............
...............
...............
...............
...............
...............
.......x.......
...............
.......o.......
...............
...............
...............
...............
...............

第3步:

...............
...............
...............
...............
...............
...............
...............
.......x.......
...............
.......o.......
......x........
...............
...............
...............
...............

第4步:

...............
...............
...............
...............
...............
...............
...............
.......x.......
........o......
.......o.......
......x........
...............
...............
...............
...............

第5步:

...............
...............
...............
...............
...............
...............
...............
.......x.......
........o......
.......o.......
......x........
.....x.........
...............
...............
...............

等等等等。

请将每一步的棋盘图形表示,按顺序写入字段ans,每步用逗号,隔开,图形表示中换行可省略。结果提交到http://2**.2**.**.1**:9012/step_06

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 int((ord(coords[0]) - ord('a'))*16 + (ord(coords[1]) - ord('a')))

getHtml = re.get("http://2**.2**.**.1**:9012/step_06/")

testOrder = getHtml.json()['questions']

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 注意Python的左闭右开规则

	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
	answer += board + ','

param = {
        'ans' : answer[:-1]
        }

getHtml = re.get('http://2**.2**.**.1**:9012/step_06', params=param)
print(getHtml.text)

直接运行即可获得答案偶。image

解题tips

类似打星星。

为什么用一维数组实现一个棋盘呢?

日后如果我们进入机器学习,或者数据处理的时候。对于单个样本的数据总是要向量化的,例如手写数字数据集,一个20×20的图片,被转化为1×400的样本数据进行训练。训练完成后还要对1×400的像素进行数据填充,补充内边距进行数据显示,变成一个1×420,或者其他形式,诸如此类。然后再将修改过的数据进行可视化显示,使用一维的一些算法,变成矩阵二维形式。

一维的算法有些难度。但一维算法更加锻炼思维,你需要考虑到更多,同时也对日后更有帮助。

当然你也可以使用二维的数组进行棋盘表示……

因为程序功能简单,这里就不重构代码,把相关功能独立变成函数了。有需求的同志们可以自己试一试。

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

文章会随时改动,注意到博客里去看。一些网站会爬取本文章,但是可能会有出入。
https://www.cnblogs.com/asmurmur/

posted @ 2021-08-24 07:24  Dba_sys  阅读(1243)  评论(0编辑  收藏  举报