当前位置: 首页 > news >正文

企维多类似网站/宁波seo网站推广

企维多类似网站,宁波seo网站推广,k68威客网,做产品网站设计应该注意什么本篇博客将演示如何使用 Python Pygame 从零开始编写一款 Frogger 风格的小游戏。Frogger 是一款早期街机经典,玩家需要帮助青蛙穿越车水马龙的马路到达对岸。本示例提供了一个精简原型,包含角色移动、汽车生成与移动、碰撞检测、胜利条件等关键点。希望…

本篇博客将演示如何使用 Python + Pygame 从零开始编写一款 Frogger 风格的小游戏。Frogger 是一款早期街机经典,玩家需要帮助青蛙穿越车水马龙的马路到达对岸。本示例提供了一个精简原型,包含角色移动汽车生成与移动碰撞检测胜利条件等关键点。希望能为你的 2D 游戏创作带来更多灵感。


1. 前言

Frogger 最早于 1981 年由科乐美(Konami)与世嘉(Sega)联合发行,玩家需要操纵一只小青蛙,穿过公路和河流,躲避疾驰的汽车或其他障碍,到达对岸的安全区。本篇示例中,我们将专注于公路部分的场景,展示如何实现:

  1. 青蛙(Frog) 的移动控制:上下左右移动,每次移动一格或一段距离;
  2. 车辆(Car) 的随机生成与自动移动:从一侧出现并驶向另一侧;
  3. 碰撞检测:如果青蛙与车辆重叠,则游戏结束;
  4. 胜利条件:青蛙成功到达屏幕顶端(或多个安全格)即可通关;
  5. 关卡与难度:可在此示例基础上控制车辆速度、数量等,增强挑战性。

2. 环境准备

  1. Python 3.x
  2. Pygame 库:若尚未安装,可在命令行执行:
    pip install pygame
    
  3. 桌面操作系统:Windows、macOS 或大部分 Linux 都能正常运行 Pygame。

3. 设计思路

  1. 地图/场景

    • 采用固定大小的屏幕,高度可分为若干“车道”或“安全区”;
    • 最上方为“目标区域”,中间若干车道,各车道上车辆从左到右或从右到左移动;
    • 最下方为青蛙的初始位置,玩家需向上移动到目标区域。
  2. 青蛙(Frog)

    • 记录其 (x, y) 位置或网格坐标。
    • 通过方向键(或 WASD)每次移动一个格子高度/宽度。
    • 若超出屏幕边界,则保持在可行范围内。
  3. 车辆(Car)

    • 不断从某侧随机生成车辆,具有一定速度和方向;
    • 随帧更新车的位置,若超出屏幕另一端则移除。
    • 可有多条车道,每条车道车辆朝同一方向行驶,速度可不相同。
  4. 碰撞检测

    • 每帧检查青蛙与所有车辆的矩形是否重叠。若重叠,游戏失败。
  5. 胜利判定

    • 如果青蛙到达屏幕顶部(或设置的终点区域),判定胜利。

4. 完整示例代码

将以下代码保存为 frogger.py 并运行。你可以根据需求对屏幕大小、车道数、车辆速度、青蛙移动距离等做个性化修改或扩展。

import pygame
import sys
import random# 初始化 Pygame
pygame.init()# ---------------------
# 全局参数
# ---------------------
WIDTH, HEIGHT = 600, 600     # 游戏窗口大小
FPS = 30                     # 帧率# 颜色定义
BLACK = (0, 0, 0)
WHITE = (255, 255, 255)
GREEN = (0, 200, 0)
RED   = (255, 0, 0)
GRAY  = (100, 100, 100)
BLUE  = (0, 0, 255)# 窗口与时钟
screen = pygame.display.set_mode((WIDTH, HEIGHT))
pygame.display.set_caption("简易 Frogger - Pygame 示例")
clock = pygame.time.Clock()
font = pygame.font.SysFont("arial", 32)# 其他配置
LANE_COUNT = 4               # 车道数量 (示例中只演示几条车道)
LANE_HEIGHT = 60             # 每条车道的高度
START_Y = HEIGHT - 50        # 青蛙起始垂直位置
FROG_SIZE = 40               # 青蛙的宽高
FROG_MOVE = 60               # 青蛙每次移动距离(与车道高度差不多)# 车辆配置
CAR_HEIGHT = 40
CAR_WIDTH  = 60
CAR_INTERVAL = 90            # 两辆车的最小水平间隔
CAR_SPEED_RANGE = (4, 7)     # 车辆速度随机区间
SPAWN_INTERVAL = 60          # 多久(帧)生成一辆新车# ---------------------
# 青蛙类
# ---------------------
class Frog:def __init__(self):self.x = WIDTH // 2 - FROG_SIZE // 2self.y = START_Yself.width = FROG_SIZEself.height = FROG_SIZEdef move_up(self):self.y -= FROG_MOVEif self.y < 0:self.y = 0def move_down(self):self.y += FROG_MOVEif self.y + self.height > HEIGHT:self.y = HEIGHT - self.heightdef move_left(self):self.x -= FROG_MOVEif self.x < 0:self.x = 0def move_right(self):self.x += FROG_MOVEif self.x + self.width > WIDTH:self.x = WIDTH - self.widthdef get_rect(self):return pygame.Rect(self.x, self.y, self.width, self.height)# ---------------------
# 车辆类
# ---------------------
class Car:def __init__(self, lane_index, direction):"""lane_index: 第几条车道(从上往下数 or 约定)direction: 车辆行驶方向: 1 表示从左往右, -1 表示从右往左"""self.lane_index = lane_indexself.direction = directionself.width = CAR_WIDTHself.height = CAR_HEIGHT# 车辆初始 y 坐标self.y = (lane_index + 1) * LANE_HEIGHT# 根据方向设定 xif direction == 1:self.x = -self.widthelse:self.x = WIDTHself.speed = random.randint(*CAR_SPEED_RANGE)def update(self):self.x += self.speed * self.directiondef is_off_screen(self):return (self.direction == 1 and self.x > WIDTH) or (self.direction == -1 and self.x + self.width < 0)def get_rect(self):return pygame.Rect(self.x, self.y, self.width, self.height)# ---------------------
# 主函数
# ---------------------
def main():frog = Frog()cars = []frame_count = 0running = Truegame_won = Falsewhile running:clock.tick(FPS)frame_count += 1# 1) 处理事件for event in pygame.event.get():if event.type == pygame.QUIT:running = Falseelif event.type == pygame.KEYDOWN:if event.key == pygame.K_UP:frog.move_up()elif event.key == pygame.K_DOWN:frog.move_down()elif event.key == pygame.K_LEFT:frog.move_left()elif event.key == pygame.K_RIGHT:frog.move_right()# 若青蛙到达顶部,则判定胜利if frog.y <= 0:game_won = Truerunning = False# 2) 生成车辆# 每间隔 SPAWN_INTERVAL 帧,在随机车道生成一辆车if frame_count % SPAWN_INTERVAL == 0:lane = random.randint(0, LANE_COUNT - 1)direction = random.choice([1, -1])# 为了减少车辆撞到一起, 可以简单判断该车道上最后一辆车的位置# 这里示例不做太多控制, 只是随机生成car = Car(lane, direction)cars.append(car)# 3) 更新车辆位置for c in cars:c.update()# 移除离开屏幕的车辆cars = [c for c in cars if not c.is_off_screen()]# 4) 检测碰撞frog_rect = frog.get_rect()for c in cars:if frog_rect.colliderect(c.get_rect()):# 撞车 -> 游戏结束running = Falsebreak# 5) 绘制场景screen.fill(BLACK)# 绘制“终点区域” (顶部)pygame.draw.rect(screen, BLUE, (0, 0, WIDTH, LANE_HEIGHT))# 绘制车道(用灰色背景)for i in range(1, LANE_COUNT + 1):y = i * LANE_HEIGHTpygame.draw.rect(screen, GRAY, (0, y, WIDTH, LANE_HEIGHT))# 绘制青蛙pygame.draw.rect(screen, GREEN, frog_rect)# 绘制车辆 (红色方块)for c in cars:pygame.draw.rect(screen, RED, c.get_rect())# 提示文本text_surface = font.render("Reach the Blue Zone!", True, WHITE)screen.blit(text_surface, (10, 10))pygame.display.flip()# 游戏结束画面game_over(game_won)def game_over(won):screen.fill(BLACK)if won:msg = "You Win! Frog Safely Crossed!"else:msg = "Game Over! The Frog got hit!"label = font.render(msg, True, WHITE)rect = label.get_rect(center=(WIDTH // 2, HEIGHT // 2))screen.blit(label, rect)pygame.display.flip()pygame.time.wait(3000)pygame.quit()sys.exit()if __name__ == "__main__":main()

主要逻辑解析

  1. 青蛙移动

    • 每次按键向上下左右移动一个格子的距离(FROG_MOVE)。
    • 防止青蛙越过屏幕边缘时,需要进行边界限制。
  2. 车道与车辆

    • 通过 LANE_COUNT 指定有多少条车道,每条车道的高度相同。
    • 每隔 SPAWN_INTERVAL 帧随机在任意车道生成一辆车,其方向可以是 从左往右从右往左
    • 车辆在每帧自动更新位置,若移出屏幕则移除。
  3. 碰撞检测

    • 获取青蛙和车辆的 Rect 判断是否 colliderect。若重叠则游戏结束。
  4. 胜利判定

    • 当青蛙到达屏幕最上方(y <= 0),判定成功过马路,游戏结束并显示胜利界面。
  5. 可扩展之处

    • 增加更多车道、修改每条车道车辆速度;
    • 为每条车道设置不同的方向或汽车密度;
    • 调整关卡难度:车辆越来越多、移动速度增快;
    • 添加额外障碍或奖励机制。

5. 运行效果

image.png

相关文章:

使用Pygame制作“青蛙过河”游戏

本篇博客将演示如何使用 Python Pygame 从零开始编写一款 Frogger 风格的小游戏。Frogger 是一款早期街机经典&#xff0c;玩家需要帮助青蛙穿越车水马龙的马路到达对岸。本示例提供了一个精简原型&#xff0c;包含角色移动、汽车生成与移动、碰撞检测、胜利条件等关键点。希望…...

BUU17 [RoarCTF 2019]Easy Calc1

自用 源代码 $(#calc).submit(function(){$.ajax({url:"calc.php?num"encodeURIComponent($("#content").val()),type:GET,success:function(data){$("#result").html(<div class"alert alert-success"><strong>答案:&l…...

堆的实现——对的应用(堆排序)

文章目录 1.堆的实现2.堆的应用--堆排序 大家在学堆的时候&#xff0c;需要有二叉树的基础知识&#xff0c;大家可以看我的二叉树文章&#xff1a;二叉树 1.堆的实现 如果有⼀个关键码的集合 K {k0 , k1 , k2 , …&#xff0c;kn−1 } &#xff0c;把它的所有元素按完全⼆叉树…...

新生讲课——图和并查集

1.图的存储 &#xff08;1&#xff09;.邻接矩阵 邻接矩阵可以借助stl中的vector,我们通过开一个二维矩阵,g[u]中存储的是u可以到达的点,定义如下 const int N 2e5 10; vector<int> g[N] 若是遇到带权图则定义如下 const int N 2e5 10; vector <pair <int ,…...

基于深度学习的视觉检测小项目(十七) 用户管理后台的编程

完成了用户管理功能的阶段。下一阶段进入AI功能相关。所有的资源见文章链接。 补充完后台代码的用户管理界面代码&#xff1a; import sqlite3from PySide6.QtCore import Slot from PySide6.QtWidgets import QDialog, QMessageBoxfrom . import user_manage # 导入使用ui…...

实战:利用百度站长平台加速网站收录

本文转自&#xff1a;百万收录网 原文链接&#xff1a;https://www.baiwanshoulu.com/33.html 利用百度站长平台加速网站收录是一个实战性很强的过程&#xff0c;以下是一些具体的步骤和策略&#xff1a; 一、了解百度站长平台 百度站长平台是百度为网站管理员提供的一系列工…...

web-XSS-CTFHub

前言 在众多的CTF平台当中&#xff0c;作者认为CTFHub对于初学者来说&#xff0c;是入门平台的不二之选。CTFHub通过自己独特的技能树模块&#xff0c;可以帮助初学者来快速入门。具体请看官方介绍&#xff1a;CTFHub。 作者更新了CTFHub系列&#xff0c;希望小伙伴们多多支持…...

【C++】P1957 口算练习题

博客主页&#xff1a; [小ᶻ☡꙳ᵃⁱᵍᶜ꙳] 本文专栏: C 文章目录 &#x1f4af;前言&#x1f4af;题目描述输入格式&#xff1a;输出格式&#xff1a; &#x1f4af;我的做法代码实现&#xff1a; &#x1f4af;老师的做法代码实现&#xff1a; &#x1f4af;对比分析&am…...

第二十三章 MySQL锁之表锁

目录 一、概述 二、语法 三、特点 一、概述 表级锁&#xff0c;每次操作锁住整张表。锁定粒度大&#xff0c;发生锁冲突的概率最高&#xff0c;并发度最低。应用在MyISAM、InnoDB、BDB等存储引擎中。 对于表级锁&#xff0c;主要分为以下三类&#xff1a; 1. 表锁 2. 元数…...

linux 进程补充

环境变量 基本概念 环境变量(environment variables)一般是指在操作系统中用来指定操作系统运行环境的一些参数 如&#xff1a;我们在编写C/C代码的时候&#xff0c;在链接的时候&#xff0c;从来不知道我们的所链接的动态静态库在哪 里&#xff0c;但是照样可以链接成功&#…...

渗透测试之文件包含漏洞 超详细的文件包含漏洞文章

目录 说明 通常分为两种类型&#xff1a; 本地文件包含 典型的攻击方式1&#xff1a; 影响&#xff1a; 典型的攻击方式2&#xff1a; 包含路径解释&#xff1a; 日志包含漏洞&#xff1a; 操作原理 包含漏洞读取文件 文件包含漏洞远程代码执行漏洞: 远程文件包含…...

Java 大视界 -- Java 大数据在智能医疗影像诊断中的应用(72)

💖亲爱的朋友们,热烈欢迎来到 青云交的博客!能与诸位在此相逢,我倍感荣幸。在这飞速更迭的时代,我们都渴望一方心灵净土,而 我的博客 正是这样温暖的所在。这里为你呈上趣味与实用兼具的知识,也期待你毫无保留地分享独特见解,愿我们于此携手成长,共赴新程!💖 一、…...

Web - CSS3浮动定位与背景样式

概述 这篇文章主要介绍了 CSS3 中的浮动定位、背景样式、变形效果等内容。包括 BFC 规范与创建方法、浮动的功能与使用要点、定位的多种方式及特点、边框与圆角的设置、背景的颜色、图片等属性、多种变形效果及 3D 旋转等&#xff0c;还提到了浏览器私有前缀。 BFC规范与浏览…...

ConcurrentHashMap线程安全:分段锁 到 synchronized + CAS

专栏系列文章地址&#xff1a;https://blog.csdn.net/qq_26437925/article/details/145290162 本文目标&#xff1a; 理解ConcurrentHashMap为什么线程安全&#xff1b;ConcurrentHashMap的具体细节还需要进一步研究 目录 ConcurrentHashMap介绍JDK7的分段锁实现JDK8的synchr…...

系统学习算法:专题九 穷举vs暴搜vs深搜vs回溯vs剪枝

其中标题的深搜&#xff0c;回溯&#xff0c;剪枝我们之前专题都已经有过学习和了解&#xff0c;这里多了两个穷举和暴搜&#xff0c;其实意思都差不多&#xff0c;穷举就是穷尽力气将所有情况都列举出来&#xff0c;暴搜就是暴力地去一个一个情况搜索&#xff0c;所以就是全部…...

解决 Pandas DataFrame 索引错误:KeyError:0

在使用 Pandas 处理数据时&#xff0c;KeyError 是一个常见的问题&#xff0c;尤其是在尝试通过索引访问数据时。本文将通过一个实际案例&#xff08;使用SKLearn中的MINIST数据集为例&#xff09;&#xff0c;详细分析 KeyError 的原因&#xff0c;并提供解决方法。 1 问题背…...

deepseek的对话风格

概述 deepseek的对话风格&#xff0c;比一般的模型的回答多了思考过程&#xff0c;这是它比较可爱的地方&#xff0c;模型的回答有了思考过程&#xff0c;对用户而言大模型的回答不完全是一个黑盒。 deepseek的对话风格 train_prompt_style """Below is an…...

制造业设备状态监控与生产优化实战:基于SQL的序列分析与状态机建模

目录 1. 背景与挑战 2. 数据建模与采集 2.1 数据表设计 设备状态表(记录设备实时状态变更)...

Javaweb学习之Mysql(Day5)

(一)Mysql概述 (1)MYSQL通用语法 SQL语句可以单行或多行书写,以分号结尾。 SQL语句可以使用空格/缩进来增强语句的可读性(即,空格和缩进不影响代码的执行)。 MySQL数据库的SQL语句不区分大小写。 注释: 1. 单行注释: -- 注释内容 或 # 注释内容 (MySQL 特有 …...

C++ Primer 迭代器

欢迎阅读我的 【CPrimer】专栏 专栏简介&#xff1a;本专栏主要面向C初学者&#xff0c;解释C的一些基本概念和基础语言特性&#xff0c;涉及C标准库的用法&#xff0c;面向对象特性&#xff0c;泛型特性高级用法。通过使用标准库中定义的抽象设施&#xff0c;使你更加适应高级…...

Java的String与StringBuilder例题

​​ package com.jiachen.StringBuilderDemo1;import java.util.Scanner;public class Exercise2 {public static void main(String[] args) {Scanner scanner new Scanner(System.in);String s scanner.nextLine().trim(); // 读取输入并去除前后空格String result;// 根据…...

Vue.js 如何选择合适的组件库

Vue.js 如何选择合适的组件库 大家在开发 Vue.js 项目的时候&#xff0c;都会面临一个问题&#xff1a;我该选择哪个组件库&#xff1f; 市面上有很多优秀的 Vue 组件库&#xff0c;比如 Element Plus、Vuetify、Quasar 等&#xff0c;它们各有特点。选择合适的组件库&#xf…...

github下载失败网页打开失败 若你已经知道github地址如何cmd下载

直接打开命令行&#xff1a; winr cmd 输入&#xff1a;git clone 地址 eg&#xff1a;git clone https://github.com/akospasztor/stm32f103-dfu-bootloader...

排序算法--计数排序

统计每个元素出现的次数&#xff0c;直接计算元素在有序序列中的位置&#xff0c;要求数据是整数且范围有限。适用于数据为小范围整数&#xff08;如年龄、成绩&#xff09;&#xff0c;数据重复率较高时效率更优。可用于小范围整数排序、基数排序的底层排序(作为基数排序的稳定…...

[特殊字符]const在函数前后的作用详解(附经典案例)

理解const在函数前后的位置差异&#xff0c;是掌握C精髓的重要一步。下面用几个超形象的例子&#xff0c;带你彻底搞懂这个知识点&#xff01; 情况1&#xff1a;const在函数后面&#xff08;成员函数限定符&#xff09; 作用&#xff1a;承诺这个成员函数不会修改对象的状态&…...

【字节青训营-7】:初探 Kitex 字节微服务框架(使用ETCD进行服务注册与发现)

本文目录 一、Kitex概述二、第一个Kitex应用三、IDL四、服务注册与发现 一、Kitex概述 长话短说&#xff0c;就是字节跳动内部的 Golang 微服务 RPC 框架&#xff0c;具有高性能、强可扩展的特点&#xff0c;在字节内部已广泛使用。 如果对微服务性能有要求&#xff0c;又希望…...

给AI用工具的能力——Agent

ReAct框架&#xff1a; Reason Action&#xff0c;推理与行动结合 可以借助思维链&#xff0c;用小样本提示展示给模型一个ReAct框架 推理&#xff1a;针对问题或上一步观察的思考 行动&#xff1a;基于推理&#xff0c;与外部环境的一些交互&#xff08;调用外部工具&…...

Jupyter Lab的使用

Lab与Notebook的区别: Jupyter Lab和Jupyter notebook有什么区别&#xff0c;这里找到一篇博客不过我没细看&#xff0c; Jupyter Lab和Jupyter Notebook的区别 - codersgl - 博客园 使用起来Lab就是一个更齐全、功能更高级的notebook&#xff0c; 启用滚动输出: 有时候一个…...

【从零开始的LeetCode-算法】922. 按奇偶排序数组 II

给定一个非负整数数组 nums&#xff0c; nums 中一半整数是 奇数 &#xff0c;一半整数是 偶数 。 对数组进行排序&#xff0c;以便当 nums[i] 为奇数时&#xff0c;i 也是 奇数 &#xff1b;当 nums[i] 为偶数时&#xff0c; i 也是 偶数 。 你可以返回 任何满足上述条件的…...

RabbitMQ深度探索:前置知识

消息中间件&#xff1a; 消息中间件基于队列模式实现异步 / 同步传输数据作用&#xff1a;可以实现支撑高并发、异步解耦、流量削峰、降低耦合 传统的 HTTP 请求存在的缺点&#xff1a; HTTP 请求基于响应的模型&#xff0c;在高并发的情况下&#xff0c;客户端发送大量的请求…...