我的编程空间,编程开发者的网络收藏夹
学习永远不晚

Pygame做一期吃豆子游戏的示例代码

短信预约 -IT技能 免费直播动态提醒
省份

北京

  • 北京
  • 上海
  • 天津
  • 重庆
  • 河北
  • 山东
  • 辽宁
  • 黑龙江
  • 吉林
  • 甘肃
  • 青海
  • 河南
  • 江苏
  • 湖北
  • 湖南
  • 江西
  • 浙江
  • 广东
  • 云南
  • 福建
  • 海南
  • 山西
  • 四川
  • 陕西
  • 贵州
  • 安徽
  • 广西
  • 内蒙
  • 西藏
  • 新疆
  • 宁夏
  • 兵团
手机号立即预约

请填写图片验证码后获取短信验证码

看不清楚,换张图片

免费获取短信验证码

Pygame做一期吃豆子游戏的示例代码

Pygame的历史

Pygame是一个利用SDL库的写就的游戏库,SDL呢,全名Simple DirectMedia Layer,是一位叫做Sam Lantinga的大牛写的,据说他为了让Loki(致力于向Linux上移植Windows的游戏的一家大好人公司,可惜已经倒闭,唉好人不长命啊……)更有效的工作,创造了这个东东。

SDL是用C写的,不过它也可以使用C++进行开发,当然还有很多其它的语言,Pygame就是Python中使用它的一个库。Pygame已经存在很多时间了,许多优秀的程序员加入其中,把Pygame做得越来越好。

开发工具:

Python版本:3.6.4
相关模块:
pygame模块;
以及一些Python自带的模块。

安装Python并添加到环境变量,
pip安装需要的相关模块即可。

游戏简介:

玩家通过↑↓←→键控制游戏的主角吃豆人吃掉藏在迷宫内的所有豆子,并且不能被鬼魂抓到。
若能顺利吃完迷宫内的所有豆子并且不被鬼魂抓到,则游戏胜利,否则游戏失败。

Step1:定义游戏精灵类

① 墙类:

在这里插入图片描述

② 食物类:

在这里插入图片描述

③ 角色类:

角色类包括吃豆人和鬼魂,鬼魂由电脑控制其运动轨迹,吃豆人由玩家控制其运动轨迹。
显然,其均需具备更新角色位置和改变角色运动方向的能力,其源代码如下:

在这里插入图片描述

Step2:设计游戏地图

① 创建墙:

在这里插入图片描述

② 创建门:

在这里插入图片描述

③ 创建角色:

在这里插入图片描述

④ 创建食物:

在这里插入图片描述

Step3:设计游戏主循环

接下来开始设计游戏主循环。首先是初始化:

在这里插入图片描述

然后定义主函数:

在这里插入图片描述

其中startLevelGame函数用于开始某一关游戏,其源代码如下:

在这里插入图片描述

showText函数用于在游戏结束或关卡切换时在游戏界面中显示提示性文字,其源代码如下:

在这里插入图片描述

源代码:


#吃豆子
import os,sys
import sys
import pygame
import random
BLACK = (0, 0, 0)
WHITE = (255, 255, 255)
BLUE = (0, 0, 255)
GREEN = (0, 255, 0)
RED = (255, 0, 0)
YELLOW = (255, 255, 0)
PURPLE = (255, 0, 255)
SKYBLUE = (0, 191, 255)
if getattr(sys, 'frozen', False):
  cur_path = sys._MEIPASS
else:
  cur_path = os.path.dirname(__file__)
BGMPATH = os.path.join(cur_path, 'resources/sounds/bg.mp3')
ICONPATH = os.path.join(cur_path,'resources/images/icon.png')
FONTPATH = os.path.join(cur_path,'resources/font/ALGER.TTF')
HEROPATH = os.path.join(cur_path,'resources/images/pacman.png')
BlinkyPATH = os.path.join(cur_path,'resources/images/Blinky.png')
ClydePATH = os.path.join(cur_path,'resources/images/Clyde.png')
InkyPATH = os.path.join(cur_path,'resources/images/Inky.png')
PinkyPATH = os.path.join(cur_path,'resources/images/Pinky.png')
NUMLEVELS = 1
class Wall(pygame.sprite.Sprite):
	def __init__(self, x, y, width, height, color, **kwargs):
		pygame.sprite.Sprite.__init__(self)
		self.image = pygame.Surface([width, height])
		self.image.fill(color)
		self.rect = self.image.get_rect()
		self.rect.left = x
		self.rect.top = y
class Food(pygame.sprite.Sprite):
	def __init__(self, x, y, width, height, color, bg_color, **kwargs):
		pygame.sprite.Sprite.__init__(self)
		self.image = pygame.Surface([width, height])
		self.image.fill(bg_color)
		self.image.set_colorkey(bg_color)
		pygame.draw.ellipse(self.image, color, [0, 0, width, height])
		self.rect = self.image.get_rect()
		self.rect.left = x
		self.rect.top = y
class Player(pygame.sprite.Sprite):
	def __init__(self, x, y, role_image_path):
		pygame.sprite.Sprite.__init__(self)
		self.role_name = role_image_path.split('/')[-1].split('.')[0]
		self.base_image = pygame.image.load(role_image_path).convert()
		self.image = self.base_image.copy()
		self.rect = self.image.get_rect()
		self.rect.left = x
		self.rect.top = y
		self.prev_x = x
		self.prev_y = y
		self.base_speed = [30, 30]
		self.speed = [0, 0]
		self.is_move = False
		self.tracks = []
		self.tracks_loc = [0, 0]
	def changeSpeed(self, direction):
		if direction[0] < 0:
			self.image = pygame.transform.flip(self.base_image, True, False)
		elif direction[0] > 0:
			self.image = self.base_image.copy()
		elif direction[1] < 0:
			self.image = pygame.transform.rotate(self.base_image, 90)
		elif direction[1] > 0:
			self.image = pygame.transform.rotate(self.base_image, -90)
		self.speed = [direction[0] * self.base_speed[0], direction[1] * self.base_speed[1]]
		return self.speed
	def update(self, wall_sprites, gate_sprites):
		if not self.is_move:
			return False
		x_prev = self.rect.left
		y_prev = self.rect.top
		self.rect.left += self.speed[0]
		self.rect.top += self.speed[1]
		is_collide = pygame.sprite.spritecollide(self, wall_sprites, False)
		if gate_sprites is not None:
			if not is_collide:
				is_collide = pygame.sprite.spritecollide(self, gate_sprites, False)
		if is_collide:
			self.rect.left = x_prev
			self.rect.top = y_prev
			return False
		return True
	def randomDirection(self):
		return random.choice([[-0.5, 0], [0.5, 0], [0, 0.5], [0, -0.5]])
class Level1():
	def __init__(self):
		self.info = 'level1'
	def setupWalls(self, wall_color):
		self.wall_sprites = pygame.sprite.Group()
		wall_positions = [[0, 0, 6, 600],
						 [0, 0, 600, 6],
						 [0, 600, 606, 6],
						 [600, 0, 6, 606],
						 [300, 0, 6, 66],
						 [60, 60, 186, 6],
						 [360, 60, 186, 6],
						 [60, 120, 66, 6],
						 [60, 120, 6, 126],
						 [180, 120, 246, 6],
						 [300, 120, 6, 66],
						 [480, 120, 66, 6],
						 [540, 120, 6, 126],
						 [120, 180, 126, 6],
						 [120, 180, 6, 126],
						 [360, 180, 126, 6],
						 [480, 180, 6, 126],
						 [180, 240, 6, 126],
						 [180, 360, 246, 6],
						 [420, 240, 6, 126],
						 [240, 240, 42, 6],
						 [324, 240, 42, 6],
						 [240, 240, 6, 66],
						 [240, 300, 126, 6],
						 [360, 240, 6, 66],
						 [0, 300, 66, 6],
						 [540, 300, 66, 6],
						 [60, 360, 66, 6],
						 [60, 360, 6, 186],
						 [480, 360, 66, 6],
						 [540, 360, 6, 186],
						 [120, 420, 366, 6],
						 [120, 420, 6, 66],
						 [480, 420, 6, 66],
						 [180, 480, 246, 6],
						 [300, 480, 6, 66],
						 [120, 540, 126, 6],
						 [360, 540, 126, 6]]
		for wall_position in wall_positions:
			wall = Wall(*wall_position, wall_color)
			self.wall_sprites.add(wall)
		return self.wall_sprites
	def setupGate(self, gate_color):
		self.gate_sprites = pygame.sprite.Group()
		self.gate_sprites.add(Wall(282, 242, 42, 2, gate_color))
		return self.gate_sprites
	def setupPlayers(self, hero_image_path, ghost_images_path):
		self.hero_sprites = pygame.sprite.Group()
		self.ghost_sprites = pygame.sprite.Group()
		self.hero_sprites.add(Player(287, 439, hero_image_path))
		for each in ghost_images_path:
			role_name = each.split('/')[-1].split('.')[0]
			if role_name == 'Blinky':
				player = Player(287, 199, each)
				player.is_move = True
				player.tracks = [[0, -0.5, 4], [0.5, 0, 9], [0, 0.5, 11], [0.5, 0, 3], [0, 0.5, 7], [-0.5, 0, 11], [0, 0.5, 3],
								 [0.5, 0, 15], [0, -0.5, 15], [0.5, 0, 3], [0, -0.5, 11], [-0.5, 0, 3], [0, -0.5, 11], [-0.5, 0, 3],
								 [0, -0.5, 3], [-0.5, 0, 7], [0, -0.5, 3], [0.5, 0, 15], [0, 0.5, 15], [-0.5, 0, 3], [0, 0.5, 3],
								 [-0.5, 0, 3], [0, -0.5, 7], [-0.5, 0, 3], [0, 0.5, 7], [-0.5, 0, 11], [0, -0.5, 7], [0.5, 0, 5]]
				self.ghost_sprites.add(player)
			elif role_name == 'Clyde':
				player = Player(319, 259, each)
				player.is_move = True
				player.tracks = [[-1, 0, 2], [0, -0.5, 4], [0.5, 0, 5], [0, 0.5, 7], [-0.5, 0, 11], [0, -0.5, 7],
								 [-0.5, 0, 3], [0, 0.5, 7], [-0.5, 0, 7], [0, 0.5, 15], [0.5, 0, 15], [0, -0.5, 3],
								 [-0.5, 0, 11], [0, -0.5, 7], [0.5, 0, 3], [0, -0.5, 11], [0.5, 0, 9]]
				self.ghost_sprites.add(player)
			elif role_name == 'Inky':
				player = Player(255, 259, each)
				player.is_move = True
				player.tracks = [[1, 0, 2], [0, -0.5, 4], [0.5, 0, 10], [0, 0.5, 7], [0.5, 0, 3], [0, -0.5, 3],
								 [0.5, 0, 3], [0, -0.5, 15], [-0.5, 0, 15], [0, 0.5, 3], [0.5, 0, 15], [0, 0.5, 11],
								 [-0.5, 0, 3], [0, -0.5, 7], [-0.5, 0, 11], [0, 0.5, 3], [-0.5, 0, 11], [0, 0.5, 7],
								 [-0.5, 0, 3], [0, -0.5, 3], [-0.5, 0, 3], [0, -0.5, 15], [0.5, 0, 15], [0, 0.5, 3],
								 [-0.5, 0, 15], [0, 0.5, 11], [0.5, 0, 3], [0, -0.5, 11], [0.5, 0, 11], [0, 0.5, 3], [0.5, 0, 1]]
				self.ghost_sprites.add(player)
			elif role_name == 'Pinky':
				player = Player(287, 259, each)
				player.is_move = True
				player.tracks = [[0, -1, 4], [0.5, 0, 9], [0, 0.5, 11], [-0.5, 0, 23], [0, 0.5, 7], [0.5, 0, 3],
								 [0, -0.5, 3], [0.5, 0, 19], [0, 0.5, 3], [0.5, 0, 3], [0, 0.5, 3], [0.5, 0, 3],
								 [0, -0.5, 15], [-0.5, 0, 7], [0, 0.5, 3], [-0.5, 0, 19], [0, -0.5, 11], [0.5, 0, 9]]
				self.ghost_sprites.add(player)
		return self.hero_sprites, self.ghost_sprites
	def setupFood(self, food_color, bg_color):
		self.food_sprites = pygame.sprite.Group()
		for row in range(19):
			for col in range(19):
				if (row == 7 or row == 8) and (col == 8 or col == 9 or col == 10):
					continue
				else:
					food = Food(30*col+32, 30*row+32, 4, 4, food_color, bg_color)
					is_collide = pygame.sprite.spritecollide(food, self.wall_sprites, False)
					if is_collide:
						continue
					is_collide = pygame.sprite.spritecollide(food, self.hero_sprites, False)
					if is_collide:
						continue
					self.food_sprites.add(food)
		return self.food_sprites
def startLevelGame(level, screen, font):
  clock = pygame.time.Clock()
  SCORE = 0
  wall_sprites = level.setupWalls(SKYBLUE)
  gate_sprites = level.setupGate(WHITE)
  hero_sprites, ghost_sprites = level.setupPlayers(HEROPATH, [BlinkyPATH, ClydePATH, InkyPATH, PinkyPATH])
  food_sprites = level.setupFood(YELLOW, WHITE)
  is_clearance = False
  while True:
    for event in pygame.event.get():
      if event.type == pygame.QUIT:
        pygame.quit()
        sys.exit(-1)
      if event.type == pygame.KEYDOWN:
        if event.key == pygame.K_LEFT:
          for hero in hero_sprites:
            hero.changeSpeed([-1, 0])
            hero.is_move = True
        elif event.key == pygame.K_RIGHT:
          for hero in hero_sprites:
            hero.changeSpeed([1, 0])
            hero.is_move = True
        elif event.key == pygame.K_UP:
          for hero in hero_sprites:
            hero.changeSpeed([0, -1])
            hero.is_move = True
        elif event.key == pygame.K_DOWN:
          for hero in hero_sprites:
            hero.changeSpeed([0, 1])
            hero.is_move = True
      if event.type == pygame.KEYUP:
        if (event.key == pygame.K_LEFT) or (event.key == pygame.K_RIGHT) or (event.key == pygame.K_UP) or (event.key == pygame.K_DOWN):
          hero.is_move = False
    screen.fill(BLACK)
    for hero in hero_sprites:
      hero.update(wall_sprites, gate_sprites)
    hero_sprites.draw(screen)
    for hero in hero_sprites:
      food_eaten = pygame.sprite.spritecollide(hero, food_sprites, True)
    SCORE += len(food_eaten)
    wall_sprites.draw(screen)
    gate_sprites.draw(screen)
    food_sprites.draw(screen)
    for ghost in ghost_sprites:
      if ghost.tracks_loc[1] < ghost.tracks[ghost.tracks_loc[0]][2]:
        ghost.changeSpeed(ghost.tracks[ghost.tracks_loc[0]][0: 2])
        ghost.tracks_loc[1] += 1
      else:
        if ghost.tracks_loc[0] < len(ghost.tracks) - 1:
          ghost.tracks_loc[0] += 1
        elif ghost.role_name == 'Clyde':
          ghost.tracks_loc[0] = 2
        else:
          ghost.tracks_loc[0] = 0
        ghost.changeSpeed(ghost.tracks[ghost.tracks_loc[0]][0: 2])
        ghost.tracks_loc[1] = 0
      if ghost.tracks_loc[1] < ghost.tracks[ghost.tracks_loc[0]][2]:
        ghost.changeSpeed(ghost.tracks[ghost.tracks_loc[0]][0: 2])
      else:
        if ghost.tracks_loc[0] < len(ghost.tracks) - 1:
          loc0 = ghost.tracks_loc[0] + 1
        elif ghost.role_name == 'Clyde':
          loc0 = 2
        else:
          loc0 = 0
        ghost.changeSpeed(ghost.tracks[loc0][0: 2])
      ghost.update(wall_sprites, None)
    ghost_sprites.draw(screen)
    score_text = font.render("Score: %s" % SCORE, True, RED)
    screen.blit(score_text, [10, 10])
    if len(food_sprites) == 0:
      is_clearance = True
      break
    if pygame.sprite.groupcollide(hero_sprites, ghost_sprites, False, False):
      is_clearance = False
      break
    pygame.display.flip()
    clock.tick(10)
  return is_clearance
def showText(screen, font, is_clearance, flag=False):
  clock = pygame.time.Clock()
  msg = 'Game Over!' if not is_clearance else 'Congratulations, you won!'
  positions = [[235, 233], [65, 303], [170, 333]] if not is_clearance else [[145, 233], [65, 303], [170, 333]]
  surface = pygame.Surface((400, 200))
  surface.set_alpha(10)
  surface.fill((128, 128, 128))
  screen.blit(surface, (100, 200))
  texts = [font.render(msg, True, WHITE),
			  font.render('Press ENTER to continue or play again.', True, WHITE),
			  font.render('Press ESCAPE to quit.', True, WHITE)]
  while True:
    for event in pygame.event.get():
      if event.type == pygame.QUIT:
        pygame.quit()
        sys.exit(-1)
      if event.type == pygame.KEYDOWN:
        if event.key == pygame.K_RETURN:
          if is_clearance:
            if not flag:
              return
            else:
              main(initialize())
          else:
            main(initialize())
        elif event.key == pygame.K_ESCAPE:
          pygame.quit()
          sys.exit(-1)
    for idx, (text, position) in enumerate(zip(texts, positions)):
      screen.blit(text, position)
    pygame.display.flip()
    clock.tick(10)

def initialize():
  pygame.init()
  icon_image = pygame.image.load(ICONPATH)
  pygame.display.set_icon(icon_image)
  screen = pygame.display.set_mode([606, 606])
  pygame.display.set_caption('吃豆子')
  return screen

def main(screen):
  try:
    pygame.mixer.init()
    pygame.mixer.music.load(BGMPATH)
    pygame.mixer.music.play(-1, 0.0)
  except:
    pass
  pygame.font.init()
  font_small = pygame.font.Font(FONTPATH, 18)
  font_big = pygame.font.Font(FONTPATH, 24)
  for num_level in range(1, NUMLEVELS+1):
    if num_level == 1:
      level = Level1()
      is_clearance = startLevelGame(level, screen, font_small)
      if num_level == NUMLEVELS:
        showText(screen, font_big, is_clearance, True)
      else:
        showText(screen, font_big, is_clearance)
if __name__ == "__main__":
  main(initialize())

到此这篇关于Pygame做一期吃豆子游戏的示例代码的文章就介绍到这了,更多相关Pygame 吃豆子内容请搜索编程网以前的文章或继续浏览下面的相关文章希望大家以后多多支持编程网!

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

Pygame做一期吃豆子游戏的示例代码

下载Word文档到电脑,方便收藏和打印~

下载Word文档

猜你喜欢

Python代码实现贪吃蛇小游戏的示例

这篇文章给大家分享的是有关Python代码实现贪吃蛇小游戏的示例的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。图示基本准备首先,我们需要安装pygame库,小编通过pip install pygame,很快就安装
2023-06-15

C语言实现简易贪吃蛇游戏的示例代码

这篇文章主要介绍了如何利用C语言实现一个经典的小游戏——贪吃蛇,文中的示例代码讲解详细,具有一定的借鉴价值,需要的可以参考一下
2022-11-13

C语言实现简单的贪吃蛇游戏的示例代码

这篇文章主要为大家详细介绍了C语言如何实现经典贪吃蛇游戏,文中的示例代码讲解详细,对我们学习C语言有一定的帮助,感兴趣的小伙伴可以跟随小编一起了解一下
2023-01-12

C语言实现三子棋游戏的示例代码

今天我们将会用C语言实现三子棋。所谓三子棋,就是三行三列的棋盘,玩家可以和电脑下棋,率先连成三个的获胜。话不多说,我们开始吧
2022-11-13

C语言实现三子棋小游戏的示例代码

这篇文章主要介绍了如何通过C语言实现三子棋小游戏,三子棋小游戏的实现主要依赖于循环语句、函数和数组,感兴趣的小伙伴可以尝试一下
2022-11-13

编程热搜

  • Python 学习之路 - Python
    一、安装Python34Windows在Python官网(https://www.python.org/downloads/)下载安装包并安装。Python的默认安装路径是:C:\Python34配置环境变量:【右键计算机】--》【属性】-
    Python 学习之路 - Python
  • chatgpt的中文全称是什么
    chatgpt的中文全称是生成型预训练变换模型。ChatGPT是什么ChatGPT是美国人工智能研究实验室OpenAI开发的一种全新聊天机器人模型,它能够通过学习和理解人类的语言来进行对话,还能根据聊天的上下文进行互动,并协助人类完成一系列
    chatgpt的中文全称是什么
  • C/C++中extern函数使用详解
  • C/C++可变参数的使用
    可变参数的使用方法远远不止以下几种,不过在C,C++中使用可变参数时要小心,在使用printf()等函数时传入的参数个数一定不能比前面的格式化字符串中的’%’符号个数少,否则会产生访问越界,运气不好的话还会导致程序崩溃
    C/C++可变参数的使用
  • css样式文件该放在哪里
  • php中数组下标必须是连续的吗
  • Python 3 教程
    Python 3 教程 Python 的 3.0 版本,常被称为 Python 3000,或简称 Py3k。相对于 Python 的早期版本,这是一个较大的升级。为了不带入过多的累赘,Python 3.0 在设计的时候没有考虑向下兼容。 Python
    Python 3 教程
  • Python pip包管理
    一、前言    在Python中, 安装第三方模块是通过 setuptools 这个工具完成的。 Python有两个封装了 setuptools的包管理工具: easy_install  和  pip , 目前官方推荐使用 pip。    
    Python pip包管理
  • ubuntu如何重新编译内核
  • 改善Java代码之慎用java动态编译

目录