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

链表经典OJ问题详解

链表经典OJ问题详解

文章目录 前言 1. 删除链表中等于给定值 val 的所有结点 2. 反转一个单链表 3. 链表的中间结点 4. 链表中倒数第k个结点 5. 合并两个有序链表 6. 链表分割 7. 链表的回文结构 8. 相交链表 9. 判断链表中是否有环 10. 返回链表开始入环的第一个结点 结语 前言 链表是一种基础且重要的数据结构,在程序设计中有着广泛的应用。由于其物理存储的非连续性,链表在插入、删除操作上具有独特的优势,但也给某些操作(如随机访问)带来了挑战。在技术面试和算法竞赛中,链表相关的题目出现频率极高,熟练掌握链表的常见操作和经典问题的解法,是每个程序员必备的技能。本文精选了10道经典的链表OJ题目,从思路分析到C语言代码实现,逐步详解,并穿插了快慢指针、哑结点等常用技巧的讲解,每道题目都附带了对应的在线练习链接,方便读者动手实践。希望能帮助读者深入理解链表,轻松应对各类链表问题。 1. 删除链表中等于给定值 val

By Ne0inhk
【图论 DFS 换根法】3772. 子图的最大得分|2235

【图论 DFS 换根法】3772. 子图的最大得分|2235

本文涉及知识点 C++图论 换根法 LeetCode3772. 子图的最大得分 给你一个 无向树 ,它包含 n 个节点,编号从 0 到 n - 1。树由一个长度为 n - 1 的二维整数数组 edges 描述,其中 edges[i] = [ai, bi] 表示在节点 ai 和节点 bi 之间有一条边。 另给你一个长度为 n 的整数数组 good,其中 good[i] 为 1 表示第 i 个节点是好节点,为 0 表示它是坏节点。 定义

By Ne0inhk
《算法闯关指南:优选算法--模拟》--41.Z 字形变换,42.外观数列

《算法闯关指南:优选算法--模拟》--41.Z 字形变换,42.外观数列

🔥草莓熊Lotso:个人主页 ❄️个人专栏: 《C++知识分享》《Linux 入门到实践:零基础也能懂》 ✨生活是默默的坚持,毅力是永久的享受! 🎬 博主简介: 文章目录 * 前言: * 41. Z 字形变换 * 解法(模拟+找规律): * 算法思路: * C++算法代码: * 算法总结&&笔记展示: * 42. 外观数列 * 解法(模拟): * 算法思路: * C++算法代码: * 算法总结&&笔记展示: * 结尾: 前言: 聚焦算法题实战,系统讲解三大核心板块:优选算法:剖析动态规划、二分法等高效策略,学会寻找“最优解”。 递归与回溯:掌握问题分解与状态回退,攻克组合、排列等难题。

By Ne0inhk