Python版经典小游戏愤怒的小鸟-Python游戏开发

news2024/12/29 14:14:33

Python版经典小游戏愤怒的小鸟源代码

如果你正在学习Python,但是找不到方向的话可以试试我这一份学习方法和籽料呀!点击 领取籽料(不要米米)

基于pygame+pymunk
程序依赖:pygame2.0.1, pymunk5.5.0
直接运行main.py


tool.py

import os
import json
from abc import abstractmethod
import pygame as pg
from . import constants as c

class State():
    def __init__(self):
        self.start_time = 0.0
        self.current_time = 0.0
        self.done = False
        self.next = None
        self.persist = {}
    
    @abstractmethod
    def startup(self, current_time, persist):
        '''abstract method'''

    def cleanup(self):
        self.done = False
        return self.persist
    
    @abstractmethod
    def update(sefl, surface, keys, current_time):
        '''abstract method'''

class Control():
    def __init__(self):
        self.screen = pg.display.get_surface()
        self.done = False
        self.clock = pg.time.Clock()
        self.fps = 60
        self.keys = pg.key.get_pressed()
        self.mouse_pos = None
        self.mouse_pressed = False
        self.current_time = 0.0
        self.state_dict = {}
        self.state_name = None
        self.state = None
        self.game_info = {c.CURRENT_TIME:0.0,
                          c.LEVEL_NUM:c.START_LEVEL_NUM,
                          c.SCORE:0}
 
    def setup_states(self, state_dict, start_state):
        self.state_dict = state_dict
        self.state_name = start_state
        self.state = self.state_dict[self.state_name]
        self.state.startup(self.current_time, self.game_info)

    def update(self):
        self.current_time = pg.time.get_ticks()
        if self.state.done:
            self.flip_state()
        self.state.update(self.screen, self.current_time, self.mouse_pos, self.mouse_pressed)
        self.mouse_pos = None

    def flip_state(self):
        previous, self.state_name = self.state_name, self.state.next
        persist = self.state.cleanup()
        self.state = self.state_dict[self.state_name]
        self.state.startup(self.current_time, persist)

    def event_loop(self):
        for event in pg.event.get():
            if event.type == pg.QUIT:
                self.done = True
            elif event.type == pg.KEYDOWN:
                self.keys = pg.key.get_pressed()
            elif event.type == pg.KEYUP:
                self.keys = pg.key.get_pressed()
            elif event.type == pg.MOUSEBUTTONDOWN and event.button == 1:
                self.mouse_pos = pg.mouse.get_pos()
                self.mouse_pressed = True
            elif event.type == pg.MOUSEBUTTONUP and event.button == 1:
                self.mouse_pressed = False

    def main(self):
        while not self.done:
            self.event_loop()
            self.update()
            pg.display.update()
            self.clock.tick(self.fps)
            if c.DEBUG:
                pg.display.set_caption("pos: " + str(pg.mouse.get_pos()))
        print('game over')

def distance(xo, yo, x, y):
    """distance between points"""
    dx = x - xo
    dy = y - yo
    d = ((dx ** 2) + (dy ** 2)) ** 0.5
    return d

def get_image(sheet, x, y, width, height, colorkey, scale):
        image = pg.Surface([width, height])
        rect = image.get_rect()

        image.blit(sheet, (0, 0), (x, y, width, height))
        image.set_colorkey(colorkey)
        image = pg.transform.scale(image,
                                   (int(rect.width*scale),
                                    int(rect.height*scale)))
        return image

def load_all_gfx(directory, colorkey=(255,0,255), accept=('.png', '.jpg', '.bmp', '.gif')):
    graphics = {}
    for pic in os.listdir(directory):
        name, ext = os.path.splitext(pic)
        if ext.lower() in accept:
            img = pg.image.load(os.path.join(directory, pic))
            if img.get_alpha():
                img = img.convert_alpha()
            else:
                img = img.convert()
                img.set_colorkey(colorkey)
            graphics[name] = img
    return graphics

pg.init()
pg.display.set_caption(c.ORIGINAL_CAPTION)
SCREEN = pg.display.set_mode(c.SCREEN_SIZE)

GFX = load_all_gfx(os.path.join("resources","graphics"))

在这里插入图片描述

完整代码和素材请在下方图片获取:
在这里插入图片描述

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

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

相关文章

Windows提取微信聊天记录,将其导出成HTML、Word、Excel文档永久保存

Windows导出微信消息数据库有两个项目。 一、PyWxDump PyWxDump是一个用于获取 wx 账户信息(昵称/账户/电话/电子邮件/数据库密钥)、解密数据库、查看 wx 聊天以及将聊天导出为 html 备份的工具。 PyWxDump项目地址 PyWxDump是用Python写的&#xff…

铲屎官快来看,清除浮毛效果很好的宠物空气净化器选购指南

在养宠与育儿并重的现代家庭中,营造一个既温馨又健康的居住环境成为了每位家长的首要任务。宠物,尤其是猫咪和狗狗,作为家庭不可或缺的一员,它们的毛发和身影为生活增添了无限乐趣,但同时也带来了一个不容忽视的挑战—…

C++和QT

什么是QT Qt 是一个跨平台的 C图形用户界面应用程序框架。 它为应用程序开发者提供建立艺术级图形界面所需的所有功能。 它是完全面向对象的,很容易扩展,并且允许真正的组件编程。 QT的优点 跨平台,几乎支持所有的平台 接口简单&#x…

《黑神话:悟空》研发公司的薪资水平

作者:程序员晓凡 最近全网最火爆的要属《黑神话:悟空》了,即便是我这个平时不沾游戏、不追直播的人,也看直播看得津津有味。 一、销量与热度背后 首先,让我们来看看那些令人瞩目的数字。《黑神话:悟空》…

AI米壳:跨境电商必备神器:批量图片翻译!

各位跨境电商的小伙伴们,在我们的电商之路上,是不是常常被产品图片翻译的问题困扰呢? 没错,以往只面对一两张图片时,我们可能会选择在百度上翻译,再用 PS 去除原来的中文文字,添加翻译后的语言到…

第三方软件测评中心分享:科技成果鉴定测试的必要性和流程

在飞速发展的科技时代,科技成果的保护和应用愈发重要,科技成果鉴定测试已经成为衡量和验证项目成功的重要环节。科技成果鉴定测试是指对科技项目成果进行评估、验证和认可的过程。这一过程通常由专家团队主导,旨在确保科技产品或研究成果达到…

Java学习第三天

总体三部分内容:数据类型转换、运算符使用、调用Java提供的程序 数据类型转换: 1.自动类型转换 类型范围小的可以直接转换给类型范围大的变量;例如int类型可以直接赋值为long型 int a 10; long b a; char字符型在计算机底层是一个数字…

SOMEIP_ETS_070: Union_Length_longer_as_mesage_length_allows_it

测试目的: 验证当设备(DUT)接收到一个联合(union)长度超出SOME/IP消息长度允许的范围时,是否能够返回错误消息。 描述 本测试用例旨在检查DUT在处理一个echoUNION方法的SOME/IP消息时,如果消…

Apache CloudStack Official Document 翻译节选(十)

关于 Apache CloudStack 的 最佳实践 (四) 网络流量监测与虚拟机容量规划 客户机网路集成流量监测哨兵 要想搜集客户机网路上的使用数据,就需要从部署在对应网路上的网络统计采集器上拉取数据。通过在Apache CloudStack云上集成流量哨兵便可…

37次8.27(docker03)

1.使用dockerfile创建应用镜像 在Docker file中定义所需要执⾏的指令,使⽤ docker build创建 镜 像,过程中会按照dockerfile所定义的内容进⾏打开临时性容 器,把 docker file中命令全部执⾏完成,就得到了⼀个容器应⽤镜 像&am…

OpenCV4深度神经网络DNN实战教程

OpenCV4深度神经网络DNN实战教程 1-概述与环境配置2-卷积神经网络概述3-加载网络模型与设置3.1 所需的模型下载3.2 所使用的模型(googlenet)3.3 Net介绍3.4 代码输出网络结构信息3.5 计算后台设置3.6 所有代码 4-图像分类网络inception的使用5-读取分类标…

计算机毕业设计选题推荐-医疗就诊平台-在线医疗问诊系统-Java/Python项目实战

✨作者主页:IT毕设梦工厂✨ 个人简介:曾从事计算机专业培训教学,擅长Java、Python、微信小程序、Golang、安卓Android等项目实战。接项目定制开发、代码讲解、答辩教学、文档编写、降重等。 ☑文末获取源码☑ 精彩专栏推荐⬇⬇⬇ Java项目 Py…

HTTP 状态码:解析与处理的全面指南

一、HTTP 状态码概述 HTTP 状态码(HTTP Status Code)是用以表示网页服务器 HTTP 响应状态的 3 位数字代码。它在客户端与服务器之间的通信中起着至关重要的作用。 其主要作用在于向客户端清晰准确地传达服务器对请求的处理结果。例如,当客户…

3种明星代言推广绝招,快速提升品牌曝光!

品牌曝光是现代商业发展中非常重要的一环,而明星代言则是提高品牌曝光的有效手段之一。本文将介绍三种科学有效的明星代言推广绝招,以帮助品牌快速提升曝光度。 1. 明星代言的概念 在现代娱乐圈中,明星代言成为了品牌推广的热门方式之一。明…

Zotero打开后所有文献及笔记都消失了

1 问题描述: 打开文献管理工具zotero之后,之前看过的所有文献都丢失了,还提示找不到路径,是否采用默认C盘的zotero数据目录 若点击了“使用新位置”,则打开的界面里也完全没有自己曾经看过的论文与笔记了。 如下图所示…

游戏开发设计模式之外观模式

目录 外观模式在游戏开发中的具体应用案例是什么? 如何在游戏引擎设计中实现外观模式以提高系统的可扩展性? 外观模式与其他设计模式(如适配器模式、代理模式)相比,有哪些独特的优势和潜在的局限性? 独…

string的模拟实现与深浅拷贝

在上一章中可以看见,string类函数的基本实现和用法,在本文。来用基础的语言来模拟实现string类,来了解一下他们的基础底层; 在VS中string,我们可以看见,实现VS的类成员很多,很麻烦; …

AI写作|AI底层方法论第三节-AI常用的格式(作用+案例)

本文背景: hello大家好我是大象,直接接上文,这一篇我们讲AI的常用格式,这一节也是基础课中非常重要的一个内容,有了正确的格式不仅能输出我们想要的文章内容(按格式)让AI清楚的知道,哪些是要求,哪些是任务。…

CSS系列之浮动清除clear(三)

一、为什么需要清除浮动 浮动的原理是让元素脱离文档流&#xff0c;直接浮在桌面上。使用浮动后续添加内容布局可能会产生布局混乱&#xff0c;造成高度坍塌&#xff0c;这时候就可以利用清除浮动来解决父元素高度塌陷的问题。 <!DOCTYPE html> <html lang"en&q…

K8S对接Ceph分布式存储

文章目录 一、Ceph理论知识1、Ceph简介2、Ceph分布式存储的优点3、Ceph核心组件 二、部署Ceph高可用集群1、服务器环境信息2、部署前环境准备工作3、部署Ceph监控服务Monitor4、激活Ceph存储服务OSD 三、K8S对接Ceph存储1、K8S对接Ceph RBD实现数据持久化2、基于Ceph RBD生成PV…