百度360必应搜狗淘宝本站头条
当前位置:网站首页 > 技术资源 > 正文

用python写游戏之200行代码写个数字华容道

off999 2025-06-24 15:57 29 浏览 0 评论

今天来分析一个益智游戏,数字华容道。

当初对这个游戏颇有印象还是在最强大脑节目上面,何猷君以几十秒就完成了这个游戏。前几天写2048的时候,又想起了这个游戏,想着来研究一下。

游戏玩法

用尽量少的步数,尽量短的时间,将棋盘上的数字方块,按照从左到右、从上到下的顺序重新排列整齐。

效果图

游戏操作方式

第一种是通过键盘的按键来移动数字,比如按上键,需要做的操作是把13移上去。

第二种是通过鼠标点击13,13移上去。不论采取哪种操作方式,可移动数字只能往固定的方向移动,做的操作都是把13和0位置互换即可。考虑到操作性,我们选用鼠标点击这种更为简单的操作方式。

自定义棋盘

定义棋盘的大小:4 * 4, 当然我把这个棋盘的大小做成了可自定义的属性,如果你觉得4*4没有挑战性, 还可以5 * 5 、6 * 6等等,下面以4 * 4为例做介绍。

看过我之前2048那篇文章的,一定明白接下来应该怎么做。没错,忽略棋盘背景,把棋盘看作一个4*4的二维矩阵,空白格用数字0填充:

接下来,我们应该考虑的问题是,数字的移动该怎么做?看上图的状态,此时只有0的上,右,下三格可以移动,别的都不能动。这里大家可以停顿一下考虑考虑,看看能不能找到一个移动的算法方案?

数字移动

通过数字在二维矩阵中的下标来表示数字的位置,比如8的位置是第一行、第一列即(0,0)(列表元素的下标从0开始), 第二行、第一列是(1, 0)。可以看下图:

图中,13的坐标是(3,0)。当鼠标点击13时,13和0交换位置,13的位置变成(2,0)。从(3,0)到(2,0)可以看作加了一个矢量(-1,0)。那如果点击不是13, 而是(1,0)位置的3,发生的变化就是(1,0)变成(2,0),矢量是(1,0),同理(2,1)位置移到(2, 0) 矢量是(0, -1),我们得到了一个上下左右的矢量集合, 上(-1, 0), 下(1, 0), 左(0, -1), 右(0, 1) 。

游戏逻辑

游戏的逻辑就变成了,当我们随便点击一个数字时,判断该数字的位置分别在加上4个矢量后的位置上的数字是否为0,是0,就把两个位置的数字交换,不是0,不做任何变动即可。

为什么会变成这样,因为一个数字可移动的方向只有0个或者1个。

数据矩阵存放

缕清了游戏的逻辑,那在记录数据二维矩阵时,就需要记录每个数字在矩阵中的位置下标。所以我们不打算采用2048中的矩阵的记录方式,而是采用python中的dict, 把位置作为key,把数字作为value。

整个操作的逻辑就是,当我们鼠标点击时,首先获取点击的坐标(x, y),通过坐标(x, y),获取到点击了哪一行,哪一列,得到(row_index, col_index)。然后把(row_index, col_index)分别加四个矢量, 判断加矢量后的位置(row_index+vector, col_index+vector) 在不在上图中的dict中且值是否等于0, 如果等于0, 使(row_index, col_index) 和 (row_index+vector, col_index+vector)的值互换。

如何判断游戏胜利?

判断dict中的最后一位是否为0,且0之前的所有值,是否按照顺序排序, 即为胜利。字典考虑到需要顺序,所以可以采用collections库中的OrderedDict 有序字典的数据格式。

代码开撸

1. 定义全局变量

2. 定义逻辑,初始化棋盘数据

在初始化过程中,首先要生成一个已胜利的数据顺序,然后随机移动一千次。如果是随机生成数据,有可能数据无解。

3. 初始化点击数据,和移动逻辑

4. 点击移动和判断游戏胜利的逻辑

5. 监控事件,自定义了定时器,记录游戏时间。监控鼠标点击事件,获取坐标,移动数字。

6. 主函数

不到两百行,代码完成。完整源代码私信回复 华容道 即可获取。

游戏运行

2048文章链接:用python写游戏之 2048

相关推荐

电脑里一堆microsoft visual

按照系统向下兼容原理,保留2010就可以了.1)你安装的时候是不是把创建快捷键的选项框都没选上,导致在开始菜单中没有找到相应的链接?2)去你的安装目录下,找到Microsoftvisualc++...

windows无法识别usb(windows无法识别usb设备)
windows无法识别usb(windows无法识别usb设备)

Windows无法识别USB,解决办法如下右键开始菜单打开设备管理器,在通用串行总线控制器中右键点击设备选择“卸载”,完成后重新启动计算机即可解决问题。这有可能是在组策略中禁用了USB口,可以使用快捷键【Win+R】运行gpedit.msc...

2025-11-10 11:51 off999

bios能看到硬盘 开机找不到硬盘

bios里可以看到硬盘,说明硬盘已经被主板识别。进系统找不到,可能硬盘没分区,或者硬盘是动态磁盘,还没有导入或激活。按win+r,输入diskmgmt.msc回车,就打开磁盘管理了,在里面可以给新硬盘...

找回qq聊天记录的方法(找回qq聊天记录怎么找)
  • 找回qq聊天记录的方法(找回qq聊天记录怎么找)
  • 找回qq聊天记录的方法(找回qq聊天记录怎么找)
  • 找回qq聊天记录的方法(找回qq聊天记录怎么找)
  • 找回qq聊天记录的方法(找回qq聊天记录怎么找)
无线网有个红叉(无线网有个红叉,搜索不到网络)

连接失败,路由坏换路由,外网坏,报修无线网络处出现红叉表示设备无法正常工作。请检查网卡驱动是否正常,无线网络开关是否打开。解决方法:查看电脑是否有无线网络开关,且是否打开。进入设备管理器检查网卡驱动是...

thinkpad笔记本官网首页(thinkpad官方商城)

官方网站 国内:http://www.thinkworld.com.cn   国内用户只需要访问国内即可。  ThinkPad,中文名为“思考本”,在2005年以前是IBMPC事业部旗下的便携式计算机...

win7什么版本最好用(win7哪个版本最稳定流畅)

Windows7旗舰版,最好,最稳定。Windows7,是由微软公司(Microsoft)开发的操作系统,内核版本号为WindowsNT6.1。Windows7可供选择的版本有:简易版(Sta...

win7自带虚拟光驱怎么使用(win7系统虚拟光驱安装教程)

以DAEMONTools为例,360软件管家里面就有最新版的下.安装后使用方法如下:第一种方法:在虚拟光驱界面中,你先按一下中间工具栏最左边“+”符号的按钮,添加镜像文件(可以一次添加多个),这...

电脑装系统蓝屏(电脑装系统蓝屏重启开不了机)

蓝屏的原因往往集中在不兼容的硬件和驱动程序、有问题的软件、病毒等。解决办法:1、病毒的原因。使用电脑管家杀毒。2、内存的原因。用橡皮擦把内存条的金手指擦拭一下,把氧化层擦掉,确保内存条安装、运行正常。...

u盘安装软件(u盘安装软件到电视)

第一种情况:软件安装包可以直接下载的。在电脑上将软件安装包下载到本地硬盘,然后将下载好软件安装包拷贝到U盘上即可拿到别的电脑上去安装。分可为exe格式的和rar格式,exe格式直接安装,rar格式的解...

microsoft官网账户注册(microsoft 帐户注册)

要创建Microsoft账户,您可以按照以下步骤进行操作:1.打开任意一个支持浏览器的设备,如电脑、手机或平板电脑。2.在浏览器中输入"Microsoft账户注册"或直接访问Mic...

outlookcom官网(outlook online archive auto)
  • outlookcom官网(outlook online archive auto)
  • outlookcom官网(outlook online archive auto)
  • outlookcom官网(outlook online archive auto)
  • outlookcom官网(outlook online archive auto)
显示器闪屏是什么原因(显示器闪屏是哪里坏了)

解决方法:  一、接触不良导致的显示器闪屏  先查看主机和显示器的电源线连接,是否松动,重新插拔一下电源线。  二、信号干扰导致的显示器闪屏  1、连接显示器的电缆线是否没有屏蔽线圈,如果没有防干扰的...

国产linux操作系统(国产linux操作系统有什么版本)

中国对于操作系统的探索其实并不晚。  早在20世纪60年代中期中国就开始操作系统的研发,那时的比尔·盖茨还只是个迷恋计算机的小字辈,南京大学教授孙钟秀、北京大学杨芙清院士等都是我国操作系统的拓荒者...

免费无需排队的云电脑(不需要排队的云电脑)

目前市场上有一些云游戏平台提供无限时长且无需排队的服务。这些平台通常采用先进的云计算技术和高性能服务器,能够提供稳定流畅的游戏体验。用户可以随时登录并畅玩游戏,无需等待排队。这些平台还提供多种游戏选择...

取消回复欢迎 发表评论: