当前位置: 首页 > article >正文

用Python和Pygame从零打造一个能‘思考’的五子棋AI(附完整代码)

用Python和Pygame从零打造一个能‘思考’的五子棋AI附完整代码五子棋作为中国传统棋类游戏的代表其规则简单却蕴含深奥的策略思维。当我们将这个古老游戏与现代编程技术结合时最令人着迷的部分莫过于赋予计算机思考能力——让它不再是随机落子而是能像人类棋手一样分析局势、制定策略。本文将带你用Python和Pygame构建一个具备基础决策能力的五子棋AI完整代码可直接运行测试。1. 游戏基础框架搭建任何游戏开发的第一步都是建立基础框架。对于五子棋而言我们需要处理三个核心要素棋盘绘制、棋子渲染和游戏状态管理。import pygame import numpy as np # 初始化游戏 def init_game(): pygame.init() screen pygame.display.set_mode((615, 615)) pygame.display.set_caption(五子棋AI对战) screen.fill(#DD954F) # 棋盘底色 # 绘制19x19的棋盘网格 for i in range(19): pygame.draw.line(screen, #000000, (20, 20 32*i), (595, 20 32*i), 1) pygame.draw.line(screen, #000000, (20 32*i, 20), (20 32*i, 595), 1) # 绘制星位标记 star_points [(3,3), (9,3), (15,3), (3,9), (9,9), (15,9), (3,15), (9,15), (15,15)] for x, y in star_points: pygame.draw.circle(screen, #000000, [20 32*x, 20 32*y], 5) return screen这段代码创建了一个标准的19路五子棋棋盘。我们使用Pygame的绘图功能绘制网格线和九个星位点这是专业五子棋比赛的标配布局。numpy数组将用于记录棋盘状态# 0-空 1-黑棋 2-白棋 board_state np.zeros((19, 19), dtypeint)2. 游戏核心逻辑实现2.1 棋子绘制与落子判定五子棋的棋子需要精致的视觉效果。我们通过绘制渐变色的同心圆来模拟立体感def draw_stone(surface, x, y, color): 绘制带立体效果的棋子 pos_x, pos_y 20 32*x, 20 32*y if color black: for i in range(50, 0, -1): alpha 255 * (i/50) pygame.draw.circle(surface, (alpha, alpha, alpha), (pos_x, pos_y), 15 * (i/50)) else: for i in range(50, 0, -1): alpha 200 55 * (i/50) pygame.draw.circle(surface, (alpha, alpha, alpha), (pos_x, pos_y), 15 * (i/50)) pygame.display.update()落子逻辑需要处理鼠标点击位置到棋盘坐标的转换def get_board_position(mouse_pos): 将鼠标坐标转换为棋盘坐标 x, y mouse_pos board_x round((x - 20) / 32) board_y round((y - 20) / 32) return np.clip(board_x, 0, 18), np.clip(board_y, 0, 18)2.2 胜负判定系统五子棋的胜负判定需要检查四个方向水平、垂直、两个对角线是否有五连珠def check_win(board, x, y, player): 检查指定位置是否形成五连珠 directions [(1,0), (0,1), (1,1), (1,-1)] # 四个检查方向 for dx, dy in directions: count 1 # 当前棋子已算1 # 正向检查 nx, ny x dx, y dy while 0 nx 19 and 0 ny 19 and board[nx, ny] player: count 1 nx dx ny dy # 反向检查 nx, ny x - dx, y - dy while 0 nx 19 and 0 ny 19 and board[nx, ny] player: count 1 nx - dx ny - dy if count 5: return True return False3. AI决策系统设计3.1 模式匹配策略库我们的AI将基于预定义的模式库进行决策。每种模式都有相应的权重AI会优先匹配高权重模式# 模式定义0-空 1-对手棋 2-AI棋 3-建议落子点 PATTERNS [ # 防守模式阻止对手形成五连 ([1,1,1,1,3], 1000), # 对手四连缺一 ([1,1,1,3,1], 1000), ([3,1,1,1,1], 1000), ([1,1,3,1,1], 1000), # 进攻模式形成自己的四连 ([2,2,2,2,3], 900), # 自己的四连缺一 ([2,2,2,3,2], 900), ([3,2,2,2,2], 900), ([2,2,3,2,2], 900), # 次级进攻/防守模式 ([0,2,2,2,3], 300), # 活三 ([0,1,1,1,3], 350), # 防守活三 ([2,2,3,0,0], 200), # 更多模式可以继续添加... ]3.2 模式匹配算法AI会扫描整个棋盘寻找与模式库匹配的情况def find_best_move(board, player): 寻找最佳落子位置 opponent 3 - player # 对手的棋子类型 best_score -1 best_move None # 遍历棋盘每个位置 for x in range(19): for y in range(19): if board[x, y] ! 0: # 已有棋子的位置跳过 continue # 检查四个方向 for dx, dy in [(1,0), (0,1), (1,1), (1,-1)]: # 构建5格序列 sequence [] for i in range(-4, 5): nx, ny x i*dx, y i*dy if 0 nx 19 and 0 ny 19: if i 0: # 中心位置是建议落子点 sequence.append(3) else: stone board[nx, ny] # 将棋子转换为模式中的表示 if stone 0: sequence.append(0) elif stone player: sequence.append(2) else: sequence.append(1) else: sequence.append(-1) # 边界外 # 检查是否匹配任何模式 for pattern, score in PATTERNS: for i in range(len(sequence) - len(pattern) 1): match True for j in range(len(pattern)): if sequence[ij] ! pattern[j]: match False break if match and score best_score: best_score score best_move (x, y) break return best_move if best_move else random_move(board)3.3 随机落子后备策略当没有匹配到任何有效模式时AI会随机选择一个合理位置def random_move(board): 随机选择一个空位置 empty_pos [(x,y) for x in range(19) for y in range(19) if board[x,y] 0] return random.choice(empty_pos) if empty_pos else None4. 游戏主循环与AI集成将上述组件整合到游戏主循环中def main(): screen init_game() board np.zeros((19, 19), dtypeint) current_player 1 # 1-玩家(黑) 2-AI(白) game_over False while True: for event in pygame.event.get(): if event.type pygame.QUIT: pygame.quit() return if not game_over and current_player 1 and event.type pygame.MOUSEBUTTONDOWN: # 玩家落子 x, y get_board_position(event.pos) if board[x, y] 0: board[x, y] 1 draw_stone(screen, x, y, black) if check_win(board, x, y, 1): print(玩家获胜!) game_over True else: current_player 2 # 轮到AI # AI回合 if not game_over and current_player 2: pygame.time.delay(500) # AI思考时间 x, y find_best_move(board, 2) board[x, y] 2 draw_stone(screen, x, y, white) if check_win(board, x, y, 2): print(AI获胜!) game_over True else: current_player 1 # 轮回到玩家 if __name__ __main__: main()5. AI策略优化方向虽然我们的基础AI已经具备一定智能但仍有多个优化方向可以提升其水平5.1 评估函数优化引入更精细的局势评估函数考虑以下因素棋型的组合价值如双三、冲四等棋盘控制区域先手优势保持def evaluate_position(board, player): 评估当前棋盘对指定玩家的优势 score 0 opponent 3 - player # 这里可以添加更复杂的评估逻辑 # 例如统计各种棋型出现的次数并加权计算 return score5.2 搜索算法引入实现简单的搜索算法可以让AI有更长远考虑def minimax(board, depth, maximizing_player, alpha, beta): Minimax算法实现 if depth 0 or game_over(board): return evaluate_position(board, 2 if maximizing_player else 1) if maximizing_player: max_eval -float(inf) for move in generate_moves(board, 2): new_board make_move(board, move, 2) eval minimax(new_board, depth-1, False, alpha, beta) max_eval max(max_eval, eval) alpha max(alpha, eval) if beta alpha: break return max_eval else: min_eval float(inf) for move in generate_moves(board, 1): new_board make_move(board, move, 1) eval minimax(new_board, depth-1, True, alpha, beta) min_eval min(min_eval, eval) beta min(beta, eval) if beta alpha: break return min_eval5.3 机器学习集成对于更高级的实现可以考虑使用强化学习训练AI# 伪代码示例 - 使用神经网络评估棋盘 model load_model(gobang_ai.h5) def neural_evaluate(board): 使用神经网络评估棋盘 input_data preprocess_board(board) return model.predict(input_data)6. 完整代码与使用说明将上述所有组件整合后我们得到完整的五子棋AI实现。使用时只需运行主程序黑棋玩家通过鼠标点击落子白棋AI会自动响应。# 完整代码见上文各节组合 # 需要安装的依赖pygame, numpy在实际测试中这个基础AI已经能够识别基本的进攻和防守机会能够给初学者带来一定挑战。随着模式库的扩充和评估函数的优化AI的水平可以进一步提升。

相关文章:

用Python和Pygame从零打造一个能‘思考’的五子棋AI(附完整代码)

用Python和Pygame从零打造一个能‘思考’的五子棋AI(附完整代码) 五子棋作为中国传统棋类游戏的代表,其规则简单却蕴含深奥的策略思维。当我们将这个古老游戏与现代编程技术结合时,最令人着迷的部分莫过于赋予计算机"思考&qu…...

视觉语言大模型中的语言先验现象与链式嵌入分析

1. 视觉语言大模型中的语言先验现象解析视觉语言大模型(LVLMs)如GPT-4V、Gemini等,通过海量多模态数据预训练获得了令人惊叹的跨模态理解能力。然而在实际应用中,这些模型常常表现出一个根本性问题:面对需要结合视觉信…...

罗技鼠标宏终极指南:如何轻松掌握绝地求生无后座力射击

罗技鼠标宏终极指南:如何轻松掌握绝地求生无后座力射击 【免费下载链接】logitech-pubg PUBG no recoil script for Logitech gaming mouse / 绝地求生 罗技 鼠标宏 项目地址: https://gitcode.com/gh_mirrors/lo/logitech-pubg 还在为《绝地求生》中难以控制…...

ABAP Debugger进阶:用监控点(Watchpoint)追踪内表数据变化的完整指南

ABAP Debugger进阶:用监控点(Watchpoint)追踪内表数据变化的完整指南 在SAP ABAP开发中,调试器就像外科医生的手术刀,而监控点(Watchpoint)则是这把刀上最精细的刀尖。当你面对一个包含数十万行…...

鸣潮自动化终极指南:用ok-ww解放双手,轻松刷声骸做日常

鸣潮自动化终极指南:用ok-ww解放双手,轻松刷声骸做日常 【免费下载链接】ok-wuthering-waves 鸣潮 后台自动战斗 自动刷声骸 一键日常 Automation for Wuthering Waves 项目地址: https://gitcode.com/GitHub_Trending/ok/ok-wuthering-waves 你是…...

Android Studio中文界面终极指南:5分钟告别英文开发困扰

Android Studio中文界面终极指南:5分钟告别英文开发困扰 【免费下载链接】AndroidStudioChineseLanguagePack AndroidStudio中文插件(官方修改版本) 项目地址: https://gitcode.com/gh_mirrors/an/AndroidStudioChineseLanguagePack 如果你正在使…...

JBoltAI BOM智能报价系统:告别手工Excel时代

对于电子制造企业而言,产品报价是连接客户需求与生产成本的关键环节,但传统报价模式往往陷入“手工依赖症”——面对千行级BOM表,人工逐行抄录器件信息、核算加工费用,不仅耗时耗力,更易因疲劳导致数据错误&#xff1b…...

WPF工业组态新选择:深度评测ConPipe 2026的40+控件与VS扩展设计体验

WPF工业组态新选择:深度评测ConPipe 2026的40控件与VS扩展设计体验 在工业自动化领域,优秀的UI控件库能显著提升SCADA系统和上位机软件的开发效率。ConPipe 2026作为WPF生态中的新锐力量,以其40余个专业控件和深度集成的Visual Studio扩展功…...

保姆级教程:用巴法云MQTT把ESP8266灯接入Home Assistant,小白也能5分钟搞定

零基础玩转智能家居:5分钟实现ESP8266灯控接入Home Assistant全攻略 第一次接触智能家居系统时,我被Home Assistant的强大功能所吸引,但面对复杂的配置过程却望而却步。直到发现巴法云MQTT这个"桥梁",才真正体会到智能家…...

S32K3 Flash模拟EEPROM实战:深入拆解FEE模块的Cluster、Block与Swap机制

S32K3 Flash模拟EEPROM实战:深入拆解FEE模块的Cluster、Block与Swap机制 在嵌入式系统中,Flash存储器扮演着至关重要的角色,而如何高效、可靠地利用Flash模拟EEPROM功能,则是许多嵌入式开发者面临的挑战。特别是在汽车电子领域&a…...

STM32新手必看:GPIO_SetBits函数里那个神秘的BSRR寄存器,到底是怎么把灯点亮的?

STM32新手必看:GPIO_SetBits函数里那个神秘的BSRR寄存器,到底是怎么把灯点亮的? 第一次接触STM32开发的朋友,往往会在点亮LED灯这个最简单的实验中遇到一个看似简单却充满疑惑的问题:为什么调用GPIO_SetBits(GPIOB, GP…...

LLMOps平台Pezzo:集中管理Prompt、监控与优化LLM应用

1. 项目概述:为什么我们需要一个LLMOps平台?如果你最近在折腾大语言模型(LLM)应用,不管是基于OpenAI的GPT系列,还是开源的Llama、Claude,大概率都经历过这样的场景:为了调出一个满意…...

PostgREST数据脱敏终极指南:保护敏感信息的7个实战策略

PostgREST数据脱敏终极指南:保护敏感信息的7个实战策略 【免费下载链接】postgrest REST API for any Postgres database 项目地址: https://gitcode.com/GitHub_Trending/po/postgrest PostgREST作为一款能为任何PostgreSQL数据库自动生成REST API的强大工具…...

Arm SVE2中BFloat16指令集的深度解析与优化实践

1. BFloat16指令集概述BFloat16(Brain Floating Point 16)是近年来在机器学习领域广泛采用的一种16位浮点格式。作为传统FP32格式的精简版本,它保留了8位指数位但将尾数位缩减到7位(共16位)。这种设计使得BFloat16能够…...

5个Testify测试反模式:Go开发者必须避免的测试陷阱

5个Testify测试反模式:Go开发者必须避免的测试陷阱 【免费下载链接】testify A toolkit with common assertions and mocks that plays nicely with the standard library 项目地址: https://gitcode.com/GitHub_Trending/te/testify Testify是Go语言生态中最…...

Umami数据湖:隐私优先的Web分析大数据存储与分析平台终极指南

Umami数据湖:隐私优先的Web分析大数据存储与分析平台终极指南 【免费下载链接】umami Umami is a modern, privacy-focused analytics platform. An open-source alternative to Google Analytics, Mixpanel and Amplitude. 项目地址: https://gitcode.com/GitHub…...

终极热重载指南:如何在Bolt.new中实现即时开发体验

终极热重载指南:如何在Bolt.new中实现即时开发体验 【免费下载链接】bolt.new Prompt, run, edit, and deploy full-stack web applications. -- bolt.new -- Help Center: https://support.bolt.new/ -- Community Support: https://discord.com/invite/stackblitz…...

Websoft9 API详解:自动化部署和管理应用的完整指南

Websoft9 API详解:自动化部署和管理应用的完整指南 【免费下载链接】websoft9 Applications self-hosting and DevOps platform for running open source, web-based linux Panel of lite PaaS 项目地址: https://gitcode.com/gh_mirrors/we/websoft9 Websof…...

Pake启动速度终极优化指南:让你的桌面应用瞬间启动的7个专业技巧

Pake启动速度终极优化指南:让你的桌面应用瞬间启动的7个专业技巧 【免费下载链接】Pake 🤱🏻 Turn any webpage into a desktop app with one command. 项目地址: https://gitcode.com/GitHub_Trending/pa/Pake Pake是一款能够将任何网…...

AUTOSAR存储栈调试实录:如何通过NvM_GetErrorStatus返回值快速定位MemIf/Fee层读写故障

AUTOSAR存储栈深度排障指南:基于NvM_GetErrorStatus的状态码逐层诊断方法论 当ECU的NVRAM管理器突然在台架测试中抛出NVM_REQ_INTEGRITY_FAILED错误时,资深汽车电子工程师的直觉反应往往不是立即翻看手册,而是像刑侦专家一样开始构建证据链。…...

Angular依赖注入终极指南:告别组件紧耦合的7个实战技巧

Angular依赖注入终极指南:告别组件紧耦合的7个实战技巧 【免费下载链接】angular Deliver web apps with confidence 🚀 项目地址: https://gitcode.com/GitHub_Trending/an/angular Angular依赖注入(DI)是构建灵活、可维护…...

手把手教你用开心电视助手给移动UNT401H盒子装B站TV版和IPTV(附详细IP连接教程)

移动UNT401H盒子进阶玩法:用开心电视助手打造全能影音中心 家里那台移动UNT401H盒子刷完机之后,是不是总觉得少了点什么?官方系统被替换成纯净版固然清爽,但如何让它真正成为客厅的娱乐中枢才是关键。作为一名折腾过数十台盒子的老…...

开源工具箱cn-daily-tools:轻量聚合与本地化部署实战

1. 项目概述与核心价值 最近在GitHub上看到一个挺有意思的项目,叫 kaito2026/cn-daily-tools 。光看名字,你可能会觉得这又是一个“日常工具合集”,没什么新意。但当我真正点进去,花时间把玩了一下里面的几个工具后&#xff0c…...

MPVue开发效率提升终极指南:5个必备VSCode插件推荐

MPVue开发效率提升终极指南:5个必备VSCode插件推荐 【免费下载链接】mpvue 基于 Vue.js 的小程序开发框架,从底层支持 Vue.js 语法和构建工具体系。 项目地址: https://gitcode.com/gh_mirrors/mp/mpvue MPVue是基于Vue.js的小程序开发框架&#…...

【YOLOv11】078、YOLOv11实时系统设计:低延迟、高吞吐量系统架构

从产线卡顿说起 上周在工厂部署YOLOv11检测系统时遇到一个典型问题:模型在测试集上mAP跑得挺漂亮,但一上产线视频流就出现明显卡顿,平均延迟飙到200ms以上,产线主管直接喊停。 拆开日志一看,预处理、推理、后处理三个环节的时间分布极不均衡,GPU利用率像心电图一样忽高…...

别再死记硬背Transformer了!用PyTorch手写一个简易版,彻底搞懂Encoder和Decoder

从零构建Transformer:用PyTorch实现编码器与解码器的核心逻辑 在自然语言处理领域,Transformer架构已经成为现代AI系统的基石。但很多学习者在理解其工作原理时陷入了一个怪圈——能够背诵自注意力公式,却无法用代码实现最基本的版本&#xf…...

3步精准测试:用MouseTester彻底掌握鼠标真实性能

3步精准测试:用MouseTester彻底掌握鼠标真实性能 【免费下载链接】MouseTester 项目地址: https://gitcode.com/gh_mirrors/mo/MouseTester 你是否曾经怀疑过鼠标的性能参数与实际表现不符?游戏中的瞄准总是差一点,办公时的光标移动不…...

支付宝扫码登录的‘隐藏关卡’:从开发到上线的全流程避坑指南(附Postman测试技巧)

支付宝扫码登录的‘隐藏关卡’:从开发到上线的全流程避坑指南(附Postman测试技巧) 当第三方登录成为现代应用的标配功能时,支付宝扫码登录因其便捷性和高覆盖率成为许多企业的首选。但看似简单的"扫码-登录"背后&#x…...

Redis是什么及核心特性

Redis(Remote Dictionary Server)是一个开源的、基于内存的键值对(Key-Value)存储系统,常被用作数据库、缓存和消息中间件。它以其极高的性能、丰富的数据结构和对持久化的支持而著称。 Redis的核心特性与优势 与其他…...

如何将Pipe库集成到现有项目:平滑迁移到函数式编程范式

如何将Pipe库集成到现有项目:平滑迁移到函数式编程范式 【免费下载链接】Pipe A Python library to use infix notation in Python 项目地址: https://gitcode.com/gh_mirrors/pi/Pipe Pipe库是一个强大的Python工具,它允许开发者在Python中使用类…...