1. 程式人生 > 程式設計 >python實現吃蘋果小遊戲

python實現吃蘋果小遊戲

本文例項為大家分享了python實現吃蘋果小遊戲的具體程式碼,供大家參考,具體內容如下

1.公共類模組

import pygame
from pygame.rect import Rect
 
 
def print_text(font,x,y,text,color=(255,255,255)):
  imgText=font.render(text,True,color)
  screen=pygame.display.get_surface()
  screen.blit(imgText,(x,y))
 
class MySprite(pygame.sprite.Sprite):
  def __init__(self):
    pygame.sprite.Sprite.__init__(self)
    self.master_image=None
    self.frame = 0
    self.old_frame = -1
    self.frame_width = 1
    self.frame_height = 1
    self.first_frame = 0
    self.last_frame = 0
    self.columns = 0
    self.last_time = 1
    self.direction = 0
    self.velocity = 0
 
  def _getx(self): return self.rect.x
  def _gety(self): return self.rect.y
 
  def _setx(self,value): self.rect.x = value
  def _sety(self,value): self.rect.y = value
  """
  描述
  property() 函式的作用是在新式類中返回屬性值。
  
  語法
  以下是 property() 方法的語法:
  
  class property([fget[,fset[,fdel[,doc]]]])
  引數
  fget -- 獲取屬性值的函式
  fset -- 設定屬性值的函式
  fdel -- 刪除屬性值函式
  doc -- 屬性描述資訊
  返回值
  返回新式類屬性。
  """
  X = property(_getx,_setx)
  Y = property(_gety,_sety)
 
  #位置屬性
  def _getpos(self): return self.rect.topleft
  def _setpos(self,pos): self.rect.topleft = pos
  position = property(_getpos,_setpos)
 
  def load(self,filename,width,height,columns):
    self.master_image=pygame.image.load(filename).convert_alpha()
    self.frame_height = height
    self.frame_width = width
    self.rect = Rect(0,height)
    self.columns = columns
 
    rect = self.master_image.get_rect()
    self.last_frame = (rect.width//width)*(rect.height//height) - 1
 
  def update(self,current_time,rate=30):
    #跟新動畫幀
    if current_time > self.last_time + rate:
      self.frame += 1
      if self.frame > self.last_frame:
        self.frame = self.first_frame
      self.last_time = current_time
    #僅當更改時才建立幀
    if self.frame != self.old_frame:
      frame_x = (self.frame % self.columns) * self.frame_width
      frame_y = (self.frame // self.columns) * self.frame_height
      rect=Rect(frame_x,frame_y,self.frame_width,self.frame_height)
      self.image = self.master_image.subsurface(rect)
      self.old_frame = self.frame
class Point(object):
  def __init__(self,y):
    self.x = x
    self.y = y
  def getx(self): return self.x
  def gety(self): return self.y
  def setx(self,value): self.x=value
  def sety(self,value): self.y=value
 
  x=property(getx,setx)
  y=property(gety,sety)
 
  def __str__(self):
    return 'x:'+"{:.0f}".format(self.x) + 'y:'+"{:.0f}".format(self.y)

2.首先生成隨機蘋果,然後監聽鍵盤移動,播放動畫。精靈和蘋果碰撞檢測,檢測是吃掉蘋果

import pygame
from pygame.rect import Rect
 
from . import MyLibrary
import random
import sys
 
 
def calc_velocity(direction,vel=1.0):
  velocity = MyLibrary.Point(0,0)
  if direction == 0:#上
    velocity.y = -vel
  elif direction == 2:#右
    velocity.x = vel
  elif direction == 4:#下
    velocity.y == vel
  elif direction == 6:#左
    velocity.x == -vel
  return velocity
 
pygame.init()
screen = pygame.display.set_mode(800,600)
font=pygame.font.Font(None,36)
timer=pygame.time.Clock()
 
#建立精靈組
player_group=pygame.sprite.Group()
food_group=pygame.sprite.Group()
 
#初始化玩家精靈組
player=MyLibrary.MySprite()
player.load('farmer.png',96,8)############-----------------圖片
player.position=80,80
player.direction= 4
player_group.add(player)
 
#初始化food精靈組
for n in range(1,50):
  food= MyLibrary.MySprite()
  food.load('food.png',35,1) #################-----------食物圖片
  food.position=random.randint(0,780),random.randint(0,580)
  food_group.add(food)
 
game_over= False
player_moving = False
plyer_health = False
 
while True:
  timer.tick(30)
  ticks = pygame.time.get_ticks()
 
  for event in pygame.event.get():
    if event.type == pygame.QUIT:
      pygame.quit()
      sys.exit()
  keys = pygame.key.get_pressed()
  if keys[pygame.key.K_UP]:
    player.direction=0
    player_moving = True
  elif keys[pygame.key.k_DOWN]:
    player_moving = True
    player.direction=4
  elif keys[pygame.key.K_RIGHT]:
    player.direction = 2
    player_moving = True
  elif keys[pygame.key.K_LEFT]:
    player.direction = 6
    player_moving = True
  else:
    player_moving = False
 
  if not game_over:
    # 根據不同的方向,角色移動不同的動畫幀
    player.first_frame = player.direction*player.columns
    player.last_time = player.first_frame + player.columns -1
    if player.frame < player.first_frame:
      player.frame = player.first_frame
 
    if not player_moving:
      #停止更新動畫幀
      player.frame = player.first_frame=player.last_frame
    else:
      player.velocity = calc_velocity(player.direction,1.5)
      player.velocity.x*=1.5
      player.velocity.y*=1.5
 
    #跟新玩家精靈組
    player_group.update(ticks,50)
 
    #移動玩家
    if player_moving:
      player.X += player.velocity.x
      player.Y += player.velocity.y
      if player.X < 0: player.X = 0
      elif player.X >700: player.X =700
      if player.Y < 0: player.Y = 0
      elif player.Y >500:player.Y =500
 
    #檢測玩家是否與食物衝突,是否吃到蘋果
    attacker = None
    attacker = pygame.sprite.spritecollideany(player,food_group)
    if attacker != None:
      if pygame.sprite.collide_circle_ratio(0.65)(player,food_group):
        plyer_health += 2
        food_group.remove(attacker)
    if plyer_health > 100:
      plyer_health=100
      #跟新食物精靈組
      food_group.update(ticks,50)
      if food_group.__len__() == 0:
        game_over = True
 
    screen.fill((50,50,100))
    food_group.draw(screen)
    player_group.draw(screen)
 
    pygame.draw.rect(screen,(510,150,180),Rect(300,570,plyer_health*2,25))
    pygame.draw.rect(screen,(100,200,100,2))
 
    if game_over:
      MyLibrary.print_text(font,300,'Game Over!')
    pygame.display.update()

以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支援我們。