使用Python编写数独游戏Sudoku教程

数独是各种应用程序中流行的益智类拼图游戏。数独板是一个9×9的网格,玩家必须在每行、每列和3×3的子网格中放置一次数字1到9,并且只能放置一次。游戏开始时,有几个空格已经用数字填充,称为givens。一个好的数独谜题应该只有一个可能的有效解决方案。

它的工作原理

数独网格类的对象是表示数独网格的数据结构。您可以调用它们的方法来修改网格或检索有关网格的信息。例如,makeMove()方法在网格上放置一个数字,resetGrid()方法将网格恢复到其原始状态,如果解决方案的所有数字都已放置在网格上,则isSolved()返回True。

该程序的主要部分从第141行开始,为该游戏使用了一个数独网格对象及其方法,但您也可以将此类复制并粘贴到您创建的其他数独程序中,以重用其功能。

先直接上代码:

import copy, random, sysEMPTY_SPACE = '.'
GRID_LENGTH = 9
BOX_LENGTH = 3
FULL_GRID_SIZE = GRID_LENGTH * GRID_LENGTHclass SudokuGrid:def __init__(self, originalSetup):self.originalSetup = originalSetupself.grid = {}self.resetGrid()self.moves = []def resetGrid(self):"""Reset the state of the grid, tracked by self.grid, to thestate in self.originalSetup."""for x in range(1, GRID_LENGTH + 1):for y in range(1, GRID_LENGTH + 1):self.grid[(x, y)] = EMPTY_SPACEassert len(self.originalSetup) == FULL_GRID_SIZEi = 0y = 0while i < FULL_GRID_SIZE:for x in range(GRID_LENGTH):self.grid[(x, y)] = self.originalSetup[i]i += 1y += 1def makeMove(self, column, row, number):"""Place the number at the column (a letter from A to I) and row(an integer from 1 to 9) on the grid."""x = 'ABCDEFGHI'.find(column)y = int(row) - 1if self.originalSetup[y * GRID_LENGTH + x] != EMPTY_SPACE:return Falseself.grid[(x, y)] = numberself.moves.append(copy.copy(self.grid))return Truedef undo(self):"""Set the current grid state to the previous state in theself.moves list."""if self.moves == []:returnself.moves.pop()if self.moves == []:self.resetGrid()else:self.grid = copy.copy(self.moves[-1])def display(self):"""Display the current state of the grid on the screen."""print('   A B C   D E F   G H I')for y in range(GRID_LENGTH):for x in range(GRID_LENGTH):if x == 0:print(str(y + 1) + '  ', end='')print(self.grid[(x, y)] + ' ', end='')if x == 2 or x == 5:print('| ', end='')print()if y == 2 or y == 5:print('   ------+-------+------')def _isCompleteSetOfNumbers(self, numbers):"""Return True if numbers contains the digits 1 through 9."""return sorted(numbers) == list('123456789')def isSolved(self):"""Returns True if the current grid is in a solved state."""for row in range(GRID_LENGTH):rowNumbers = []for x in range(GRID_LENGTH):number = self.grid[(x, row)]rowNumbers.append(number)if not self._isCompleteSetOfNumbers(rowNumbers):return Falsefor column in range(GRID_LENGTH):columnNumbers = []for y in range(GRID_LENGTH):number = self.grid[(column, y)]columnNumbers.append(number)if not self._isCompleteSetOfNumbers(columnNumbers):return Falsefor boxx in (0, 3, 6):for boxy in (0, 3, 6):boxNumbers = []for x in range(BOX_LENGTH):for y in range(BOX_LENGTH):number = self.grid[(boxx + x, boxy + y)]boxNumbers.append(number)if not self._isCompleteSetOfNumbers(boxNumbers):return Falsereturn Trueprint('''Sudoku PuzzleSudoku is a number placement logic puzzle game. A Sudoku grid is a 9x9grid of numbers. Try to place numbers in the grid such that every row,column, and 3x3 box has the numbers 1 through 9 once and only once.For example, here is a starting Sudoku grid and its solved form:5 3 . | . 7 . | . . .     5 3 4 | 6 7 8 | 9 1 26 . . | 1 9 5 | . . .     6 7 2 | 1 9 5 | 3 4 8. 9 8 | . . . | . 6 .     1 9 8 | 3 4 2 | 5 6 7------+-------+------     ------+-------+------8 . . | . 6 . | . . 3     8 5 9 | 7 6 1 | 4 2 34 . . | 8 . 3 | . . 1 --> 4 2 6 | 8 5 3 | 7 9 17 . . | . 2 . | . . 6     7 1 3 | 9 2 4 | 8 5 6------+-------+------     ------+-------+------. 6 . | . . . | 2 8 .     9 6 1 | 5 3 7 | 2 8 4. . . | 4 1 9 | . . 5     2 8 7 | 4 1 9 | 6 3 5. . . | . 8 . | . 7 9     3 4 5 | 2 8 6 | 1 7 9''')input('Press Enter to begin...')with open('data.txt') as puzzleFile:puzzles = puzzleFile.readlines()for i, puzzle in enumerate(puzzles):puzzles[i] = puzzle.strip()grid = SudokuGrid(random.choice(puzzles))while True:grid.display()if grid.isSolved():print('Congratulations! You solved the puzzle!')print('Thanks for playing!')sys.exit()while True:print()print('Enter a move, or RESET, NEW, UNDO, ORIGINAL, or QUIT:')print('(For example, a move looks like "B4 9".)')action = input('> ').upper().strip()if len(action) > 0 and action[0] in ('R', 'N', 'U', 'O', 'Q'):breakif len(action.split()) == 2:space, number = action.split()if len(space) != 2:continuecolumn, row = spaceif column not in list('ABCDEFGHI'):print('There is no column', column)continueif not row.isdecimal() or not (1 <= int(row) <= 9):print('There is no row', row)continueif not (1 <= int(number) <= 9):print('Select a number from 1 to 9, not ', number)continuebreakprint()if action.startswith('R'):grid.resetGrid()continueif action.startswith('N'):grid = SudokuGrid(random.choice(puzzles))continueif action.startswith('U'):grid.undo()continueif action.startswith('O'):originalGrid = SudokuGrid(grid.originalSetup)print('The original grid looked like this:')originalGrid.display()input('Press Enter to continue...')if action.startswith('Q'):print('Thanks for playing!')sys.exit()if grid.makeMove(column, row, number) == False:print('You cannot overwrite the original grid\'s numbers.')print('Enter ORIGINAL to view the original grid.')input('Press Enter to continue...')

运行sudoku.py时,输出将如下所示:

代码的工作原理:

SudokuGrid类的对象是表示数独网格的数据结构。您可以调用它们的方法来修改网格或检索有关网格的信息。例如,makeMove()方法在网格上放置一个数字,resetGrid()方法将网格恢复到其原始状态,如果解决方案的所有数字都已放置在网格上,则isSolved()返回True。

该程序的主要部分从第111行开始,为该游戏使用了一个数独网格对象及其方法,但您也可以将此类复制并粘贴到您创建的其他数独程序中,以重用其功能。

date.txt文件包含的是谜题,以下是此文件中的内容示例:

..3.2.6..9..3.5..1..18.64....81.29..7.......8..67.82....26.95..8..2.3..9..5.1.3..

2...8.3...6..7..84.3.5..2.9...1.54.8.........4.27.6...3.1..7.4.72..4..6...4.1...3

......9.7...42.18....7.5.261..9.4....5.....4....5.7..992.1.8....34.59...5.7......

.3..5..4...8.1.5..46.....12.7.5.2.8....6.3....4.1.9.3.25.....98..1.2.6...8..6..2.

提示:粘贴代码时注意格式的缩进。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/174220.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Linux MeterSphere一站式开源持续测试平台远程访问

文章目录 前言1. 安装MeterSphere2. 本地访问MeterSphere3. 安装 cpolar内网穿透软件4. 配置MeterSphere公网访问地址5. 公网远程访问MeterSphere6. 固定MeterSphere公网地址 前言 MeterSphere 是一站式开源持续测试平台, 涵盖测试跟踪、接口测试、UI 测试和性能测试等功能&am…

计算机毕业设计 基于SpringBoot的智能停车场计费系统的设计与实现 Java实战项目 附源码+文档+视频讲解

博主介绍&#xff1a;✌从事软件开发10年之余&#xff0c;专注于Java技术领域、Python人工智能及数据挖掘、小程序项目开发和Android项目开发等。CSDN、掘金、华为云、InfoQ、阿里云等平台优质作者✌ &#x1f345;文末获取源码联系&#x1f345; &#x1f447;&#x1f3fb; 精…

linux下的工具---yum

一、什么是yum yum是Linux下的软件包管理器 二、什么是软件包管理器 1、在Linux下安装软件, 一个通常的办法是下载到程序的源代码, 并进行编译, 得到可执行程序. 2、但是这样太麻烦了, 于是有些人把一些常用的软件提前编译好, 做成软件包(可以理解成windows上的安装程序)放在…

IDEA中Tomcat启动web项目

1.首先【Run】-->【Edit Configurations】&#xff0c;进入对应功能界面 2.点击左上角【】&#xff0c;选择Tomcat Server -->Local 3.Name输入自己中意的&#xff0c;下面两个port&#xff0c;保证没被占用就行 4.切到【Deployment】页签&#xff0c;点击【】&#xff…

(十三)Flask之特殊装饰器详解

目录&#xff1a; Flask中用作装饰器的特殊的函数第一部分&#xff1a;before_request和after_request一、 before_request装饰器&#xff1a;二、after_request装饰器&#xff1a;三、多个before_request和after_request执行流程分析&#xff1a; 首先—理论讲解&#xff1a;然…

Python3 面向对象

面向对象技术简介 类&#xff08;Class&#xff09;&#xff1a;用来描述具有相同属性的方法和对象的集合。它定义了该集合中每个对象所共有的属性和方法。对象是类的实例。方法&#xff1a;类中定义的函数类变量&#xff1a;类变量在整个实例化的对象中是公用的。类变量定义在…

微软Azure AI新增Phi、Jais等,40种新大模型

微软在官方宣布在Azure AI云开发平台中&#xff0c;新增了Falcon、Phi、Jais、Code Llama、CLIP、Whisper V3、Stable Diffusion等40个新模型&#xff0c;涵盖文本、图像、代码、语音等内容生成。 开发人员只需要通过API或SDK就能快速将模型集成在应用程序中&#xff0c;同时支…

Java EE 进程线程

JavaEE 进程&线程 文章目录 JavaEE 进程&线程1. 进程1.1 概念1.2 进程管理1.3 PCB (Process Control Block) 2. 线程2.1 概念2.1 线程与进程的区别2.3 创建线程 1. 进程 1.1 概念 什么是进程&#xff1f; 进程是操作系统对一个正在执行的程序的一种抽象 我们可以打开…

Python编程基础

Python是一种简单易学的编程语言&#xff0c;广泛应用于Web开发、数据分析、人工智能等领域。无论您是初学者还是有一定编程经验的人士&#xff0c;都可以从Python的基础知识开始建立自己的编程技能。 目录 理论Python语言的发展程序设计语言的分类静态语言与脚本语言的区别 代…

Allegro层叠中的介电常数如何填写指导说明

Allegro层叠中的介电常数如何填写指导说明 在用Allegro进行PCB设计的时候,需要在cross-section中设置好每个层的信息,包括层命名,每层的厚度等等信息。如下图 一般来说,这些信息就足够了 但是对于有仿真需求或者等长设计需要使用ps作为延时单位的设计的时候,需要额外在层…

JVM基础篇:垃圾回收

1.前言 1.1C/C的内存管理 在C/C这类没有自动垃圾回收机制的语言中&#xff0c;一个对象如果不再使用&#xff0c;需要手动释放&#xff0c;否则就会出现内存泄漏。我们称这种释放对象的过程为垃圾回收&#xff0c;而需要程序员编写代码进行回收的方式为手动回收。内存泄漏指的…

6.12找树左下角的值(LC513-M)

算法&#xff1a; 这道题适合用迭代法&#xff0c;层序遍历&#xff1a;按层遍历&#xff0c;每次把每层最左边的值保存、更新到result里面。 看看Java怎么实现层序遍历的&#xff08;用队列&#xff09;&#xff1a; /*** Definition for a binary tree node.* public clas…

C++——解锁string常用接口

本篇的内容是记录使用string接口的测试与使用&#xff0c;方便后续使用时查阅使用 首先介绍 string::npos; size_t&#xff08;无符号整型&#xff09;的最大值。NPOS 是一个静态成员常量值&#xff0c;具有 size_t 类型元素的最大可能值。当此值用作字符串成员函数中 len&am…

Linux多路转接select,poll

文章目录 目录 文章目录 一、五种IO模型 1.阻塞IO: 2.非阻塞IO 3.信号驱动IO 4.IO多路转接 5.异步IO 二、高级IO的一些重要概念 1.同步通信和异步通信 2.阻塞和非阻塞 三、其他高级IO 四、非阻塞IO 1.fctl函数 2.实现setNoBlock函数&#xff0c;将文件描述符设置…

好玩的调度技术-生成式三维技术

好玩的调度技术-生成式三维技术 文章目录 好玩的调度技术-生成式三维技术前言一、效果图&#xff1f;二、技术实现系列文章链接其他文章新篇章 前言 目前休息了&#xff0c;预计休息半年&#xff0c;这半年里只会零星更新一些好玩的技术&#xff0c;感觉好玩系列都快成系列文章…

详解如何使用VSCode搭建TypeScript环境(适合小白)

搭建Javascript环境 因为TypeScript不能直接在浏览器上运行。它需要编译器来编译并生成JavaScript文件。所以需要首先安装好javascript环境&#xff0c;可以参考文章&#xff1a; 详解如何使用VS code搭建JavaScript环境&#xff08;适合小白&#xff09;_vscode配置javascri…

LeetCode Hot100 437.路径总和III

题目&#xff1a; 给定一个二叉树的根节点 root &#xff0c;和一个整数 targetSum &#xff0c;求该二叉树里节点值之和等于 targetSum 的 路径 的数目。 路径 不需要从根节点开始&#xff0c;也不需要在叶子节点结束&#xff0c;但是路径方向必须是向下的&#xff08;只能从…

不可错过的设计工具!7款亲测好用的网页设计工具推荐!

网页设计并不容易&#xff0c;易于使用的网页设计工具更难找到。随着网络的快速发展&#xff0c;网站迅速崛起&#xff0c;网页设计也很流行。本文收集了 7 种良心和易于使用的网页设计工具&#xff0c;每一种近年来都受到网页设计师的广泛欢迎&#xff0c;以确保实用和易于使用…

前端技术探秘-Nodejs的CommonJS规范实现原理 | 京东物流技术团队

了解Node.js Node.js是一个基于ChromeV8引擎的JavaScript运行环境&#xff0c;使用了一个事件驱动、非阻塞式I/O模型&#xff0c;让JavaScript 运行在服务端的开发平台&#xff0c;它让JavaScript成为与PHP、Python、Perl、Ruby等服务端语言平起平坐的脚本语言。Node中增添了很…

免费商用字体,进来领取!!!

如果你不知道去哪里找免费可商用字体&#xff0c;那一定要收藏好这几个网站&#xff0c;全部都是免费无版权字体&#xff0c;以后再也不用担心侵权问题了。 1、免费字体网 https://font.sucai999.com/ 一个免费可商用字体搬运工&#xff0c;实时跟新市面上免费商用的字体。网站…