没有合适的资源?快使用搜索试试~ 我知道了~
首页python使用minimax算法实现五子棋
资源详情
资源评论
资源推荐
python使用使用minimax算法实现五子棋算法实现五子棋
主要为大家详细介绍了python使用minimax算法实现五子棋,具有一定的参考价值,感兴趣的小伙伴们可以参考
一下
这是一个命令行环境的五子棋程序。使用了minimax算法。
除了百度各个棋型的打分方式,所有代码皆为本人所撸。本程序结构与之前的井字棋、黑白棋一模一样。
有一点小问题,没时间弄了,就这样吧。
一、效果图一、效果图
(略)
二、完整代码二、完整代码
from functools import wraps
import time
import csv
'''
五子棋 Gobang
作者:hhh5460
时间:20181213
'''
#1.初始化棋盘
#------------
def init_board():
'''
初始化棋盘
棋盘规格 15*15
如下所示:
board = [[. . . . . . . . . . . . . . .],
[. . . . . . . . . . . . . . .],
[. . . . . . . . . . . . . . .],
[. . . . . . . . . . . . . . .],
[. . . . . . . . . . . . . . .],
[. . . . . . . . . . . . . . .],
[. . . . . . . . . . . . . . .],
[. . . . . . . . . . . . . . .],
[. . . . . . . . . . . . . . .],
[. . . . . . . . . . . . . . .],
[. . . . . . . . . . . . . . .],
[. . . . . . . . . . . . . . .],
[. . . . . . . . . . . . . . .],
[. . . . . . . . . . . . . . .],
[. . . . . . . . . . . . . . .]]
其中:
. – 未被占用
X – 被黑棋占用
O – 被白棋占用
'''
print('Init board...')
time.sleep(0.5)
n = 15
board = [['.' for _ in range(n)] for _ in range(n)]
return board
#2.确定玩家,执黑先走
#--------------------
def get_player():
'''
人类玩家选择棋子颜色(黑'X'先走)
'''
humancolor = input("Enter your color. (ex. 'X' or 'O'):").upper()
computercolor = ['X', 'O'][humancolor == 'X']
return computercolor, humancolor
#3.进入循环
#----------
#4.打印棋盘、提示走子
#------------------------------
def print_board(board): #ok
'''
打印棋盘、比分
开局:
1 2 3 4 5 6 7 8 9 a b c d e f
1 . . . . . . . . . . . . . . .
2 . . . . . . . . . . . . . . .
3 . . . . . . . . . . . . . . .
4 . . . . . . . . . . . . . . .
5 . . . . . . . . . . . . . . .
6 . . . . . . . . . . . . . . .
7 . . . . . . . . . . . . . . .
8 . . . . . . . . . . . . . . .
9 . . . . . . . . . . . . . . .
a . . . . . . . . . . . . . . .
b . . . . . . . . . . . . . . .
c . . . . . . . . . . . . . . .
d . . . . . . . . . . . . . . .
e . . . . . . . . . . . . . . .
f . . . . . . . . . . . . . . .
'''
axises = list('123456789abcdef')
print(' ', ' '.join(axises))
for i, v in enumerate(axises):
print(v, ' '.join(board[i]))
#5.思考走法、放弃终止
#--------------------
def get_human_move(board, color): #ok
'''
取人类玩家走法
'''
giveup = True # 放弃标志
legal_moves = _get_legal_moves(board, color)
#print(','.join([translate_move(move) for move in legal_moves]), len(legal_moves))
while True:
_move = input("Enter your move.(ex.'cd' means row=c col=d): ").lower()
move = translate_move(_move)
if move in legal_moves:
giveup = False # 不放弃
break
return move, giveup
def _get_all_lianxin(board, move, color): #ok
'''
取当前点位落子后连星
1.按照棋盘两连、三连、四连的个数 double triple quadra penta
'''
n = len(board)
uncolor = ['X', 'O'][color == 'X'] # 反色
lianxin = [] # 连星数,len(lianxin) == 4
directions = ((0,1),(1,0),(1,1),(1,-1)) # 东, 南, 东南, 西南
for direction in directions:
dr, dc = direction # 步幅
#r, c = move # 起点
count = 1 # 连星数,算上起点(落子位置)
jump_count = [0, 0] # 顺、反方向跳开一个空格之后的连星数
jump_flag = [False, False] # 顺、反方向跳开一个空格的标志
block = [False, False] # 顺、反方向是否堵死
#name = ['','']
for i,v in enumerate([1, -1]): # 顺、反方向分别用1、-1表示
dr, dc = v*dr, v*dc # 步幅
r, c = move[0]+dr, move[1]+dc # 先走一步
while True:
if not _is_on_board(board, [r, c]) or board[r][c] == uncolor: # 不在棋盘内,或对方棋子
block[i] = True # 被堵死
break
if board[r][c] == '.': # 为空
if not _is_on_board(board, [r+dr, c+dc]) or board[r+dr][c+dc] != color: # 且下一格,不在棋盘内、或者非己方棋子
break
if jump_flag[i] == True: # 前面已经跳了一格了,则终止
break # 能力所限,不考虑又跳一格的情况!!!
else:
jump_flag[i] = True
elif board[r][c] == color:
if jump_flag[i] == True:
jump_count[i] += 1
else:
count += 1
r, c = r + dr, c + dc # 步进
lianxin.append([count, jump_count, block])
return lianxin
def _move_score(board, move): #ok
'''
对该落子位置“打分”
这个逻辑太复杂了,代码又长又臭!!暂时不考虑简化
棋型分值:
0.活五 +100000
1.死五 +100000
2.活四 +10000
3.死四 +1000
4.活三 +1000
5.死三 +100
6.活二 +100
7.死二 +10
8.活一 +10
9.死一 +2
特别说明:
10.跳N 两边棋型分相加 * 上一级分值的20% ?商榷
lianxin == [[2,[0,0],[True,False]],
[1,[0,0],[True,False]],
[3,[1,0],[False,False]],
[3,[2,1],[True,False]]]
'''
# 死一, 活一, 死二, 活二, 死三, 活三, 死四, 活四, 死五, 活五
scores = [ 2, 10, 10, 100, 100, 1000, 1000, 10000,100000,100000]
sum_score = 0
for color in ['X','O']:
for lianxin in _get_all_lianxin(board, move, color):
count, jump_count, block = lianxin
if jump_count[0] > 0 and jump_count[1] > 0: # 情况一:两边跳
if block[0] == True and block[1] == True:
if count + jump_count[0] + jump_count[1] + 2 < 5: continue
else:
# 这边跳了
if block[0] == True: # 有跳的,先把分数加了再说(查表加分)
sum_score += scores[jump_count[0]*2-2] # 加死的分
sum_score += min(scores[(jump_count[0]+count)*2-2] * 0.2, 200) # 上一级的20%
else:
sum_score += scores[jump_count[0]*2-1] # 加活的分
sum_score += min(scores[(jump_count[0]+count)*2-1] * 0.2, 200) # 上一级的20%
# 这边也跳了
if block[1] == True: # 有跳的,先把分数加了再说(查表加分)
sum_score += scores[jump_count[1]*2-2] # 加死的分
sum_score += min(scores[(jump_count[1]+count)*2-2] * 0.2, 200) # 上一级的20%
else:
sum_score += scores[jump_count[1]*2-1] # 加活的分
sum_score += min(scores[(jump_count[1]+count)*2-1] * 0.2, 200) # 上一级的20%
# 中间
sum_score += scores[count*2-1] # 中间加活的分
elif jump_count[0] > 0 and jump_count[1] == 0: # 情况二:有一边跳
if block[0] == True and block[1] == True:
if count + jump_count[0] + jump_count[1] + 1 < 5: continue
剩余12页未读,继续阅读
weixin_38530846
- 粉丝: 5
- 资源: 930
上传资源 快速赚钱
- 我的内容管理 收起
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
会员权益专享
最新资源
- RTL8188FU-Linux-v5.7.4.2-36687.20200602.tar(20765).gz
- c++校园超市商品信息管理系统课程设计说明书(含源代码) (2).pdf
- 建筑供配电系统相关课件.pptx
- 企业管理规章制度及管理模式.doc
- vb打开摄像头.doc
- 云计算-可信计算中认证协议改进方案.pdf
- [详细完整版]单片机编程4.ppt
- c语言常用算法.pdf
- c++经典程序代码大全.pdf
- 单片机数字时钟资料.doc
- 11项目管理前沿1.0.pptx
- 基于ssm的“魅力”繁峙宣传网站的设计与实现论文.doc
- 智慧交通综合解决方案.pptx
- 建筑防潮设计-PowerPointPresentati.pptx
- SPC统计过程控制程序.pptx
- SPC统计方法基础知识.pptx
资源上传下载、课程学习等过程中有任何疑问或建议,欢迎提出宝贵意见哦~我们会及时处理!
点击此处反馈
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功
评论0