python123平台作业答案循环结构棋盘放⽶_python版本五⼦棋
的实现代码
正⽂之前
大学嵌入式培养指什么前阵⼦做了个《⼈⼯智能》 的课程作业,然后写了个⼈⼯智障。。。⼤概就是个可以跟你下五⼦棋的傻⼉⼦。。。下⾯是代码和效果
正⽂
1、 摘要
bigdecimal保留两位小数乘100机器博弈是⼈⼯智能领域的重要分⽀,它的研究对象多以复杂的类智⼒游戏为主,已经得到解决的棋类游戏,⼏乎全部都应归功于机器博弈近半个世纪的发展。计算机解决问题的优势在于能把不易解析的问题,借助于现代计算机的运算速度优势枚举出所有的合理情形⽽得解;然⽽,博弈问题的复杂程度决定了它不能过度依赖机器的计算能⼒。许多待解决的或已经解决的棋类,其状态空间复杂度或博弈树复杂度量级都太过庞⼤,所以我们需要添加约束,并且采⽤合理的算法进⾏优化。
五⼦棋问题是⼈⼯智能中的⼀个经典问题。当今世界,alphago已经执围棋之⽜⽿,五⼦棋领域却鲜少有
⼈问津。本⽂根据课堂所学知识结合⽂献、博客,基于两种开发语⾔实现了⼀个智能对战的ai五⼦棋游戏平台。
本⽂所做⼯作如下:
(1) 五⼦棋界⾯实现;
(2) 智能判定棋盘⾛势;
(3) 改进了棋盘扫描⽅式;
(4) 改良了系统评分表评估⽅式;
(5) 实现了基于点评分表估值出最佳落⼦⽅式。
2、 问题描述、知识表达
2.1 问题描述
五⼦棋ai问题的最⼤问题是如何实现智能对弈,即当⼈落⼦之后,算法如何解读当前的棋盘并且对其进⾏分析解读,得到电脑⽅的最佳落⼦点。其次还有⼀个问题是如何判断胜利,这可以作为前⾯棋盘
局势判定的⼀个⼦问题,也可以看做是⼀个单独的问题,不过这个问题总体来说较为简单,所以不做详细说明。
2.2 知识表达
五⼦棋的整体知识构建包含以下部分:
(1) 棋盘局⾯表⽰法
(2) 棋局胜利判定
(3) 棋型知识库
(4) 智能博弈流程
对于问题(1),采⽤数组表⽰法。棋盘中的各交叉点有三种状态,不妨令 0表⽰空(未放置棋⼦) ,-1 表⽰有⿊⼦ ,1 表⽰有⽩⼦,数组表⽰法的基本思想是:以交叉点对应的数组索引值来表达物理位置 ,以交叉点对应的元素值表达状态(空、 ⿊⼦、 ⽩⼦)。令 v = {0 ,1 ,-1} ,棋盘 的第 i 个交叉点的状态 si ∈v ,任何棋局都可以表⽰成⼀个 n ×n 的⼆元组。
对于问题(2), 采⽤数组表⽰法时,想知道任意两个元素 si 和sj 是否共线,要通过 i 和 j 之间的数值规律来判断。从这⽅⾯看,数组表⽰法是⼀种原始、低效的表⽰⽅法,但是对于评分表算法来说其性能损失是可以接受的。要判断是否有⼀⽅已经胜利,只需要对整个棋盘判定当前落⼦点的纵、横、正斜、反斜四个⽅向的最长延伸出四个位置看是否能连成⼀条同⾊直线即可。具体的操作可以视为:从落⼦点出发,向两个⽅向延伸,如果遇到同⾊,那么计数器加⼀,遇到⾮同⾊(空⽩或者异⾊)则停⽌在该⽅向的延伸,⼀个计数器记下该⽅向上的两头的连续同⾊棋⼦数。等到四个⽅向都探索完毕,如果四个计数器中有⼀个计数器达到了5,那么即可判断出已经有五⼦连珠了,此局结束。
问题(3)棋型知识库主要包括各种既定的棋盘形式,有如下⼏种:
² 活四 :有两个连五点(即有两个点可以形成五),图中⽩点即为连五点。当活四出现的时候,整个局势已经⽆法阻⽌连五了,活四的归属⽅⼀定能取得胜利;
² 冲四 :有⼀个连五点,如下⾯三图,均为冲四棋型。图中⽩点为连五点。 相对⽐活四来说,冲四的威胁性就⼩了很多,因为这个时候,只要跟着防守在那个唯⼀的连五点上,冲四就没法形成连五。
² 活三 :可以形成活四的三,如下图,代表两种最基本的活三棋型。图中⽩点为活四点。活三棋型是进攻中最常见的⼀种,因为活三之后,如果对⽅不以理会,将可以下⼀⼿将活三变成活四,⽽活四是⽆法防守的。所以,⾯对活三的时候,需要⾮常谨慎对待。在没有更好的进攻⼿段的情况下,必须对其进⾏防守,以防⽌其形成可怕的活四棋型。
² 眠三: 只能够形成冲四的三,如下各图,分别代表最基础的六种眠三形状。图中⽩点代表冲四点。眠三的棋型与活三的棋型相⽐,危险系数下降不少,因为眠三棋型即使不去防守,下⼀⼿它也只能形成冲四,⽽对于单纯的冲四棋型,是可以很简单的防守住的。
² 活⼆ :能够形成活三的⼆,如下图,是三种基本的活⼆棋型。图中⽩点为活三点。
² 眠⼆ :能够形成眠三的⼆。图中四个为最基本的眠⼆棋型,细⼼且喜欢思考的同学会根据眠三介绍中的图2-13到与下列四个基本眠⼆棋型都不⼀样的眠⼆。图中⽩点为眠三点。
对于上述的棋型,我们主要考虑的是活四、冲四、活三、眠三这⼏种主要的进攻棋型的防守与构成,整体棋型遵从以下原则:优先考虑数⽬,同等数⽬的情况下考虑是活是眠。评分表算法的设计整体偏向于防守。
对于问题(4),当下棋型的评估分析,算法严格遵从以下流程:
当⼈类⽅落下⼀⼦,算法启动,扫描全局,得到⼈类棋⼦的集合和电脑棋⼦的集合。全局扫描之后,
对当前局势进⾏排序、计算。对每个集合的每个空⽩点位置打分,打分依据是根据这个点周围四个⽅向上的同⾊连续棋⼦的数量。按照这些最后得到的评分,得出最⼤值。得到⼈类⽅和电脑⽅的两个最⼤值之后,进⾏⽐较,如果⼈类⽅局势较好(分数较⾼),则算法将下⼀次落⼦位置设置为⼈类⽅得分最⾼的点,尽⼒降低⼈类⽅的下⼀步得分;如果电脑⽅的分数较⾼,那么则直接在使得分数最⾼的点落⼦即可。
3、 开发⼯具
本次课程设计,⼀共设计了两个版本,⼀个java版本,为19x19的棋盘,配备简单的消息提⽰,基于awt实现gui,开发⼯具intellij idea 2018.1
另⼀个版本是使⽤python设计,核⼼算法相同,但是受限于图⽚源⽂件,为15x15棋盘,基于pygame实现gui,开发⼯具是:jetbrains pycharm 2018.2.4 x64
4、 代码实现
from time import sleep
import pygame
from pygame.locals import *
from random import randint
level = 15
grade = 10
max = 1008611
def scan(chesspad, color):
shape = [[[0 for high in range(5)] for col in range(15)] for row in range(15)]
# 扫描每⼀个点,然后在空⽩的点每⼀个⽅向上做出价值评估!!
for i in range(15):
for j in range(15):
# 如果此处为空 那么就可以开始扫描周边
if chesspad[i][j] == 0:
m = i
n = j
# 如果上⽅跟当前传⼊的颜⾊参数⼀致,那么加分到0位!
while n - 1 >= 0 and chesspad[m][n - 1] == color:
n -= 1
oracle数据库增删改语句shape[i][j][0] += grade
if n-1>=0 and chesspad[m][n - 1] == 0:
shape[i][j][0] += 1
if n-1 >= 0 and chesspad[m][n - 1] == -color:
shape[i][j][0] -= 2
m = i
n = j
# 如果下⽅跟当前传⼊的颜⾊参数⼀致,那么加分到0位!while (n + 1 < level and chesspad[m][n + 1] == color): n += 1
shape[i][j][0] += grade
if n + 1 < level and chesspad[m][n + 1] == 0:配置网络yum源步骤
shape[i][j][0] += 1
if n + 1 < level and chesspad[m][n + 1] == -color: shape[i][j][0] -= 2
m = i
n = j
# 如果左边跟当前传⼊的颜⾊参数⼀致,那么加分到1位!while (m - 1 >= 0 and chesspad[m - 1][n] == color):
m -= 1
shape[i][j][1] += grade
if m - 1 >= 0 and chesspad[m - 1][n] == 0:
shape[i][j][1] += 1
if m - 1 >= 0 and chesspad[m - 1][n] == -color:
shape[i][j][1] -= 2
m = i
n = jpython基础代码作业
# 如果右边跟当前传⼊的颜⾊参数⼀致,那么加分到1位!while (m + 1 < level and chesspad[m + 1][n] == color): m += 1
shape[i][j][1] += grade
if m + 1 < level and chesspad[m + 1][n] == 0:
shape[i][j][1] += 1
if m + 1 < level and chesspad[m + 1][n] == -color:
shape[i][j][1] -= 2
m = i
n = j
# 如果左下⽅跟当前传⼊的颜⾊参数⼀致,那么加分到2位!
while (m - 1 >= 0 and n + 1 < level and chesspad[m - 1][n + 1] == color): m -= 1
n += 1
shape[i][j][2] += grade
if m - 1 >= 0 and n + 1 < level and chesspad[m - 1][n + 1] == 0:
shape[i][j][2] += 1
if m - 1 >= 0 and n + 1 < level and chesspad[m - 1][n + 1] == -color: shape[i][j][2] -= 2
m = i
n = j
# 如果右上⽅跟当前传⼊的颜⾊参数⼀致,那么加分到2位!
while (m + 1 < level and n - 1 >= 0 and chesspad[m + 1][n - 1] == color): m += 1
n -= 1
shape[i][j][2] += grade
if m + 1 < level and n - 1 >= 0 and chesspad[m + 1][n - 1] == 0:
shape[i][j][2] += 1
if m + 1 < level and n - 1 >= 0 and chesspad[m + 1][n - 1] == -color: shape[i][j][2] -= 2
m = i
n = j
# 如果左上⽅跟当前传⼊的颜⾊参数⼀致,那么加分到3位!
while (m - 1 >= 0 and n - 1 >= 0 and chesspad[m - 1][n - 1] == color):
m -= 1
n -= 1
shape[i][j][3] += grade
if m - 1 >= 0 and n - 1 >= 0 and chesspad[m - 1][n - 1] == 0:
shape[i][j][3] += 1
if m - 1 >= 0 and n - 1 >= 0 and chesspad[m - 1][n - 1] == -color:
吾爱免费源码
shape[i][j][3] -= 2

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。