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/


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM