侯体宗的博客
  • 首页
  • Hyperf版
  • beego仿版
  • 人生(杂谈)
  • 技术
  • 关于我
  • 更多分类
    • 文件下载
    • 文字修仙
    • 中国象棋ai
    • 群聊
    • 九宫格抽奖
    • 拼图
    • 消消乐
    • 相册

python实现简单五子棋游戏

Python  /  管理员 发布于 7年前   147

本文实例为大家分享了python实现简单五子棋游戏的具体代码,供大家参考,具体内容如下

from graphics import *from math import *import numpy as np  def ai(): """ AI计算落子位置 """ maxmin(True, DEPTH, -99999999, 99999999) return next_point[0], next_point[1]  def maxmin(is_ai, depth, alpha, beta): """ 负值极大算法搜索 alpha + beta剪枝 """ # 游戏是否结束 | | 探索的递归深度是否到边界 if game_win(list1) or game_win(list2) or depth == 0:  return evaluation(is_ai)  blank_list = list(set(list_all).difference(set(list3))) order(blank_list) # 搜索顺序排序 提高剪枝效率 # 遍历每一个候选步 for next_step in blank_list[0:60]:   # 如果要评估的位置没有相邻的子, 则不去评估 减少计算  if not has_neightnor(next_step):   continue   if is_ai:   list1.append(next_step)  else:   list2.append(next_step)  list3.append(next_step)   value = -maxmin(not is_ai, depth - 1, -beta, -alpha)  if is_ai:   list1.remove(next_step)  else:   list2.remove(next_step)  list3.remove(next_step)   if value > alpha:   if depth == DEPTH:    next_point[0] = next_step[0]    next_point[1] = next_step[1]   # alpha + beta剪枝点   if value >= beta:    return beta   alpha = value return alpha  def order(blank_list): """ 离最后落子的邻居位置最有可能是最优点 计算最后落子点的8个方向邻居节点 若未落子,则插入到blank列表的最前端 :param blank_list: 未落子节点集合 :return: blank_list """ last_pt = list3[-1] # for item in blank_list: for i in range(-1, 2):  for j in range(-1, 2):   if i == 0 and j == 0:    continue   if (last_pt[0] + i, last_pt[1] + j) in blank_list:    blank_list.remove((last_pt[0] + i, last_pt[1] + j))    blank_list.insert(0, (last_pt[0] + i, last_pt[1] + j))  def has_neightnor(pt): """ 判断是否有邻居节点 :param pt: 待评测节点 :return: """ for i in range(-1, 2):  for j in range(-1, 2):   if i == 0 and j == 0:    continue   if (pt[0] + i, pt[1] + j) in list3:    return True return False  def evaluation(is_ai): """ 评估函数 """ if is_ai:  my_list = list1  enemy_list = list2 else:  my_list = list2  enemy_list = list1 # 算自己的得分 score_all_arr = [] # 得分形状的位置 用于计算如果有相交 得分翻倍 my_score = 0 for pt in my_list:  m = pt[0]  n = pt[1]  my_score += cal_score(m, n, 0, 1, enemy_list, my_list, score_all_arr)  my_score += cal_score(m, n, 1, 0, enemy_list, my_list, score_all_arr)  my_score += cal_score(m, n, 1, 1, enemy_list, my_list, score_all_arr)  my_score += cal_score(m, n, -1, 1, enemy_list, my_list, score_all_arr) # 算敌人的得分, 并减去 score_all_arr_enemy = [] enemy_score = 0 for pt in enemy_list:  m = pt[0]  n = pt[1]  enemy_score += cal_score(m, n, 0, 1, my_list, enemy_list, score_all_arr_enemy)  enemy_score += cal_score(m, n, 1, 0, my_list, enemy_list, score_all_arr_enemy)  enemy_score += cal_score(m, n, 1, 1, my_list, enemy_list, score_all_arr_enemy)  enemy_score += cal_score(m, n, -1, 1, my_list, enemy_list, score_all_arr_enemy)  total_score = my_score - enemy_score * 0.1 return total_score  def cal_score(m, n, x_decrict, y_derice, enemy_list, my_list, score_all_arr): """ 每个方向上的分值计算 :param m: :param n: :param x_decrict: :param y_derice: :param enemy_list: :param my_list: :param score_all_arr: :return: """ add_score = 0 # 加分项 # 在一个方向上, 只取最大的得分项 max_score_shape = (0, None)  # 如果此方向上,该点已经有得分形状,不重复计算 for item in score_all_arr:  for pt in item[1]:   if m == pt[0] and n == pt[1] and x_decrict == item[2][0] and y_derice == item[2][1]:    return 0  # 在落子点 左右方向上循环查找得分形状 for offset in range(-5, 1):  # offset = -2  pos = []  for i in range(0, 6):   if (m + (i + offset) * x_decrict, n + (i + offset) * y_derice) in enemy_list:    pos.append(2)   elif (m + (i + offset) * x_decrict, n + (i + offset) * y_derice) in my_list:    pos.append(1)   else:    pos.append(0)  tmp_shap5 = (pos[0], pos[1], pos[2], pos[3], pos[4])  tmp_shap6 = (pos[0], pos[1], pos[2], pos[3], pos[4], pos[5])   for (score, shape) in shape_score:   if tmp_shap5 == shape or tmp_shap6 == shape:    if score > max_score_shape[0]:     max_score_shape = (score, ((m + (0 + offset) * x_decrict, n + (0 + offset) * y_derice),(m + (1 + offset) * x_decrict, n + (1 + offset) * y_derice),(m + (2 + offset) * x_decrict, n + (2 + offset) * y_derice),(m + (3 + offset) * x_decrict, n + (3 + offset) * y_derice),(m + (4 + offset) * x_decrict, n + (4 + offset) * y_derice)),          (x_decrict, y_derice))  # 计算两个形状相交, 如两个3活 相交, 得分增加 一个子的除外 if max_score_shape[1] is not None:  for item in score_all_arr:   for pt1 in item[1]:    for pt2 in max_score_shape[1]:     if pt1 == pt2 and max_score_shape[0] > 10 and item[0] > 10:      add_score += item[0] + max_score_shape[0]   score_all_arr.append(max_score_shape)  return add_score + max_score_shape[0]  def game_win(list): """ 胜利条件判断 """ # for m in range(COLUMN): #  for n in range(ROW): #   if n < ROW - 4 and (m, n) in list and (m, n + 1) in list and (m, n + 2) in list and ( #     m, n + 3) in list and (m, n + 4) in list: #    return True #   elif m < ROW - 4 and (m, n) in list and (m + 1, n) in list and (m + 2, n) in list and ( #     m + 3, n) in list and (m + 4, n) in list: #    return True #   elif m < ROW - 4 and n < ROW - 4 and (m, n) in list and (m + 1, n + 1) in list and ( #     m + 2, n + 2) in list and (m + 3, n + 3) in list and (m + 4, n + 4) in list: #    return True #   elif m < ROW - 4 and n > 3 and (m, n) in list and (m + 1, n - 1) in list and ( #     m + 2, n - 2) in list and (m + 3, n - 3) in list and (m + 4, n - 4) in list: #    return True return False  def draw_window(): """ 绘制棋盘 """ # 绘制画板 win = GraphWin("五子棋", GRAPH_HEIGHT, GRAPH_WIDTH) win.setBackground("gray") # 绘制列 i1 = 0 while i1 <= GRID_WIDTH * COLUMN:  i1 = i1 + GRID_WIDTH  l = Line(Point(i1, GRID_WIDTH), Point(i1, GRID_WIDTH * COLUMN))  l.draw(win) # 绘制行 i2 = 0 while i2 <= GRID_WIDTH * ROW:  i2 = i2 + GRID_WIDTH  l = Line(Point(GRID_WIDTH, i2), Point(GRID_WIDTH * ROW, i2))  l.draw(win) return win  def main(): """ 程序循环 :return: """ mode = int(input("先手 AI先手 ? 1 0 \n")) # 绘制棋盘 win = draw_window() # 添加棋盘所有点 for i in range(COLUMN + 1):  for j in range(ROW + 1):   list_all.append((i, j)) # 循环条件 g = 0 change = 0 # 开始循环 while g == 0:  # AI  if change % 2 == mode:   # AI先手 走天元   if change == 0:    pos = (6, 6)   else:    pos = ai()   # 添加落子   list1.append(pos)   list3.append(pos)   # 绘制白棋   piece = Circle(Point(GRID_WIDTH * (pos[0]), GRID_WIDTH * (pos[1])), 12)   piece.setFill('white')   piece.draw(win)   # AI胜利   if game_win(list1):    message = Text(Point(GRAPH_WIDTH / 2, GRID_WIDTH / 2), "AI获胜")    message.draw(win)    g = 1   change = change + 1   # User  else:   p2 = win.getMouse()   x = round((p2.getX()) / GRID_WIDTH)   y = round((p2.getY()) / GRID_WIDTH)    # 若点未被选取过   if not (x, y) in list3:    # 添加落子    list2.append((x, y))    list3.append((x, y))    # 绘制黑棋    piece = Circle(Point(GRID_WIDTH * x, GRID_WIDTH * y), 12)    piece.setFill('black')    piece.draw(win)    # 胜利    if game_win(list2):     message = Text(Point(GRAPH_WIDTH / 2, GRID_WIDTH / 2), "人类胜利")     message.draw(win)     g = 1    change = change + 1  message = Text(Point(GRAPH_WIDTH / 2 + 100, GRID_WIDTH / 2), "游戏结束") message.draw(win) win.getMouse() win.close()  if __name__ == '__main__': GRID_WIDTH = 40 COLUMN = 11 ROW = 11 GRAPH_WIDTH = GRID_WIDTH * (ROW + 1) GRAPH_HEIGHT = GRID_WIDTH * (COLUMN + 1)  list1 = [] # AI list2 = [] # human list3 = [] # all list_all = [] # 整个棋盘的点 next_point = [0, 0] # AI下一步最应该下的位置  mode=int(input("请选择: 快不准 或 慢却准 ? 1 : 0 \n")) if mode==1:  DEPTH=1 elif mode==0:  DEPTH=3 else:  DEPTH=3  shape_score = [(50, (0, 1, 1, 0, 0)),     (50, (0, 0, 1, 1, 0)),     (200, (1, 1, 0, 1, 0)),     (500, (0, 0, 1, 1, 1)),     (500, (1, 1, 1, 0, 0)),     (5000, (0, 1, 1, 1, 0)),     (5000, (0, 1, 0, 1, 1, 0)),     (5000, (0, 1, 1, 0, 1, 0)),     (5000, (1, 1, 1, 0, 1)),     (5000, (1, 1, 0, 1, 1)),     (5000, (1, 0, 1, 1, 1)),     (5000, (1, 1, 1, 1, 0)),     (5000, (0, 1, 1, 1, 1)),     (50000, (0, 1, 1, 1, 1, 0)),     (99999999, (1, 1, 1, 1, 1))] main()

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持。


  • 上一条:
    Python自动化运维之Ansible定义主机与组规则操作详解
    下一条:
    Python基础学习之函数方法实例详解
  • 昵称:

    邮箱:

    0条评论 (评论内容有缓存机制,请悉知!)
    最新最热
    • 分类目录
    • 人生(杂谈)
    • 技术
    • linux
    • Java
    • php
    • 框架(架构)
    • 前端
    • ThinkPHP
    • 数据库
    • 微信(小程序)
    • Laravel
    • Redis
    • Docker
    • Go
    • swoole
    • Windows
    • Python
    • 苹果(mac/ios)
    • 相关文章
    • 在python语言中Flask框架的学习及简单功能示例(0个评论)
    • 在Python语言中实现GUI全屏倒计时代码示例(0个评论)
    • Python + zipfile库实现zip文件解压自动化脚本示例(0个评论)
    • python爬虫BeautifulSoup快速抓取网站图片(1个评论)
    • vscode 配置 python3开发环境的方法(0个评论)
    • 近期文章
    • 在windows10中升级go版本至1.24后LiteIDE的Ctrl+左击无法跳转问题解决方案(0个评论)
    • 智能合约Solidity学习CryptoZombie第四课:僵尸作战系统(0个评论)
    • 智能合约Solidity学习CryptoZombie第三课:组建僵尸军队(高级Solidity理论)(0个评论)
    • 智能合约Solidity学习CryptoZombie第二课:让你的僵尸猎食(0个评论)
    • 智能合约Solidity学习CryptoZombie第一课:生成一只你的僵尸(0个评论)
    • 在go中实现一个常用的先进先出的缓存淘汰算法示例代码(0个评论)
    • 在go+gin中使用"github.com/skip2/go-qrcode"实现url转二维码功能(0个评论)
    • 在go语言中使用api.geonames.org接口实现根据国际邮政编码获取地址信息功能(1个评论)
    • 在go语言中使用github.com/signintech/gopdf实现生成pdf分页文件功能(0个评论)
    • gmail发邮件报错:534 5.7.9 Application-specific password required...解决方案(0个评论)
    • 近期评论
    • 122 在

      学历:一种延缓就业设计,生活需求下的权衡之选中评论 工作几年后,报名考研了,到现在还没认真学习备考,迷茫中。作为一名北漂互联网打工人..
    • 123 在

      Clash for Windows作者删库跑路了,github已404中评论 按理说只要你在国内,所有的流量进出都在监控范围内,不管你怎么隐藏也没用,想搞你分..
    • 原梓番博客 在

      在Laravel框架中使用模型Model分表最简单的方法中评论 好久好久都没看友情链接申请了,今天刚看,已经添加。..
    • 博主 在

      佛跳墙vpn软件不会用?上不了网?佛跳墙vpn常见问题以及解决办法中评论 @1111老铁这个不行了,可以看看近期评论的其他文章..
    • 1111 在

      佛跳墙vpn软件不会用?上不了网?佛跳墙vpn常见问题以及解决办法中评论 网站不能打开,博主百忙中能否发个APP下载链接,佛跳墙或极光..
    • 2016-10
    • 2016-11
    • 2018-04
    • 2020-03
    • 2020-04
    • 2020-05
    • 2020-06
    • 2022-01
    • 2023-07
    • 2023-10
    Top

    Copyright·© 2019 侯体宗版权所有· 粤ICP备20027696号 PHP交流群

    侯体宗的博客