自制打地鼠游戏,自制打地鼠游戏玩法与规则

  自制打地鼠游戏,自制打地鼠游戏玩法与规则

  本文主要介绍如何用Python实现打地鼠这个小游戏。本文中的示例代码非常详细,具有一定的参考价值。感兴趣的朋友可以参考一下。

  效果展示

  仓鼠游戏

  简介

  相信大家都知道打gopher的游戏规则,这里就不介绍了。反正我就是不停的用锤子砸从洞里钻出来的gopher

  首先,我们来确定游戏中有哪些元素。Gopher,Gopher,当然要有Gopher,所以我们写一个Gopher的游戏精灵类:

  地鼠

  鼹鼠类(pygame.sprite.Sprite):

  def __init__(self,image_paths,position,**kwargs):

  py game . sprite . sprite . _ _ init _ _(self)

  self . images=[py game . transform . scale(py game . image . load(image _ paths[0]),(101,103)),

  py game . transform . scale(py game . image . load(image _ paths[-1]),(101,103))]

  self.image=self.images[0]

  self.rect=self.image.get_rect()

  self . mask=py game . mask . from _ surface(self . image)

  自我设定位置(位置)

  self.is_hammer=False

  设置位置

  定义设定位置(自身,位置):

  self.rect.left,self.rect.top=pos

  设置被点击

  def setBeHammered(self):

  self.is_hammer=True

  显示在屏幕上

  def draw(自身,屏幕):

  if self . is _ hammer : self . image=self . images[1]

  screen.blit(self.image,self.rect)

  重置

  定义重置(自我):

  self.image=self.images[0]

  self.is_hammer=False

  很明显,地鼠有两种状态,被锤子砸到和没被锤子砸到,所以需要加载两个图。一只地鼠被击中时从未被击中的地鼠的图形切换到被击中后的地鼠的图形(我要找的图形可能看起来不像地鼠,请见谅兄弟)。那我们来定义一下锤子,一个游戏精灵类。与地鼠类似,锤子有两种状态,即未锤下和锤下,只不过锤下后需要快速回到未锤下的状态。具体来说,代码实现如下:

  类锤(pygame.sprite.Sprite):

  def __init__(self,image_paths,position,**kwargs):

  py game . sprite . sprite . _ _ init _ _(self)

  self . images=[py game . image . load(image _ paths[0]),py game . image . load(image _ paths[1])]

  self.image=self.images[0]

  self.rect=self.image.get_rect()

  self . mask=py game . mask . from _ surface(self . images[1])

  self.rect.left,self.rect.top=position

  #用于显示锤击时的特殊效果。

  self.hammer_count=0

  self.hammer_last_time=4

  self.is _ hammering=False

  设置位置

  定义设定位置(自身,位置):

  self . rect . centex,self.rect.centery=pos

  设置锤击

  def set hamming(self):

  self.is _ hammering=True

  显示在屏幕上

  定义绘制(自身,sc

  reen):

   if self.is_hammering:

   self.image = self.images[1]

   self.hammer_count += 1

   if self.hammer_count > self.hammer_last_time:

   self.is_hammering = False

   self.hammer_count = 0

   else:

   self.image = self.images[0]

   screen.blit(self.image, self.rect)

  OK,定义完游戏精灵之后,我们就可以开始写主程序啦。首先自然是游戏初始化:

  

游戏初始化

  def initGame():

   pygame.init()

   pygame.mixer.init()

   screen = pygame.display.set_mode(cfg.SCREENSIZE)

   pygame.display.set_caption(Whac A Mole-微信公众号:Charles的皮卡丘)

   return screen

  然后加载必要的游戏素材和定义必要的游戏变量(我都注释的比较详细了,就不在文章里赘述一遍了,自己看注释呗~)

  

 # 加载背景音乐和其他音效

   pygame.mixer.music.load(cfg.BGM_PATH)

   pygame.mixer.music.play(-1)

   audios = {

   count_down: pygame.mixer.Sound(cfg.COUNT_DOWN_SOUND_PATH),

   hammering: pygame.mixer.Sound(cfg.HAMMERING_SOUND_PATH)

   }

   # 加载字体

   font = pygame.font.Font(cfg.FONT_PATH, 40)

   # 加载背景图片

   bg_img = pygame.image.load(cfg.GAME_BG_IMAGEPATH)

   # 开始界面

   startInterface(screen, cfg.GAME_BEGIN_IMAGEPATHS)

   # 地鼠改变位置的计时

   hole_pos = random.choice(cfg.HOLE_POSITIONS)

   change_hole_event = pygame.USEREVENT

   pygame.time.set_timer(change_hole_event, 800)

   # 地鼠

   mole = Mole(cfg.MOLE_IMAGEPATHS, hole_pos)

   # 锤子

   hammer = Hammer(cfg.HAMMER_IMAGEPATHS, (500, 250))

   # 时钟

   clock = pygame.time.Clock()

   # 分数

   your_score = 0

  接着就是游戏主循环啦:

  

# 游戏主循环

  while True:

   # --游戏时间为60s

   time_remain = round((61000 - pygame.time.get_ticks()) / 1000.)

   # --游戏时间减少, 地鼠变位置速度变快

   if time_remain == 40:

   pygame.time.set_timer(change_hole_event, 650)

   elif time_remain == 20:

   pygame.time.set_timer(change_hole_event, 500)

   # --倒计时音效

   if time_remain == 10:

   audios[count_down].play()

   # --游戏结束

   if time_remain < 0: break

   count_down_text = font.render(Time: +str(time_remain), True, cfg.WHITE)

   # --按键检测

   for event in pygame.event.get():

   if event.type == pygame.QUIT:

   pygame.quit()

   sys.exit()

   elif event.type == pygame.MOUSEMOTION:

   hammer.setPosition(pygame.mouse.get_pos())

   elif event.type == pygame.MOUSEBUTTONDOWN:

   if event.button == 1:

   hammer.setHammering()

   elif event.type == change_hole_event:

   hole_pos = random.choice(cfg.HOLE_POSITIONS)

   mole.reset()

   mole.setPosition(hole_pos)

   # --碰撞检测

   if hammer.is_hammering and not mole.is_hammer:

   is_hammer = pygame.sprite.collide_mask(hammer, mole)

   if is_hammer:

   audios[hammering].play()

   mole.setBeHammered()

   your_score += 10

   # --分数

   your_score_text = font.render(Score: +str(your_score), True, cfg.BROWN)

   # --绑定必要的游戏元素到屏幕(注意顺序)

   screen.blit(bg_img, (0, 0))

   screen.blit(count_down_text, (875, 8))

   screen.blit(your_score_text, (800, 430))

   mole.draw(screen)

   hammer.draw(screen)

   # --更新

   pygame.display.flip()

   clock.tick(60)

  每一部分我也都做了注释,逻辑很简单,就不多废话了。60s后,游戏结束,我们就可以统计分数以及和历史最高分做对比了:

  

# 读取最佳分数(try块避免第一次游戏无.rec文件)

  try:

   best_score = int(open(cfg.RECORD_PATH).read())

  except:

   best_score = 0

  # 若当前分数大于最佳分数则更新最佳分数

  if your_score > best_score:

   f = open(cfg.RECORD_PATH, w)

   f.write(str(your_score))

   f.close()

  为了使游戏看起来更正式,再随手添个开始界面和结束界面呗:

  

游戏开始界面

  def startInterface(screen, begin_image_paths):

   begin_images = [pygame.image.load(begin_image_paths[0]), pygame.image.load(begin_image_paths[1])]

   begin_image = begin_images[0]

   while True:

   for event in pygame.event.get():

   if event.type == pygame.QUIT:

   pygame.quit()

   sys.exit()

   elif event.type == pygame.MOUSEMOTION:

   mouse_pos = pygame.mouse.get_pos()

   if mouse_pos[0] in list(range(419, 574)) and mouse_pos[1] in list(range(374, 416)):

   begin_image = begin_images[1]

   else:

   begin_image = begin_images[0]

   elif event.type == pygame.MOUSEBUTTONDOWN:

   if event.button == 1 and mouse_pos[0] in list(range(419, 574)) and mouse_pos[1] in list(range(374, 416)):

   return True

   screen.blit(begin_image, (0, 0))

   pygame.display.update()

  结束界面

  def endInterface(screen, end_image_path, again_image_paths, score_info, font_path, font_colors, screensize):

   end_image = pygame.image.load(end_image_path)

   again_images = [pygame.image.load(again_image_paths[0]), pygame.image.load(again_image_paths[1])]

   again_image = again_images[0]

   font = pygame.font.Font(font_path, 50)

   your_score_text = font.render(Your Score: %s % score_info[your_score], True, font_colors[0])

   your_score_rect = your_score_text.get_rect()

   your_score_rect.left, your_score_rect.top = (screensize[0] - your_score_rect.width) / 2, 215

   best_score_text = font.render(Best Score: %s % score_info[best_score], True, font_colors[1])

   best_score_rect = best_score_text.get_rect()

   best_score_rect.left, best_score_rect.top = (screensize[0] - best_score_rect.width) / 2, 275

   while True:

   for event in pygame.event.get():

   if event.type == pygame.QUIT:

   pygame.quit()

   sys.exit()

   elif event.type == pygame.MOUSEMOTION:

   mouse_pos = pygame.mouse.get_pos()

   if mouse_pos[0] in list(range(419, 574)) and mouse_pos[1] in list(range(374, 416)):

   again_image = again_images[1]

   else:

   again_image = again_images[0]

   elif event.type == pygame.MOUSEBUTTONDOWN:

   if event.button == 1 and mouse_pos[0] in list(range(419, 574)) and mouse_pos[1] in list(range(374, 416)):

   return True

   screen.blit(end_image, (0, 0))

   screen.blit(again_image, (416, 370))

   screen.blit(your_score_text, your_score_rect)

   screen.blit(best_score_text, best_score_rect)

   pygame.display.update()

  大功告成~

  完整源代码

  以上就是基于Python制作打地鼠小游戏的详细内容,更多关于Python打地鼠游戏的资料请关注盛行IT软件开发工作室其它相关文章!

郑重声明:本文由网友发布,不代表盛行IT的观点,版权归原作者所有,仅为传播更多信息之目的,如有侵权请联系,我们将第一时间修改或删除,多谢。

留言与评论(共有 条评论)
   
验证码: