【代码】pygame学习

效果图

在这里插入图片描述

代码

import pygame
import random
from pygame.locals import *

# Pygame 提供一个叫做 Sprites 的基础类,为了画图。Surface 看作一张白纸,Rects 是 Surface 中矩形区域的表示。
class Player(pygame.sprite.Sprite):
    def __init__(self):
        super(Player, self).__init__()
        self.image = pygame.image.load('jet.png').convert()
        self.image.set_colorkey((255, 255, 255), RLEACCEL)
        self.rect = self.image.get_rect()

    # 定义按键
    def update(self, pressed_keys):
        if pressed_keys[K_UP]:
            self.rect.move_ip(0, -2)
        if pressed_keys[K_DOWN]:
            self.rect.move_ip(0, 2)
        if pressed_keys[K_LEFT]:
            self.rect.move_ip(-2, 0)
        if pressed_keys[K_RIGHT]:
            self.rect.move_ip(2, 0)

        # 超出屏幕范围的进行纠正
        if self.rect.left < 0:
            self.rect.left = 0
        elif self.rect.right > 800:
            self.rect.right = 800
        if self.rect.top <= 0:
            self.rect.top = 0
        elif self.rect.bottom >= 600:
            self.rect.bottom = 600

# 定义敌人类
class Enemy(pygame.sprite.Sprite):
    def __init__(self):
        super(Enemy, self).__init__()
        self.image = pygame.image.load('missile.png').convert()
        self.image.set_colorkey((255, 255, 255), RLEACCEL)
        self.rect = self.image.get_rect(
            center=(random.randint(820, 900), random.randint(0, 600)))
        self.speed = random.randint(1, 2)

    def update(self):
        self.rect.move_ip(-self.speed, 0)
        # 如果超出边框,就删除,不会再被渲染出来
        if self.rect.right < 0:
            self.kill()

# 定义背景类
class Cloud(pygame.sprite.Sprite):
    def __init__(self):
        super(Cloud, self).__init__()
        self.image = pygame.image.load('cloud.png').convert()
        self.image.set_colorkey((0, 0, 0), RLEACCEL)
        self.rect = self.image.get_rect(center=(
            random.randint(820, 900), random.randint(0, 600))
        )

    def update(self):
        self.rect.move_ip(-2, 0)
        if self.rect.right < 0:
            self.kill()

# 初始化 pygame
pygame.init()

# 创造一个画布,并传递宽度和高度
screen = pygame.display.set_mode((800, 600))

# 创建自定义事件
ADDENEMY = pygame.USEREVENT + 1
pygame.time.set_timer(ADDENEMY, 1000)
ADDCLOUD = pygame.USEREVENT + 2
pygame.time.set_timer(ADDCLOUD, 1000)

# 创建一个类
player = Player()

background = pygame.Surface(screen.get_size())
background.fill((135, 206, 250))

# Group 是 Sprite 的集合
enemies = pygame.sprite.Group()
clouds = pygame.sprite.Group()
all_sprites = pygame.sprite.Group()
all_sprites.add(player)

# 游戏主循环
running = True

while running:
    # 遍历事件队列
    for event in pygame.event.get():
        # 检测 KEYDOWN 事件: KEYDOWN 是 pygame.locals 中定义的常量,pygame.locals文件开始已经导入
        if event.type == KEYDOWN:
            # 如果按下 Esc 那么主循环终止
            if event.key == K_ESCAPE:
                running = False
        # 检测 QUIT : 如果 QUIT, 终止主循环
        elif event.type == QUIT:
            running = False

        elif event.type == ADDENEMY:
            new_enemy = Enemy()
            enemies.add(new_enemy)
            all_sprites.add(new_enemy)

        elif event.type == ADDCLOUD:
            new_cloud = Cloud()
            all_sprites.add(new_cloud)
            clouds.add(new_cloud)

    screen.blit(background, (0, 0))
    pressed_keys = pygame.key.get_pressed()
    player.update(pressed_keys)
    enemies.update()
    clouds.update()
    for entity in all_sprites:
        screen.blit(entity.image, entity.rect)

    if pygame.sprite.spritecollideany(player, enemies):
        player.kill()

    pygame.display.flip()

知识点

只在这里简述,自己明白就行。具体的或者不明白的参考最后的链接

Blit 和 Flip

将创建的 Surface 绘制(Blit)到另一个 Surface 上,blit()有两个参数:要画的 Surface 和 在源 Surface 上的坐标。注意在 blit 之后的 pygame.display.filp() 的调用。Flip将会更新自上次 flip 后的整个屏幕,两次 flip 之间发生的修改都将在屏幕上显示,没有调用flip()那就什么也不会出现。

用户输入

pygame 的一个事件方法,pygame.event.get_pressed()。get_pressed()方法返回一个队列,其中包含了所有按键事件组成的字典,我们将把它放在主循环中,这样我们将获得每一帧上的按键。

Sprites

Sprites 是屏幕上事物的二维表达。本质上来讲,Sprite 就是一个图片,Pygame 提供一个叫做 Sprites 的基础类,它就是用来扩展的,可以包含想要在屏幕上呈现的对象一个或多个图形表示。

Groups

Groups 是 Sprite 的集合,sprite.Group 有一些内建的方法,有助于解决冲突和更新问题,所以建议采用这种方法。使用add()向里面添加Sprites

自定义事件

我们创建一个自定义事件,它隔几秒钟就会触发创建一批敌人。我们要监听该事件,方式和监听按键或退出事件一样

冲突

pygame.sprite 提供一个函数 spritecollideany() ,它接受一个 Sprite 对象和一个 Sprite.Group ,检测 Sprite 对象是否和 Sprite Group 中的其他 Sprites 冲突。

if pygame.sprite.spritecollideany(player,enemies):
    player.kill()

图片

我们想用一张图片替代 Surface 对象。我们将使用 pygame.image.load() 导入图片的路径。load() 方法将会返回一个 Surface 对象。我们然后在这个 Surface 对象上调用 convert() 创建副本,这样可以更快地将它画在屏幕上。
接下来,我们在图片上调用 set_colorkey() 方法。set_colorkey用于设置图片的颜色,如果不设置 Pygame 会将图片设置为透明。这里我选用白色,因为和飞机的背景色一致。RLEACCEL 是一个可选参数,它有助于 PyGame 在非加速显示器上更快地渲染。

class  Player(pygame.sprite.Sprite):
    def __init__(self):
        super(Player,self).__init__()
        self.image = pygame.image.load('jet.png').convert()
        self.image.set_colorkey((255,255,255),RLEACCEL)
        self.rect = self.image.get_rect()

参考链接:

从零开发一个小游戏:PyGame 入门
PyGame – A Primer

在Python中使用Pygame库创建完整的斗地主游戏是一个大型项目,涉及到多个模块和概念。由于这是一项详细的编程任务,这里提供一个简化的概述和步骤,而不是直接给出完整的代码。 **步骤和关键部分:** 1. **安装Pygame**: 首先,你需要安装Pygame库,可以通过pip命令安装:`pip install pygame` 2. **设置游戏窗口**: - 导入pygame库并初始化窗口大小、标题等。 3. **图形界面设计**: - 创建玩家、牌堆、出牌区域、得分板等UI元素。 - 使用Pygame的Surface和Rect对象创建和管理这些元素的位置和显示。 4. **牌类和牌型处理**: - 设计牌类,包含花色、数字、是否出过等属性。 - 实现洗牌、分发牌等功能。 5. **游戏逻辑**: - 游戏循环,包括玩家操作(牌、出牌)、判定胜负等规则。 - 判断地主、农民的轮流出牌,根据剩余牌数和出牌规则决定游戏结果。 6. **事件处理**: - 处理键盘输入、鼠标点击等用户交互事件。 7. **游戏结束与重置**: - 游戏结束后,显示最终得分,并提供重新开始或退出游戏的选项。 8. **运行游戏**: - 在主程序中调用游戏循环并持续运行直到用户选择退出。 由于代码量较大,这里仅提供了大致思路。如果你想要学习具体的代码示例,建议查阅相关教程、博客或在线课程,例如GitHub上开源的斗地主项目。同时,记得在编写过程中结合具体需求不断调整和完善。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

yzy_1996

买杯咖啡,再接再厉

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值