您当前的位置:首页 > IT编程 > python
| C语言 | Java | VB | VC | python | Android | TensorFlow | C++ | oracle | 学术与代码 | cnn卷积神经网络 | gnn | 图像修复 | Keras | 数据集 | Neo4j | 自然语言处理 | 深度学习 | 医学CAD | 医学影像 | 超参数 | pointnet | pytorch | 异常检测 | Transformers | 情感分类 | 知识图谱 |

自学教程:Pygame做一期吃豆子游戏的示例代码

51自学网 2021-10-30 22:48:56
  python
这篇教程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,sysimport sysimport pygameimport randomBLACK = (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._MEIPASSelse:  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 = 1class 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 = yclass 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 = yclass 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_spritesdef 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_clearancedef 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 screendef 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 吃豆子内容请搜索51zixue.net以前的文章或继续浏览下面的相关文章希望大家以后多多支持51zixue.net!


Python3+Pygame实现射击游戏完整代码
浅谈pandas中对nan空值的判断和陷阱
万事OK自学网:51自学网_软件自学网_CAD自学网自学excel、自学PS、自学CAD、自学C语言、自学css3实例,是一个通过网络自主学习工作技能的自学平台,网友喜欢的软件自学网站。