pygame 入门实例教程 1 - 复古方块赛车游戏

python赛车游戏开发,python赛车游戏代码 作者自我介绍:大爽歌,。本教程,过程清晰简明,最终。项目代码已上传到我的github:本文分7部分,每一部分最终代码均存到项目仓库下的游戏运行效果,截图如下。 阅读详情

作者自我介绍:大爽歌, b站小UP主 ,直播编程+红警三 ,python1对1辅导老师 。

本教程步骤明确,过程清晰简明,最终代码量250行上下,适合学习pygame的新手。
项目代码已上传到我的github: https://github.com/BigShuang/simple-brick-games-by-pygame
本文分7部分,每一部分最终代码均存到项目仓库下的1 car racing
游戏已录制成视频,投稿至本人b站:点击前往b站观看游戏视频

游戏运行效果,截图如下
在这里插入图片描述

〇 - 初始准备工作

  • 本项目使用的python3版本*(如果你用python2,我不知会怎么样)*
  • Ide推荐大家选择pycharm*(不同ide应该没影响)*
  • 需要安装第三方库pygame,安装方法(windows电脑,mac系统本人实测与pygame不兼容,强行运行本项目卡成ppt)

电脑打开cmd命令窗口,输入pip install pygame
如果电脑上安的是pip3则是pip3 install pygame

补充说明:
由于众所周知的原因,安装过程中下载可能十分缓慢,甚至由此导致安装失败
此时建议大家尝试使用镜像下载

—国内源—
清华:https://pypi.tuna.tsinghua.edu.cn/simple
阿里云:http://mirrors.aliyun.com/pypi/simple/
中国科技大学: https://pypi.mirrors.ustc.edu.cn/simple/
华中理工大学:http://pypi.hustunique.com/
山东理工大学:http://pypi.sdutlinux.org/
豆瓣:http://pypi.douban.com/simple/

使用办法 pip install xxxx -i jinxiangurl
具体到pygame,则是:

pip install pygame -i https://pypi.tuna.tsinghua.edu.cn/simple

一、实现基础窗口

0 - 新建car_racing.py文件,内容如下
import pygame

WIN_WIDTH = 600  # 窗口宽度
WIN_HEIGHT = 900  # 窗口高度

pygame.init() # pygame初始化,必须有,且必须在开头
# 创建主窗体
win=pygame.display.set_mode((WIN_WIDTH,WIN_HEIGHT))

此时运行car_racing.py,会发现一个一闪而逝的窗口,

1 - 进一步,我们自然而然的就要思考这些问题
  • 游戏窗口大小设置为多少合适?
    由于是方块游戏,所以可以根据方格尺寸、行格字数、列格子数去计算出窗口的宽高
  • 怎么维持住这个窗口?
    通过while循环去实现
  • 但是简单的循环只是单纯的将界面卡住,怎么实现刷新?
    在循环体内使用pygame.display.update()语句进行界面的更新
  • 循环的刷新频率不做节制的话,界面会飞速刷新导致卡死,怎么办?
    pygame有专门的对象pygame.time.Clock用于去控制循环刷新的频率,创建pygame.time.Clock对象后,调用该对象的tick()方法,函数参数为每秒刷新次数,就可以设置循环每秒刷新频率,术语叫做帧率

可前往官方文档观看pygame.time.Clock的更多细节,https://www.pygame.org/docs/ref/time.html#pygame.time.Clock

  • 根据上面的思路,修改car_racing.py后如下
import pygame

C, R = 11, 20  # 11列, 20行
CELL_SIZE = 40  # 格子尺寸

FPS=60  # 游戏帧率
WIN_WIDTH = CELL_SIZE * C  # 窗口宽度
WIN_HEIGHT = CELL_SIZE * R  # 窗口高度

pygame.init() # pygame初始化,必须有,且必须在开头
# 创建主窗体
clock = pygame.time.Clock() # 用于控制循环刷新频率的对象
win = pygame.display.set_mode((WIN_WIDTH,WIN_HEIGHT))

while True:
    clock.tick(FPS) # 控制循环刷新频率,每秒刷新FPS对应的值的次数
    pygame.display.update()

此时运行car_racing.py, 就可以得到一个最最最基础的窗口了,

2 - 但是,这个窗口有个大问题, 此时窗口的关闭按钮很容易出bug(卡死)

所以需要自己去重新实现这个窗口关闭功能,需要在循环体内添加如下代码

# 获取所有事件
for event in pygame.event.get():
    if event.type == pygame.QUIT:
        # 判断当前事件是否为点击右上角退出键
        pygame.quit()
        sys.exit() # 需要提前 import sys

同时我们一般会希望能够设置下背景的颜色
比如,这个游戏的背景色是轻灰色(200, 200, 200)
那么设置背景的代码为

bg_color = (200, 200, 200)
win.fill(bg_color)

不过需要注意的是,这段代码放在不同的位置会产生不同的效果。
放在while循环之前,代表只绘制一次背景,会被后面绘制的东西遮住。
放在while循环中,则是每一帧都会绘制一次背景,一般用于去覆盖掉那些希望删掉的元素。

本阶段最后car_racing.py如下

import pygame
import sys

FPS=60 # 游戏帧率
WINWIDTH = 600  # 窗口宽度
WINHEIGHT = 900  # 窗口高度

pygame.init() # pygame初始化,必须有,且必须在开头
# 创建主窗体
clock = pygame.time.Clock() # 用于控制循环刷新频率的对象
win = pygame.display.set_mode((WINWIDTH,WINHEIGHT))

bg_color = (200, 200, 200)
win.fill(bg_color)

while True:
    # 获取所有事件
    for event in pygame.event.get():
        if event.type == pygame.QUIT:
            # 判断当前事件是否为点击右上角退出键
            pygame.quit()
            sys.exit()

    clock.tick(FPS) # 控制循环刷新频率,每秒刷新FPS对应的值的次数
    pygame.display.update()

到这里,基础窗口就完成了~

二、实现基础方块绘制

1 最基础的绘制方法

pygame里面,绘制一个小方格实际上是很简单的。
新建一个方格色块(放在while循环之前)

area = pygame.Surface((CELL_SIZE, CELL_SIZE))
enemy_color = (50, 50, 50)
area.fill(enemy_color)

再将方格色块放在窗口对象上(放在while循环中,clock.tick(FPS)之前)

win.blit(area, (CELL_SIZE, 0))

此时运行,效果如图
在这里插入图片描述

不过这个绘制方法的问题在于, 后面的移动操作管理起来颇为不便。
要在while循环中编写各种代码来实现area这个色块的位置变换的话,代码写起来麻烦,管理起来也乱。

pygame 给我们提供了一个Sprite类,用于实现可以移动的二维图像对象。

我们将继承这个类,并封装一些需要的方法,方便移动以及管理。

2 使用pygame的Sprite类

In computer graphics, a sprite is a two-dimensional bitmap that is integrated into a larger scene, most often in a 2D video game.
在计算机图形学中,精灵是一种二维位图,它被集成到一个更大的场景中,通常在二维视频游戏中。
个人理解,sprite是一个计算机术语,代表界面中可以移动的二维位图。

继承Sprite, 新建Block类如下(在新建win对象,应该是14行,后面添加如下代码)

class Block(pygame.sprite.Sprite):
    def __init__(self, c, r, color):
        super().__init__()

        self.cr = [c, r]
        self.x = c * CELL_SIZE
        self.y = r * CELL_SIZE

        self.image  = pygame.Surface((CELL_SIZE, CELL_SIZE))
        self.image.fill(color)

        self.rect = self.image.get_rect()
        self.rect.move_ip(self.x, self.y)

删掉前面 1 最基础的绘制方法中, area的相关代码

在while循环之前, 添加如下代码

enemy_color = (50, 50, 50)
block = Block(1, 1, enemy_color)
win.blit(block.image, block.rect)

此时运行效果和1中相同。

三 基础方块移动

1 给Block添加移动方法

首先,给Block 类添加移动到指定行列的类方法如下

    def move_cr(self, c, r):
        self.cr[0] = c
        self.cr[1] = r
        self.x = c * CELL_SIZE
        self.y = r * CELL_SIZE
        self.rect.left = self.x
        self.rect.top = self.y

但是这个方法还是不够的的,
因为游戏中的移动,一般都是操作上下左右来移动。

那么,我们需要把上下左右,转换成c、r的变换。
所以建立字典如下

DIRECTIONS = {
    "UP": (0, -1),  # (dc, dr)
    "DOWN": (0, 1),
    "LEFT": (-1, 0),
    "RIGHT": (1, 0),
}

然后再给Block 类添加按方向移动的方法如下

    def move(self, direction):
        dc, dr = DIRECTIONS[direction]
        next_c, next_r = self.cr[0] + dc, self.cr[1] + dr
        self.move_cr(next_c, next_r)
2 响应键盘按键移动

1 中只是添加了移动的方法,但是玩家要通过键盘来移动的话,
还需要程序中有能够响应处理键盘操作
所以在while循环中的for event in pygame.event.get()循环里,添加代码如下

if event.type == pygame.KEYDOWN:
    if event.key == pygame.K_LEFT or event.key == ord('a'):
        block.move("LEFT")
    if event.key == pygame.K_RIGHT or event.key == ord('d'):
        block.move("RIGHT")
    if event.key == pygame.K_UP or event.key == ord('w'):
        block.move("UP")
    if event.key == pygame.K_DOWN or event.key == ord('s'):
        block.move("DOWN")

同时移动后,需要再进行绘制才能看到在上面的for循环后面(外面)添加

win.blit(block.image, block.rect)

但是这个时候会有一个问题,移动后原来的位置色块还在,没有消失掉(被清掉)。
多移动几下后,结果就像下图一样
在这里插入图片描述

3 清除之前的绘制

所以我们需要擦除之前绘制的色块。
pygame里面,一般采用重新绘制整个界面的方式擦除之前的绘制。
重新绘制界面后,再在界面上添加新的需要绘制的东西。

即在while循环中,win.blit(block.image, block.rect)之前添加代码:

win.fill(bg_color)

此时, while 循环之前的这两句代码删不删除没啥区别

win.fill(bg_color)
win.blit(block.image, block.rect)

(个人视为多余的,所以删除)

此时移动小方块就不会有之前的色块残留了

不过此时还有一个小小的问题,就是小方块可以移动到界面边界外
虽然可以再移动回来,但是这不符合我们这个程序的规则。
所以需要再进行边界处理,使其无法移到边界外。

4 边界处理

给Block 类添加检查能否移动的方法如下

    def check_move(self, direction=""):
        move_c, move_r = DIRECTIONS[direction]
        next_c, next_r = self.cr[0] + move_c, self.cr[1] + move_r

        if 0 <= next_c < C and 0 <= next_r < R:
            return True

        return False

再在while循环中的for循环中的每次调用move方法前,使用check_move检查是否 能移动。
修改后的while循环如下

while True:
    # 获取所有事件
    for event in pygame.event.get():
        if event.type == pygame.QUIT:
            # 判断当前事件是否为点击右上角退出键
            pygame.quit()  # 关闭窗口
            sys.exit()  # 停止程序

        if event.type == pygame.KEYDOWN:
            if event.key == pygame.K_LEFT or event.key == ord('a'):
                if block.check_move("LEFT"):
                    block.move("LEFT")
            if event.key == pygame.K_RIGHT or event.key == ord('d'):
                if block.check_move("RIGHT"):
                    block.move("RIGHT")
            if event.key == pygame.K_UP or event.key == ord('w'):
                if block.check_move("UP"):
                    block.move("UP")
            if event.key == pygame.K_DOWN or event.key == ord('s'):
                if block.check_move("DOWN"):
                    block.move("DOWN")

    win.fill(bg_color)
    win.blit(block.image, block.rect)

    clock.tick(FPS) # 控制循环刷新频率,每秒刷新FPS对应的值的次数
    pygame.display.update()

当然这么写不够优雅,if block.check_move("RIGHT"):重复了四次,
有的朋友可能会觉得把check_move的调用放在move方法里面开头更好。

这里之所以不这么做,是因为后面会在方块组成的赛车类里,进行这个check_move的工作。
具体见下文。

四 多个方块组成方块赛车

1 使用方块组绘制赛车

无论是玩家的车,还是敌人的车,
都是由多个方块组成的。
所以首先要定义下,玩家车和敌人车的方格组成,代码如下

CARS = {  # 车的形状,即格子位置
    "player": [
        [0, 1, 0],
        [1, 1, 1],
        [1, 0, 1],
    ],
    "enemy": [
        [1, 0, 1],
        [1, 1, 1],
        [0, 1, 0],
    ]
}

根据这个方格祖,绘制赛车方法如下:
(放在while循环中,重置背景之后)

car_c, car_r = 2, 2
for ri, row in enumerate(CARS["enemy"]):
    for ci, cell in enumerate(row):
        if cell == 1:
            i_block = Block(car_c + ci, car_r + ri, enemy_color)
            win.blit(i_block.image, i_block.rect)
2 使用Group管理方块

接下来要建立一个赛车类,用来管理这些方块。
pygame为我们提供了一个管理多个Sprite的工具pygame.sprite.Group。
这个Group类可以使用draw方法,将内部的Sprite一起绘制在屏幕窗口上。
这里赛车类就继承这个Group类,如下。

class Car(pygame.sprite.Group):
    def __init__(self, c, r, car_kind, car_color):
        super().__init__()

        for ri, row in enumerate(CARS[car_kind]):
            for ci, cell in enumerate(row):
                if cell == 1:
                    block = Block(c+ci, r+ri, car_color)
                    self.add(block)

同时,给这个赛车类添加移动方法,用于统一移动内部的方块

    def move(self, direction=""):
        if all(block.check_move(direction) for block in self.sprites()):
            for block in self.sprites():
                block.move(direction)

然后删掉其他的建立方块与绘制方块的代码
此时while循环上下代码如下


bg_color = (200, 200, 200)
enemy_color = (50, 50, 50)
player_color = (65, 105, 225)  # RoyalBlue

bottom_center_c = (C - len(CARS["player"][0])) // 2
bottom_center_r = R - len(CARS["player"])
car = Car(bottom_center_c, bottom_center_r, "player", player_color)

while True:
    # 获取所有事件
    for event in pygame.event.get():
        if event.type == pygame.QUIT:
            # 判断当前事件是否为点击右上角退出键
            pygame.quit()  # 关闭窗口
            sys.exit()  # 停止程序

        if event.type == pygame.KEYDOWN:
            if event.key == pygame.K_LEFT or event.key == ord('a'):
                car.move("LEFT")
            if event.key == pygame.K_RIGHT or event.key == ord('d'):
                car.move("RIGHT")
            if event.key == pygame.K_UP or event.key == ord('w'):
                car.move("UP")
            if event.key == pygame.K_DOWN or event.key == ord('s'):
                car.move("DOWN")

    win.fill(bg_color)

    car.draw(win)

    clock.tick(FPS) # 控制循环刷新频率,每秒刷新FPS对应的值的次数
    pygame.display.update()

此时效果如图,小车可以左右移动
在这里插入图片描述

五 刷新敌人赛车

敌人的赛车绘制,同上面第四部分。
不过敌人的赛车

  1. 需要隔一段时间就能自动生成一个
  2. 不能由玩家的键盘操作移动,而是自动地向下移动。
  3. 向下移动出边界后需要清理掉
1 为Car添加新的方法

这里有几个问题需要先解决,

  • 敌人的赛车是可以从上边界移动出来, 可以向下移动出下边界的。
    所以需要修改下原有的赛车内
    为Car添加无边界限制的移动方法free_move如下
    def free_move(self, direction=""):
        for block in self.sprites():
            block.move(direction)

再修改原有的move方法如下

    def move(self, direction=""):
        if all(block.check_move(direction) for block in self.sprites()):
            self.free_move(direction)
  • 敌人赛车完全移动出边界后要清理掉
    所以要给赛车类添加一个方法判断是否完全出了边界
    先给组成赛车的方格Block添加方法is_out如下
    def is_out(self):
        if 0 <= self.cr[0] < C and 0 <= self.cr[1] < R:
            return False
        return True

再为Car添加方法is_out如下

    def is_out(self):
        return all(block.is_out() for block in self.sprites())
2 添加敌人赛车管理类

我们需要一个管理敌人赛车的类EnemyManager。
其代码如下

import random  # 在代码文件开头部分添加

# 在 enemy_color 声明之后的位置添加
class EnemyManager():
    def __init__(self):
        self.enemies = []

        self.move_count = 0

    def gen_new_enemies(self):  # 生成敌人赛车
        # 设置敌人赛车的生成间隔, 隔两倍的敌人赛车行数+1
        if self.move_count % (2 * len(CARS["enemy"]) + 1) == 1:

            ec = random.randint(1, C - len(CARS["enemy"][0]))
            enemy = Car(ec, 0, "enemy", enemy_color)

            self.enemies.append(enemy)

    def move(self):  # 自动向下移动敌人赛车
        # 超出边界后,自动清理掉
        to_delete = []
        for i, enemy in enumerate(self.enemies):
            enemy.free_move("DOWN")
            if enemy.is_out():
                to_delete.append(i)

        for di in to_delete[::-1]:  # 倒着按序号来删除
            self.enemies.pop(di)

        self.move_count += 1

        self.gen_new_enemies()

    def draw(self, master):
        # 绘制敌人赛车
        for enemy in self.enemies:
            enemy.draw(master)
3 绘制敌人赛车

在while循环之前实例化EnemyManager,代码如下

emg = EnemyManager()

在while中对敌车进行绘制,即在win.fill(bg_color)之后添加代码如下

emg.move()
emg.draw(win)

但是此时敌人赛车运动的太快了,是每帧一次移动。
所以需要设置一下,让敌人的赛车每过MOVE_SPACE帧才进行一次移动
在开头添加代码如下

MOVE_SPACE = 5

再在while循环之前添加帧计数器

frame_count = 0

在while循环中的开头添加

frame_count += 1

再修改刚才的敌人赛车绘制代码如下

if frame_count % MOVE_SPACE == 0:
    emg.move()
    
emg.draw(win)

此时运行效果如图
在这里插入图片描述

六 碰撞检测

1 - 添加检测方法

要实现碰撞检测,只需给敌人赛车管理类EnemyManager添加方法
遍历其中现有的敌人赛车,检查是否与玩家赛车相撞即可。
赛车相撞的判断方法为两车的方块有重叠,即有相同位置的方块。
所以给类Car添加check_collide方法,代码如下

    def check_collide(self, other_car):
        for block in self.sprites():
            bcr1 = tuple(block.cr)
            for other_block in other_car.sprites():
                bcr2 = tuple(other_block.cr)
                if bcr1 == bcr2:
                    return True
        
        return False

再给敌人赛车管理类EnemyManager添加check_collide方法,代码如下

    def check_collide(self, player):
        for enemy in self.enemies:
            if enemy.check_collide(player):
                return True

        return False
2 - 碰撞后结束游戏

在while循环中,绘制完赛车后添加碰撞检测
即在clock.tick(FPS)之前添加代码如下

    if emg.check_collide(car):
        break

此时玩家赛车碰到敌人赛车,游戏就会结束。

不过,此时游戏结束后会直接关闭窗口。
玩家体验并不好,所以需要进一步的优化下。
最好是游戏结束后,窗口不关闭,展示Game Over的提示,并告诉玩家得分。

七 综合优化

1 游戏流程优化

游戏流程上,运行代码后,敌人赛车就直接迎面而来,留给玩家的缓冲准备时间太短了。
所以这里修改为代码运行后,游戏处于等待状态,玩家按键盘任意键开始游戏。
同时游戏结束后,玩家可按键盘任意键重新开始。

首先需要在while循环前,添加一个游戏运行状态变量,默认游戏未开始

running = False

再修改while循环如下

while True:
    frame_count += 1

    # 获取所有事件
    for event in pygame.event.get():
        if event.type == pygame.QUIT:
            # 判断当前事件是否为点击右上角退出键
            pygame.quit()  # 关闭窗口
            sys.exit()  # 停止程序

        if event.type == pygame.KEYDOWN:
            if running:  # 游戏开始时,响应上下左右按键
                if event.key == pygame.K_LEFT or event.key == ord('a'):
                    car.move("LEFT")
                if event.key == pygame.K_RIGHT or event.key == ord('d'):
                    car.move("RIGHT")
                if event.key == pygame.K_UP or event.key == ord('w'):
                    car.move("UP")
                if event.key == pygame.K_DOWN or event.key == ord('s'):
                    car.move("DOWN")
            else: # 游戏结束后,响应任意按键,开始游戏
                # reset game, 重置变量和游戏状态
                car = Car(bottom_center_c, bottom_center_r, "player", player_color)
                frame_count = 0
                emg = EnemyManager()
                running =True

    if running:
        win.fill(bg_color)

        if frame_count % MOVE_SPACE == 0:
            emg.move()

        emg.draw(win)

        car.draw(win)

        if emg.check_collide(car):
            running = False  # 撞车后,游戏状态改变为结束

    clock.tick(FPS) # 控制循环刷新频率,每秒刷新FPS对应的值的次数
    pygame.display.update()

此时游戏流程就修改好了,但是没有文本提示,玩家会不明就里,感到迷惑,所以需要文字在开始时和结束时进行提示。

2 文本提示与得分展示

在游戏开头添加大中小三种字体(必须要在pygame.init()之后,能后不能前)

# 大中小三种字体,48,36,24
FONTS = [
    pygame.font.Font(pygame.font.get_default_font(), font_size) for font_size in [48, 36, 24]
]

代码运行后,游戏尚未开始,需要文本提示玩家按任意键开始游戏
即在while循环之前添加代码如下

score_color = (0,128,0)
start_info = FONTS[2].render("Press any key to start game", True, score_color)
text_rect = start_info.get_rect(center=(WIN_WIDTH / 2, WIN_HEIGHT / 2))
win.blit(start_info, text_rect)

游戏过程中,展示玩家得分(玩家坚持时间)
在while循环中,car.draw(win)之后添加代码如下

text_info = FONTS[2].render("Scores: %d" % (frame_count/ FPS), True, score_color)
win.blit(text_info, dest=(0, 0))

玩家撞车后,一轮游戏结束,需要展示Game Over,玩家得分,与按任意键结束游戏
修改while循环中,原有的代码

        if emg.check_collide(car):
            running = False  # 撞车后,游戏状态改变为结束

为

        if emg.check_collide(car):
            running = False  # 撞车后,游戏状态改变为结束

            over_color = (255,0,0)
            texts = ["Game Over", "Scores: %d" % (frame_count / FPS), "Press Any Key to Restart game"]
            for ti, text in enumerate(texts):
                over_info = FONTS[ti].render(text, True, over_color)
                text_rect = over_info.get_rect(center=(WIN_WIDTH / 2, WIN_HEIGHT / 2 + 48 * ti))
                win.blit(over_info, text_rect)
3 代码优化

我们注意到,关于颜色这个常量,都是直接写在用的地方。
后面多了后,容易找起来不方便,所以建议把所有的颜色声明都统一移到开头位置。
这里放在CELL_SIZE = 40之后,移动后颜色设置代码如下

bg_color = (200, 200, 200)
enemy_color = (50, 50, 50)
player_color = (65, 105, 225)  # RoyalBlue
score_color = (0,128,0)  # SpringGreen
over_color = (255, 0, 0)
4 后续
  • 其实,由于颜色值比较多,我更喜欢把颜色统一放在一个字典里面,根据键来取值,本文github项目下的car_racing.py就是这样写的
  • 游戏中赛车移动,是按一下移动一个,可能有的人跟喜欢能够连续移动,这个已在项目下的1 car racing文件夹下的car_racing_plus1.py中实现。
pygame 初学者入门案例 pygame入门学习案例,pygame 小游戏,贪吃蛇 阅读详情

相关推荐

Python Pygame 2D赛车游戏开发实战:从零到一掌握游戏开发核心

游戏开发是理解计算机图形学、事件驱动编程和实时系统交互的经典实践场景。其核心原理在于游戏循环(Game Loop)的持续运行,通过事件处理、状态更新和画面渲染三个基本步骤,将静态代码转化为动态交互体验。在技术实现层面,面向对象编程(OOP)思想至关重要,它将游戏世界中的实体(如赛车、赛道)抽象为具有属性与行为的类,使得代码结构清晰、易于维护。碰撞检测是游戏物理真实性的基石,从简单的矩形检测到高效的掩码(Mask)碰撞,其算法的选择直接影响游戏手感和性能。将这些技术应用于实践,能够高效构建出包含玩家控制、AI

weixin_30542979的博客 301

Python制作的赛车小游戏源代码,逆行飙车

python制作的赛车小游戏,逆行飙车,通过键盘方向键控制。

Python代码大全 4288

python趣味编程-5分钟实现一个F1 赛车公路游戏(含源码、步骤讲解)

Python 中的 F1 赛道游戏是一款简单的基于图形用户界面的游戏。下面的代码是 pygame 库,是 Python 编程语言的开源模块,专门用于帮助您制作游戏和其他多媒体应用程序。这款 Python 语言的 F1 赛道游戏可以免费下载开源代码,它是为想要学习 Python 的初学者创建的。下面给出了代码,该代码是用于游戏中使用的音频声音的功能。在下面给出的代码中,这是用于游戏中使用的标题的功能。在下面给出的代码中,它用于按钮和文本中使用的颜色的功能。在下面给出的代码中,这是用于游戏中使用的图像的功能。

xiaoshun007的专栏 813

pygame游戏实例入门

pygame游戏实例入门开发环境第三方库安装任务介绍大概实现思路具体实现流程游戏背景界面猴子类主函数中实例化猴子类运行 开发环境 pycharm+anconda3; 第三方库: pygame;(从标题看这句略显多余) 第三方库安装 方法一:直接在pycharm里面安装。 files->seting->project->python Interpreter 在左侧界面的最左侧边栏上面有个加号,点击后在弹出页面搜索需要的第三方库,然后直接安装。 方法二:pip安装。 因为用的是anconda

weixin_45734483的博客 3423

python小游戏:天天酷跑

用python写的跑酷类小游戏,适合新手参考,现在只实现了吃金币和障碍物碰撞功能,相对比较简单,可以自己拓展。

告别手动翻页!用幻影联动+DLL调用,5分钟搞定通达信分时指标自动选股

本文详细介绍了如何利用幻影联动软件结合DLL调用技术,实现通达信分时指标的自动化选股。通过改造指标代码和配置幻影联动任务,用户可以在5分钟内完成从信号检测到自动报警的全流程,大幅提升短周期交易的效率和准确性。

weixin_42561040的博客 768

Python pygame入门实战:从零开发复古方块赛车游戏

游戏开发的核心在于游戏循环、事件处理与碰撞检测等基础机制。pygame作为基于SDL的Python游戏库,通过双缓冲渲染和帧率控制实现流畅动画,让开发者用少量代码即可构建可交互的图形程序。掌握AABB碰撞检测和对象池管理,能有效提升游戏逻辑的健壮性。这类技术广泛应用于2D游戏、交互式演示等场景。本文以复古方块赛车游戏为例,完整演示从窗口初始化到分数系统的实现过程,帮助初学者理解游戏开发的基本骨架。

weixin_34006965的博客 276

别光看教程了!手把手带你用STM32F103C8T6最小系统板点亮第一个LED(附完整电路图)

本文详细介绍了如何使用STM32F103C8T6最小系统板点亮第一个LED,从硬件连接到软件开发环境搭建,再到编写和下载程序,手把手教你完成STM32入门的第一步。适合初学者快速上手STM32开发,附完整电路图和代码示例。

weixin_28678831的博客 194

Python游戏开发入门:用pygame从零实现复古方块赛车

游戏开发入门常面临环境配置复杂、逻辑抽象难懂等门槛,而基于Python的pygame库凭借轻量依赖与适中抽象层级,成为理解游戏循环、事件处理与碰撞检测等核心机制的理想起点。其原理在于通过时钟对象控制帧率、基于时间增量驱动对象移动,并利用矩形碰撞检测实现交互逻辑。掌握这些基础后,开发者可快速构建具备分数系统与难度递增的纵向卷轴躲避游戏,并自然过渡到更复杂的精灵组管理与状态机设计。本文以复古方块赛车为例,完整演示从环境搭建到可玩原型的实操流程。

weixin_33910759的博客 310

别再为数码管引脚发愁了!用STM32的普通IO口驱动TM1650数码管模块(附完整模拟I2C代码)

本文详细介绍了如何利用STM32的普通IO口通过模拟I2C协议驱动TM1650数码管模块,提供了完整的硬件连接方案和软件实现代码。通过模拟I2C技术,开发者可以灵活使用任意GPIO引脚控制多位数码管显示,解决了传统驱动方式占用大量IO资源的问题。文章包含TM1650寄存器解析、亮度控制等实用功能实现,并分享了常见问题排查与性能优化技巧。

weixin_30764771的博客 659

光电二极管探测器电流信号处理与指令输出系统

本文提出了一种基于Python的光电二极管电流信号处理系统设计方案。该系统能够实时采集、处理光电二极管输出的电流信号,并根据预设阈值输出控制指令。系统采用模块化架构,包含数据采集、信号处理、阈值检测、指令生成等核心模块。其中数据采集模块提供了模拟器实现和硬件接口框架,支持噪声模拟和脉冲信号生成。系统设计考虑了实时性、可靠性和可扩展性,适用于光强测量、光电检测等多种应用场景。

huanghm88的专栏 1180

Python+pygame复古方块赛车游戏开发教程:从零实现碰撞检测与难度曲线

游戏开发入门常从简单项目开始,而Python结合pygame库能快速构建可玩原型。其核心原理基于游戏循环、事件处理与矩形碰撞检测,通过帧率控制实现流畅动画。技术价值在于无需美术资源即可用纯色矩形搭建完整游戏,降低学习门槛。典型应用场景包括2D卷轴赛车、躲避类小游戏等。本文以复古方块赛车为例,详细讲解玩家移动、敌方生成、碰撞检测、分数系统与状态管理,并融入pygame碰撞检测与难度曲线设计,帮助新手掌握游戏开发基础。

weixin_28728715的博客 267

【OpenClaw从入门到精通】第10篇:OpenClaw生产环境部署全攻略:性能优化+安全加固+监控运维(2026实测版)

本文聚焦OpenClaw从测试环境走向生产环境的核心痛点,围绕“性能优化、安全加固、监控运维”三大维度展开实操讲解。先明确生产环境硬件/系统选型标准,再通过硬件层资源管控、模型调度策略、缓存优化等手段提升响应速度(实测响应效率提升50%+);接着从网络、权限、数据三层构建安全防护体系,集成火山引擎安全方案拦截高危操作;最后落地TenacitOS可视化监控与Prometheus告警体系,配套完整故障排查清单和虚拟实战案例。全文所有配置、代码均经实测验证,兼顾新手入门实操性和进阶读者的生产级部署需求。

专注于人工智能、软件开发、工控自动化、工厂数字化及智能化等领域,希望和大家共同进步! 3408

【Pygame】十个案例(1)

首先,在开始编写代码前引入 pygame 模块 :import pygame。

jssksn的博客 1338

YOLOv11的流形学习压缩:局部线性嵌入(LLE)引导的特征降维,实现在CSP模块中嵌入流形结构保持约束

摘要 本文探讨了流形学习在YOLOv11目标检测模型中的应用,重点研究局部线性嵌入(LLE)方法对CSP模块的特征压缩优化。针对深度学习模型的高维特征冗余问题,LLE通过三个关键步骤实现非线性降维:寻找k近邻、计算重构权重和低维嵌入,相比传统PCA方法能更好地保持数据的局部结构。文章详细分析了LLE的数学原理和参数选择策略,并提出在YOLOv11的CSP模块中嵌入流形约束的创新设计。通过特征分割前、处理过程和融合阶段引入流形一致性损失函数,该方法能在降低特征维度的同时保持原始流形结构,从而提升模型的计算效率

本博客聚焦 YOLOv11 全流程落地,涵盖架构优化、数据集处理、训练技巧与多场景部署,兼及国产数据库、Java 开发与 AI 模型应用,内容兼顾理论与工程实践,为开发者提供系统干货,助力高效提升技术能力。 1380

无需Python环境!纯C#上位机+OpenCVSharp4+ONNX Runtime实现YOLOv8摄像头实时流检测,工业级稳定

摘要 工业自动化C#开发中,传统Python方案实现视觉检测功能存在环境依赖、内存泄漏和性能不稳定等问题。本文提出基于.NET 8+OpenCVSharp4+ONNX Runtime的纯C#方案,通过实际案例验证其优势: 零Python依赖,支持离线部署 内存稳定(380MB/72h),检测延迟<80ms 检测精度达漏检率<0.1%,误检率<0.5% 保留原有业务逻辑代码,3天完成适配 方案采用分层架构设计,支持多种硬件平台和操作系统,提供从模型导出到部署的全流程指导,为工业视觉检测提供高

这里只有干货:从 Modbus 通信到 MES 对接,从 YOLO 训练到工控机部署,带你搞定工业软件开发全流程。 196

Python游戏利器pygame,疯狂赛车(34)

21~22行:退出程序,pygame.quit()是pygame.init()函数的一种相反的函数,它运行的代码会使得Pygame库停止工作。41~45行:如果按下了键盘方向键左键,且坐标没有靠近最左边,使其向左移动,否则在窗口最左边不改变。47~50行:如果按下了键盘方向键右键,且坐标没有靠近最右边,使其向右移动,否则在窗口最右边不改变。53~59行:汽车enemy从上向下移动,如果移出窗口,则重新生成一个,位置在顶部,横坐标随机。67~68行:每躲过一个对面的小汽车时,对面小汽车速度加1,直到最大值。

parasoft的专栏 2884

AI应用架构师进阶:智能控制系统架构的多Agent设计

本文将从“AI应用架构师”的视角,系统讲解智能控制系统中多Agent架构的设计方法。理解多Agent系统的核心特性与在智能控制场景中的优势;掌握多Agent架构的设计流程:从需求分析到角色划分、通信设计、决策实现;通过实战案例(智能家居控制场景),手把手带你落地一个多Agent智能控制系统;探讨进阶话题:动态Agent组织、安全性设计、与大语言模型(LLM)的融合等。在多Agent系统中,Agent(智能体)是具备自主决策能力的最小执行单元。

小程序开发 1086

100个Python小游戏,上班摸鱼我能玩一整年【附源码】

哈喽铁子们。

2301_79382003的博客 1万+

文档:亲测可用解决vnc灰屏,黑屏,鼠标大黑叉情况

主要解决vnc-viewer灰屏,黑屏,鼠标大黑叉等现象,详细见文档。

数学建模模型总结

这是本人在两年内准备参加数学建模竞赛搜集到的模型资料,已经经过了本人的筛选和整理,希望能够对准备参加数学建模竞赛的学弟学妹们提供一些帮助!

【Python入门基础】Pygame实例

Pygame程序实例源自小甲鱼python教学视频,如有需要教学视频可在评论区留下邮箱 Pygame实现移动动画 import pygame import sys # 初始化Pygame pygame.init() size = width,height=1200,820 speed=[-2,1] bg=(255,255,255) # RGB # 创建指定大小的窗口 Surface screen = pygame.display.set_mode(size) # 设置窗口标题 pygame.dis.

ZoomToday 1705

SAP B1中文培訓教材_SDK

公司内部培训资料,对开发工具 ,DIAPI, UIAPI,Add-ON有详细解说

python编写一个赛车游戏

好的,下面是一个简单的赛车游戏的例子。这个游戏有一辆赛车和一条跑道,赛车可以向左或向右移动。每次移动后,赛车的位置会更新,并在屏幕上显示赛车的当前位置。游戏结束时,会显示游戏的得分。 首先,我们需要定义赛车类: class RaceCar: def __init__(self, x=0, y=0): self.x = x self.y = y ...

weixin_35750483的博客 1236

复分析 阿尔福斯(Ahlfors) 第三版答案 英文

答案分为十章,有部分习题没有答案,全英文复分析阿尔福斯(Ahlfors) 第三版答案

Python游戏编程之赛车游戏6-1

玩家类的__init__()方法在实例化该类时调用,代码如图6所示。图6 玩家类的__init__()方法的代码其中,第13行中将玩家类的名字设置为Player,该类的父类是pygame.sprite.Sprite类。第14-18行代码定义了玩家的__init__()方法,在该方法中,首先在第17行导入表示玩家的红色汽车图片,即“Player.png”;第18行通过image.get_rect()方法得到图片的位置及大小;

hou09tian的博客 1732

一口气用Python写了13个小游戏(附源码)

一口气用Python写了13个小游戏(附源码)

一名正义的白帽黑客 2万+

Python写一个跑酷游戏

好的,我可以给你一些提示来帮助你开发一个跑酷游戏。 首先,你需要使用 Pygame 模块来绘制游戏界面和处理用户输入。 Pygame 是一个用于开发游戏的 Python 库,提供了许多有用的功能。 其次,你需要设计游戏的主要流程。跑酷游戏通常会有一个角色在屏幕上跑动,并避开障碍物。你需要设计游戏的玩法,包括控制角色的方式、障碍物的布局和角色的移动速度等。 然后,你需要设计游戏的界面。这包括绘制背景...

weixin_35754676的博客 1477

15. python从入门到精通——Pygame游戏编程

当点击屏幕的时候小鸟就往上飞,再次点击小鸟再次往上飞,当不点击时小鸟会以更快速度降落。我们需要控制小鸟我们需要控制小鸟通过各种各样的管道,当我们穿过一组管道时就会得一分,如果在飞行过程中碰到了管道那么小鸟状态变为灰色掉在地上,游戏结束并且显示一个总的分数。

weixin_43812198的博客 1万+

python--pygame库窗口绘制图形实例

pygame窗口绘制图形pygame.draw.circle()、pygame.draw.rect()、pygame.draw.line()、pygame.draw.arc()实例;安装pygame库,使用pip模块帮助下载安装,win+r打开控制台,输入cmd然后安装。

qq_51677275的博客 1860
上一篇: b站个人直播年报【大爽歌作】 介绍与演示
下一篇: python一对一辅导教程:Computational Problems for Physics chapter 1-A Code Listings 1.1 - 1.6
大爽歌
博客等级 码龄9年 422粉丝 92原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值