iis服务器助手广告广告
返回顶部
首页 > 资讯 > 后端开发 > Python >利用python实现flappy bird 游戏(完整代码)
  • 136
分享到

利用python实现flappy bird 游戏(完整代码)

2024-04-02 19:04:59 136人浏览 独家记忆

Python 官方文档:入门教程 => 点击学习

摘要

第一个python文件,flappybirdmain.py ,程序中已经有详细注释.。 程序大概流程:1.加载图片素材文件 2.绘画开始界面,等待程序开始(按空格) 3 .程序刷新,

第一个python文件,flappybirdmain.py ,程序中已经有详细注释.。

程序大概流程:1.加载图片素材文件 2.绘画开始界面,等待程序开始(按空格) 3 .程序刷新,不断while 循环(a.随机生成柱子,并移动,然后绘制 b.小鸟自下落 c.检测键盘方向按键) 4.程序结束,绘制结束界面,把分数记录到txt文件


# -*- coding: utf-8 -*-
"""
Created on Thu Dec 15 00:27:17 2016
BY LINJUNJI SYSU 1360622136@qq.com
"""
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 -*-
"""
Created on Thu Dec 15 00:27:17 2016

@author: LINJUNJI 
"""
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 游戏的文章就介绍到这了,更多相关Python flappy bird 游戏内容请搜索编程网以前的文章或继续浏览下面的相关文章希望大家以后多多支持编程网!

--结束END--

本文标题: 利用python实现flappy bird 游戏(完整代码)

本文链接: https://www.lsjlt.com/news/156264.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • 利用python实现flappy bird 游戏(完整代码)
    第一个python文件,flappybirdmain.py ,程序中已经有详细注释.。 程序大概流程:1.加载图片素材文件 2.绘画开始界面,等待程序开始(按空格) 3 .程序刷新,...
    99+
    2024-04-02
  • 怎么用python实现flappy bird游戏
    本篇内容介绍了“怎么用python实现flappy bird游戏”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!程序大概流程:1.加载图片素材...
    99+
    2023-06-25
  • 基于JS实现Flappy Bird游戏的示例代码
    前言 Flappy Bird 是一款无尽的游戏,玩家可以控制一只鸟。玩家必须保护小鸟免于与管道等障碍物相撞。每次小鸟通过管道时,分数都会增加一。当小鸟与管道碰撞或因重力而坠落时,游戏...
    99+
    2024-04-02
  • python flappy bird小游戏分步实现流程
    目录导语:开发工具:环境搭建运行视频:正文:计分表结尾:导语: 哈喽,哈喽~今天小编又来分享小游戏了——flappy bird(飞扬的小鸟),这个游戏非常的经...
    99+
    2024-04-02
  • python怎么实现flappy bird小游戏
    本篇内容介绍了“python怎么实现flappy bird小游戏”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!开发工具:Pytho...
    99+
    2023-06-29
  • VUE实现一个Flappy Bird游戏的示例代码
    Flappy Bird是一个非常简单的小游戏,在app上大家都玩过。这里就用VUE来实现一个简单的PC版Flappy Bird,娱乐一下~~~~~ 要实现这个游戏,首先来分析一下游戏...
    99+
    2024-04-02
  • 利用Jetpack Compose复刻游戏Flappy Bird
    目录1.拆解游戏2.复刻画面ⅰ.布置远近景ⅱ.摆放管道ⅲ.放置小鸟3.状态管理和架构4.路面动起来5.管道动起来6.小鸟飞起来7.碰撞和实时分值8.结束分值和重新开始9.最终效果Fl...
    99+
    2024-04-02
  • 基于JS怎么实现Flappy Bird游戏
    本文小编为大家详细介绍“基于JS怎么实现Flappy Bird游戏”,内容详细,步骤清晰,细节处理妥当,希望这篇“基于JS怎么实现Flappy Bird游戏”文章能帮助大家解决疑惑,下面跟着小编的思路慢慢深入,一起来学习...
    99+
    2023-06-30
  • Python实战:运用Pygame编写Flappy bird小游戏,我能玩一天
    首先下载Python中Pygame的模块可以在Windows下的CMD中使用pip下载pip install pygame有的小伙伴安装的时候报错,那么你可以从官网下载Pygame然后解压进入网址https://www.lfd.uci.ed...
    99+
    2023-06-02
  • Python3+Pygame实现射击游戏完整代码
    目录一、游戏特点二、运行效果展示三、完整代码四、运行方式之前看到过很多人写的飞机大战,当然了之前我也写过多个版本,总体来说功能是实现了,但总感觉不够“炫” 今天浏览Python资料的...
    99+
    2024-04-02
  • 利用python实现你说我猜游戏的完整实例
    目录前言一、游戏规则二、实现过程1、基本框架2、完整案例 三、总结前言 五一参加python技能书的答疑,发现题目中的逻辑存在问题,对应的你说我猜游戏里面的都是恒相等的。就...
    99+
    2024-04-02
  • C语言实现三子棋游戏含完整代码
    目录一、text.c源文件部分1、main函数部分2、game函数部分二、game.h头文件部分三、game.c源文件部分运行 三子棋是大家小时候和同桌在纸上都玩过的简单小游戏,这个...
    99+
    2024-04-02
  • C语言实现扫雷小游戏完整算法详解(附完整代码)
    目录前言1.算法基本思路2.算法详解1.初始化数组与打印数组2.设置雷3.排查与标记4.CountMine函数计算周围雷的个数 5.ExpandMine函数递归展开周围所有...
    99+
    2024-04-02
  • C语言实现飞机大战小游戏完整代码
     大一课设做的飞机大战,可以进行登入和注册,这个是利用单链表做的,源代码已经给出,这个是最基本的飞机大战模式,我设置了几个功能,比如排行榜之类的。排行榜是用结构体数组做的,...
    99+
    2024-04-02
  • python小游戏实现代码
    早上逛CSDN首页就见到这么一篇教程。看了一下很有意思,就马上动手实现了一下。看看效果吧: 完整代码: # -*- coding: utf-8 -*- # 1 - Import library import pygame from ...
    99+
    2023-01-31
    小游戏 代码 python
  • Java实现俄罗斯方块小游戏。(附完整源代码)
    大家好,我是百思不得小赵。 创作时间:2022 年 5 月 12 日 博客主页: 🔍点此进入博客主页 —— 新时代的农民工 🙊 —— 换一种思维逻辑去看待这个世界 👀 今天是加入CSDN...
    99+
    2023-09-02
    java 开发语言 经验分享
  • 用C语言完整实现2048游戏
    目录前言一、游戏思路二、游戏框架 1.菜单界面2.游戏主体1.初始化界面:2.随机生成初始数字3.实现移动4.增加新数字5.判定胜负6.游戏函数三、游戏运行四、所有代码总结 前言 游...
    99+
    2024-04-02
  • Python编写简易猜数字小游戏(附完整代码)
    Python编写简易猜数字小游戏(附完整代码) 猜数字游戏是一款非常经典的小游戏,本文将介绍如何使用Python编写一个简易的猜数字游戏,并提供完整的源代码。 首先,让我们了解一下游戏规则。游戏开始时...
    99+
    2023-09-23
    python java 开发语言
  • Java实现飞机大战游戏 附完整源码
    目录飞机大战详细文档实现效果:结构设计详细分析Main界面类使用边框布局,给面板分三个区,如图所示绘制背景地图飞行道具类UML图绘制线程: 如何让我们的游戏动起来背景的绘制我的飞机的...
    99+
    2024-04-02
  • Python完整实现俄罗斯方块游戏全解
    目录1俄罗斯方块游戏2Python代码实现 2.1展现2.2Python代码1 俄罗斯方块游戏 《俄罗斯方块》原本是前苏联科学家阿列克谢·帕基特诺夫所开发的教...
    99+
    2024-04-02
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作