python——小游戏(ball,bird)

发布时间 2023-12-13 12:45:17作者: 奇诺qwq

 

 

ball

 

# -*- coding: utf-8 -*-
"""
Created on Wed Dec 13 09:19:38 2023

@author: kabuqinuo
"""

import sys    # 导入sys模块
import pygame   # 导入pygame模块

pygame.init()     # 初始化pygame
size = width, height = 640, 480   # 设置窗口
screen  = pygame.display.set_mode(size)   # 显示窗口
color = (0, 0, 0)   # 设置颜色

ball = pygame.image.load("ball1.png")  #加载图片
ballrect = ball.get_rect()    # 获取矩形区域

speed = [5, 5]     # 设置移动的X轴、Y轴距离
clock = pygame.time.Clock()     # 设置时钟
# 执行死循环,确保窗口一直显示
while True:
    clock.tick(60)    # 每秒执行60次
    # 检查事件
    for event in pygame.event.get():
        if event.type == pygame.QUIT:     # 如果单击关闭窗口,则退出
            sys.exit()
    ballrect = ballrect.move(speed)    # 移动小球
    # 碰到左右边缘
    if ballrect.left < 0 or ballrect.right > width:
        speed[0] = -speed[0]
    # 碰到上下边缘
    if ballrect.top < 0 or ballrect.bottom > height:
        speed[1] = -speed[1]
    screen.fill(color)     # 用指定的颜色填充整个窗口
    screen.blit(ball, ballrect)     # 将图片画到窗口上
    screen.blit(ball, ballrect)     # 将图片画到窗口上
    pygame.display.flip()    # 更新全部显示
pygame.quit()      # 退出pygame

 

 

 bird

背景

 

小鸟

 

 

 

 

# -*- coding: utf-8 -*-
"""
Created on Wed Dec 13 08:39:08 2023

@author: kabuqinuo
"""
""""1. 游戏简介
Flappy Bird是一款鸟类飞行游戏,由越南河内独立游戏开发者阮哈东(DongNguyen)开发。在Flappy Bird这款游戏中,玩家只需要用一根手指来操控,单击触摸手机屏幕,小鸟就会往上飞,不断地单击就会不断地往高处飞。放松手指,则会快速下降。所以玩家要控制小鸟一直向前飞行,然后注意躲避途中高低不平的管子。如果小鸟碰到了障碍物,游戏就会结束。每当小鸟飞过一组管道,玩家就会获得一分。
2. 游戏分析
在Flappy Bird中,主要有两个对象:小鸟和管道。可以创建Bird类和Pineline类来分别表示这两个对象。小鸟可以通过上下移动来躲避管道,所以在Bird类中创建一个birdUpdate()方法,实现小鸟的上下移动。为了体现小鸟向前飞行的特征,可以让管道一直向左侧移动,这样在窗口中就好像小鸟在向前飞行。所以,在Pineline类中也创建了一个updatePipline()方法,实现管道的向左移动。此外,还创建了3个函数:createMap()函数用于绘制地图;checkDead()函数用于判断小鸟的生命状态;getResult()函数用于获取最终分数。最后在主逻辑中实例化类并调用相关方法,实现相应功能。
3. 搭建主框架
通过前面分析,我们可以搭建起Flappy Bird游戏的主框架。Flappy Bird游戏有两个对象:小鸟和管道。先来创建这两个类,类中的具体方法可以先使用pass语句替代。然后创建一个绘制地图的函数createMap()。最后,在主逻辑中绘制背景图片。
"""
import pygame
from pygame.locals import *
import random as rd
import sys
import copy
 
path="D:\\Ptycode\\class ex\\classtest\\game\\"
COUNTDOWN=USEREVENT+1
NEWTUBE=USEREVENT+2
 
class Game:
    def __init__(self):
        pygame.init()
        self.W,self.H=500,700
        self.screen=pygame.display.set_mode((self.W,self.H))
        pygame.display.set_caption("FlappyBird Classic")
        pygame.display.set_icon(pygame.image.load(path+"assets1.png"))
 
        self.bg=pygame.transform.smoothscale(pygame.image.load(path+"assets_background.png"),(self.W,self.H))
        self.player=Player()
        self.tubes=[]
        self.tubeWidth=45
        self.counter=0
        self.toUpdate=2
        self.tubeSpeed=2
        self.state="countdown"
        self.countdown=3
        self.score=0
        pygame.time.set_timer(COUNTDOWN,1000)
    
    def listen(self):
        for event in pygame.event.get():
            if event.type==QUIT:
                sys.exit()
            if event.type==KEYDOWN:
                if event.key==K_SPACE and self.state=="play":
                    self.player.jump()
            if event.type==COUNTDOWN:
                self.countdown-=1
                if self.countdown<=0:
                    self.state="play"
                    pygame.time.set_timer(COUNTDOWN,0)
                    pygame.time.set_timer(NEWTUBE,2200)
            if event.type==NEWTUBE:
                self.newTube()
 
    def draw(self):
        self.screen.blit(self.bg,(0,0))
        if self.state=="lose":
            t=self.print_text("simhei",128,str(self.score),(255,0,0))
            tr=t.get_rect()
            tr.center=self.W/2,self.H/2
            self.screen.blit(t,tr)
        if self.state=="play":
            self.player.update()
        self.screen.blit(self.player.image,self.player.rect)
        if self.state=="play":
            self.updateTube()
            for tube in self.tubes:
                x,y=tube[0],tube[1]
                height=tube[2]
                rect=pygame.draw.rect(self.screen,(0,255,0),(x,y,self.tubeWidth,height))
                if self.player.rect.colliderect(rect):
                    self.state="lose"
                    while self.player.rect.top<self.H:
                        self.screen.blit(self.bg,(0,0))
                        self.player.update()
                        self.screen.blit(self.player.image,self.player.rect)
                        pygame.display.update()
                    return
            t=self.print_text("simhei",35,str(self.score),(255,0,0))
            self.screen.blit(t,(25,25))
            self.check()
        if self.state=="countdown":
            t=self.print_text("simhei",72,str(self.countdown),(255,0,0))
            tr=t.get_rect()
            tr.center=self.W/2,self.H/2
            self.screen.blit(t,tr)
 
    def check(self):
        if self.player.rect.bottom>=self.H or self.player.rect.top<=0:
            self.state="lose"
            while self.player.rect.top<self.H:
                self.screen.blit(self.bg,(0,0))
                self.player.update()
                self.screen.blit(self.player.image,self.player.rect)
                pygame.display.update()
 
    def updateTube(self):
        self.counter+=1
        if self.counter>=self.toUpdate:
            for i,tube in enumerate(self.tubes):
                tube[0]-=self.tubeSpeed
            self.counter=0
            for i,tube in enumerate(copy.copy(self.tubes)):
                if tube[0]+self.tubeWidth<=0:
                    self.tubes.pop(i)
                    if tube[1]<1:
                        self.score+=1
                    break
 
    def run(self):
        while True:
            self.listen()
            self.draw()
            pygame.display.update()
 
    @staticmethod
    def print_text(name,size,text,color):
        font=pygame.font.SysFont(name,size)
        image=font.render(text,True,color)
        return image
 
    def newTube(self):
        spacing=200
        t1h=rd.randint(50,self.H-spacing)
        t2h=self.H-spacing-t1h
        self.tubes.append([self.W,0,t1h])
        self.tubes.append([self.W,t1h+spacing,t2h])
  

class Player:
    def __init__(self):
        self.images=[pygame.image.load(path+"assets1.png"),
                     pygame.image.load(path+"assets2.png"),
                     pygame.image.load(path+"assets3.png")]
        self.item=0
        self.image=self.images[self.item]
        self.rect=self.image.get_rect()
        try:
            self.rect.center=90,game.H/2
        except NameError:
            self.rect.center=90,800/2
        self.fallSpeed=0
        self.counter=0
        self.toUpdate=4
 
    def jump(self):
        self.fallSpeed=-10
 
    def fall(self):
        self.rect.y+=self.fallSpeed
        self.fallSpeed+=1
 
    def change(self):
        self.item+=1
        if self.item>2:
            self.item=0
        self.image=self.images[self.item]
 
    def update(self):
        self.counter+=1
        if self.counter>=self.toUpdate:
            self.fall()
            self.change()
            self.counter=0

 
if __name__ == '__main__':
    game=Game()
    game.run()