目录

啥也不多说,先来一个效果图展示

工具使用

游戏思路解析

项目整体的框架搭建

创建小恐龙对象

创建障碍物对象

创建地板对象

游戏的基本配置信息


啥也不多说,先来一个效果图展示

工具使用

开发环境:win10、python3.7 开发工具:pycharm 工具包:pygame

游戏思路解析

准备相对应的游戏图片 准备相对应的音频数据

项目整体的框架搭建

创建小恐龙对象

import pygame'''小恐龙'''
class Dinosaur(pygame.sprite.Sprite):def __init__(self, imagepaths, position=(40, 147), size=[(44, 47), (59, 47)], **kwargs):pygame.sprite.Sprite.__init__(self)# 导入所有图片self.images = []image = pygame.image.load(imagepaths[0])for i in range(5):self.images.append(pygame.transform.scale(image.subsurface((i*88, 0), (88, 95)), size[0]))image = pygame.image.load(imagepaths[1])for i in range(2):self.images.append(pygame.transform.scale(image.subsurface((i*118, 0), (118, 95)), size[1]))self.image_idx = 0self.image = self.images[self.image_idx]self.rect = self.image.get_rect()self.rect.left, self.rect.bottom = positionself.mask = pygame.mask.from_surface(self.image)# 定义一些必要的变量self.init_position = positionself.refresh_rate = 5self.refresh_counter = 0self.speed = 11.5self.gravity = 0.6self.is_jumping = Falseself.is_ducking = Falseself.is_dead = Falseself.movement = [0, 0]'''跳跃'''def jump(self, sounds):if self.is_dead or self.is_jumping:returnsounds['jump'].play()self.is_jumping = Trueself.movement[1] = -1 * self.speed'''低头'''def duck(self):if self.is_jumping or self.is_dead:returnself.is_ducking = True'''不低头'''def unduck(self):self.is_ducking = False'''死掉了'''def die(self, sounds):if self.is_dead:returnsounds['die'].play()self.is_dead = True'''将恐龙画到屏幕'''def draw(self, screen):screen.blit(self.image, self.rect)'''载入当前状态的图片'''def loadImage(self):self.image = self.images[self.image_idx]rect = self.image.get_rect()rect.left, rect.top = self.rect.left, self.rect.topself.rect = rectself.mask = pygame.mask.from_surface(self.image)'''更新小恐龙'''def update(self):if self.is_dead:self.image_idx = 4self.loadImage()returnif self.is_jumping:self.movement[1] += self.gravityself.image_idx = 0self.loadImage()self.rect = self.rect.move(self.movement)if self.rect.bottom >= self.init_position[1]:self.rect.bottom = self.init_position[1]self.is_jumping = Falseelif self.is_ducking:if self.refresh_counter % self.refresh_rate == 0:self.refresh_counter = 0self.image_idx = 5 if self.image_idx == 6 else 6self.loadImage()else:if self.refresh_counter % self.refresh_rate == 0:self.refresh_counter = 0if self.image_idx == 1:self.image_idx = 2elif self.image_idx == 2:self.image_idx = 3else:self.image_idx = 1self.loadImage()self.refresh_counter += 1

创建障碍物对象

  • 仙人掌

  • 飞龙

import random
import pygame'''仙人掌'''
class Cactus(pygame.sprite.Sprite):def __init__(self, imagepaths, position=(600, 147), sizes=[(40, 40), (40, 40)], **kwargs):pygame.sprite.Sprite.__init__(self)# 导入图片self.images = []image = pygame.image.load(imagepaths[0])for i in range(3):self.images.append(pygame.transform.scale(image.subsurface((i*101, 0), (101, 101)), sizes[0]))image = pygame.image.load(imagepaths[1])for i in range(3):self.images.append(pygame.transform.scale(image.subsurface((i*68, 0), (68, 70)), sizes[1]))self.image = random.choice(self.images)self.rect = self.image.get_rect()self.rect.left, self.rect.bottom = positionself.mask = pygame.mask.from_surface(self.image)# 定义一些必要的变量self.speed = -10'''画到屏幕上'''def draw(self, screen):screen.blit(self.image, self.rect)'''更新'''def update(self):self.rect = self.rect.move([self.speed, 0])if self.rect.right < 0:self.kill()'''飞龙'''
class Ptera(pygame.sprite.Sprite):def __init__(self, imagepath, position, size=(46, 40), **kwargs):pygame.sprite.Sprite.__init__(self)# 导入图片self.images = []image = pygame.image.load(imagepath)for i in range(2):self.images.append(pygame.transform.scale(image.subsurface((i*92, 0), (92, 81)), size))self.image_idx = 0self.image = self.images[self.image_idx]self.rect = self.image.get_rect()self.rect.left, self.rect.centery = positionself.mask = pygame.mask.from_surface(self.image)# 定义一些必要的变量self.speed = -10self.refresh_rate = 10self.refresh_counter = 0'''画到屏幕上'''def draw(self, screen):screen.blit(self.image, self.rect)'''更新'''def update(self):if self.refresh_counter % self.refresh_rate == 0:self.refresh_counter = 0self.image_idx = (self.image_idx + 1) % len(self.images)self.loadImage()self.rect = self.rect.move([self.speed, 0])if self.rect.right < 0:self.kill()self.refresh_counter += 1'''载入当前状态的图片'''def loadImage(self):self.image = self.images[self.image_idx]rect = self.image.get_rect()rect.left, rect.top = self.rect.left, self.rect.topself.rect = rectself.mask = pygame.mask.from_surface(self.image)

创建地板对象

import pygame'''地板'''
class Ground(pygame.sprite.Sprite):def __init__(self, imagepath, position, **kwargs):pygame.sprite.Sprite.__init__(self)# 导入图片self.image_0 = pygame.image.load(imagepath)self.rect_0 = self.image_0.get_rect()self.rect_0.left, self.rect_0.bottom = positionself.image_1 = pygame.image.load(imagepath)self.rect_1 = self.image_1.get_rect()self.rect_1.left, self.rect_1.bottom = self.rect_0.right, self.rect_0.bottom# 定义一些必要的参数self.speed = -10'''更新地板'''def update(self):self.rect_0.left += self.speedself.rect_1.left += self.speedif self.rect_0.right < 0:self.rect_0.left = self.rect_1.rightif self.rect_1.right < 0:self.rect_1.left = self.rect_0.right'''将地板画到屏幕'''def draw(self, screen):screen.blit(self.image_0, self.rect_0)screen.blit(self.image_1, self.rect_1)

游戏的基本配置信息

'''配置文件'''
import os'''屏幕大小'''
SCREENSIZE = (600, 150)
'''FPS'''
FPS = 60
'''音频素材路径'''
AUDIO_PATHS = {'die': os.path.join(os.getcwd(), 'resources/audios/die.wav'),'jump': os.path.join(os.getcwd(), 'resources/audios/jump.wav'),'point': os.path.join(os.getcwd(), 'resources/audios/point.wav')
}
'''图片素材路径'''
IMAGE_PATHS = {'cacti': [os.path.join(os.getcwd(), 'resources/images/cacti-big.png'),os.path.join(os.getcwd(), 'resources/images/cacti-small.png')],'cloud': os.path.join(os.getcwd(), 'resources/images/cloud.png'),'dino': [os.path.join(os.getcwd(), 'resources/images/dino.png'),os.path.join(os.getcwd(), 'resources/images/dino_ducking.png')],'gameover': os.path.join(os.getcwd(), 'resources/images/gameover.png'),'ground': os.path.join(os.getcwd(), 'resources/images/ground.png'),'numbers': os.path.join(os.getcwd(), 'resources/images/numbers.png'),'ptera': os.path.join(os.getcwd(), 'resources/images/ptera.png'),'replay': os.path.join(os.getcwd(), 'resources/images/replay.png')
}
'''背景颜色'''
BACKGROUND_COLOR = (235, 235, 235)
BLACK = (0, 0, 0)
WHITE = (255, 255, 255)
```设定游戏开始界面
```python
import sys
import pygame
from modules.sprites.dinosaur import Dinosaur'''游戏开始界面'''
def GameStartInterface(screen, sounds, cfg):dino = Dinosaur(cfg.IMAGE_PATHS['dino'])ground = pygame.image.load(cfg.IMAGE_PATHS['ground']).subsurface((0, 0), (83, 19))rect = ground.get_rect()rect.left, rect.bottom = cfg.SCREENSIZE[0]/20, cfg.SCREENSIZE[1]clock = pygame.time.Clock()press_flag = Falsewhile True:for event in pygame.event.get():if event.type == pygame.QUIT:pygame.quit()sys.exit()elif event.type == pygame.KEYDOWN:if event.key == pygame.K_SPACE or event.key == pygame.K_UP:press_flag = Truedino.jump(sounds)dino.update()screen.fill(cfg.BACKGROUND_COLOR)screen.blit(ground, rect)dino.draw(screen)pygame.display.update()clock.tick(cfg.FPS)if (not dino.is_jumping) and press_flag:return True```
游戏结束界面
```python
import sys
import pygame'''游戏结束界面'''
def GameEndInterface(screen, cfg):replay_image = pygame.image.load(cfg.IMAGE_PATHS['replay'])replay_image = pygame.transform.scale(replay_image, (35, 31))replay_image_rect = replay_image.get_rect()replay_image_rect.centerx = cfg.SCREENSIZE[0] / 2replay_image_rect.top = cfg.SCREENSIZE[1] * 0.52gameover_image = pygame.image.load(cfg.IMAGE_PATHS['gameover'])gameover_image = pygame.transform.scale(gameover_image, (190, 11))gameover_image_rect = gameover_image.get_rect()gameover_image_rect.centerx = cfg.SCREENSIZE[0] / 2gameover_image_rect.centery = cfg.SCREENSIZE[1] * 0.35clock = pygame.time.Clock()while True:for event in pygame.event.get():if event.type == pygame.QUIT:pygame.quit()sys.exit()elif event.type == pygame.KEYDOWN:if event.key == pygame.K_SPACE or event.key == pygame.K_UP:return Trueelif event.type == pygame.MOUSEBUTTONDOWN:mouse_pos = pygame.mouse.get_pos()if replay_image_rect.collidepoint(mouse_pos):return Truescreen.blit(replay_image, replay_image_rect)screen.blit(gameover_image, gameover_image_rect)pygame.display.update()clock.tick(cfg.FPS)
```项目运行文件
```python
import cfg
import sys
import random
import pygame
from modules.interfaces.gameend import GameEndInterface
from modules.interfaces.gamestart import GameStartInterface
from modules.sprites.dinosaur import Dinosaur
from modules.sprites.obstacle import Cactus, Ptera
from modules.sprites.scene import Ground'''main'''
def main(highest_score):# 游戏初始化pygame.init()screen = pygame.display.set_mode(cfg.SCREENSIZE)pygame.display.set_caption('九歌')# 导入所有声音文件sounds = {}for key, value in cfg.AUDIO_PATHS.items():sounds[key] = pygame.mixer.Sound(value)# 游戏开始界面GameStartInterface(screen, sounds, cfg)# 定义一些游戏中必要的元素和变量score = 0# score_board = Scoreboard(cfg.IMAGE_PATHS['numbers'], position=(534, 15), bg_color=cfg.BACKGROUND_COLOR)highest_score = highest_score# highest_score_board = Scoreboard(cfg.IMAGE_PATHS['numbers'], position=(435, 15), bg_color=cfg.BACKGROUND_COLOR, is_highest=True)dino = Dinosaur(cfg.IMAGE_PATHS['dino'])ground = Ground(cfg.IMAGE_PATHS['ground'], position=(0, cfg.SCREENSIZE[1]))cloud_sprites_group = pygame.sprite.Group()cactus_sprites_group = pygame.sprite.Group()ptera_sprites_group = pygame.sprite.Group()add_obstacle_timer = 0score_timer = 0# 游戏主循环clock = pygame.time.Clock()while True:for event in pygame.event.get():if event.type == pygame.QUIT:pygame.quit()sys.exit()elif event.type == pygame.KEYDOWN:if event.key == pygame.K_SPACE or event.key == pygame.K_UP:dino.jump(sounds)elif event.key == pygame.K_DOWN:dino.duck()elif event.type == pygame.KEYUP and event.key == pygame.K_DOWN:dino.unduck()screen.fill(cfg.BACKGROUND_COLOR)# --随机添加仙人掌/飞龙add_obstacle_timer += 1if add_obstacle_timer > random.randrange(50, 150):add_obstacle_timer = 0random_value = random.randrange(0, 10)if random_value >= 5 and random_value <= 7:cactus_sprites_group.add(Cactus(cfg.IMAGE_PATHS['cacti']))else:position_ys = [cfg.SCREENSIZE[1]*0.82, cfg.SCREENSIZE[1]*0.75, cfg.SCREENSIZE[1]*0.60, cfg.SCREENSIZE[1]*0.20]ptera_sprites_group.add(Ptera(cfg.IMAGE_PATHS['ptera'], position=(600, random.choice(position_ys))))# --更新游戏元素dino.update()ground.update()cloud_sprites_group.update()cactus_sprites_group.update()ptera_sprites_group.update()score_timer += 1if score_timer > (cfg.FPS//12):score_timer = 0score += 1score = min(score, 99999)if score > highest_score:highest_score = scoreif score % 100 == 0:sounds['point'].play()if score % 1000 == 0:ground.speed -= 1for item in cloud_sprites_group:item.speed -= 1for item in cactus_sprites_group:item.speed -= 1for item in ptera_sprites_group:item.speed -= 1# --碰撞检测for item in cactus_sprites_group:if pygame.sprite.collide_mask(dino, item):dino.die(sounds)for item in ptera_sprites_group:if pygame.sprite.collide_mask(dino, item):dino.die(sounds)# --将游戏元素画到屏幕上dino.draw(screen)ground.draw(screen)cloud_sprites_group.draw(screen)cactus_sprites_group.draw(screen)ptera_sprites_group.draw(screen)# --更新屏幕pygame.display.update()clock.tick(cfg.FPS)# --游戏是否结束if dino.is_dead:break# 游戏结束界面return GameEndInterface(screen, cfg), highest_score'''run'''
if __name__ == '__main__':highest_score = 0while True:flag, highest_score = main(highest_score)if not flag: break
```

❀微信扫一扫关注公众号加入学习交流技术解答小天地+q裙:881744585❀

用Python写个超级小恐龙跑酷游戏,上班摸鱼我能玩一天相关推荐

  1. 2022-用Python写个超级小恐龙跑酷游戏,上班摸鱼我能玩一天10-22

    啥也不多说,先来一个效果图展示 **工具使用 ** ** 开发环境:win10.python3.7** ** 开发工具:pycharm 工具包:pygame** 游戏思路解析 准备相对应的游戏图片 准 ...

  2. Phaser(二):小恐龙跑酷游戏

    效果展示 资源 图片资源 地图资源 src/GameScenes/Scene02/Tilemaps/map.json { "compressionlevel":-1,"h ...

  3. Pygame实战:程序员小哥给女友写了一款锻炼反应能力的游戏,从此上班摸鱼再也没被扣工资。

    导语 上班摸鱼有没有玩游戏啊! 如果没有 那你也肯定没有玩坠落的小鸟主题游戏咯~ ​ 不过没有关系 木子这就放大图给你过过眼瘾: ​ ​​​ 看看这个界面还真有app游戏软件哪味儿了! 这个可是大人小 ...

  4. python socket能做什么_用python写一个聊天小程序!和女朋友的专属聊天工具!

    原标题:用python写一个聊天小程序!和女朋友的专属聊天工具! 1.UDP简介 Internet协议集支持一个无连接的传输协议,该协议称为用户数据报协议(UDP).UDP为应用程序提供了无需建立就可 ...

  5. 【kimol君的无聊小发明】—用python写截屏小工具

    [kimol君的无聊小发明]-用python写截屏小工具 前言 一.技术实现 1. 相关库 2. 定义窗口 3. 绘制工具条 4. 定义事件函数 二.后续改进 写在最后 前言 今天我看了一下自己的文件 ...

  6. Python写王者荣耀小游戏

    Python写王者荣耀小游戏 文章目录 Python写王者荣耀小游戏 说明: 一.socket创建 二.实现多进程 三.面向对象版本 四.主体部分搭建 1. 服务器主要步骤的实现 1-1主体部分 1- ...

  7. 用java制作小游戏:小恐龙跑酷

    用java制作小游戏:小恐龙跑酷 插入链接与图片 运行图片:( 第一次做游戏,画风比较丑哈!最左边的就是主角小恐龙了,中间的是障碍物仙人掌,右边的小狗也是障碍物,右上角的是分数条) 图片: 以下是Ja ...

  8. c 语言500行小游戏代码,500行代码使用python写个微信小游戏飞机大战游戏.pdf

    500行行代代码码使使用用python写写个个微微信信小小游游戏戏飞飞机机大大战战游游戏戏 这篇文章主要介绍了500行代码使用python写个微信小游戏飞机大战游戏,本文通过实例代码给大家介绍的非常详 ...

  9. 【python小游戏】用python写一款小游戏--贪吃蛇

    大家好,我是爱吃饼干的小白鼠,今天给大家分享一款自制小游戏.如何用python编写贪吃蛇. 今天,突发奇想的想用python写一款小游戏--贪吃蛇.相信大家都玩过,那么玩一款自己写的是一种什么样的体验 ...

最新文章

  1. 修改Ubuntu的aptget源为阿里源的方法
  2. KVM、QEMU和KQemu的区别:
  3. Delphi2010 DataSnap 学习(一)
  4. oracle 增加ora容量_案例:Oracle报错ORA-01144 详解数据文件大小32GB的限制的原因
  5. SAP Spartacus Org Unit明细页面的工具栏按钮设计
  6. Cisco 3550-EMI 交 换 机 配 置 教 程
  7. catia曲面扫掠命令详解_Mastercam快捷键命令,附中英文功能讲解!值得收藏!
  8. 使用ASP.NET Core 3.x 构建 RESTful API - 3.3.3 ProblemDetails
  9. vim 命令模式 筛选_10个步骤的筛选器模式
  10. C++设计模式-适配器模式
  11. C语言:存储类型,内存管理
  12. [转载] 民兵葛二蛋——第18集
  13. LeetCode 135. 分发糖果(贪心算法)
  14. linux和windows下TIME_WAIT过多的解决办法
  15. java比较常用的缓存技术_常用缓存技术
  16. 【C语言】malloc,free(),strerror函数
  17. A2M峰会直击|闲鱼纳米镜——人人都是数据分析师
  18. Apollo beta公测版本安装
  19. FPS游戏UE4逆向视频教程
  20. iOS开发常用代码片段:总有你用得上的功能

热门文章

  1. 【硬件在环HIL环境配置】
  2. 求无限循环小数的循环节
  3. proxmox ve 中文社区_Proxmox VE 部署维护
  4. 完全备份、增量备份和差异备份
  5. cfa专题突破网课资源
  6. 多分类的评价指标PRF(Macro-F1/MicroF1/weighted)详解
  7. SAP顾问生涯闲记:2016年越南鞋厂项目回忆
  8. 华三模拟器HCL下载与安装教程
  9. 程序员的8个级别,你属于哪个级别?
  10. 安装IE,出现“无法安装ie,因为其他程序或更新正在等待重新启动计算机。”解决方法。