如何用Python建立自己的Dino Run?

zhongpeijiaoyu發表於2020-07-21

  今天,將向大家展示如何構建離線狀態下幾乎每個人都可以玩的最受歡迎的遊戲之一。如果您猜測哪個遊戲,就是在談論瀏覽器的Dino遊戲。但是,我們的Dino遊戲是彩色版本的瀏覽器版本的修改形式。現在,讓我們直接進入教程,如何用Python建立自己的Dino Run?請遵循所有精心給出的說明,以免在執行Dino Run遊戲時出現任何問題。

  如何用Python建立自己的Dino Run?

  首先,從安裝python後,開啟cmd 並鍵入以下命令。

  其次,複製下面提供的程式碼以及可以從下面的下載按鈕中獲得的資源。

  1.點安裝pygame

  2.點安裝random2

  最後,使用python main.py命令執行python程式碼。[在這裡,main.py是檔名]。

  原始碼:

  author = “Tripura Coders”

  import os

  import sys

  import pygame

  import random

  from pygame import *

  pygame.init()

  scr_size = (width,height) = (600,600)

  FPS = 60

  gravity = 0.6

  black = (0,0,0)

  white = (255,255,255)

  background_col = (235,235,235)

  high_score = 0

  screen = pygame.display.set_mode(scr_size)

  clock = pygame.time.Clock()

  pygame.display.set_caption(“Dino Run by Tripura Coders”)

  jump_sound = pygame.mixer.Sound(‘templates/jump.wav’)

  die_sound = pygame.mixer.Sound(‘templates/die.wav’)

  checkPoint_sound = pygame.mixer.Sound(‘templates/checkPoint.wav’)def load_image(

  name,

  sizex=-1,

  sizey=-1,

  colorkey=None,

  ):

  fullname = os.path.join(‘templates’, name)

  image = pygame.image.load(fullname)

  image = image.convert()

  if colorkey is not None:

  if colorkey is -1:

  colorkey = image.get_at((0, 0))

  image.set_colorkey(colorkey, RLEACCEL)

  if sizex != -1 or sizey != -1:

  image = pygame.transform.scale(image, (sizex, sizey))

  return (image, image.get_rect())def load_sprite_sheet(

  sheetname,

  nx,

  ny,

  scalex = -1,

  scaley = -1,

  colorkey = None,

  ):

  fullname = os.path.join(‘templates’,sheetname)

  sheet = pygame.image.load(fullname)

  sheet = sheet.convert()

  sheet_rect = sheet.get_rect()

  templates = []

  sizex = sheet_rect.width/nx

  sizey = sheet_rect.height/ny

  for i in range(0,ny):

  for j in range(0,nx):

  rect = pygame.Rect((jsizex,isizey,sizex,sizey))

  image = pygame.Surface(rect.size)

  image = image.convert()

  image.blit(sheet,(0,0),rect)

  if colorkey is not None:

  if colorkey is -1:

  colorkey = image.get_at((0,0))

  image.set_colorkey(colorkey,RLEACCEL)

  if scalex != -1 or scaley != -1:

  image = pygame.transform.scale(image,(scalex,scaley))

  templates.append(image)

  sprite_rect = templates[0].get_rect()

  return templates,sprite_rectdef disp_gameOver_msg(retbutton_image,gameover_image):

  retbutton_rect = retbutton_image.get_rect()

  retbutton_rect.centerx = width / 2

  retbutton_rect.top = height*0.52

  gameover_rect = gameover_image.get_rect()

  gameover_rect.centerx = width / 2

  gameover_rect.centery = height*0.35

  screen.blit(retbutton_image, retbutton_rect)

  screen.blit(gameover_image, gameover_rect)def extractDigits(number):

  if number > -1:

  digits = []

  i = 0

  while(number/10 != 0):

  digits.append(number%10)

  number = int(number/10)

  digits.append(number%10)

  for i in range(len(digits),5):

  digits.append(0)

  digits.reverse()

  return digitsclass Dino():

  def init(self,sizex=-1,sizey=-1):

  self.images,self.rect = load_sprite_sheet(‘dino.png’,5,1,sizex,sizey,-1)

  self.images1,self.rect1 = load_sprite_sheet(‘dino_ducking.png’,2,1,59,sizey,-1)

  self.rect.bottom = int(0.98*height)

  self.rect.left = width/15

  self.image = self.images[0]

  self.index = 0

  self.counter = 0

  self.score = 0

  self.isJumping = False

  self.isDead = False

  self.isDucking = False

  self.isBlinking = False

  self.movement = [0,0]

  self.jumpSpeed = 11.5

  self.stand_pos_width = self.rect.width

  self.duck_pos_width = self.rect1.width

  def draw(self):

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

  def checkbounds(self):

  if self.rect.bottom > int(0.98*height):

  self.rect.bottom = int(0.98*height)

  self.isJumping = False

  def update(self):

  if self.isJumping:

  self.movement[1] = self.movement[1] + gravity

  if self.isJumping:

  self.index = 0

  elif self.isBlinking:

  if self.index == 0:

  if self.counter % 400 == 399:

  self.index = (self.index + 1)%2

  else:

  if self.counter % 20 == 19:

  self.index = (self.index + 1)%2

  elif self.isDucking:

  if self.counter % 5 == 0:

  self.index = (self.index + 1)%2

  else:

  if self.counter % 5 == 0:

  self.index = (self.index + 1)%2 + 2

  if self.isDead:

  self.index = 4

  if not self.isDucking:

  self.image = self.images[self.index]

  self.rect.width = self.stand_pos_width

  else:

  self.image = self.images1[(self.index)%2]

  self.rect.width = self.duck_pos_width

  self.rect = self.rect.move(self.movement)

  self.checkbounds()

  if not self.isDead and self.counter % 7 == 6 and self.isBlinking == False:

  self.score += 1

  if self.score % 100 == 0 and self.score != 0:

  if pygame.mixer.get_init() != None:

  checkPoint_sound.play()

  self.counter = (self.counter + 1)class Cactus(pygame.sprite.Sprite):

  def init(self,speed=5,sizex=-1,sizey=-1):

  pygame.sprite.Sprite.init(self,self.containers)

  self.images,self.rect = load_sprite_sheet(‘cacti-small.png’,3,1,sizex,sizey,-1)

  self.rect.bottom = int(0.98*height)

  self.rect.left = width + self.rect.width

  self.image = self.images[random.randrange(0,3)]

  self.movement = [-1*speed,0]

  def draw(self):

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

  def update(self):

  self.rect = self.rect.move(self.movement)

  if self.rect.right < 0:

  self.kill()class Ptera(pygame.sprite.Sprite):

  def init(self,speed=5,sizex=-1,sizey=-1):

  pygame.sprite.Sprite.init(self,self.containers)

  self.images,self.rect = load_sprite_sheet(‘ptera.png’,2,1,sizex,sizey,-1)

  self.ptera_height = [height0.82,height0.75,height*0.60]

  self.rect.centery = self.ptera_height[random.randrange(0,3)]

  self.rect.left = width + self.rect.width

  self.image = self.images[0]

  self.movement = [-1*speed,0]

  self.index = 0

  self.counter = 0

  def draw(self):

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

  def update(self):

  if self.counter % 10 == 0:

  self.index = (self.index+1)%2

  self.image = self.images[self.index]

  self.rect = self.rect.move(self.movement)

  self.counter = (self.counter + 1)

  if self.rect.right < 0:

  self.kill()class Ground():

  def init(self,speed=-5):

  self.image,self.rect = load_image(‘ground.png’,-1,-1,-1)

  self.image1,self.rect1 = load_image(‘ground.png’,-1,-1,-1)

  self.rect.bottom = height

  self.rect1.bottom = height

  self.rect1.left = self.rect.right

  self.speed = speed

  def draw(self):

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

  screen.blit(self.image1,self.rect1)

  def update(self):

  self.rect.left += self.speed

  self.rect1.left += self.speed

  if self.rect.right < 0:

  self.rect.left = self.rect1.right

  if self.rect1.right < 0:

  self.rect1.left = self.rect.rightclass Cloud(pygame.sprite.Sprite):

  def init(self,x,y):

  pygame.sprite.Sprite.init(self,self.containers)

  self.image,self.rect = load_image(‘cloud.png’,int(90*30/42),30,-1)

  self.speed = 1

  self.rect.left = x

  self.rect.top = y

  self.movement = [-1*self.speed,0]

  def draw(self):

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

  def update(self):

  self.rect = self.rect.move(self.movement)

  if self.rect.right < 0:

  self.kill()class Scoreboard():

  def init(self,x=-1,y=-1):

  self.score = 0

  self.tempimages,self.temprect = load_sprite_sheet(‘numbers.png’,12,1,11,int(11*6/5),-1)

  self.image = pygame.Surface((55,int(11*6/5)))

  self.rect = self.image.get_rect()

  if x == -1:

  self.rect.left = width*0.89

  else:

  self.rect.left = x

  if y == -1:

  self.rect.top = height*0.1

  else:

  self.rect.top = y

  def draw(self):

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

  def update(self,score):

  score_digits = extractDigits(score)

  self.image.fill(background_col)

  for s in score_digits:

  self.image.blit(self.tempimages[s],self.temprect)

  self.temprect.left += self.temprect.width

  self.temprect.left = 0def introscreen():

  temp_dino = Dino(44,47)

  temp_dino.isBlinking = True

  gameStart = False

  temp_ground,temp_ground_rect = load_sprite_sheet(‘ground.png’,15,1,-1,-1,-1)

  temp_ground_rect.left = width/20

  temp_ground_rect.bottom = height

  logo,logo_rect = load_image(‘logo.jpg’,300,140,-1)

  logo_rect.centerx = width*0.6

  logo_rect.centery = height*0.6

  while not gameStart:

  if pygame.display.get_surface() == None:

  print(“Couldn’t load display surface”)

  return True

  else:

  for event in pygame.event.get():

  if event.type == pygame.QUIT:

  return True

  if event.type == pygame.KEYDOWN:

  if event.key == pygame.K_SPACE or event.key == pygame.K_UP:

  temp_dino.isJumping = True

  temp_dino.isBlinking = False

  temp_dino.movement[1] = -1*temp_dino.jumpSpeed

  temp_dino.update()

  if pygame.display.get_surface() != None:

  screen.fill(background_col)

  screen.blit(temp_ground[0],temp_ground_rect)

  if temp_dino.isBlinking:

  screen.blit(logo,logo_rect)

  temp_dino.draw()

  pygame.display.update()

  clock.tick(FPS)

  if temp_dino.isJumping == False and temp_dino.isBlinking == False:

  gameStart = Truedef gameplay():

  global high_score

  gamespeed = 4

  startMenu = False

  gameOver = False

  gameQuit = False

  playerDino = Dino(44,47)

  new_ground = Ground(-1*gamespeed)

  scb = Scoreboard()

  highsc = Scoreboard(width*0.78)

  counter = 0

  cacti = pygame.sprite.Group()

  pteras = pygame.sprite.Group()

  clouds = pygame.sprite.Group()

  last_obstacle = pygame.sprite.Group()

  Cactus.containers = cacti

  Ptera.containers = pteras

  Cloud.containers = clouds

  retbutton_image,retbutton_rect = load_image(‘replay_button.png’,35,31,-1)

  gameover_image,gameover_rect = load_image(‘game_over.png’,190,11,-1)

  temp_images,temp_rect = load_sprite_sheet(‘numbers.png’,12,1,11,int(11*6/5),-1)

  HI_image = pygame.Surface((22,int(11*6/5)))

  HI_rect = HI_image.get_rect()

  HI_image.fill(background_col)

  HI_image.blit(temp_images[10],temp_rect)

  temp_rect.left += temp_rect.width

  HI_image.blit(temp_images[11],temp_rect)

  HI_rect.top = height*0.1

  HI_rect.left = width*0.73

  while not gameQuit:

  while startMenu:

  pass

  while not gameOver:

  if pygame.display.get_surface() == None:

  print(“Couldn’t load display surface”)

  gameQuit = True

  gameOver = True

  else:

  for event in pygame.event.get():

  if event.type == pygame.QUIT:

  gameQuit = True

  gameOver = True

  if event.type == pygame.KEYDOWN:

  if event.key == pygame.K_SPACE:

  if playerDino.rect.bottom == int(0.98*height):

  playerDino.isJumping = True

  if pygame.mixer.get_init() != None:

  jump_sound.play()

  playerDino.movement[1] = -1*playerDino.jumpSpeed

  if event.key == pygame.K_DOWN:

  if not (playerDino.isJumping and playerDino.isDead):

  playerDino.isDucking = True

  if event.type == pygame.KEYUP:

  if event.key == pygame.K_DOWN:

  playerDino.isDucking = False

  for c in cacti:

  c.movement[0] = -1*gamespeed

  if pygame.sprite.collide_mask(playerDino,c):

  playerDino.isDead = True

  if pygame.mixer.get_init() != None:

  die_sound.play()

  for p in pteras:

  p.movement[0] = -1*gamespeed

  if pygame.sprite.collide_mask(playerDino,p):

  playerDino.isDead = True

  if pygame.mixer.get_init() != None:

  die_sound.play()

  if len(cacti) < 2:

  if len(cacti) == 0:

  last_obstacle.empty()

  last_obstacle.add(Cactus(gamespeed,40,40))

  else:

  for l in last_obstacle:

  if l.rect.right < width*0.7 and random.randrange(0,50) == 10:

  last_obstacle.empty()

  last_obstacle.add(Cactus(gamespeed, 40, 40))

  if len(pteras) == 0 and random.randrange(0,200) == 10 and counter > 500:

  for l in last_obstacle:

  if l.rect.right < width*0.8:

  last_obstacle.empty()

  last_obstacle.add(Ptera(gamespeed, 46, 40))

  if len(clouds) < 5 and random.randrange(0,300) == 10:

  Cloud(width,random.randrange(height/5,height/2))

  playerDino.update()

  cacti.update()

  pteras.update()

  clouds.update()

  new_ground.update()

  scb.update(playerDino.score)

  highsc.update(high_score)

  if pygame.display.get_surface() != None:

  screen.fill(background_col)

  new_ground.draw()

  clouds.draw(screen)

  scb.draw()

  if high_score != 0:

  highsc.draw()

  screen.blit(HI_image,HI_rect)

  cacti.draw(screen)

  pteras.draw(screen)

  playerDino.draw()

  pygame.display.update()

  clock.tick(FPS)

  if playerDino.isDead:

  gameOver = True

  if playerDino.score > high_score:

  high_score = playerDino.score

  if counter%700 == 699:

  new_ground.speed -= 1

  gamespeed += 1

  counter = (counter + 1)

  if gameQuit:

  break

  while gameOver:

  if pygame.display.get_surface() == None:

  print(“Couldn’t load display surface”)

  gameQuit = True

  gameOver = False

  else:

  for event in pygame.event.get():

  if event.type == pygame.QUIT:

  gameQuit = True

  gameOver = False

  if event.type == pygame.KEYDOWN:

  if event.key == pygame.K_ESCAPE:

  gameQuit = True

  gameOver = False

  if event.key == pygame.K_RETURN or event.key == pygame.K_SPACE:

  gameOver = False

  gameplay()

  highsc.update(high_score)

  if pygame.display.get_surface() != None:

  disp_gameOver_msg(retbutton_image, gameover_image)

  if high_score != 0:

  highsc.draw()

  screen.blit(HI_image, HI_rect)

  pygame.display.update()

  clock.tick(FPS)

  pygame.quit()

  quit()def main():

  isGameQuit = introscreen()

  if not isGameQuit:

  gameplay()

  main()

  以上就是關於如何用Python建立自己的Dino Run的全部內容介紹,想了解更多關於Python的資訊,請繼續關注中培教育。原文連結:www.zpedu.com/it/rjyf/11700.html

本作品採用《CC 協議》,轉載必須註明作者和本文連結

相關文章