freeBuf
主站

分类

漏洞 工具 极客 Web安全 系统安全 网络安全 无线安全 设备/客户端安全 数据安全 安全管理 企业安全 工控安全

特色

头条 人物志 活动 视频 观点 招聘 报告 资讯 区块链安全 标准与合规 容器安全 公开课

官方公众号企业安全新浪微博

FreeBuf.COM网络安全行业门户,每日发布专业的安全资讯、技术剖析。

FreeBuf+小程序

FreeBuf+小程序

Pygame恐龙跑酷游戏
2024-08-14 11:30:14

在谷歌浏览器里,如果没连接互联网,会弹出提示,提示旁的图标是一个小恐龙,点击小恐龙,就会触发一个小游戏,供人游玩
而今天,我们就要来仿制一款这样的小游戏

在代码开干之前,先感谢我的指导老师

不多说了,直接开干

# 首先先导入我们需要的库
import pygame
from pygame.locals import *
from itertools import cycle
import random

#宏
SCREENWIDTH=800
SCREENHEIGHT=260
FPS=30

class Map():							# 地图类
    def __init__(self,x,y):
        self.bg=pygame.image.load('image/bg.png') # 加载背景图片
        self.x=x
        self.y=y

    def map_rolling(self):				# 背景图片的移动
        if self.x<-790:
            self.x=800
        else:
            self.x-=5
    def map_update(self):				# 更新背景图片
        SCREEN.blit(self.bg,(self.x,self.y))

class Dinosaur():						# 恐龙类
    def __init__(self):
        self.rect=pygame.Rect(0,0,0,0)	# 申请一个图片矩形空间
        self.jumpState=False			# 跳跃判断
        self.jumpHeight=140				# 跳跃高度
        self.lowest_y=140				# 最低高度
        self.jumpValue=0				# 每次跳跃高度
        self.dinosaurIndex=0			# 恐龙图片的索引(因为有多个图片交替显示)
        self.dinosaurIndexGen=cycle([0,1,2]) #遍历索引
        self.dinosaur_image=(				 # 恐龙图片
            pygame.image.load('image/dinosaur1.png'),
            pygame.image.load('image/dinosaur2.png'),
            pygame.image.load('image/dinosaur3.png'),
        )
        self.jump_audio=pygame.mixer.Sound('audio/jump.wav') #跳跃声音
        self.rect.size=self.dinosaur_image[0].get_size()	 #适应恐龙图片大小
        self.x=50
        self.y=self.lowest_y
        self.rect.topleft=(self.x,self.y)

    def jump(self):		#跳跃捕获
        self.jumpState=True

    def move(self):		#恐龙移动
        if self.jumpState:
            if self.rect.y>=self.lowest_y:
                self.jumpValue=-5
            if self.rect.y<=self.lowest_y-self.jumpHeight:
                self.jumpValue=5
            self.rect.y+=self.jumpValue
            if self.rect.y>=self.lowest_y:
                self.jumpState=False
    def draw_dinosaur(self): #恐龙显示
        dinosaurIndex=next(self.dinosaurIndexGen)
        SCREEN.blit(self.dinosaur_image[dinosaurIndex],(self.x,self.rect.y))

class Obstacle():	# 障碍物类
    score=0
    def __init__(self):
        self.rect=pygame.Rect(0,0,0,0)	#申请矩形空间
		
		# 有两种障碍物
        self.stone=pygame.image.load('image/stone.png')
        self.cacti=pygame.image.load('image/cacti.png')
        # 分数记录也在障碍物类里面写了
        self.numbers=(
            pygame.image.load('image/0.png'),
            pygame.image.load('image/1.png'),
            pygame.image.load('image/2.png'),
            pygame.image.load('image/3.png'),
            pygame.image.load('image/4.png'),
            pygame.image.load('image/5.png'),
            pygame.image.load('image/6.png'),
            pygame.image.load('image/7.png'),
            pygame.image.load('image/8.png'),
            pygame.image.load('image/9.png'),
        )
        self.score_audio=pygame.mixer.Sound('audio/score.wav')	# 得分声音
		
		# 障碍物有两种形态,要随机显示
        r=random.randint(0,1)
        if r==0:
            self.image=self.stone
        else:
            self.image=self.cacti
        
        self.rect.size=self.image.get_size()	# 适应障碍物图片的大小
        self.width,self.height=self.rect.size	# 获取图片长宽
        self.x=800
        self.y=200-(self.height/2)
        self.rect.center=(self.x,self.y)

    def obstacle_move(self): #障碍物的移动
        self.rect.x-=5
    def draw_obstacle(self): #障碍物的显示
        SCREEN.blit(self.image,(self.rect.x,self.rect.y))

    def getScore(self):		# 得分
        self.score
        tmp=self.score
        if tmp==1:
            self.score_audio.play()
        self.score=0
        return tmp

    def showScore(self):	# 分数显示
        self.scoreDigits=[int(x) for x in list(str(self.score))]
        totalWidth=0
        for digit in self.scoreDigits:
            totalWidth+=self.numbers[digit].get_width()
        Xoffset=(SCREENWIDTH-totalWidth)/2
        for digit in self.scoreDigits:
            SCREEN.blit(self.numbers[digit],(Xoffset,SCREENHEIGHT*0.1))
            Xoffset+=self.numbers[digit].get_width()
 
def game_over():	# 游戏结束的工作
    bump_audio=pygame.mixer.Sound('audio/bump.wav')	# 加载结束音效
    bump_audio.play()								# 播放结束音效
    screen_w=pygame.display.Info().current_w
    screen_h=pygame.display.Info().current_h

    over_img=pygame.image.load('image/gameover.png')# 加载结束图片
    SCREEN.blit(over_img,((screen_w-over_img.get_width())/2,(screen_h-over_img.get_height())/2)) # 显示结束图片

def mainGame():		# 游戏主程序
    # 设置和导入需要用到的变量
    score=0
    over=False
    global SCREEN,FPSCLOCK
    # 初始化游戏
    pygame.init()
	
	# 设置屏幕更新时间以及设置窗口大小和窗口标题
    FPSCLOCK=pygame.time.Clock()
    SCREEN=pygame.display.set_mode((SCREENWIDTH,SCREENHEIGHT))
    pygame.display.set_caption('小恐龙')
    # 设置两个背景图片的位置,用于循环展示图片
    bg1=Map(0,0)
    bg2=Map(800,0)
    # 恐龙类示例化
    dinosaur=Dinosaur()
    addObstacleTime=0
    list=[]
    while True:
        for event in pygame.event.get(): # 捕捉鼠标信息
            if event.type==QUIT:		# 侦测到要退出
                exit()
            if event.type==KEYDOWN and event.key==K_SPACE: # 按住空格键跳跃
                if dinosaur.rect.y>=dinosaur.lowest_y:
                    dinosaur.jump()
                    dinosaur.jump_audio.play()

        if over==False:
        	# 地图切换
            bg1.map_update()
            bg1.map_rolling()
            bg2.map_update()
            bg2.map_rolling()
            # 恐龙行走
            dinosaur.move()
            dinosaur.draw_dinosaur()
            if addObstacleTime>=1300: # 设置添加障碍物需要等待的时间
                r=random.randint(0,100)
                if r>40: # 类似几率,数字越小生成障碍物的几率越大
                    obstacle=Obstacle()
                    list.append(obstacle)	# 往列表里添加障碍物
                addObstacleTime=0
            for i in range(len(list)): 		# 遍历列表,生成障碍物
                list[i].obstacle_move()
                list[i].draw_obstacle()
                if pygame.sprite.collide_rect(dinosaur,list[i]): # 判断恐龙是否碰到障碍物
                    over=True		# 如果是,执行函数game_over()
                    game_over()
                else:
                    if(list[i].rect.x+list[i].rect.width)<dinosaur.rect.x: # 再次判断,如果真正跳过了障碍物,得分
                        score+=list[i].getScore()
                list[i].showScore() # 显示分数
        addObstacleTime+=20		# 增加毫秒数
        pygame.display.update()	# 窗口更新
        FPSCLOCK.tick(FPS)		# 更新时间
        # if over==True:
            # mainGame()
       # 上面注释语句可写可不写,主要是在游戏结束后能自动重新开始
# 调用 mainGame()函数
if __name__=='__main__':
    mainGame()

(注:此文章是从CSDN搬运而来,CSDN账号:爱电摇的小码农,以后的文章都是从CSDN我的账号上搬运而来)

# python # 游戏 # Python实战
本文为 独立观点,未经允许不得转载,授权请联系FreeBuf客服小蜜蜂,微信:freebee2022
被以下专辑收录,发现更多精彩内容
+ 收入我的专辑
+ 加入我的收藏
相关推荐
  • 0 文章数
  • 0 关注者