基于Python的数独游戏系统的研究与设计.docx
- 文档编号:4856292
- 上传时间:2022-12-10
- 格式:DOCX
- 页数:30
- 大小:1.17MB
基于Python的数独游戏系统的研究与设计.docx
《基于Python的数独游戏系统的研究与设计.docx》由会员分享,可在线阅读,更多相关《基于Python的数独游戏系统的研究与设计.docx(30页珍藏版)》请在冰豆网上搜索。
基于Python的数独游戏系统的研究与设计
基于Python的数独游戏系统的研究与设计
摘要
当今世界,人们的精神需要越来越多,各种益智类游戏资源大量出现,受到大众的广泛喜爱。
其中数独游戏大受欢迎,主要原因是它不需要丰富的知识,能被初学者迅速接受。
数独不但有趣,并且能够锻炼游戏者的推理与逻辑能力,很多教育者都一致认为数独是对大脑开发的绝佳形式。
本文是以python为基础,利用回溯法实现数独的破解,以python相关的游戏开发框架实现游戏界面的显示,以及其它相关语法实现数独库的生成,得到一个基于python的数独游戏系统。
关键词:
数独游戏回溯法python
ResearchanddesignofSudokugamesystembasedonPython
Abstract
Intoday'sworld,withthegrowingspiritualneedsofthepeople,avarietyofpuzzlegameresourceshaveappearedinlargenumbersandarewidelylovedbythepublic.OneofthemostpopularSudokugamesisthatitdoesnotrequireextensiveknowledgeandcanbequicklyacceptedbybeginners.Sudokuisnotonlyfun,butalsocantrainthereasoningandlogicalskillsoftheplayers.ManyeducatorsbelievethatSudokuisagreatwaytotrainyourmind.Thisarticleisbasedonpython,usingthebacktrackingmethodtoachievesudokucracking,usingpython-relatedgamedevelopmentframeworktodisplaythegameinterface,andotherrelatedgrammarstoachievethesudokulibrarygeneration,toobtainapython-basedsudokugamesystem.
Keywords:
SudokugameBacktrackingPython
1前言
1.1本设计的目的和意义
随着现代科学技术的飞速发展和计算机技术的进步以及游戏开发的普及,数独游戏已经以手机和电脑游戏的方式呈现在人们面前,不需要笔和纸也能完成一局数独游戏。
由于数独的入门门槛低,却又能锻炼人们的逻辑与思维能力,深受广大游戏爱好者的喜爱。
在中国,有许多城市的许多所中小学将数独作为一门课程引进课堂。
其魅力不仅局限于此,许多国家都以数独为主题举办过相关比赛。
1.2系统概述
本课题从了解数独的背景开始,介绍了数独游戏的发展过程、基本原理以及简述破解其所用的基本方法,在此基础上,运用Python语言进行数独游戏系统的设计与实现,通过设置数组、约束条件进行递归求解。
1.3系统功能结构
本数独游戏有三个难度:
简单,一般,困难。
每个难度有十关,用户对关卡可以选择,但每一关重新开始之后会出现不同的数度棋盘,可以让用户在同一难度体验不同数独;在游戏的进行界面有计时,来记录玩家的游戏所用时间;玩家可以修改任意一个填过的数字,可以重新开始和显示答案,但提交错误次数不能超过5次,超过5次错误则结束游戏。
游戏进行时可以随时暂停、继续、返回主页。
1.4开发技术简介
本文首先介绍数独游戏及其求解方法,详细介绍了回溯算法的定义及其原理,通过python进行了回溯算法求解的实现,最后进行了游戏测试,并且通过测试,系统能够快速的进行求解,值得推广。
与其它语言相比,Python语言具有很好的可扩展性,语法简洁,可以应用的领域非常广泛。
近几年,Python的发展速度非常之快,许多大学开始引入Python程序设计课程,许多公司也逐渐转为以Python语言进行开发。
2数独游戏简介
本文章的大体思路为:
首先介绍数独的背景、意义、游戏规则以及一般解法,其次介绍Python相关的知识,两项进行结合,在Python的基础上实现数独游戏,最后进行测试,确保功能可行。
2.1数独游戏的背景及意义
2.1.1数独游戏背景
数独游戏的前身名叫拉丁方阵(LatinSquare),是18世纪初的瑞士数学家欧拉以及其他数学家研讨出来的。
19世纪末,美国的一位建筑师根据拉丁方阵发明了一种填数游戏,便形成了数独的初始模样。
20世纪,在一本益智杂志上发现了这个游戏,随后,被日本学者引进日本,发表在游戏杂志上,并给它重新起了名字,为“sudoku”,也就是现在的数独。
数独在其发展历程中,热度只增不减。
国内许多中小学都将其引进课堂,世界各地也举办过许多“数独”主题的比赛。
2.1.2数独游戏的意义
与其它相似游戏不同,数独的入门简单,不需要大量知识,能被大多数初学者接受。
数独游戏好玩有趣,可以锻炼玩家的推理逻辑能力。
数独游戏很全面的考验了玩家的观察能力和推理能力,虽然规则简单,但不缺变化,数字排列变化多样,正是因为这样,不少教育者认为数独是一个很好的锻炼头脑的方式。
2.2数独游戏的规则、求解方法以及设计
2.2.1数独游戏规则和求解方法
游戏规则:
数独分为九个宫(如图2.1所示),每个宫又分为了9个格(如图2.2所示),总共为81个格子。
玩家需要根据这81个格子中一定的已知数字和解题的规则,利用逻辑和推理,在空白的格子里填写1-9中的任意数字,保证每行、每列、每一宫都出现1-9的所有数字,但每行、每列、每宫出现的数字不能重复。
图2.1数独九宫图
图2.2数独每一宫的格数
数独游戏在最开始出现的有空格的状态称为数独初盘(如图2.3所示);当成功破解游戏之后得到的数独则称为终盘(如图2.4所示)。
数独游戏有初盘必有终盘,若一个初盘有多个终盘,游戏的质量就会降低,因此唯一终盘解的初盘生成是数独游戏待解决的两个问题[1]。
图2.3数独初盘
图2.4数独终盘
数独的求解方法多种多样,例如摒除法、余数法等。
面对使用电脑来计算数独的常用算法有递归算法、候选数回溯法、枚举法、遗传算法、方程求解等[2]。
本设计主要采用回溯法来解决数独问题。
2.2.2数独游戏设计
(1)界面规划
数独游戏分为五个界面,分别为首页、难度选择、关卡选择、游戏界面和游戏结算画面。
游戏首页有开始游戏和退出两个按钮控制游戏的开始和退出,如图2.5所示。
图2.5游戏首页
难度选择界面有三个选项,分别为简单、一般、困难,玩家可以选择自己所要进行游戏的难度,如图2.6所示。
图2.6难度选择界面
每个难度的关卡选择界面有十个关卡,每个关卡是对所选难度的细划分,如图2.7所示。
图2.7关卡选择界面
游戏进行界面由一个9*9的棋盘,一个计时器,暂停、重新开始、提交、返回、答案五个按钮组成。
棋盘用于显示已知的数字以及获取玩家输入的数字,计时器用来记录玩家游戏所用时间,按钮用于控制游戏进行与停止,在停止的过程中,棋盘会隐藏,防止玩家作弊。
游戏进行时的界面和暂停时的界面具体如图2.8和图2.9所示。
图2.8游戏进行界面
图2.9游戏暂停界面
游戏结算画面分为两种,一种是过关界面,一种是失败界面。
当玩家成功破解数独,则过关,会显示“YouWin”,可以选择进行下一关卡;当玩家破解数独失败时,则显示“Youlose”,可以选择重新开始。
具体如图2.10和2.11所示。
图2.10胜利界面
2.11失败界面
(2)难度划分
游戏的难度,是依据空格数在整个棋盘中所占比重划分的[3]。
当棋盘空格数越多,该数独的游戏难度则越大。
简单难度的关卡中,空格的数量由10逐渐增加至20。
破解简单难度的第一关所用时间基本在50s左右,随着难度的增大(空格数的增多),通过关卡的时间会逐步增加,但也不会花费太长时间,最后一关的通关时间在200s左右。
前部分简单难度关卡中的空格分布较分散,不会有很多连续空格,根据排除法,很快就能完成数独。
后面的关卡会出现3-4个的连续空格(如图2.12所示),需要玩家寻找单独空格或空格连续少的地方下手。
图2.12简单难度分析
一般难度的关卡中,空格的数量由20逐渐增加至30。
破解一般难度的第一关所用时间在210s左右,与简单的最后一关进行衔接,不会突然过难。
由于空格数量增多,空格的分布会出现小区域的连续空格,或者一行(列)只有3-4个已知数(如图2.13所示),这给解数独的过程增加了难度,这时玩家就需要寻找新的突破口。
图2.13一般难度分析
困难难度的关卡中,空格的数量由30逐渐增加至40。
难度相比前面的简单和一般难度要大很多,这时就需要玩家拥有一些技巧来破解数独。
破解简单难度的第一关的时间大概在420s左右,关卡中会出现3*3矩阵中大面积空格和一行(列)连续空格的组合形式(如图2.14所示),会发现两行排除到最后的可选答案一模一样,这时就需要根据其它的数字来推理该空格所应该填的数字。
图2.14困难难度分析
2.3本章小结
本章主要介绍了数独从发明起初到现代的发展背景以及其重要的意义,对数独游戏的具体规则、求解方法以及难度划分做了详细介绍。
根据数独游戏的原始规则,对所开发的数独游戏进行设计,并给出界面设计图,为文章后续做出铺垫。
3应用的主要技术
本文基于Python开发平台,在windows环境下开发,分别运用了Python语言中的pygame框架、json模块、time模块等,以下对其进行详细介绍,
3.1Python介绍
Python是一种程序设计语言,纯粹是面向对象的动态语言,最初是用于创建自动化脚本的,随着版本的更新和新功能的增加,逐渐用于独立的大型项目的开发。
Python具有简洁易读、可扩展的特性,受到很多开发者的欢迎。
国外的名牌大学也采用python进行程序设计课程,例如,卡耐基梅隆大学、麻省理工学院。
但也因其纯粹的面向对象,在学习时会遇到两方面困难:
一方面,class和type的本质完全相同,类即为型,型亦为类[4];另一方面,型也是可以在程序中操作的对象[4]。
这两方面会造成混淆。
Python的语法限制性非常强,比如常见的但又极其重要的缩进规则,若编写代码者编程习惯不好,就会无法通过编译。
也正是因为这项规则,Python对开发人员的限制很强,学习初期会有不适应的现象,但也正因为这种强制,使得python的代码会清晰很多,更适合团队合作,能更好的适应社会化编程[5]。
Python与其它语言相比,在很多方面都有着相对的优势。
首先,Python是完全免费的,任何人都可以在自己的计算机上免费安装。
其次,Python非常易学、严谨,能让编写人员编写出的代码更加的容易读懂、更加方便维护。
最后,Python有非常丰富的扩展库,可以使各项任务轻松完成,开发者开发完整程序的各种需要都可以满足。
Python在国外有着相当广泛且重要的作用,比如Google的核心搜索引擎是由python实现的;全球最大的游戏公司EVE-online可以同时让10000个玩家在同一个程序中成为可能,这一举措就是靠python实现的[6];迪斯尼乐园还有用python制作动画等[6]。
3.2Pygame框架
本课题运用的主要框架即为Pygame框架,对界面进行布置以及游戏的整体运行,再结合其它相关知识实现整个游戏的功能。
3.2.1Pygame简介
Pygame是Python的一个跨平台模块,为电子游戏专门设计,基于该平台开发的游戏几乎不做任何修改就可以运行于各种主流操作系统平台之上[7]。
其中包含的图像和声音建立在SDL的基础上,允许实时电子游戏研发而不用被低级语言束缚,比如机器语言、汇编语言[5]。
所有的资源结构都可以用高级语言提供,例如此次采用的Python语言。
Pygame不仅能够实现对游戏流程的完整控制,还对游戏界面的绘制有着强大的功能。
游戏屏幕的绘制、游戏事件处理以及游戏状态的更新是游戏程序主循环不可或缺的,它们的循环关系如图3.1所示。
图3.1游戏程序主循环
3.2.2Pygame框架中的模块
Pygame框架中有非常多的模块,这些模块可以为游戏的开发提供各种功能,其中常用的功能模块如下表3.1所示。
表3.1Pygame框架中的常用模块
模块名
功能
pygame.cdrom
访问光驱
pygame.cursors
加载光标
pygame.display
访问显示设备
pygame.draw
绘制形状、线和点
pygame.event
管理事件
pygame.font
使用字体
pygame.image
加载和存储图片
pygame.joystick
使用游戏手柄
pygame.key
读取键盘按键
pygame.mixer
声音
pygame.mouse
鼠标
pygame.movie
播放视频
pygame.music
播放音频
pygame.rect
管理矩形区域
pygame.sprite
操作移动图像
pygame.surface
管理图像和屏幕
pygame.surfarray
管理点阵图像数据
pygame.time
管理时间和帧信息
pygame.transform
缩放和移动图像
3.2.3Pygame中常用事件
事件就是一个操作,Pygame通常会接受用户的各种操作,比如移动鼠标、按键盘等。
这些操作会产生对应的事件。
事件在软件开发中极其重要,Pygame会把一系列事件存放在一个队列里,并逐个进行处理[8]。
下面分别介绍几个会用到的比较重要的函数和事件:
(1)事件检索。
对于事件的检索,有三种不同的函数,分别是pygame.event.get(),pygame.event.wait(),pygame.event.poll()。
pygame.event.get()函数是检索当前队列中的所有的事件;pygame.event.wait()函数是首先检索一个事件,当这个事件发生之后,再继续检索下一个事件;pygame.event.poll()函数同样是只检索一个事件,但会根据当前的情形返回一个真实的事件。
(2)处理鼠标事件。
当鼠标动作的时候,就会产生MOUSEMOTION事件,该事件总共有三个参数。
●buttons:
分别含有3个数字的元组,3个元组分别代表鼠标的左键、中键、右键,若数字为1,则表示按下了对应的鼠标键。
●pos:
代表当前位置。
●rel:
代表现在事件距离上次产生鼠标事件时的距离。
和其类似的常用的鼠标事件还有MOUSEBUTTONDOWN和MOUSEBUTTONUP。
如果在知道鼠标是按下的情况下,就可以用这个来代替上面那个功能比较强大且复杂的事件。
它们有两个参数如下所示。
●button:
代表操作哪个按键。
●pos:
代表位置。
(3)处理键盘事件。
处理键盘事件为KEYDOWN和KEYUP。
这两个事件有三个参数,如下所示。
●key:
表示按下或者放开的键盘所对应的键值,是数字形式,但一般很难有人记住,所以在Pygame中可以使用K_xxx来表示。
●mod:
代表组合键的信息,表示键盘上两个按键同时按下,若mod&KMOD_CTRL是真,则说明用户也按下了Ctrl键。
●unicode:
代表了所按下键对应的Unicode编码值。
(4)事件过滤。
在现实应用中,并不是所有事件都需要处理。
有些游戏中可能会无视鼠标操作,而有的游戏则会无视键盘操作。
这时就需要用函数pygame.event.set_blocked(事件名)来完成。
如果有许多事件需要进行过滤,就创建一个专门的列表来实现。
当然,有不允许的事件也相对应的有允许的事件,使用pygame.event.set_allowed()函数就可以来设定允许发生的事件。
鼠标事件和键盘事件的运用是非常多的。
在本设计中,鼠标事件多为点击事件,按下鼠标左键进行下一步操作;键盘事件主要是在数独九宫格中的空白格内填入数组。
3.3回溯法简介
回溯法是一种择优搜索方法,也叫做试探法,它是一种系统地搜索问题的解的方法,选择最优的条件向前搜索,以得出最终结果。
但是如果在探索到某一步时发现这一步没有满足条件的解,则证明上一步选择的解不是优解或者不满足所要达到的条件,就需要回到上一步,重新选择最优方案,这种技术就称为回溯法。
简单来说,回溯法的基本思想就是:
能进则进,不能则退,换路再试。
回溯法解决问题的关键点有三点:
(1)对所给定的问题,对其的解空间进行定义;
(2)对搜索的解所对应的解空间的结构进行确定,要求解空间的结构便于搜索;
(3)首先用深度优先的方式对解空间进行搜索,并且在搜索的过程中对无效的分支运用剪枝函数,以避免多余的搜索。
回溯法有一个重要特性:
给定问题的解空间一般是在搜索问题的解的过程中动态产生的。
回溯法在很多范畴内都有运用,不单单在计算机算法上,其它的还有排课系统、物流配送最优路线等。
3.4json模块
json模块是一种轻量级的数据交换方式,在Python中,可使用json模块对数据进行编码。
本课题主要用它对游戏时间记录进行读取。
当玩家破解一局数独的时间短于原来的记录,则将新的数据导入json文件;如果长于原来的记录,则记录保持不变。
3.5time模块
Time时间模块是对时间进行各种操作的一个模块,可以获取当前时间、格式化时间,也可以运用内置函数对时间格式进行处理以及格式转换。
本课题中主要运用time.time()进行游戏计时,当玩家完成游戏获得胜利之后,会获取计时器的时间,进行游戏记录的保存。
3.6本章小结
本章主要介绍了Python的背景、发展以及优势特点,还有Python中用来编写游戏的pygame框架,介绍了其常用的模块和事件。
最后介绍了python的其它模块:
json模块和time模块,并对它们在本设计中所实现的功能做了简单介绍。
4游戏系统分析
所谓系统分析就是,用户通过与客户的沟通,将得到的信息以需求说明书的方式展示给用户和开发者。
在软件功能发展的历史潮流中,长期以来,尤其是在第一次,需求分析的重要性不被人们所认同,例如当时美国IBM公司为英国电信公司开发一套信息管理系统,在需求不明确的情况下开始开发,最初的工期为一年,由于需求获取不清晰导致工期推迟了半年多,造成巨大损失。
现在有很多软件公司也存在这种情况,在需求还不清楚的情况下直接开始开发,导致到最后的验收阶段,重新更改,造成了人力、物力的极大浪费。
造成这一切后果的原因是获取需求不及时、不明确、不全面。
4.1可行性分析
可行性分析,简单来讲就是要看所设计的产品是否可行。
而是否可行就需要开发者到市场上去调研,通过不同层面的调研来综合分析,本系统的开发是否可行。
一般可行性分析包含很多层面,我主要就从技术方面、经济方面、社会方面来进行分析判断,来评价所要开发系统的可能性。
可行性分析十分重要,如果前期不进行可行性分析,盲目的对项目进行开发,极有可能造成所开发的项目投入到市场之后,却无人问津,到头来竹篮打水一场空。
所以说可行性分析所要达成的主要目的就是到底是不是要干的问题。
下面将从技术可行性、社会可行性和经济可行性这三个方面来对所做的系统进行分析和研究。
4.1.1技术可行性
系统的开发语言为python,使用回溯算法来进行数独的求解,python是比较常用且流行的语言,现在有许多程序和网页都是用python编写的,python还常被用来做数据爬虫,技术可以说是非常成熟。
回溯算法在许多问题上也都有运用,也是一种非常成熟的算法,所以游戏系统在技术上是可行的。
4.1.2经济可行性
本系统的主要功能是通过回溯算法进行求解。
系统整个体系相对来说很小,所以开发成本很低。
系统硬件的投入就是一台电脑,软件的投入就是python以及一些相关的扩展包,所有软件都是通过网络获取而且没有付费。
因为软件发面的投入几乎为零,后期维护目前还没涉及,人员的投入就是我自己。
由于没有投放市场,也不涉及培训等,由上面来看,整个投入的主要内容就是一台电脑。
而对用户来说,系统的使用也只需一台电脑就可以。
综上所述,系统在经济上是可行的。
4.1.3操作可行性
本系统的操作可行性主要分为两个方面,一方面为法律因素,另一方面为用户使用可行性方面。
(1)法律因素
本游戏在开发之前,进行了详细的需求分析,经过了大量的调研。
而且系统的软件设计是在独立的环境下完成的,没有抄袭任何国内外的产品,更谈不上盗版侵权的问题,是完全合法的软件。
本系统的开发是完全遵守法律原则,依照法律程序划清了委托方和开发方的职责,没有违法行为,可放心使用,因此法律上是有保障的。
(2)用户使用可行性
本系统功能简单,使用方便,用户只需一台电脑,就可以进行操作。
由于系统的功能是入侵简介,都是由系统完成,用户只需看到结果。
所以说在使用上是没有问题的。
综上所述,系统在操作上是可行的。
4.2游戏系统运行环境分析
本设计基于处理器因特尔酷睿i7,运行内存为16G,硬盘内存在100G以上的硬件环境下开发,系统为windows10操作系统,开发语言为python,开发所用软件版本为python3.6。
开发环境良好,操作可行。
4.3本章小结
本章主要对游戏系统进行分析,分别进行了可行性分析以及系统运行环境分。
可行性分析中又分别对技术、经济和操作可行性进行了具体的分析,分析结果为可行。
又对游戏系统运行的硬件环境、操作系统以及开发版本进行分析,结果也为可行。
5游戏设计
开发此游戏的目的是为了让更多人了解到数独的奥秘,数独并没有想象中那么难,只要掌握技巧就能获得其中的无限乐趣。
4
5
5.1设计原则
对于数独游戏来说,在整个游戏设计的过程中需要考虑到益智类游戏的科学性、严谨性、教育性和趣味性,这些是开发一款益智类游戏的基础。
我也对现在网络上的一些数独游戏进行下载体验,大多数是以关卡固定题目的方式来进行,所以我进行了一下创新,同一难度随机生成不同数独,有很大的可玩性。
应遵循的原则有以下几点:
5.1.1开发角度
(1)因为是在windows系统下开发,所以暂时不考虑mac系统,但考虑到windows系统也有众多版本,所以要考虑一定的兼容性。
(2)现在的电脑屏幕的分辨率逐步提高,要充分利用高分辨率屏幕的优势,让玩家在操作手感和操作灵活程度上都能获得很好的用户体验。
(3)益智类游戏的主题和内容应正面积极,符合社会主义价值观和伦理道德,包含色情暴力等危害心理健康的有感内容[9]。
5.1.2推广角度
(1)应对玩家进行分类,确定适合年龄和知识能力的对象。
数独游戏规则简单,对于任何有兴趣的玩家都可以进行尝试。
(2)游戏的难度应适中,不能让玩家感觉到太难无法进行,也不能太简单让玩家觉得没有挑战性。
游戏难度应该由简到难,让玩家进行思考和研究,逐步突破,获得游戏成就感。
5.1.3娱乐角度
游戏界面应简洁舒心,对于数独这种益智动脑类游戏,界面颜色应使人心情舒畅,给玩家提供一个安静的环境供玩家思考,使玩家能够投入其中。
当玩家能够成功破解数独时,会得到一种成就感,从而对下一关有更大的信心去破解它;当玩家失败了的时候,就可以根据答案研究数独,从游戏中学习。
5.2需求分析
5.2.1功能需求
本设计是以“
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 基于 Python 游戏 系统 研究 设计
![提示](https://static.bdocx.com/images/bang_tan.gif)