python小游戏之恐龙快跳

    技术2026-03-04  10

    恐龙快跳小游戏-Python

    1.引言 当今社会是一个信息社会,一个知识经济的年代。自从世界上第一台计算机ENIAC于1946年问世到现在,计算机业飞速发展。随着以全球信息网络普及和全球信息共享为标志的“全球信息网络革命”的蓬勃兴起,世界已然进入在计算机信息管理领域的激烈竞争的时代,计算机,自然而然的变成了人们生活中必不可少的一部分。 过去,人们只要是借助电影,电视,音乐等方式来娱乐。而今天,以游戏为代表的电子娱乐正成为主流娱乐方式。因为CPU以及显卡等设备的高速发展,为人们开发出更加炫目多彩的游戏提供了可能。时代的发展,社会的进步,科学技术正以日新月异的速度飞速的向前发展。计算机技术的发展更是迅速而且广泛。可以说,计算机已经涉及到现代绝大部分行业。目前纷繁复杂的游戏软件比比皆是,无论在线的网路游戏还是桌面游戏,二维的还是三维立体空间的,多由单机版游戏孕育而来。学习简单的单机版游戏的制作,有利于初学者了解到游戏制作的理念。目前不论是在国内还是世界范围内,游戏产业都如雨后的春笋,蓬勃发展,越来越多更具娱乐性的游戏产品被开发出来 随着今年来生活质量的提高也是在我们更加辛苦的工作下换来的,因此在我们休息之余必须要找一种放松的方式来安抚我们疲惫的神经。随着近年来游戏市场的崛起,越来越多的游戏出现在人们身边,一款放松心情的游戏固然重要,对于贪吃蛇这种游戏已经不满足当前人们最求新颖的要求了,因此一款恐龙快跳的小游戏便开始问世,不经在谷歌浏览器中也设置了此类游戏,为了满足网络不好而在电脑前苦苦等待连接的人们一丝放松的时间。本次设计运用的开发语言是 Python 语言,主要运行的是pygame库。

    恐龙快跳小游戏制作过程 1、仙人掌实现类:

    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 = position self.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()

    通过随机选择这两幅图中每幅图进行剪切,每幅图剪切成3块,已生成不同的仙人掌,并加入到图片队列中。 2、飞龙实现类:

    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 = 0 self.image = self.images[self.image_idx] self.rect = self.image.get_rect() self.rect.left, self.rect.centery = position self.mask = pygame.mask.from_surface(self.image) # 定义一些必要的变量 self.speed = -10 self.refresh_rate = 10 self.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 = 0 self.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.top self.rect = rect self.mask = pygame.mask.from_surface(self.image)

    此处飞龙是将图片切成两块,也将其加入图像队列中,两张图片进行交替显示便可以实现飞龙的动态飞行姿态。 3、云实现类

    class Cloud(pygame.sprite.Sprite): def __init__(self, imagepath, position, **kwargs): pygame.sprite.Sprite.__init__(self) # 导入图片 self.image = pygame.image.load(imagepath) self.rect = self.image.get_rect() self.rect.left, self.rect.top = position # 定义一些必要的参数 self.speed = -1 '''将云画到屏幕上''' 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()

    4、地板实现类:

    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 = position self.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.speed self.rect_1.left += self.speed if self.rect_0.right < 0: self.rect_0.left = self.rect_1.right if 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)

    5、记分板实现类:

    class Scoreboard(pygame.sprite.Sprite): def __init__(self, imagepath, position, size=(11, 13), is_highest=False, bg_color=None, **kwargs): pygame.sprite.Sprite.__init__(self) # 导入图片 self.images = [] image = pygame.image.load(imagepath) for i in range(12): self.images.append(pygame.transform.scale(image.subsurface((i*20, 0), (20, 24)), size)) if is_highest: self.image = pygame.Surface((size[0]*8, size[1])) else: self.image = pygame.Surface((size[0]*5, size[1])) self.rect = self.image.get_rect() self.rect.left, self.rect.top = position # 一些必要的变量 self.is_highest = is_highest self.bg_color = bg_color self.score = '00000' '''设置得分''' def set(self, score): self.score = str(score).zfill(5) '''画到屏幕上''' def draw(self, screen): self.image.fill(self.bg_color) for idx, digital in enumerate(list(self.score)): digital_image = self.images[int(digital)] if self.is_highest: self.image.blit(digital_image, ((idx+3)*digital_image.get_rect().width, 0)) else: self.image.blit(digital_image, (idx*digital_image.get_rect().width, 0)) if self.is_highest: self.image.blit(self.images[-2], (0, 0)) self.image.blit(self.images[-1], (digital_image.get_rect().width, 0)) screen.blit(self.image, self.rect)

    首先先将此图片切成12份,已提取中的数字,并将此数字对应self.score显示到屏幕上。显示效果为 HI 00000 其次。限制了计分器的长度为5,也就是最大值为99999,初始化为00000,通过改变self.score的值进行动态的显示。 6、游戏开始实现类:

    '''游戏开始界面''' 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 = False 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: press_flag = True dino.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

    将此图片分两片进行动态补充,并将地板进行切割为宽度为83,高度为19的图片。 并实时捕捉键盘的输入状态,当捕获到空格以及上键按下后游戏启动。 7、游戏结束类:

    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] / 2 replay_image_rect.top = cfg.SCREENSIZE[1] * 0.52 gameover_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] / 2 gameover_image_rect.centery = cfg.SCREENSIZE[1] * 0.35 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: return True elif event.type == pygame.MOUSEBUTTONDOWN: mouse_pos = pygame.mouse.get_pos() if replay_image_rect.collidepoint(mouse_pos): return True screen.blit(replay_image, replay_image_rect) screen.blit(gameover_image, gameover_image_rect) pygame.display.update() clock.tick(cfg.FPS)

    出发状态为判断是否接触到了障碍物 当接触到后显示 并键盘是否按下空格以及上键,已重启游戏

    最后代码执行效果: 开始界面: 游戏中: 死亡时:

    Processed: 0.009, SQL: 9