python实现flappy bird小游戏

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

flappygamemain.py

# -*- coding: utf-8 -*-
from __future__ import unicode_literals
"""
Created on Dec 25 2016
@author: LINJUNJI
@mail: ljj6@mail2.sysu.edu.cn
"""
import pygame
from sys import exit
import random
from pygame.locals import *
from pygame.font import *
from gamerole import *
import os
import datetime
import numpy as np
import 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=False
score=0
flag=1

def 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: ljj6@mail2.sysu.edu.cn
"""

import pygame
import random

SCREEN_WIDTH =384
SCREEN_HEIGHT=448
INTERVEL=120  #两个障碍之间的间隔
UP_LIMIT=60
DOWN_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游戏

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

(0)

相关推荐

  • python实现简单flappy bird

    本文实例为大家分享了python实现flappy bird的简单代码,供大家参考,具体内容如下 import pygame from pygame.locals import * from sys import exit import random # 屏幕宽度 SCREENWIDTH = 288 # 屏幕高度 SCREENHEIGHT = 512 IMAGES = {} # 背景图片地址 BACKGROUND_PATH = 'back_ground.png' PIPE_PATH = 'pipe

  • python实现Flappy Bird源码

    Flappy Bird是前段时间(好像一年or两年前....)特别火的有一个小游戏,相信大家都玩过. Flappy Bird操作简单,通过点击手机屏幕使Bird上升,穿过柱状障碍物之后得分,碰到则游戏结束.由于障碍物高低不等,控制Bird上升和下降需要反应快并且灵活,要得到较高的分数并不容易.作为一个游戏渣,我最高纪录是8分...... 我记得当时还想,是谁发明了这个小游戏,逼死强迫症,记得当时本科时好多人在玩.... 无意间在GitHub上看到了python实现的代码,所以拿来学习了一番.代码

  • python实现flappy bird游戏

    flappy bird最近火遍大江南北,教你用python写游戏的第一课就向它开刀了. 这个课程的基础是假定你有比较不错的编程功底,对python有一点点的基础. 一.准备工作 1.用python写游戏需要什么呢? 1)当然是python本身了,我用的是python2.7,不同版本大同小异. 2)pygame,这个非常重要,所有的核心都是基于这个lib的. 2.分析游戏 flappy bird这个游戏很简单,大致可以分为4个部分: 1)背景.背景分为两个,一个是bg,一个是land.bg就是那张

  • python实现flappy bird小游戏

    本文实例为大家分享了python实现flappy bird游戏的具体代码,供大家参考,具体内容如下 flappygamemain.py # -*- coding: utf-8 -*- from __future__ import unicode_literals """ Created on Dec 25 2016 @author: LINJUNJI @mail: ljj6@mail2.sysu.edu.cn """ import pygame

  • python flappy bird小游戏分步实现流程

    目录 导语: 开发工具: 环境搭建 运行视频: 正文: 计分表 结尾: 导语: 哈喽,哈喽~今天小编又来分享小游戏了——flappy bird(飞扬的小鸟),这个游戏非常的经典,游戏中玩家必须控制一只小鸟,跨越由各种不同长度水管所组成的障碍.这个游戏能对于小编来说还是有点难度的. 开发工具: Python版本:3.6.4 相关模块: pygame模块: 以及一些python自带的模块. 环境搭建 安装Python并添加到环境变量,pip安装需要的相关模块即可. 运行视频: 播放链接:https:

  • 纯JavaScript 实现flappy bird小游戏实例代码

    前言: <flappy bird>是一款由来自越南的独立游戏开发者Dong Nguyen所开发的作品,游戏于2013年5月24日上线,并在2014年2月突然暴红.2014年2月,<Flappy Bird>被开发者本人从苹果及谷歌应用商店撤下.2014年8月份正式回归APP STORE,正式加入Flappy迷们期待已久的多人对战模式.游戏中玩家必须控制一只小鸟,跨越由各种不同长度水管所组成的障碍. 正文: 接下来就是一步一步来实现它 步骤1:页面布局,这儿就不多说了,页面内容如下:

  • C语言实现Flappy Bird小游戏

    本文实例为大家分享了C语言实现Flappy Bird小游戏的具体代码,供大家参考,具体内容如下 #include<stdio.h> #include<stdlib.h> #include<conio.h> #include<time.h> #include<Windows.h> /********函数变量声明********/ #define PR_Box printf("■") #define PR_Gold printf(

  • 使用pygame编写Flappy bird小游戏

    0. 最终效果: 1. 搭建一个最小框架 1.1 需要的函数 初始化所有导入的pygame模块. pygame.init() 生成一个窗口.返回的是一个surface对象.通过resolution设置窗口大小,flags代表扩展选项,depth代表设置颜色,但不建议设置. pygame.display.set_mode((resolution =(0,0),flags = 0,depth = 0)) 设置窗口标题. pygame.display.set_caption("Flappy bird_

  • C语言简易版flappy bird小游戏

    假期在家无聊,想随便码点东西,故有此简陋的小游戏诞生.觉着可能对初学C语言的小伙伴练习有点帮助,故写此博客.游戏界面如下: 首先,先画出整个小游戏实现的流程图,如下: 思路很简单,整个游戏界面是由一个大的char类型数组构成,更新数组的值然后不停的打印出来就形成了动态效果. 由上图看,大循环是保证游戏一直不断的进行下去,小循环是让小鸟的速度大于游戏界面里背景(由#构成的柱子)的速度(小鸟动四下柱子才动一下). 下面是具体代码(水平有限大家多多见谅,但是效果还是有的!) Bird.c文件 #inc

  • java实现flappy Bird小游戏

    本文实例为大家分享了java实现flappy Bird游戏的具体代码,供大家参考,具体内容如下 整个游戏由3个类构成.Bird类,Pipe类,stage类 第一步:首先写一个Bird类 //鸟类 public class Bird { private int flyHeight;//飞行高度 private int xpos;//距离y轴(窗口左边缘)的位置, public static int Up=1;//向上飞 public static int Down=-1;//向下飞 public

  • 原生js实现Flappy Bird小游戏

    这是一个特别简单的用原生js实现的一个小鸟游戏,比较简单,适合新手练习. html结构 <div id="game"> <div id="bird"></div> </div> css样式 #game { width: 800px; height: 600px; border: 1px solid #000; background: url(images/sky.png); overflow: hidden; posi

  • JavaScript实现Fly Bird小游戏

    本教程为大家分享了Fly Bird小游戏的制作流程,供大家参考,具体内容如下 1.分析页面结构,理清需求和功能 游戏有三个界面,分别是开始界面,游戏界面和游戏结束界面. 1.1 开始界面 start.gif 游戏的大背景 上下移动的游戏标题和翅膀摆动的小鸟 start 按钮,点击进入游戏界面 一直移动的地面 1.2 游戏界面 play.gif 显示越过障碍数量的计分器 移动的障碍物,分别是上管道和下管道 点击游戏界面,小鸟向上飞起,然后在重力作用下下坠, 当小鸟和管道碰撞后,结束界面弹出,同时小

随机推荐