本文实例为大家分享了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写五子棋游戏下载_python实现简单五子棋游戏相关推荐

  1. python石头剪刀布游戏编程_Python实现简单石头剪刀布游戏

    近日在学习Python的一些基础知识,觉得还是很有趣的一个一门语言!就目前的学习的一些知识,编写了一些一个简单的石头剪刀布的游戏.主要是熟悉一些Python的一些控制语句. import random ...

  2. python制作图片拼图游戏下载_Python图像处理——人物拼图游戏

    游戏介绍: 拼图游戏将一幅图片分割咸若干拼块并将它们随机打乱顺序,当将所有拼块都放回原位置时,就完成了拼图(游戏结束).本人物拼图游戏为3行3列,拼块以随机顺序排列,玩家用鼠标单击空白块四周的交换它们 ...

  3. 用python写个根据提示猜词语简单的游戏_python实现简单猜单词游戏

    本文实例为大家分享了python实现猜单词游戏的具体代码,供大家参考,具体内容如下 电脑根据单词列表随机生成一个单词,打印出这个单词长度个 ' _ ' ,玩家随机输入一个这个单词可能包含的英文字母,如 ...

  4. python写井字棋_python实现简单井字棋游戏

    #!/usr/bin/env python3 # -*- coding:utf-8 -*- u''' Created on 2019年4月13日 @author: wuluo ''' author = ...

  5. python最简单的游戏源代码_Python 练习: 简单角色游戏程序

    要求: 1.创建三个游戏人物,分别是: 苍井井,女,18,初始战斗力1000 东尼木木,男,20,初始战斗力1800 波多多,女,19,初始战斗力2500 2.游戏场景,分别: 草丛战斗,消耗200战 ...

  6. Unity3D 游戏引擎之构建简单的游戏世界(三)

    Unity3D 游戏引擎之构建简单的游戏世界 雨松MOMO原创文章如转载,请注明:转载至我的独立域名博客雨松MOMO程序研究院,原文地址:http://www.xuanyusong.com/archi ...

  7. 编写五子棋的完整python代码_python制作简单五子棋游戏

    本文实例为大家分享了python五子棋游戏的具体代码,供大家参考,具体内容如下 #五子棋 '" 矩阵做棋盘 16*16 "+" 打印棋盘 for for 游戏是否结束 开 ...

  8. python简单网格五子棋_python实现简单五子棋游戏

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

  9. python五子棋算法_python实现简单五子棋游戏

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

最新文章

  1. 求职Python开发,面试官最喜欢问的几个问题
  2. php内容管理器是什么原因,有什么好的php内容管理后台吗?打算试水接单的大三狗提问...
  3. java中连接mysql数据库_java中怎么连接mysql数据库
  4. python中三元_Python三元运算和Python函数介绍
  5. NfcA/NfcB/NfcF/NfcV/IsoDep/Ndef/Mifare/Felica/Pboc/ISOxxxx 标签格式及标准
  6. java web背景颜色表,更改表行背景颜色
  7. 【css】让img图片居中显示
  8. 为什么不发展三进制计算机,三进制计算机
  9. Kafka Spout Offset存储在Zookeeper
  10. 图片base64编码的前端展示及后端解码,编码
  11. 情人节数码好物推荐,值得入手的四款数码好物分享
  12. android+删除相片代码,android删除手机照片
  13. iOS保存图片到相册
  14. 【目标检测】YOLOv5训练工具,简化训练准备过程
  15. CODOSYS之结构化文本(ST)—— 初级篇(四)基础-数据类型
  16. 红猫linux系统下载教程,RedCat_NSS_红猫linux软路由安装使用手册
  17. 机器人 零境交错吧_电击文库零境交错新手最强角色推荐 哪个组合最厉害
  18. JAVA API1.8中文版 谷歌翻译 最准确最全的翻译版本!蓝奏下载
  19. MySQL DML数据库操作
  20. 永磁同步电机力矩控制(三):关于电机位置信号

热门文章

  1. Winform 中设置TextBox获取焦点和全选
  2. 浦发银行java开发面试_2020浦发银行面经java,面试题(附回答)
  3. 为什么中国很多优质的公司不在A股上市,却跑去美国上市?
  4. UE4 图片可见性: visible Collapsed Hidden Hit Test Invisible Self HIt Test Invisible
  5. 面试题5:从尾到头打印单链表(链表--剑指offer)
  6. 8145v5 参数_参数估计
  7. 习题3-6 纵横字谜的答案 UVa232
  8. NLP自然语言处理简介
  9. gta5虚拟服务器,画质炸裂的《GTA5》重制版,虚拟现实的混合体,堪比续作!
  10. 当产品追溯遇上区块链