Python 小游戏实战:打造视觉精美的数独小游戏

Python 小游戏实战:打造视觉精美的数独小游戏

在这里插入图片描述

Python 小游戏实战:打造视觉精美的数独小游戏

Python 小游戏实战:打造视觉精美的数独小游戏,数独是一款经典的逻辑推理数字游戏,通过填充数字 1-9 到 9x9 的网格中,使得每行、每列和每个 3x3 子网格都包含 1-9 的所有数字,不重复。本文将带大家使用 Python 的 Pygame 库实现一个视觉精美、交互友好的数独小游戏。

一、前言

    Python作为一门简洁、易读、功能强大的编程语言,其基础语法是入门学习的核心。掌握好基础语法,能为后续的编程实践打下坚实的基础。本文将全面讲解Python3的基础语法知识,适合编程初学者系统学习。Python以其简洁优雅的语法和强大的通用性,成为当今最受欢迎的编程语言。本专栏旨在系统性地带你从零基础入门到精通Python核心。无论你是零基础小白还是希望进阶的专业开发者,都将通过清晰的讲解、丰富的实例和实战项目,逐步掌握语法基础、核心数据结构、函数与模块、面向对象编程、文件处理、主流库应用(如数据分析、Web开发、自动化)以及面向对象高级特性,最终具备独立开发能力和解决复杂问题的思维,高效应对数据分析、人工智能、Web应用、自动化脚本等广泛领域的实际需求。

在这里插入图片描述

在这里插入图片描述

🥇 点击进入Python入门专栏,Python凭借简洁易读的语法,是零基础学习编程的理想选择。本专栏专为初学者设计,系统讲解Python核心基础:变量、数据类型、流程控制、函数、文件操作及常用库入门。通过清晰示例与实用小项目,助你快速掌握编程思维,打下坚实根基,迈出自动化办公、数据分析或Web开发的第一步。

🥇 点击进入Python小游戏实战专栏, 寓教于乐,用Python亲手打造经典小游戏!本专栏通过开发贪吃蛇、飞机大战、猜数字、简易版俄罗斯方块等趣味项目,在实践中掌握Python核心语法、面向对象编程、事件处理、图形界面(如Pygame)等关键技能,将枯燥的代码学习转化为可见的成果,让学习编程充满乐趣与成就感,快速提升实战能力。

🥇 点击进入Python小工具实战专栏,告别重复劳动,用Python打造效率神器!本专栏教你开发文件批量处理、自动邮件通知、简易爬虫、桌面提醒、密码生成器、天气查询等实用小工具。聚焦os、shutil、requests、smtplib、schedule等核心库,通过真实场景案例,快速掌握自动化脚本编写技巧,解放双手,显著提升工作与生活效率,让代码真正服务于你的日常。

🥇 点击进入Python爬虫实战专栏,解锁网络数据宝库!本专栏手把手教你使用Python核心库(如requests、BeautifulSoup、Scrapy)构建高效爬虫。从基础网页解析到动态页面抓取、数据存储(CSV/数据库)、反爬策略应对及IP代理使用,通过实战项目(如电商比价、新闻聚合、图片采集、舆情监控),掌握合法合规获取并利用网络数据的核心技能,让数据成为你的超能力。

🥇 点击进入Python项目实战专栏,告别碎片化学习,挑战真实项目!本专栏精选Web应用开发(Flask/Django)、数据分析可视化、自动化办公系统、简易爬虫框架、API接口开发等综合项目。通过需求分析、架构设计、编码实现、测试部署的全流程,深入掌握工程化开发、代码复用、调试排错与团队协作核心能力,积累高质量作品集,真正具备解决复杂问题的Python实战经验。


✨ 正文开始

数独是一款经典的逻辑推理数字游戏,通过填充数字1-9到9x9的网格中,使得每行、每列和每个3x3子网格都包含1-9的所有数字,不重复。本文将带大家使用Python的Pygame库实现一个视觉精美、交互友好的数独小游戏。

二、开发准备

2.1 所需环境

  • Python 3.6+
  • Pygame库(用于图形界面和交互)

2.2安装依赖

首先确保安装了Pygame库,如果没有安装,可以使用pip命令安装:

pip install pygame 

三、项目结构设计

我们将项目分为两个主要文件:

  • main.py:负责游戏界面渲染和用户交互
  • build.py:负责数独谜题的生成和验证逻辑

这种分离设计使代码结构更清晰,便于维护和扩展。

四 、核心功能实现

4.1. 数独谜题生成与验证(build.py)

首先实现数独的核心逻辑,包括数独生成、验证等功能:

import random defprint_matrix(matrix):"""打印矩阵,用于调试"""print('—'*19)for row in matrix:print('|'+' '.join([str(col)for col in row])+'|')print('—'*19)defshuffle_number(_list):"""随机打乱列表,用于生成不同的数独""" random.shuffle(_list)return _list defcheck(matrix, i, j, number):""" 检查数字是否可以放置在指定位置 规则:行、列、3x3子网格中不能有重复数字 """# 检查行if number in matrix[i]:returnFalse# 检查列if number in[row[j]for row in matrix]:returnFalse# 检查3x3子网格 group_i, group_j =int(i/3),int(j/3)if number in[matrix[i][j]for i inrange(group_i*3,(group_i+1)*3)for j inrange(group_j*3,(group_j+1)*3)]:returnFalsereturnTruedefbuild_game(matrix, i, j, number):"""递归构建完整数独矩阵"""if i >8or j >8:return matrix if check(matrix, i, j, number):# 创建矩阵副本进行修改 _matrix =[[col for col in row]for row in matrix] _matrix[i][j]= number # 计算下一个位置 next_i, next_j =(i+1,0)if j ==8else(i, j+1)# 尝试下一个位置的所有可能数字for _number in shuffle_number(number_list): __matrix = build_game(_matrix, next_i, next_j, _number)# 验证是否生成了完整有效的数独if __matrix andsum([sum(row)for row in __matrix])==(sum(range(1,10))*9):return __matrix returnNonedefgive_me_a_game(blank_size=9):"""生成带空白的数独游戏"""# 生成完整数独 matrix_all = build_game(matrix,0,0, random.choice(number_list))# 随机生成要空白的位置 set_ij =set()whilelen(list(set_ij))< blank_size: set_ij.add(f"{random.choice(range(9))},{random.choice(range(9))}")# 创建带空白的数独 matrix_blank =[[col for col in row]for row in matrix_all] blank_ij =[]for ij inlist(set_ij): i, j =int(ij.split(',')[0]),int(ij.split(',')[1]) blank_ij.append((i, j)) matrix_blank[i][j]=0return matrix_all, matrix_blank, blank_ij # 全局变量 number_list =[1,2,3,4,5,6,7,8,9] matrix =[([0]*9)for i inrange(9)]if __name__ =="__main__":# 测试生成数独 print_matrix(build_game(matrix,0,0, random.choice(number_list)))

4.2. 游戏界面与交互(main.py)

接下来实现游戏的可视化界面和用户交互逻辑:

import sys import pygame from pygame.color import THECOLORS as COLORS from build import print_matrix, give_me_a_game, check defdraw_background():"""绘制游戏背景和网格"""# 白色背景 screen.fill(COLORS['white'])# 绘制9x9网格,加粗绘制3x3大格子边界# 垂直线for i inrange(10): line_width =5if i %3==0else2 pygame.draw.line(screen, COLORS['black'],(i*100,0),(i*100,900), line_width)# 水平线for i inrange(10): line_width =5if i %3==0else2 pygame.draw.line(screen, COLORS['black'],(0, i*100),(900, i*100), line_width)defdraw_choose():"""绘制当前选中的单元格高亮框"""# 绘制蓝色高亮框,留出边框 pygame.draw.rect(screen, COLORS['blue'],(cur_j*100+5, cur_i*100+5,100-10,100-10),0)defcheck_win(matrix_all, matrix):"""检查是否完成数独"""return matrix_all == matrix defcheck_color(matrix, i, j):"""检查数字是否符合规则,返回对应的颜色""" _matrix =[[col for col in row]for row in matrix] _matrix[i][j]=0# 临时清空当前位置以便检查if check(_matrix, i, j, matrix[i][j]):return COLORS['green']# 合法数字显示绿色return COLORS['red']# 非法数字显示红色defdraw_number():"""绘制数独中的数字"""for i inrange(len(MATRIX)):for j inrange(len(MATRIX[0])):# 空白格子的数字颜色根据合法性变化,固定数字显示灰色 _color = check_color(MATRIX, i, j)if(i,j)in BLANK_IJ else COLORS['gray']# 渲染数字,空值不显示 txt = font80.render(str(MATRIX[i][j]if MATRIX[i][j]notin[0,'0']else''),True, _color) x, y = j*100+30, i*100+10# 居中显示 screen.blit(txt,(x, y))defdraw_context():"""绘制游戏状态信息""" txt = font100.render(f'Blank: {cur_blank_size} Changes: {cur_change_size}',True, COLORS['black']) screen.blit(txt,(10,900))# 显示在底部if __name__ =="__main__":# 初始化pygame pygame.init()# 常量定义 SIZE =[900,1000]# 窗口大小,额外100像素显示状态信息 font80 = pygame.font.SysFont('Times',80)# 数字字体 font100 = pygame.font.SysFont('Times',90)# 状态信息字体# 创建窗口 screen = pygame.display.set_mode(SIZE) pygame.display.set_caption("数独小游戏")# 设置窗口标题# 变量初始化 cur_i, cur_j =0,0# 当前选中的单元格 cur_blank_size =int(sys.argv[1])iflen(sys.argv)>1else10# 空白数量,可通过命令行参数设置 cur_change_size =0# 已修改次数# 生成数独游戏 MATRIX_ANSWER, MATRIX, BLANK_IJ = give_me_a_game(blank_size=cur_blank_size)print(BLANK_IJ) print_matrix(MATRIX)# 主游戏循环 running =Truewhile running:# 事件处理for event in pygame.event.get():if event.type== pygame.QUIT: running =Falsebreakelif event.type== pygame.MOUSEBUTTONDOWN:# 鼠标点击选择单元格 x, y = event.pos cur_j, cur_i =int(x /100),int(y /100)# 确保选择在有效范围内 cur_i =max(0,min(8, cur_i)) cur_j =max(0,min(8, cur_j))elif event.type== pygame.KEYUP:# 键盘输入数字ifchr(event.key)in['1','2','3','4','5','6','7','8','9']and(cur_i, cur_j)in BLANK_IJ: MATRIX[cur_i][cur_j]=int(chr(event.key))# 更新空白数量 cur_blank_size =sum(1for row in MATRIX for col in row if col in[0,'0']) cur_change_size +=1# 绘制游戏元素 draw_background() draw_choose() draw_number() draw_context()# 刷新屏幕 pygame.display.flip()# 检查是否完成if check_win(MATRIX_ANSWER, MATRIX):print('恭喜你,完成了数独挑战!')break# 退出游戏 pygame.quit()

运行效果图:

在这里插入图片描述

五 、 功能解析

5.1. 数独生成逻辑

  • build_game() 函数使用递归回溯算法生成完整的数独矩阵
  • give_me_a_game() 函数从完整数独中随机挖去指定数量的数字作为谜题
  • check() 函数验证数字放置是否符合数独规则

5.2. 游戏界面设计

  • 9x9的网格布局,使用不同粗细的线条区分3x3子网格
  • 选中的单元格会显示蓝色高亮框
  • 固定数字显示为灰色,玩家输入的数字根据合法性显示绿色(合法)或红色(非法)
  • 底部状态栏显示剩余空白数量和已修改次数

5.3. 用户交互

  • 鼠标点击选择单元格
  • 键盘输入1-9数字填充选中的空白单元格
  • 自动检查输入合法性并通过颜色提示
  • 完成数独后自动提示成功

六、游戏玩法

  1. 鼠标点击要填充的单元格(蓝色高亮显示)
  2. 按键盘1-9数字键填入数字
  3. 绿色数字表示符合数独规则,红色数字表示有冲突
  4. 填满所有空白且全部正确后,游戏结束并提示成功

运行程序,可通过命令行参数指定空白格数量(难度):

python main.py 20# 生成有20个空白格的数独

七、优化建议

  1. 增加难度选择界面,无需通过命令行参数设置
  2. 添加计时器功能,记录完成时间
  3. 增加错误次数限制
  4. 添加提示功能
  5. 优化UI,增加更精美的背景和动画效果
  6. 保存游戏进度功能

八、总结

本项目通过Pygame实现了一个功能完整的数独游戏,包含了数独生成、规则验证、用户交互等核心功能。代码结构清晰,注释完善,便于理解和扩展。

通过这个项目,我们学习了递归回溯算法在数独生成中的应用,以及如何使用Pygame构建图形界面和处理用户交互。希望这个教程能帮助你入门Python游戏开发,也欢迎在此基础上进行更多创新和改进!

附录:扩展学习资源

  1. 官方资源
  2. 本专栏特色资源
    • 代码资源仓库:ZEEKLOG专属资源在线获取
    • 海量Python教程:关注公众号:xcLeigh,获取网盘地址
    • 一对一答疑:添加微信与博主在线沟通(备注“Python专栏”

联系博主

    xcLeigh 博主,全栈领域优质创作者,博客专家,目前,活跃在ZEEKLOG、微信公众号、小红书、知乎、掘金、快手、思否、微博、51CTO、B站、腾讯云开发者社区、阿里云开发者社区等平台,全网拥有几十万的粉丝,全网统一IP为 xcLeigh。希望通过我的分享,让大家能在喜悦的情况下收获到有用的知识。主要分享编程、开发工具、算法、技术学习心得等内容。很多读者评价他的文章简洁易懂,尤其对于一些复杂的技术话题,他能通过通俗的语言来解释,帮助初学者更好地理解。博客通常也会涉及一些实践经验,项目分享以及解决实际开发中遇到的问题。如果你是开发领域的初学者,或者在学习一些新的编程语言或框架,关注他的文章对你有很大帮助。

    亲爱的朋友,无论前路如何漫长与崎岖,都请怀揣梦想的火种,因为在生活的广袤星空中,总有一颗属于你的璀璨星辰在熠熠生辉,静候你抵达。

     愿你在这纷繁世间,能时常收获微小而确定的幸福,如春日微风轻拂面庞,所有的疲惫与烦恼都能被温柔以待,内心永远充盈着安宁与慰藉。

    至此,文章已至尾声,而您的故事仍在续写,不知您对文中所叙有何独特见解?期待您在心中与我对话,开启思想的新交流。


     💞 关注博主 🌀 带你实现畅游前后端!

     🏰 大屏可视化 🌀 带你体验酷炫大屏!

     💯 神秘个人简介 🌀 带你体验不一样得介绍!

     🥇 从零到一学习Python 🌀 带你玩转Python技术流!

     🏆 前沿应用深度测评 🌀 前沿AI产品热门应用在线等你来发掘!

     💦 :本文撰写于ZEEKLOG平台,作者:xcLeigh所有权归作者所有)https://xcleigh.blog.ZEEKLOG.net/,如果相关下载没有跳转,请查看这个地址,相关链接没有跳转,皆是抄袭本文,转载请备注本文原地址。


在这里插入图片描述

     📣 亲,码字不易,动动小手,欢迎 点赞 ➕ 收藏,如 🈶 问题请留言(或者关注下方公众号,看见后第一时间回复,还有海量编程资料等你来领!),博主看见后一定及时给您答复 💌💌💌

Read more

【C++ 】智能指针:内存管理的 “自动导航仪”

【C++ 】智能指针:内存管理的 “自动导航仪”

目录 一、引入 二、智能指针的两大特性: 1、RAII 特点: 好处: 2、行为像指针 三、智能指针起初的缺陷:拷贝问题 四、几种智能指针的介绍。 1、C++98出现的智能指针——auto_ptr auto_ptr解决上述拷贝构造的问题: 2、boost库 3、unique_ptr 4、shared_ptr 引用计数的实现: 赋值运算符的问题:(循环引用) 5、weak_ptr 特点: 解决循环引用问题: 五、C++智能指针的基本框架: 六、定制删除器,以及包装器的使用场景之一 七、内存泄漏: 1、什么是内存泄漏,内存泄漏的危害:

By Ne0inhk
【探寻C++之旅】C++11 深度解析:重塑现代 C++ 的关键特性

【探寻C++之旅】C++11 深度解析:重塑现代 C++ 的关键特性

请君浏览 * 前言 * 1. C++的发展历史 * 2. 列表初始化:统一对象初始化的优雅方案 * 2.1 从 C++98 到 C++11 的突破 * 2.2 std::initializer_list:容器初始化的 “神器” * 3. 右值引用和移动语义:彻底解决拷贝性能痛点 * 3.1 左值 vs 右值 * 3.2 左值引用 vs 右值引用 * 3.3右值引用的使用场景 * 3.3.1参数匹配 * 3.3.2 类型分类 * 3.3.3 移动构造和移动赋值

By Ne0inhk
C++ 虚函数与纯虚函数:多态的核心实现基石

C++ 虚函数与纯虚函数:多态的核心实现基石

C++ 虚函数与纯虚函数:多态的核心实现基石 💡 学习目标:深度理解虚函数与纯虚函数的本质区别,掌握虚函数表的底层原理,能够灵活运用二者设计具备多态特性的类结构。 💡 学习重点:虚函数的声明与重写规则、纯虚函数与抽象类的使用场景、虚函数表的工作机制、虚函数的常见陷阱与解决方案。 一、虚函数的本质与定义 ✅ 结论:虚函数是 C++ 实现动态多态的核心,通过在基类成员函数前添加 virtual 关键字,允许派生类重写该函数,并在运行时根据对象的实际类型调用对应版本。 1.1 虚函数的声明语法 虚函数的声明必须在基类中进行,语法格式如下: class 基类名 {public:virtual 返回值类型 函数名(参数列表){// 函数体}}; 1.2 虚函数的核心特性 1. 运行时绑定:函数调用关系在程序运行时确定,而非编译时。 2. 重写规则:派生类重写的函数必须与基类虚函数的函数名、参数列表、返回值类型完全一致(协变类型除外)。 3.

By Ne0inhk
Redis核心通用命令深度解析:结合C++ redis-plus-plus 实战指南

Redis核心通用命令深度解析:结合C++ redis-plus-plus 实战指南

前言:为何选择 Redis 与 C++? 在当今这个数据驱动的时代,高性能的数据存储与访问是构建现代化应用的基石。Redis,作为一个开源的、基于内存的键值对存储数据库,以其无与伦比的读写速度、丰富的数据结构、以及灵活的应用场景(缓存、消息队列、会话存储、排行榜等),成为了后端开发者的瑞士军刀。 与此同时,C++ 作为一门追求极致性能的编程语言,长期以来在游戏开发、金融交易、高性能计算等领域占据着主导地位。当 C++ 的高性能与 Redis 的高速度相结合时,我们便能够构建出响应迅捷、吞吐量巨大的应用程序。 然而,要将二者优雅地结合起来,我们需要一个强大的“桥梁”——Redis 客户端库。redis-plus-plus 就是这样一个专为现代 C++ (C++11 及以上) 设计的优秀库。它不仅封装了 Redis 的原生协议,提供了类型安全、易于使用的 API,

By Ne0inhk