保姆级教你用Python制作超级玛丽游戏“爷青回~”(文末赠书)

news2024/12/23 23:14:38

名字:阿玥的小东东

学习:Python、C/C++

主页链接:阿玥的小东东的博客_CSDN博客-python&&c++高级知识,过年必备,C/C++知识讲解领域博主

目录

贪吃蛇游戏

弹珠游戏

超级玛丽(爷青回~)

完整代码如下:

总结

618多得图书活动来啦


Python是一门易学易用的编程语言,适用于各种不同的编程场景,包括游戏开发。Python不仅具有强大的数据处理和计算能力,还具有一整套游戏编程工具包,可以帮助开发者快速实现各种类型的游戏。本文将探讨如何使用Python编程语言制作游戏,阿玥了提供几个Python游戏开发的示例。

  1. Pygame游戏编程框架

Pygame是一个专门为Python编程语言设计的游戏开发框架,它提供了一整套游戏开发工具包,包括图形、声音和输入控制等。Pygame的优点在于它非常易学易用,并且具有广泛的社区支持和大量可用的代码资源。下面是一个使用Pygame编写的简单游戏的代码示例:

import pygame
from pygame.locals import *

pygame.init()
screen = pygame.display.set_mode((640, 480))
clock = pygame.time.Clock()

while True:
    for event in pygame.event.get():
        if event.type == QUIT:
            pygame.quit()
            sys.exit()

    screen.fill((255, 255, 255))
    pygame.draw.circle(screen, (255, 0, 0), (320, 240), 100)
    pygame.display.update()
    clock.tick(60)

贪吃蛇游戏

这个程序使用Pygame框架创建了一个窗口,并在屏幕中央绘制了一个红色圆形。这个游戏循环在每帧之间运行,并等待用户关闭窗口。

  1. 使用Pygame编写贪吃蛇游戏

下面是一个使用Pygame编写的贪吃蛇游戏的代码示例:

import pygame
import random
from pygame.locals import *

pygame.init()
screen = pygame.display.set_mode((640, 480))
clock = pygame.time.Clock()

class Snake:
    def __init__(self):
        self.body = [(4, 5), (5, 5), (6, 5)]
        self.direction = "right"

    def move(self):
        x, y = self.body[0]
        if self.direction == "up":
            y -= 1
        elif self.direction == "down":
            y += 1
        elif self.direction == "left":
            x -= 1
        elif self.direction == "right":
            x += 1
        self.body.pop()
        self.body.insert(0, (x, y))

    def grow(self):
        x, y = self.body[0]
        if self.direction == "up":
            y -= 1
        elif self.direction == "down":
            y += 1
        elif self.direction == "left":
            x -= 1
        elif self.direction == "right":
            x += 1
        self.body.insert(0, (x, y))

    def draw(self):
        for x, y in self.body:
            pygame.draw.rect(screen, (0, 255, 0), (x * 20, y * 20, 20, 20), 0)

    def check_collision(self):
        x, y = self.body[0]
        if x < 0 or x > 31 or y < 0 or y > 23:
            return True
        for i, j in self.body[1:]:
            if x == i and y == j:
                return True
        return False

class Food:
    def __init__(self):
        self.x = random.randint(0, 31)
        self.y = random.randint(0, 23)

    def draw(self):
        pygame.draw.rect(screen, (255, 0, 0), (self.x * 20, self.y * 20, 20, 20), 0)

    def check_collision(self, snake):
        if self.x == snake.body[0][0] and self.y == snake.body[0][1]:
            snake.grow()
            self.x = random.randint(0, 31)
            self.y = random.randint(0, 23)

snake = Snake()
food = Food()

while True:
    for event in pygame.event.get():
        if event.type == QUIT:
            pygame.quit()
            sys.exit()
        elif event.type == KEYDOWN:
            if event.key == K_UP and snake.direction != "down":
                snake.direction = "up"
            elif event.key == K_DOWN and snake.direction != "up":
                snake.direction = "down"
            elif event.key == K_LEFT and snake.direction != "right":
                snake.direction = "left"
            elif event.key == K_RIGHT and snake.direction != "left":
                snake.direction = "right"

    screen.fill((0, 0, 0))
    snake.move()
    snake.draw()
    food.draw()
    food.check_collision(snake)
    if snake.check_collision():
        pygame.quit()
        sys.exit()
    pygame.display.update()
    clock.tick(10)

这个程序使用Pygame框架创建了一个窗口,并绘制了一条贪吃蛇和一个食物。在这个游戏中,玩家必须通过控制蛇来吃掉食物,每吃掉一个食物,蛇就会变长一节。

  1. 使用Pygame编写弹珠游戏

下面是一个使用Pygame编写的弹珠游戏的代码示例:

弹珠游戏

import pygame
from pygame.locals import *

pygame.init()
screen = pygame.display.set_mode((640, 480))
clock = pygame.time.Clock()

class Ball:
    def __init__(self, x, y, vx, vy, radius):
        self.x = x
        self.y = y
        self.vx = vx
        self.vy = vy
        self.radius = radius

    def move(self):
        self.x += self.vx
        self.y += self.vy

    def draw(self):
        pygame.draw.circle(screen, (255, 255, 255), (self.x, self.y), self.radius)

class Paddle:
    def __init__(self, x, y, width, height, speed):
        self.x = x
        self.y = y
        self.width = width
        self.height = height
        self.speed = speed

    def move(self, direction):
        if direction == "left":
            self.x -= self.speed
        elif direction == "right":
            self.x += self.speed

        if self.x < 0:
            self.x = 0
        elif self.x + self.width > 640:
            self.x = 640 - self.width

    def draw(self):
        pygame.draw.rect(screen, (255, 255, 255), (self.x, self.y, self.width, self.height), 0)

ball = Ball(320, 240, 5, -5, 10)
paddle = Paddle(250, 460, 100, 20, 10)

while True:
    for event in pygame.event.get():
        if event.type == QUIT:
            pygame.quit()
            sys.exit()
        elif event.type == KEYDOWN:
            if event.key == K_LEFT:
                paddle.move("left")
            elif event.key == K_RIGHT:
                paddle.move("right")

    screen.fill((0, 0, 0))
    ball.move()
    ball.draw()
    paddle.draw()
    if ball.y < ball.radius:
        ball.vy = -ball.vy
    elif ball.x < ball.radius or ball.x > 640 - ball.radius:
        ball.vx = -ball.vx
    elif ball.y > 480 - ball.radius:
        pygame.quit()
        sys.exit()
    if ball.y >= paddle.y - ball.radius and ball.x >= paddle.x and ball.x <= paddle.x + paddle.width:
        ball.vy = -ball.vy
    pygame.display.update()
    clock.tick(60)

这个程序使用Pygame框架创建了一个窗口,并在屏幕中央绘制了一个弹珠和一个滑板。在这个游戏中,玩家必须使用滑板将弹珠弹回,直到弹珠跌落到底部或碰到四周的边界。

超级玛丽(爷青回~)

超级玛丽游戏是一款非常经典的游戏,下面我们将使用Python语言来实现一个类似的简化版的超级玛丽游戏。

  1. 游戏背景

我们将使用Pygame工具包来实现游戏背景,首先我们需要导入Pygame和sys模块:

import pygame
import sys

然后,需要初始化Pygame:

pygame.init()

接着,我们创建一个窗口,并设置窗口大小为800x600像素:

screen = pygame.display.set_mode((800, 600))

为了方便维护,我们将游戏中要使用到的颜色值定义成常量:

BLACK = (0, 0, 0)
WHITE = (255, 255, 255)
GRAY = (128, 128, 128)

然后,我们可以在窗口中绘制游戏背景:

screen.fill(BLACK)
pygame.draw.rect(screen, GRAY, (100, 100, 600, 400), 0)
pygame.display.update()

这段代码绘制了一个灰色的矩形框作为游戏背景。

  1. 玛丽角色

接下来,我们需要定义玩家角色——超级玛丽。我们使用一个小人头像来代表超级玛丽。

首先,我们需要导入pygame.image模块:

import pygame.image

然后,我们可以通过以下代码加载和绘制超级玛丽的头像:

mario = pygame.image.load("mario_head.png")
screen.blit(mario, (400, 500))
pygame.display.update()

这段代码加载了一个名为“mario_head.png”的图像文件,并将其绘制到了屏幕中央底部。

  1. 定义玛丽的移动

接下来,我们需要定义超级玛丽的移动方法。为了简化游戏逻辑,我们将只实现左右移动和跳跃两种动作。

首先,我们需要定义超级玛丽的位置和速度:

mario_pos = [400, 500]
mario_vel = [0, 0]

然后,我们需要在主循环中监听键盘事件,并根据按下的键来决定超级玛丽的移动:

while True:
    for event in pygame.event.get():
        if event.type == pygame.QUIT:
            sys.exit()
        elif event.type == pygame.KEYDOWN:
            if event.key == pygame.K_LEFT:
                mario_vel[0] = -5  # 向左移动
            elif event.key == pygame.K_RIGHT:
                mario_vel[0] = 5   # 向右移动
            elif event.key == pygame.K_UP:
                mario_vel[1] = -10 # 跳跃

    mario_pos[0] += mario_vel[0]
    mario_pos[1] += mario_vel[1]

    screen.fill(BLACK)
    pygame.draw.rect(screen, GRAY, (100, 100, 600, 400), 0)
    screen.blit(mario, mario_pos)
    pygame.display.update()

    mario_vel[1] += 1  # 重力加速度

这段代码在接收到左右移动和跳跃的键盘事件后,更新了超级玛丽的位置和速度,并将其绘制到了游戏背景中。

  1. 定义碰撞检测

最后,我们需要实现超级玛丽与游戏背景的碰撞检测。当超级玛丽碰到游戏背景时,需要停止其运动。

我们可以定义一个名为“is_collision”的函数来检测碰撞:

def is_collision(pos, vel, rect):
    if pos[0] < rect[0]:
        pos[0] = rect[0]
    elif pos[0] > rect[0] + rect[2]:
        pos[0] = rect[0] + rect[2]
    if pos[1] < rect[1]:
        pos[1] = rect[1]
        vel[1] = 0
    elif pos[1] > rect[1] + rect[3]:
        pos[1] = rect[1] + rect[3]
        vel[1] = 0
    return pos, vel

这个函数用于检测超级玛丽是否与游戏背景矩形碰撞,如果发生碰撞,将会返回新的位置和速度。

接着,我们需要在主循环中调用这个函数:

while True:
    # 监听键盘事件,更新玛丽的位置和速度
    ...

    # 检测碰撞,更新玛丽的位置和速度
    mario_pos, mario_vel = is_collision(mario_pos, mario_vel, (100, 100, 600, 400))

    # 绘制游戏背景和玛丽
    ...

这样,当超级玛丽碰撞到游戏背景矩形时,就会停止运动了。

完整代码如下:

import pygame
import sys

BLACK = (0, 0, 0)
WHITE = (255, 255, 255)
GRAY = (128, 128, 128)

pygame.init()
screen = pygame.display.set_mode((800, 600))

mario = pygame.image.load("mario_head.png")
mario_pos = [400, 500]
mario_vel = [0, 0]

def is_collision(pos, vel, rect):
    if pos[0] < rect[0]:
        pos[0] = rect[0]
    elif pos[0] > rect[0] + rect[2]:
        pos[0] = rect[0] + rect[2]
    if pos[1] < rect[1]:
        pos[1] = rect[1]
        vel[1] = 0
    elif pos[1] > rect[1] + rect[3]:
        pos[1] = rect[1] + rect[3]
        vel[1] = 0
    return pos, vel

while True:
    for event in pygame.event.get():
        if event.type == pygame.QUIT:
            sys.exit()
        elif event.type == pygame.KEYDOWN:
            if event.key == pygame.K_LEFT:
                mario_vel[0] = -5
            elif event.key == pygame.K_RIGHT:
                mario_vel[0] = 5
            elif event.key == pygame.K_UP:
                mario_vel[1] = -10

    mario_pos[0] += mario_vel[0]
    mario_pos[1] += mario_vel[1]

    mario_pos, mario_vel = is_collision(mario_pos, mario_vel, (100, 100, 600, 400))

    screen.fill(BLACK)
    pygame.draw.rect(screen, GRAY, (100, 100, 600, 400), 0)
    screen.blit(mario, mario_pos)
    pygame.display.update()

    mario_vel[1] += 1

这段代码可以实现一个简单的超级玛丽游戏,玩家可以通过左右移动和跳跃来控制超级玛丽的运动,当超级玛丽碰到游戏背景时,将会停止运动。

总结

Python是一门非常适合游戏开发的编程语言,其强大的数据处理和计算能力以及丰富的游戏编程工具包为开发者提供了广阔的发展空间。阿玥提供了几个使用Python编写的简单游戏示例,大佬们看看就好,也可以自己动手敲打敲打

本期推荐

本期推荐

参与方式:点赞+收藏+评论:人生苦短,我用Python!

截止6.18日晚上20:00

 

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

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

相关文章

SpringBoot 实现 PDF 添加水印

SpringBoot 实现 PDF 添加水印 使用场景方式一&#xff1a;使用 Apache PDFBox 库方式二&#xff1a;使用 iText 库方式三&#xff1a;Free Spire.PDF for JavaDemo 使用场景 PDF&#xff08;Portable Document Format&#xff0c;便携式文档格式&#xff09;是一种流行的文件…

LIME论文阅读笔记

这是暗图增强领域一篇经典的传统方法论文&#xff0c;发表在TIP这个顶刊 文章基于的是这样一个公式&#xff1a; L R ⋅ T LR\cdot T LR⋅T 其中&#xff0c; L L L是暗图&#xff0c; R R R是反射分量&#xff0c; T T T是illumination map&#xff0c;并且对于彩色图像来说…

OpenCV reshape函数

reshape函数 在opencv中&#xff0c;reshape函数比较有意思&#xff0c;它既可以改变矩阵的通道数&#xff0c;又可以对矩阵元素进行序列化&#xff0c;非常有用的一个函数。 函数原型&#xff1a; C: Mat Mat::reshape(int cn, int rows0) const参数比较少&#xff0c;但设…

DJ3-5 TCP:流量控制、连接控制

目录 一、流量控制 二、连接管理 1. 建立连接&#xff08;三次握手&#xff09; 2. 关闭连接 3. TCP 连接的生命周期 一、流量控制 一条 TCP 连接的每一侧主机都为该连接设置了接收缓冲区。 TCP 的接收方的接收缓冲区&#xff1a; 1. 提供流量控制服务的原因 应用进程会…

Burpsuit使用03:拦截请求并修改响应

burpsuite是渗透的必备工具&#xff0c;使用它可以进行一些截包分析&#xff0c;修改包数据、暴力破解、扫描等功能&#xff0c;使用最多的场景应该是设置代理拦截数据包分析数据和爆破。 文章目录 拦截请求并修改响应Intercept is offForwardDropAction 拦截请求并修改响应 拦…

5.4、docker-compose

h ttps://www.runoob.com/docker/docker-compose.html Docker Compose docker-compose.yml 配置文件编写详解_docker-compose.yml 编写_种子选手的博客-CSDN博客 docker-compose.yml 配置文件编写详解 1.dockerfile: 构建镜像&#xff1b; 2.docker run: 启动容器&#xff1b;…

upyter Notebook:内核似乎挂掉

项目场景&#xff1a;提示&#xff1a;这里简述项目相关背景&#xff1a;项目场景&#xff1a;深度强化学习在中国股票量化交易上的应用&#xff0c;要求跑赢大盘问题描述提示&#xff1a;这里描述项目中遇到的问题&#xff1a;使用Jupyter Notebook运行时&#xff0c;跑到绘图…

瑞萨RA系列mcu学习笔记--RTT-pwm驱动

方案1&#xff1a;Studio 2.2.6和使用了RASC3.5下使用pwm驱动 开发环境必须说一下&#xff0c;本人在在开发环境的问题上栽了一个跟头&#xff0c; 使用最新版的RTT Studio 2.2.6和使用了RASC4.0的版本生成的公共编译ok&#xff0c;但是一下载到mcu就直接不能运行&#xff1a…

浅谈Java的IO与Netty

一、Java的IO((Input/Output))模型 传统IO和Java NIO最大的区别是传统的IO是面向流&#xff0c;NIO是面向Buffer Socket之间建立链接及通信的过程&#xff01;实际上就是对TCP/IP连接与通信过程的抽象: 1.服务端Socket会bind到指定的端口上&#xff0c;Listen客户端的”插入”…

如何迁移现有应用和数据到阿里云服务器?有哪些迁移工具和方法?

如何迁移现有应用和数据到阿里云服务器&#xff1f;有哪些迁移工具和方法&#xff1f;   随着云计算技术的不断发展&#xff0c;越来越多的企业和个人开始将应用和数据迁移到云服务器上。阿里云作为国内领先的云服务提供商&#xff0c;为用户提供了一系列方便可靠的应用和数据…

2023开放原子全球开源峰会参会感受:英特尔开源技术合作与产品创新

2023开放原子全球开源峰会参会感受&#xff1a;英特尔开源技术合作与产品创新 文章目录 2023开放原子全球开源峰会参会感受&#xff1a;英特尔开源技术合作与产品创新一. 引言二. 6.11参会感受2.1 英特尔基础软件开放生态合作2.2 Celadon加速安卓在英特尔架构上的产品创新2.3 面…

ASEMI代理光宝高速光耦LTV-5341参数,LTV-5341应用

编辑-Z LTV-5341参数描述&#xff1a; 型号&#xff1a;LTV-5341 储存温度Tstg&#xff1a;-55~125℃ 工作温度Topr&#xff1a;-40~110℃ 总输出电源电压(VCC –VEE)&#xff1a;35V 平均正向输入电流IF&#xff1a;20mA 峰值瞬态输入电流IF(TRAN)&#xff1a;1A 输入…

【面试中的网络知识】DNS原理-如何实现域名和IP地址的查询转换

接上一篇&#xff0c;理解 浏览器是如何生成HTTP消息的 &#xff0c;最好是按照顺序来读。  从上一篇博客我们得知浏览器是如何生成了HTTP消息了&#xff0c;但是浏览器作为应用程序&#xff0c;是不具备向网络中发送请求的能力&#xff0c;而是需要委托给操作系统的内核协议栈…

淘宝详情页分发推荐算法总结:用户即时兴趣强化

转子&#xff1a;https://juejin.cn/post/6992169847207493639 商品详情页是手淘内流量最大的模块之一&#xff0c;它加载了数十亿级商品的详细信息&#xff0c;是用户整个决策过程必不可少的一环。这个区块不仅要承接用户对当前商品充分感知的诉求&#xff0c;同时也要能肩负起…

必学KVM技术详解包括所有技能

KVM虚拟化进阶学习 一&#xff0c;KVM命令行安装 图形化安装教程&#xff1a;https://blog.csdn.net/weixin_53678904/article/details/125950867?spm1001.2014.3001.5501 1.存储池管理 ​ KVM必须要配置⼀个⽬录当作他存储磁盘镜像(存储卷)的⽬录&#xff0c;我们称这个⽬…

通达信筹码单峰密集选股公式,突破筹码密集区发出信号

筹码密集是相对筹码发散而言的&#xff0c;筹码分布在宽广的价格区间&#xff0c;这种状态就是筹码发散&#xff08;如下图&#xff09;&#xff0c;而且筹码峰像群山一样&#xff0c;有多个高峰&#xff0c;属于多峰形态。 与之相对的&#xff0c;筹码分布在比较窄的价格区间&…

Armbian安装1panel教程

文章目录 一 1panel简介二 检测是否安装1Panel三 环境要求四 安装操作指导4.1 确定系统类型4.2 执行安装命令4.3 访问1panel面板4.4 设置1panel访问配置4.5 查看访问1panel面板入口 五 常用命令总结 一 1panel简介 1Panel 是一个现代化、开源的 Linux 服务器运维管理面板。 二…

New Bing使用教程

New Bing使用教程 New Bing简介前提条件使用技巧 New Bing简介 New Bing是微软推出的一款基于GPT4模型的智能搜索引擎&#xff0c;它不仅可以提供高质量的搜索结果&#xff0c;还可以与用户进行自然语言交互。 用户只需安装Edge浏览器即可使用&#xff0c;但现实使用中会出现…

驱动操作 驱动移植试验和Source Insight添加项目

目录 驱动移植 》1.需要有一个驱动对应的 .c代码 》2.将.c文件放入到对应的文件夹内 》3.修改Makefile文件 》4.修改Kconfig菜单 》5.到顶层目录配置自己驱动 》6.编译成模块 》7.此时用的开发板上内核的编译器&#xff0c;安装得到开发板上进行安装 》8.在开发板上进…

标准IO和文件IO分别实现cp功能(嵌入式学习)

标准IO和文件IO分别实现cp功能 标准IO实现cp功能标准IO概念代码实现 文件IO实现cp功能文件IO概念代码实现 标准IO实现cp功能 标准IO概念 想了解标准IO的概念&#xff0c;请点击这里——》IO进程——标准IO&#xff08;嵌入式学习&#xff09; IO进程——标准IO&#xff08;嵌…