使用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.hqwc.cn/news/222783.html

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

相关文章

【Linux】安卓端JuiceSSH结合内网穿透实现远程连接服务器

目录 前言1. Linux安装cpolar2. 创建公网SSH连接地址3. JuiceSSH公网远程连接4. 固定连接SSH公网地址5. SSH固定地址连接测试 前言 处于内网的虚拟机如何被外网访问呢&#xff1f;如何手机就能访问虚拟机呢&#xff1f; 本文介绍 cpolarJuiceSSH 实现手机端远程连接Linux虚拟…

51单片机项目(14)——基于51单片机的烟雾报警系统

1.设计内容 本次设计的系统功能描述如下&#xff1a; 1.可以测量烟雾浓度并且在屏幕显示&#xff0c;同时显示浓度阈值。 2.可以通过按键对阈值进行加减调节。 3.浓度大于阈值时&#xff0c;蜂鸣器报警&#xff0c;风扇转动&#xff0c;发送报警信息&#xff08;“to high”…

竞赛选题 题目:基于大数据的用户画像分析系统 数据分析 开题

文章目录 1 前言2 用户画像分析概述2.1 用户画像构建的相关技术2.2 标签体系2.3 标签优先级 3 实站 - 百货商场用户画像描述与价值分析3.1 数据格式3.2 数据预处理3.3 会员年龄构成3.4 订单占比 消费画像3.5 季度偏好画像3.6 会员用户画像与特征3.6.1 构建会员用户业务特征标签…

ABAP: JSON 报文解析——/ui2/cl_json

1、JSON数组 报文格式如下&#xff0c;是JSON 数组类型的。 [{"I_TYPE":"V","I_BUSINESSSCOPE":"1001"},{"I_TYPE":"V","I_BUSINESSSCOPE":"1002"} ] json转换为SAP内表&#xff1a; TYP…

数字IC芯片验证流程及验证工具推荐?收藏专用

验证其实是一个“证伪”的过程&#xff0c;从流程到工具&#xff0c;验证工程师的终极目的都只有一个&#xff1a; 发现所有BUG&#xff0c;或者证明没有BUG&#xff0c;以保证芯片功能性能的正确性和可靠性。 验证环节对于一颗芯片的重要性也是不言而喻的&#xff1a; 从项…

spring-boot集成mybatis-generator

通用 Mapper 在 1.0.0 版本的时候增加了 MyBatis Generator (以下简称 MBG) 插件&#xff0c;使用该插件可以很方便的生成实体类、Mapper 接口以及对应的 XML 文件。 下面介绍了 mybatis-generator 在 spring-boot 中的使用过程 一、引入pom依赖 <dependencies><de…

视频合并方法:视频剪辑、合并,高效操作,轻松制作大片

在数字媒体时代&#xff0c;视频剪辑已经成为展示创意和表达自我的重要方式。通过剪辑和合并视频片段&#xff0c;可以将不同的素材组合在一起&#xff0c;制作出更加丰富和有表现力的作品。在视频合并之前&#xff0c;要对视频素材进行剪辑。通过剪辑&#xff0c;可以删除不需…

怎么把视频声音提取成MP3?一分钟解决!

有的时候&#xff0c;我们在看一些综艺访谈节目的时候&#xff0c;觉得里面干货满满&#xff0c;会忍不住想单独把音频下载出来单独听&#xff0c;还可以防止会员到期后不可以再播放&#xff0c;下面就向大家介绍三种好用的视频音乐提取成MP3的方法。 方法一&#xff1a;使用野…

〔005〕虚幻 UE5 像素流多用户部署

✨ 目录 ▷ 为什么要部署多用户▷ 开启分发服务器▷ 配置启动多个信令服务器▷配置启动客户端▷多用户启动整体流程和预览▷注意事项▷ 为什么要部署多用户 之前的像素流部署,属于单用户,是有很大的弊端的打开多个窗口访问,可以看到当一个用户操作界面的时候,另一个界面也会…

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

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

CSC公派博士后|管理学老师赴韩国首尔大学达成目标

J老师自身背景正好卡在CSC公派博士后申报条件的边缘&#xff0c;为增大通过概率&#xff0c;其提出优选亚洲范围内的世界知名高校、专业相符、2年博士后职位的要求。最终我们用韩国首尔大学的邀请函助其顺利获批CSC&#xff0c;实现了所有既定目标。 J老师背景&#xff1a; 申…

Nginx Openresty通过Lua+Redis 实现动态封禁IP

需求 为了封禁某些爬虫或者恶意用户对服务器的请求&#xff0c;我们需要建立一个动态的 IP 黑名单。对于黑名单中的 IP &#xff0c;我们将拒绝提供服务。并且可以设置封禁失效时间 环境准备 linux version: centos7 / ubuntu 等 redis version: 5.0.5 nginx version: nginx…