Python游戏开发:数字华容道(内附完整代码)

在这里插入图片描述

数字华容道是一种经典的智力游戏,源自中国古代的华容道游戏。它的目标是通过滑动数字块,将空格移动到指定位置,从而完成拼图。这款游戏不仅考验玩家的逻辑思维能力,还能锻炼空间想象力和策略规划能力。在数字华容道中,玩家需要将数字从1到16排列成一个4x4的方阵,而空格则可以移动到任何相邻的空位上。

一、游戏实现

游戏的实现基于Python语言,利用Turtle图形库来绘制游戏界面和控制用户交互。Freegames库提供了向量操作,简化了位置和移动的计算。需要用到这些库:

  • Python 编程语言
  • Turtle 图形库
  • Freegames 库(提供向量操作)

二、代码解析

1.初始化和加载

from random import *
from turtle import *
from freegames import floor, vectortiles = {}
neighbors = [vector(100, 0),vector(-100, 0),vector(0, 100),vector(0, -100),
]def load():"""Load tiles and scramble."""count = 1for y in range(-200, 200, 100):for x in range(-200, 200, 100):mark = vector(x, y)tiles[mark] = countcount += 1tiles[mark] = None  # 将最后一个位置设置为空格# 随机打乱数字位置1000次for count in range(1000):neighbor = choice(neighbors)spot = mark + neighborif spot in tiles:number = tiles[spot]tiles[spot] = Nonetiles[mark] = numbermark = spot

这段代码首先定义了棋盘上的格子和邻居方向,然后通过load函数初始化棋盘上的数字,并随机打乱它们的位置。

2.绘制方格

def square(mark, number):"""Draw white square with black outline and number."""up()goto(mark.x, mark.y)down()color('black', 'white')begin_fill()for count in range(4):forward(99)left(90)end_fill()if number is None:returnelif number < 10:forward(20)write(number, font=('Arial', 60, 'normal'))

square函数负责绘制每个数字方格,如果是空格则不绘制数字。
在这里插入图片描述

3.处理用户点击

def tap(x, y):"""Swap tile and empty square."""x = floor(x, 100)y = floor(y, 100)mark = vector(x, y)for neighbor in neighbors:spot = mark + neighborif spot in tiles and tiles[spot] is None:number = tiles[mark]tiles[spot] = numbersquare(spot, number)tiles[mark] = Nonesquare(mark, None)

tap函数处理用户点击事件,当用户点击一个数字时,如果其相邻的空格可以移动,则交换它们的位置。

4.绘制所有方格

def draw():"""Draw all tiles."""for mark in tiles:square(mark, tiles[mark])update()

draw函数遍历所有方格,并调用square函数进行绘制。
在这里插入图片描述

5.主函数

setup(420, 420, 370, 0)
hideturtle()
tracer(False)
load()
draw()
onscreenclick(tap)
done()

主函数设置了Turtle窗口的大小和位置,隐藏了turtle图标,关闭了动画效果,加载了初始状态,绘制了棋盘,并绑定了点击事件。

  • load函数中的随机打乱是游戏开始的关键,它确保了每次游戏的初始状态都是不同的。
  • tap函数中的交换逻辑是游戏的核心,它处理了用户交互和游戏状态的更新。

三、效果展示

在这里插入图片描述

四、完整代码及注释

from random import *  # 导入random模块的所有函数
from turtle import *  # 导入turtle模块的所有函数from freegames import floor, vector  # 导入floor和vector函数# 初始化一个字典,用于存储棋盘上的数字
tiles = {}
# 定义棋盘上每个数字块的四个可能移动方向
neighbors = [vector(100, 0),  # 向右移动vector(-100, 0),  # 向左移动vector(0, 100),  # 向下移动vector(0, -100),  # 向上移动
]# 加载棋盘布局并打乱数字顺序
def load():"""加载棋盘上的数字并进行随机打乱"""count = 1  # 计数器,用于给每个数字块编号# 遍历棋盘上的所有位置for y in range(-200, 200, 100):for x in range(-200, 200, 100):mark = vector(x, y)  # 将位置坐标转换为向量tiles[mark] = count  # 将数字块编号存入字典count += 1  # 计数器递增# 将最后一个位置设置为空格tiles[mark] = None# 随机交换数字块1000次,以达到打乱的效果for count in range(1000):neighbor = choice(neighbors)  # 随机选择一个移动方向spot = mark + neighbor  # 计算目标位置# 如果目标位置在棋盘上且为空,则交换两个数字块的位置if spot in tiles:number = tiles[spot]tiles[spot] = Nonetiles[mark] = numbermark = spot  # 更新当前位置# 绘制数字块
def square(mark, number):"""绘制白色方块,黑色轮廓,并在其中写上数字"""up()  # 提起画笔goto(mark.x, mark.y)  # 移动到指定位置down()  # 放下画笔color('black', 'white')  # 设置画笔颜色为黑色,填充颜色为白色begin_fill()  # 开始填充for count in range(4):  # 画一个四边形forward(99)  # 向前移动99个单位left(90)  # 左转90度end_fill()  # 结束填充# 如果当前位置为空,则不绘制数字if number is None:return# 如果数字小于10,则向前移动一些距离,以便于数字居中显示elif number < 10:forward(20)write(number, font=('Arial', 60, 'normal'))  # 写上数字# 处理用户点击事件
def tap(x, y):"""点击时交换数字块和空格的位置"""x = floor(x, 100)  # 将x坐标对100取模,得到棋盘上的位置y = floor(y, 100)  # 将y坐标对100取模,得到棋盘上的位置mark = vector(x, y)  # 将位置坐标转换为向量# 遍历所有可能的移动方向for neighbor in neighbors:spot = mark + neighbor  # 计算目标位置# 如果目标位置在棋盘上且为空,则交换两个数字块的位置if spot in tiles and tiles[spot] is None:number = tiles[mark]  # 保存当前位置的数字tiles[spot] = number  # 将数字移动到目标位置square(spot, number)  # 绘制移动后的数字tiles[mark] = None  # 将当前位置设置为空square(mark, None)  # 绘制空格# 绘制所有数字块
def draw():"""绘制棋盘上的所有数字块"""for mark in tiles:  # 遍历所有位置square(mark, tiles[mark])  # 绘制每个位置的数字块update()  # 更新屏幕显示# 初始化Turtle窗口
setup(420, 420, 370, 0)
hideturtle()  # 隐藏turtle图标
tracer(False)  # 关闭动画效果,提高绘制速度# 加载棋盘布局并开始绘制
load()
draw()# 绑定点击事件到tap函数
onscreenclick(tap)# 进入主循环,等待用户操作
done()

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

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

相关文章

基于TCP的在线词典系统(分阶段实现)(阻塞io和多路io复用(select)实现)

1.功能说明 一共四个功能&#xff1a; 注册 登录 查询单词 查询历史记录 单词和解释保存在文件中&#xff0c;单词和解释只占一行, 一行最多300个字节&#xff0c;单词和解释之间至少有一个空格。 2.功能演示 3、分阶段完成各个功能 3.1 完成服务器和客户端的连接 servic…

PTX入门教程与实战

PTX入门教程 官方文档的目录结构 1 PTX指令 官方文档链接 1.1 指令形式 指令的操作数个数从0-4不等&#xff0c;其中d代表的是目的操作数&#xff0c;a,b,c是源操作数 p opcode;p opcode a;p opcode d, a;p opcode d, a, b;p opcode d, a, b, c;2 编程模型 2.…

FullCalendar的使用,react日历组件

1.下载 yarn add fullcalendar/core fullcalendar/react fullcalendar/daygrid 2.运行 import React from react; import FullCalendar from "fullcalendar/react"; import dayGridPlugin from "fullcalendar/daygrid";const ExperimentalSchedule () …

13--memcache与redis

前言&#xff1a;数据库读取速度较慢一直是无法解决的问题&#xff0c;大型网站应对的方式主要是使用缓存服务器来缓解这种情况&#xff0c;减少数据库访问次数&#xff0c;以提高动态Web等应用的速度、提高可扩展性。 1、简介 Memcached/redis是高性能的分布式内存缓存服务器…

paddlepaddle2.6,paddleorc2.8,cuda12,cudnn,nccl,python10环境

1.安装英伟达显卡驱动 首先需要到NAVIDIA官网去查自己的电脑是不是支持GPU运算。 网址是&#xff1a;CUDA GPUs | NVIDIA Developer。打开后的界面大致如下&#xff0c;只要里边有对应的型号就可以用GPU运算&#xff0c;并且每一款设备都列出来相关的计算能力&#xff08;Compu…

C语言 | Leetcode C语言题解之第230题二叉搜索树中第K小的元素

题目&#xff1a; 题解&#xff1a; /*** Definition for a binary tree node.* struct TreeNode {* int val;* struct TreeNode *left;* struct TreeNode *right;* };*/int search_num(struct TreeNode* root, int k, int *result, int num) {if(num k 1){retu…

计算机的错误计算(二十九)

摘要 &#xff08;1&#xff09;讨论近似值的错误数字个数。有时&#xff0c;遇到数字9或0, 不太好确认近似值的错误数字个数。&#xff08;2&#xff09;并进一步解释确认计算机的错误计算&#xff08;二十八&#xff09;中一个函数值的错误数字个数。 理论上&#xff0c;我…

Java数据结构-二叉树

树型结构 概念 树是一种非线性的数据结构&#xff0c;它是由n&#xff08;n>0&#xff09;个有限结点组成的一个具有层次关系的集合。把它叫做树是因为它看起来像一棵倒挂的树&#xff0c;也就是说它是根朝上叶朝下的。 树具有以下特点&#xff1a; 有一个特殊结点&…

javaweb个人主页设计(html+css+js)

目录 1 前言和要求 1.1 前言 1.2 设计要求 2 预览 2.1 主页页面 2.2 个人简介 2.3 个人爱好 2.4 个人成绩有代码&#xff0c;但是图片已省略&#xff0c;可以根据自己情况添加 2.5 收藏夹 3 代码实现 3.1 主页 3.2 个人简介 3.3 个人爱好 3.4 个人成绩&#xff…

CSS技巧专栏:一日一例 1.纯CSS实现 会讨好的热情按钮 特效

题外话: 从今天开始,我准备开设一个新的专栏,专门写 使用CSS实现各种酷炫按钮的方法,本专栏目前准备写40篇左右,大概会完成如下按钮效果: 今天,我来介绍第一个按钮的实现方法:会讨好的热情按钮。为什么我给它起这样的名字呢?你看它像不像一个不停摇尾巴的小黄?当你鼠…

SvANet:微小医学目标分割网络,增强早期疾病检测

SvANet&#xff1a;微小医学目标分割网络&#xff0c;增强早期疾病检测 提出背景前人工作医学对象分割微小医学对象分割注意力机制 SvANet 结构图SvANet 解法拆解解法逻辑链 论文&#xff1a;SvANet: A Scale-variant Attention-based Network for Small Medical Object Segmen…

中职网络安全B模块渗透测试server2003

通过本地PC中渗透测试平台Kali对服务器场景Windows进⾏系统服务及版本扫描渗透测 试&#xff0c;并将该操作显示结果中Telnet服务对应的端⼝号作为FLAG提交 使用nmap扫描发现目标靶机开放端口232疑似telnet直接进行连接测试成功 Flag&#xff1a;232 通过本地PC中渗透测试平台…

【Lora模型推荐】Stable Diffusion创作具有玉石翡翠质感的图标设计

站长素材AI教程是站长之家旗下AI绘图教程平台 海量AI免费教程&#xff0c;每日更新干货内容 想要深入学习更多AI绘图教程&#xff0c;请访问站长素材AI教程网&#xff1a; AI教程_深度学习入门指南 - 站长素材 (chinaz.com) logo版权归各公司所有&#xff01;本笔记仅供AIGC…

基于stm32+小程序开发智能家居门禁系统-硬件-软件实现

视频演示&#xff1a; 基于stm32智能家居门禁系统小程序开发项目 视频还有添加删除卡号&#xff0c;添加删除指纹&#xff0c;关闭继电器电源等没有演示。 代码Git&#xff1a; https://github.com/Abear6666/stm32lock 总体功能&#xff1a; 本门禁系统主要解锁功能分别为卡…

android13 设置左右分屏修改为单屏幕,应用分屏改为单屏

总纲 android13 rom 开发总纲说明 目录 1.前言 2.系统设置实现分析 3. 设置修改 4.编译与验证 5.猜测 6.彩蛋 1.前言 android13中,系统设置变成,左边是一级菜单,右侧是二级菜单, 这样跟我们以前android7/8/9的布局是不一样的,我们需要将它修改为一级菜单,点进去…

mysql 5.7.44 32位 zip安装

前言 因为研究别人代码&#xff0c;他使用了5.7的 32位 mysql &#xff0c;同时最新的 8.4 64位 mysql 不能用官方lib连接。所以安装这个版本使用&#xff0c;期间有些坑&#xff0c;在这里记录一下。 下载路径 mysql官方路径&#xff1a;https://downloads.mysql.com/archi…

Unity如何查找两个transform最近的公共parent

查找两个子对象最近的父对象 一、问题背景二、解决方案思路核心算法代码 三、总结 一、问题背景 最近看到个关于Unity的问题&#xff1a;在Hierarchy面板中的游戏对象&#xff0c;给定两个子物体transform对象&#xff0c;如何查找这两个transform最近的公共父级parent。感觉挺…

从 ArcMap 迁移到 ArcGIS Pro

许多 ArcMap 用户正在因 ArcGIS Pro 所具有的现代 GIS 桌面工作流优势而向其迁移。 ArcGIS Pro 与其余 ArcGIS 平台紧密集成&#xff0c;使您可以更有效地共享和使用内容。 它还将 2D 和 3D 组合到一个应用程序中&#xff0c;使您可以在同一工程中使用多个地图和多个布局。 Arc…

Linux桌面溯源

X窗口系统(X Window System) Linux起源于X窗口系统&#xff08;X Window System&#xff09;&#xff0c;亦即常说的X11&#xff0c;因其版本止于11之故。 X窗口系统&#xff08;X Window System&#xff0c;也常称为X11或X&#xff09;是一种以位图方式显示的软件窗口系统。…

保姆级教你如何在大学期间获得自己的一项个人软著(1)

注册与实名认证 1. 注册与实名认证 已注册和实名认证 or 直接使用组织账号 进行软著申请的&#xff0c;可以跳过这部分 1.1 注册 登录中国版权保护中心 中国版权登记业务平台 点击右上角的用户中心 点击立即注册 选择个人身份进行注册 返回登记页面中国版权登记业务平台…