侯体宗的博客
  • 首页
  • Hyperf版
  • beego仿版
  • 人生(杂谈)
  • 技术
  • 关于我
  • 更多分类
    • 文件下载
    • 文字修仙
    • 中国象棋ai
    • 群聊
    • 九宫格抽奖
    • 拼图
    • 消消乐
    • 相册

python实现flappy bird小游戏

Python  /  管理员 发布于 7年前   238

本文实例为大家分享了python实现flappy bird游戏的具体代码,供大家参考,具体内容如下

flappygamemain.py

# -*- coding: utf-8 -*-from __future__ import unicode_literals"""Created on Dec 25 2016@author: LINJUNJI @mail: [email protected] """import pygamefrom sys import exitimport randomfrom pygame.locals import *from pygame.font import * from gamerole import *import osimport datetimeimport numpy as npimport operator#图片路径信息BackGround_image_path1='./sources/background/day.png'  #背景图片BackGround_image_path2='./sources/background/night.png'GetStart_image_path='./sources/guide/day/down.png'  #开始界面GameOver_image_path='./sources/other/gameover.png'Restart_image_path='./sources/other/restart.png'Grade_blackball_path='./sources/other/grade_blackball.png'white_gold_Medal_image_path='./sources/medal/white_gold_medal.png' #奖牌图片gold_image_path='./sources/medal/gold_medal.png'silver_medal_image_path='./sources/medal/silver_medal.png'bronze_medal_image_path='./sources/medal/bronze_medal.png'Ground_image_path='./sources/background/ground.png'  #地面图片pilar_image_up_path='./sources/pilar/up.png'  #柱子图片pilar_image_down_path='./sources/pilar/down.png'Bird_image1_path='./sources/bird/up.png'   #小鸟图片Bird_image2_path='./sources/bird/med.png'Bird_image3_path='./sources/bird/down.png'#游戏窗体设置pygame.init()screen = pygame.display.set_mode((SCREEN_WIDTH, SCREEN_HEIGHT))pygame.display.set_caption('falppy_bird') #图片载入 background_day=pygame.image.load(BackGround_image_path1)background_night=pygame.image.load(BackGround_image_path2)ground=pygame.image.load(Ground_image_path)pilar_image_up=pygame.image.load(pilar_image_up_path)pilar_image_down=pygame.image.load(pilar_image_down_path)get_start_image=pygame.image.load(GetStart_image_path)gameover_image=pygame.image.load(GameOver_image_path)medal_blackball_image=pygame.image.load(Grade_blackball_path)restart_image=pygame.image.load(Restart_image_path)bird_images=[]bird_image_up=pygame.image.load(Bird_image1_path)bird_image_med=pygame.image.load(Bird_image2_path)bird_image_down=pygame.image.load(Bird_image3_path)bird_images.append(bird_image_up)bird_images.append(bird_image_med)bird_images.append(bird_image_down)medal_images=[]medal1=pygame.image.load(white_gold_Medal_image_path)medal2=pygame.image.load(gold_image_path)medal3=pygame.image.load(silver_medal_image_path)medal4=pygame.image.load(bronze_medal_image_path)medal_images.append(medal1)medal_images.append(medal2)medal_images.append(medal3)medal_images.append(medal4)#新建小鸟bird_pos=[190,190] #小鸟初始位置mybird=Bird(bird_images,bird_pos)#柱子集合pilar_set = pygame.sprite.Group()#运行参数设置pilar_frequency=0 #柱子更新参数bird_frequency=0 #小鸟飞行频率clock = pygame.time.Clock()running=Falsescore=0flag=1def collide_circle(pilar, mybird): #碰撞检测函数 if mybird.rect.right > pilar.pilar1_rect.left and mybird.rect.left < pilar.pilar1_rect.right: if (mybird.rect.top >pilar.pilar1_rect.bottom and mybird.rect.bottom <pilar.pilar2_rect.top):  return False else:  return True else: if mybird.rect.bottom > 400:  return True else:  return False def get_history_record(score): #获取记录的得分 record=[] index =0 if os.path.isfile("record.txt"): #存在:获取记录到的内容  f=open("record.txt") line=f.readline() line=f.readline() while line !="":  record.append([int(line.strip().split(",")[0]),line.strip().split(",")[1]])  line=f.readline() f.close() record.append([score,str(datetime.datetime.now())]) record.sort(key=operator.itemgetter(0),reverse=True) print record while len(record)>10: record.pop() file_writer = open("record.txt", 'w') file_writer.writelines("time"+","+"grade"+"\n") for i in range(len(record)): file_writer.writelines(str(record[i][0])+","+str(record[i][1])+"\n") if int(record[i][0]) == int(score):  index=i file_writer.close() if index >3: index=3 return record[0][0],index  while not running: clock.tick(60)  screen.fill(0) screen.blit(get_start_image, (0, 0))  pygame.display.update() x, y=pygame.mouse.get_pos()  for event in pygame.event.get(): if event.type ==pygame.QUIT:  pygame.quit()  exit() elif event.type == pygame.MOUSEBUTTONDOWN:  if y<380 and y>300 and x>180 and x <210:  running=True while True: clock.tick(60)  pilar_frequency +=1  #生成柱子 if pilar_frequency %100==0: pilar_pos=[384,random.randint(130, 250)] new_pilar=Pilar(pilar_image_up, pilar_image_down, pilar_pos) pilar_set.add(new_pilar)  if pilar_frequency >=1000: pilar_frequency=0  flag=(-1)*flag  #移动柱子 for pilar in pilar_set: pilar.move() if collide_circle(pilar, mybird): #碰撞检测代码  mybird.is_hit=True   for pilar in pilar_set:  pilar.stop() if pilar.pilar1_rect.right <0:  pilar_set.remove(pilar)  #小鸟降落 mybird.SelfMoveDown()  # 绘制背景 screen.fill(0)  if flag==1: screen.blit(background_day, (0, 0))  else: screen.blit(background_night, (0, 0)) #绘制柱子 for pilar in pilar_set: screen.blit(pilar.pilar1_image,pilar.pilar1_rect) screen.blit(pilar.pilar2_image,pilar.pilar2_rect) #绘制地面  screen.blit(ground,(0,384)) #绘制玩家小鸟 bird_frequency +=1  if not mybird.is_hit: #未发生碰撞 score +=10 screen.blit(mybird.image[mybird.image_index],mybird.rect) mybird.image_index=bird_frequency % 3  else: #发生碰撞 running=False  mybird.SelfDiedDown() screen.blit(mybird.image[0],mybird.rect) has_log=False while not running and mybird.is_downtoground: #画面切换到结束界面    screen.blit(gameover_image,(64,30))  screen.blit(medal_blackball_image,(42,100))  screen.blit(restart_image,(122,270))  if not has_log:     bestscore,index=get_history_record(score/100) #获取历史记录情况  print score/100  print bestscore,index  has_log=True  screen.blit(medal_images[index],(75,160)) #要读取之前保存的信息,  x, y=pygame.mouse.get_pos()     #目前得分  score_font = pygame.font.Font(None, 36)  score_text = score_font.render(str(score/100), True, (255,255,255))  text_rect = score_text.get_rect()  text_rect.midtop = [290, 145]  screen.blit(score_text, text_rect)  #历史最佳得分  score_font = pygame.font.Font(None, 36)  score_text = score_font.render(str(bestscore), True, (255,255,255))  text_rect = score_text.get_rect()  text_rect.midtop = [290,200]  screen.blit(score_text, text_rect)    for event in pygame.event.get():  if event.type ==pygame.QUIT:   pygame.quit()   exit()  elif event.type == pygame.MOUSEBUTTONDOWN:   if y<360 and y>280 and x>150 and x <240: #重新开始   pilar_set = pygame.sprite.Group()   mybird=Bird(bird_images,bird_pos)   score=0   running=True  pygame.display.update()    # 绘制得分  score_font = pygame.font.Font(None, 36) score_text = score_font.render(str(score/100), True, (255,255,255)) text_rect = score_text.get_rect() text_rect.midtop = [185, 30] screen.blit(score_text, text_rect) #屏幕更新 pygame.display.update() #绘制按键执行代码 key_pressed=pygame.key.get_pressed() if not mybird.is_hit: if key_pressed[K_w] or key_pressed[K_UP]:  mybird.moveUp() if key_pressed[K_s] or key_pressed[K_DOWN]:  mybird.moveDown()  for event in pygame.event.get(): if event.type ==pygame.QUIT:  pygame.quit()  exit()

gamerole.py

# -*- coding: utf-8 -*-from __future__ import unicode_literals"""Created on Thu Dec 25 2016@author: LINJUNJI @mail: [email protected] """import pygameimport randomSCREEN_WIDTH =384SCREEN_HEIGHT=448INTERVEL=120  #两个障碍之间的间隔UP_LIMIT=60DOWN_LIMIT=360#小鸟类class Bird(pygame.sprite.Sprite): def __init__(self,bird_imgs,init_pos): pygame.sprite.Sprite.__init__(self) self.image=bird_imgs self.rect=self.image[0].get_rect() self.rect.midbottom=init_pos self.up_speed = 5 self.down_speed=2 self.selfdown_speed=2 self.image_index=0  #图片索引参数,控制小鸟飞行姿态变化 self.is_hit=False  self.is_downtoground=False  def SelfMoveDown(self): self.rect.top += self.selfdown_speed  def SelfDiedDown(self): self.up_speed = 0 self.down_speed=0 self.rect.bottom +=self.selfdown_speed*2 if self.rect.bottom >=400:  self.rect.bottom =400  self.is_downtoground=True  def moveUp(self): if self.rect.top<=0:  self.rect.top=0 else:  self.rect.top -=self.up_speed   def moveDown(self): if self.rect.top>=SCREEN_HEIGHT-self.rect.height:  self.rect.top = SCREEN_HEIGHT-self.rect.height else:  self.rect.top += self.down_speed '''  def moveLeft(self): if self.rect.left <= 0:  self.rect.left = 0 else:  self.rect.left -= self.speed def moveRight(self): if self.rect.left >= SCREEN_WIDTH - self.rect.width:  self.rect.left = SCREEN_WIDTH - self.rect.width else:  self.rect.left += self.speed '''#柱子类class Pilar(pygame.sprite.Sprite): def __init__(self,pilar_image_up,pilar_image_down,init_pos): pygame.sprite.Sprite.__init__(self) self.pilar1_image=pilar_image_up self.pilar2_image=pilar_image_down self.pilar1_rect=self.pilar1_image.get_rect() self.pilar2_rect=self.pilar2_image.get_rect() self.pilar1_rect.bottomleft=init_pos self.pilar2_rect.topleft=[init_pos[0],init_pos[1]+INTERVEL] self.horizontal_speed=2 #柱子平移的速度 self.vertical_speed=0.3 #柱子上下移动的速度 self.direction=random.randint(0,1) #柱子上下移动的方向  def move(self): self.pilar1_rect.left -=self.horizontal_speed #柱子左右移动 self.pilar2_rect.left -=self.horizontal_speed if self.direction == 1:    #控制柱子上下移动  self.pilar1_rect.bottom +=self.vertical_speed   self.pilar2_rect.top +=self.vertical_speed  if self.pilar2_rect.top > DOWN_LIMIT:  self.direction=0 else:  self.pilar1_rect.bottom -=self.vertical_speed   self.pilar2_rect.top -=self.vertical_speed  if self.pilar1_rect.bottom < UP_LIMIT:  self.direction=1 def stop(self): self.horizontal_speed=0 self.vertical_speed=0

源码下载:python实现flappy bird游戏

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持。


  • 上一条:
    用Python读取几十万行文本数据
    下一条:
    python实现Flappy Bird源码
  • 昵称:

    邮箱:

    0条评论 (评论内容有缓存机制,请悉知!)
    最新最热
    • 分类目录
    • 人生(杂谈)
    • 技术
    • linux
    • Java
    • php
    • 框架(架构)
    • 前端
    • ThinkPHP
    • 数据库
    • 微信(小程序)
    • Laravel
    • Redis
    • Docker
    • Go
    • swoole
    • Windows
    • Python
    • 苹果(mac/ios)
    • 相关文章
    • 在python语言中Flask框架的学习及简单功能示例(0个评论)
    • 在Python语言中实现GUI全屏倒计时代码示例(0个评论)
    • Python + zipfile库实现zip文件解压自动化脚本示例(0个评论)
    • python爬虫BeautifulSoup快速抓取网站图片(1个评论)
    • vscode 配置 python3开发环境的方法(0个评论)
    • 近期文章
    • 智能合约Solidity学习CryptoZombie第四课:僵尸作战系统(0个评论)
    • 智能合约Solidity学习CryptoZombie第三课:组建僵尸军队(高级Solidity理论)(0个评论)
    • 智能合约Solidity学习CryptoZombie第二课:让你的僵尸猎食(0个评论)
    • 智能合约Solidity学习CryptoZombie第一课:生成一只你的僵尸(0个评论)
    • 在go中实现一个常用的先进先出的缓存淘汰算法示例代码(0个评论)
    • 在go+gin中使用"github.com/skip2/go-qrcode"实现url转二维码功能(0个评论)
    • 在go语言中使用api.geonames.org接口实现根据国际邮政编码获取地址信息功能(1个评论)
    • 在go语言中使用github.com/signintech/gopdf实现生成pdf分页文件功能(0个评论)
    • gmail发邮件报错:534 5.7.9 Application-specific password required...解决方案(0个评论)
    • 欧盟关于强迫劳动的规定的官方举报渠道及官方举报网站(0个评论)
    • 近期评论
    • 122 在

      学历:一种延缓就业设计,生活需求下的权衡之选中评论 工作几年后,报名考研了,到现在还没认真学习备考,迷茫中。作为一名北漂互联网打工人..
    • 123 在

      Clash for Windows作者删库跑路了,github已404中评论 按理说只要你在国内,所有的流量进出都在监控范围内,不管你怎么隐藏也没用,想搞你分..
    • 原梓番博客 在

      在Laravel框架中使用模型Model分表最简单的方法中评论 好久好久都没看友情链接申请了,今天刚看,已经添加。..
    • 博主 在

      佛跳墙vpn软件不会用?上不了网?佛跳墙vpn常见问题以及解决办法中评论 @1111老铁这个不行了,可以看看近期评论的其他文章..
    • 1111 在

      佛跳墙vpn软件不会用?上不了网?佛跳墙vpn常见问题以及解决办法中评论 网站不能打开,博主百忙中能否发个APP下载链接,佛跳墙或极光..
    • 2016-10
    • 2016-11
    • 2018-04
    • 2020-03
    • 2020-04
    • 2020-05
    • 2020-06
    • 2022-01
    • 2023-07
    • 2023-10
    Top

    Copyright·© 2019 侯体宗版权所有· 粤ICP备20027696号 PHP交流群

    侯体宗的博客