pgzrun 拼图游戏制作过程详解(10)

news2024/12/24 0:23:22

10. 拼图游戏继续升级——多关卡拼图

  • 初始化列表Photos用来储存拼图文件名,Photo_ID用来统计当下是第几张拼图,Squares储存当下拼图的24张小拼图的文件名,Gird储存当下窗口上显示的24个小拼图及坐标。
Photos=["girl_","boy_","cat_"]
Photo_ID=0
Squares=[]
Gird=[]
  • 建立change_Photo()函数通过Photo_ID来初始化新一轮的拼图
def change_Photo():
    global Photo_ID
    Squares.clear()
    Gird.clear()
    for i in range(1,25):# 初始化最新图片的文件名
        if i<10:
            s=Photos[Photo_ID]+'0'+str(i)
        else:
            s=Photos[Photo_ID]+str(i)
        Squares.append(Actor(s))
    # 略 Squares、Gird的初始化
  • 设定图片切换方法:上一张拼图胜利后按下空格键切换下一张拼图,再次将Is_Win设定为False
  • 修改游戏胜利条件:Photo_ID等于Photos的长度且Is_Win为True时才能迎来最终的胜利
def on_key_down(key):
    global Photo_ID,Is_Win,Win_music
    if key == keys.SPACE:
        Photo_ID += 1
        if Photo_ID < len(Photos):
            Is_Win = False
            Win_music = 0
            change_Photo()
  • 修改时间的更新条件
def update():
    global newTime,startTime,Photo_ID
    if (not Is_Win) or (Photo_ID!=len(Photos)):
        endTime = datetime.datetime.now()
        newTime=(endTime-startTime).seconds
  • 再窗口上增加当下是第几张拼图的提示
def draw():
    # 略
    screen.draw.text("第" + str(Photo_ID+1)+"张图", (WIDTH-100, 10),\
     fontsize=20, fontname='s', color="blue")
  • 当最后一张拼图完成增加提示
def draw():
    # 略
    if Is_Win:
        # 略
        if Photo_ID == len(Photos) :
            screen.draw.text("已是最后一张图了!", (WIDTH / 2 - 170, HEIGHT / 2 + 50), \
            fontsize=50, fontname='s', color="blue")

执行效果如下图所示:

完整代码如下:

import pgzrun
import random
import time
import datetime

try:
    txtFile=open("rank.txt",'r')
    score=txtFile.readline()
except:
    txtFile=open("rank.txt",'w')
    score = "您是第一个玩家"
    txtFile.write(score)
txtFile.close()

startTime=datetime.datetime.now()
oldTime=int(score) if score.isdigit() else 9999
newTime=0

TITLE="pgzrun 拼图游戏"
Square_size=125
WIDTH=Square_size*4
HEIGHT=Square_size*6

click_time=0
clickID_1=clickID_2=-1
Is_Win=False
Win_music=0

sounds.bg_music.play(-1)

Photos=["girl_","boy_","cat_"]
Photo_ID=0
Squares=[]
Gird=[]

def swap_Square(i,j):  # 两个拼图的位置互换
    sounds.chick.play()
    temp_pos=Gird[i].pos
    Gird[i].pos=Gird[j].pos
    Gird[j].pos=temp_pos

def change_Photo():
    global Photo_ID
    Squares.clear()
    Gird.clear()
    for i in range(1,25):
        if i<10:
            s=Photos[Photo_ID]+'0'+str(i)
        else:
            s=Photos[Photo_ID]+str(i)
        Squares.append(Actor(s))
    for i in range(6):
        for j in range(4):
            Square=Squares[i*4+j]
            Square.left=Square_size*j
            Square.top=Square_size*i
            Gird.append(Square)
    for k in range(10):  # 随机抽取10组拼图 进行位置互换
        i = random.randint(0, 23)
        j = random.randint(0, 23)
        swap_Square(i, j)

change_Photo()

def on_mouse_down(pos,button): # 当鼠标被点击时
    global click_time ,clickID_1 , clickID_2,Is_Win,Win_music
    for i in range(24):
        if Gird[i].collidepoint(pos): # 拼图对象被点击
            break
    if click_time%2==0 :
        clickID_1=i
    else:
        clickID_2=i
        swap_Square(clickID_1,clickID_2)
    click_time += 1
    # 成功判断
    is_win = True
    for i in range(6):
        for j in range(4):
            Square = Squares[i * 4 + j]
            if not (Square.left == Square_size * j and Square.top == Square_size * i) :
                is_win = False
                break
    if is_win:
        if Win_music==0:
            sounds.win_music.play()
            Win_music=1
        Is_Win=True
        if newTime<oldTime:
            txtFile=open("rank.txt",'w')
            txtFile.write(str(newTime))
            txtFile.close()

def draw():
    screen.clear()
    for Square in Gird:
        Square.draw()
    screen.draw.text("游戏最佳记录: "+str(oldTime), (10, 10), fontsize=20, fontname='s', color="blue")
    screen.draw.text("第" + str(Photo_ID+1)+"张图", (WIDTH-100, 10), fontsize=20, fontname='s', color="blue")
    screen.draw.text("游戏运行时间: " + str(newTime), (10, 30), fontsize=20, fontname='s', color="blue")
    if Is_Win:
        screen.draw.text("游戏胜利!",(WIDTH/2-100,HEIGHT/2-50),fontsize=50,fontname='s',color="blue")
        if Photo_ID == len(Photos) :
            screen.draw.text("已是最后一张图了!", (WIDTH / 2 - 170, HEIGHT / 2 + 50), fontsize=50, fontname='s', color="blue")
    else :
        for i in range(5):
            screen.draw.line((i*Square_size,0),(i*Square_size,HEIGHT),"black")
        for i in range(7):
            screen.draw.line((0,i*Square_size),(WIDTH,i*Square_size),"black")
        if clickID_1!=-1:
            screen.draw.rect(Rect((Gird[clickID_1].left,Gird[clickID_1].top),(Square_size,Square_size)),"red")

def update():
    global newTime,startTime,Photo_ID
    if (not Is_Win) or (Photo_ID!=len(Photos)):
        endTime = datetime.datetime.now()
        newTime=(endTime-startTime).seconds

def on_key_down(key):
    global Photo_ID,Is_Win,Win_music
    if key == keys.SPACE:
        Photo_ID += 1
        if Photo_ID < len(Photos):
            Is_Win = False
            Win_music = 0
            change_Photo()

pgzrun.go()

pgzrun拼图游戏素材包下载

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

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

相关文章

“顽固”——C语言用栈实现队列

解题图解&#xff1a; 1、 先用stack1存储push来的数据 2、每当要pop数据时&#xff0c;从stack2中取&#xff0c;如果 stack2为空&#xff0c;就先从stack1中“倒”数据到stack2。 这就是用栈实现队列的基本操作 这道题看起来比较容易&#xff0c;但是&#xff01;如果你用C语…

jupyter notebook插件安装及插件推荐

安装插件 安装插件选择的工具栏 pip install jupyter_contrib_nbextensions将插件工具栏添加到jupyter notebook页面 jupyter contrib nbextension installdisable configuration for nbextensions without explicit compatibility (they may break your notebook environme…

《Kubernetes部署篇:Ubuntu20.04基于containerd部署kubernetes1.25.14集群(多主多从)》

一、架构图 如下图所示: 二、环境信息 1、资源下载基于containerd部署容器版kubernetes1.25.14集群资源合集 2、部署规划主机名K8S版本系统版本内核版本IP地址备注k8s-master-121.25.14Ubuntu 20.04.5 LTS5.15.0-69-generic192.168.1.12master节点 + etcd节点k8s-master-131.…

【超实用】2023年,学生上班族如何简单快速,低成本的搭建一个博客网站

文章目录 前言实操环节香港虚拟机购买博客搭建ssl证书配置备份设置 总结 前言 因为工作和生活的需要&#xff0c;我一直有博客的搭建需求。我将总结下来&#xff0c;为读者提供参考。  起初&#xff0c;我采用的是香港云虚拟主机&#xff0c;这种虚拟机极其便宜&#xff08;一…

java接入烽火科技拾音器详细步骤

1 背景 项目中需要拾音器去采集音频数据并保存成mp3这种音频文件&#xff0c;以便以后如果有纠纷后可以作为证据去减少纠纷&#xff0c;于是采购了一台烽火科技的拾音器设备&#xff0c;包括一个采音器及一个处理终端。 2 接线 设备拿过来第一件事是接线&#xff0c;通电&…

WampServer下载安装+cpolar内网穿透实现公网访问本地服务【内网穿透】

文章目录 前言1.WampServer下载安装2.WampServer启动3.安装cpolar内网穿透3.1 注册账号3.2 下载cpolar客户端3.3 登录cpolar web ui管理界面3.4 创建公网地址 4.固定公网地址访问 前言 Wamp 是一个 Windows系统下的 Apache PHP Mysql 集成安装环境&#xff0c;是一组常用来…

如何将视频进行分割?这几种分割方法了解一下

当我们将视频分成几段后&#xff0c;可以更好地组织和管理不同的片段&#xff0c;方便后续查找和使用。我们可以根据需要调整视频的长度和内容&#xff0c;满足不同的观看需求。此外&#xff0c;分段视频可以更好地适应不同的观看场景&#xff0c;可以更方便地分享和传播&#…

RocketMQ 源码分析——Consumer

文章目录 消费者启动流程消费者模式集群消费广播消费 Consumer负载均衡集群模式广播模式 并发消费流程获取topic配置信息获取Group的ConsumerList获取Queue的消费Offset拉取Queue的消息更新Queue的消费Offset 顺序消费流程消费存在的问题消费卡死启动之后较长时间才消费 消费者…

操作系统(5-7分)

内容概述 进程管理 进程的状态 前驱图 同步和互斥 PV操作&#xff08;难点&#xff09; PV操作由P操作原语和V操作原语组成&#xff08;原语是不可中断的过程&#xff09;&#xff0c;对信号量进行操作&#xff0c;具体定义如下&#xff1a; P&#xff08;S&#xff09;&#…

渗透测试信息收集方法和工具分享

文章目录 一、域名收集1.OneForAll2.子域名挖掘机3.subdomainsBurte4.ssl证书查询 二、获取真实ip1.17CE2.站长之家ping检测3.如何寻找真实IP4.纯真ip数据库工具5.c段&#xff0c;旁站查询 三、端口扫描1.端口扫描站长工具2.masscan(全端口扫描)nmap扫描3.scanport4.端口表5.利…

API(八)cosocket常用SDK

一 同步且非阻塞的底层SDK&#xff1a;cosocket 说明&#xff1a; 本篇章只是对cosocket常用话API的汇总,并没有实际案例加以辅证场景&#xff1a; 许多单机版的中间件都是基于cosocket做的二次开发 OpenResty 的核心和精髓 cosocket ① coscoket常用的指令 个人建议&am…

java jax-ws webservice编程,入门教程,包含服务端与客户端,编码

java jax-ws webservice 就是服务端程序提供接口,客户端,通过服务端提供的jar包(或者打包的类文件),通过jax-ws直接调用服务端暴露的接口来进行操作. 服务端 共三个文件 接口 package com.jaxwsdemo.serveice;import javax.jws.WebMethod; import javax.jws.WebParam; impo…

【java基础】Java常见的创建对象方式

背景&#xff1a; 对于好多程序员来说&#xff0c;你问他&#xff0c;如何创建对象&#xff0c;他可能就只知道new个对象不就行了&#xff0c;但是当我们需要看一些框架的源码的时候&#xff0c;经常发现他们不是这样创建对象&#xff0c;然后回过头来&#xff0c;我们就得补充…

2023.9.18 网络层 IP 协议详解

目录 IP协议 IPv4 32位 源IP 地址 / 32位 目的IP 地址 IP 地址管理 特殊 IP 路由选择 IP协议 IPv4 32位 源IP 地址 / 32位 目的IP 地址 基本知识&#xff1a; 在 IP 报头中一般表示为 32位 二进制整数日常生活中的 IP 一般将 32位 二进制整数&#xff0c;也就是 4字节 的二…

Vue的模板语法(下)

一.事件处理 事件修饰符 Vue通过由点(.)表示的指令后缀来调用修饰符&#xff0c; .stop&#xff0c; .prevent&#xff0c;.capture&#xff0c;.self&#xff0c;.once .stop&#xff1a;阻止事件冒泡。当一个元素触发了事件&#xff0c;并且该元素包含嵌套的父元素时&#…

【大虾送书第十期】从不了解用户画像,到用画像数据赋能业务看这一本书就够了

目录 &#x1f36d;写在前面 &#x1f36d;内容简介 &#x1f36d;设计图和原型图 &#x1f36d;参考目录 &#x1f36d;文末福利 &#x1f990;博客主页&#xff1a;大虾好吃吗的博客 &#x1f990;专栏地址&#xff1a;免费送书活动专栏地址 写在前面 在大数据时代&#xff0…

小程序游戏开发和app游戏开发有什么不同呢?

小程序游戏开发和App游戏开发有一些重要的区别&#xff0c;这些区别涉及到平台、技术、发布和用户体验等方面。以下是它们之间的主要不同之处&#xff1a; 平台&#xff1a; 小程序游戏开发是为特定的小程序平台设计的&#xff0c;如微信小程序、支付宝小程序等。这些小程序通常…

Android使用Chrome浏览器进行抓包

Android使用Chrome浏览器进行抓包 这里记录一个用Android真机抓包的方法。 打开Chrome浏览器&#xff0c;打开网址&#xff1a;chrome://inspect/#devices 找到对应 App 点击 inspect&#xff0c;进行网络请求&#xff0c;就能看到抓包的数据啦 数据线连上android设备&#x…

Mybatis框架学习

什么是mybatis&#xff1f; mybatis是一款用于持久层的、轻量级的半自动化ORM框架&#xff0c;封装了所有jdbc操作以及设置查询参数和获取结果集的操作&#xff0c;支持自定义sql、存储过程和高级映射 mybatis用来干什么&#xff1f; 用于处理java和数据库的交互 使用mybat…

容器中的nginx暴露一个端口部署多个功能的网站

随着容器的应用越来越多&#xff0c;将nginx部署在容器中也是常有之事。可能事先创建容器时只暴露了一个端口给浏览器连接&#xff0c;后面又想根据添加多个应用&#xff0c;根据URL的不同来访问不同的应用。比如在暴露了主机的83端口给nginx容器的80端口&#xff0c;原来只有一…