资讯专栏INFORMATION COLUMN

Python面向对象练习-通过pygame改良乌龟吃鱼

jk_v1 / 1004人阅读

摘要:先看看最后效果图片的话是从网上小鱼儿那个案例里面拿的,实现的功能如下是通过方向键操作乌龟,进行吃鱼吃鱼的时候根据乌龟的坐标和鱼的进行检测,在碰撞区域则干掉这条鱼背景音乐和吃鱼音乐的播放分数累积鱼的平滑游动控制帧频实现代码导入一些常用的函数乌

先看看最后效果

图片的话是从网上小鱼儿那个案例里面拿的,实现的功能如下:

是通过方向键操作乌龟,进行吃鱼

吃鱼的时候根据乌龟的x,y坐标和鱼的x,y进行检测,在碰撞区域则干掉这条鱼

背景音乐和吃鱼音乐的播放

分数累积

鱼的平滑游动(控制帧频)

实现代码
import random
import pygame
import sys
from pygame.locals import *  #导入一些常用的函数

pygame.init()
screen=pygame.display.set_mode([640,480]) 
pygame.display.set_caption("乌龟吃鱼") #定义窗口的标题为"乌龟吃鱼"
background = pygame.image.load("C:UsersAdministratorDesktopgameimageshaidi.jpg").convert()
fishImg = pygame.image.load("C:UsersAdministratorDesktopgameimagesfish.png").convert_alpha()
wuguiImg = pygame.image.load("C:UsersAdministratorDesktopgameimages	urtle.png").convert_alpha()

#乌龟吃掉小鱼的音乐  mp3格式的不行,wav格式的
eatsound = pygame.mixer.Sound("C:UsersAdministratorDesktopachievement.wav")
#背景音乐
pygame.mixer.music.load("C:UsersAdministratorDesktopgame_music.mp3")
pygame.mixer.music.play(loops=0, start=0.0)
#成绩文字显示
count=0
font =pygame.font.SysFont("arial", 40)
score = font.render("score %d"%count, True, (255, 255, 255))

w_width = wuguiImg.get_width()-5 #得到乌龟图片的宽度,后面留着吃鱼的时候用
w_height = wuguiImg.get_height()-5 #得到乌龟图片的高度

y_width = fishImg.get_width()-5 #得到鱼图片的宽度
y_height = fishImg.get_height()-5 #得到鱼图片的高度

fpsClock=pygame.time.Clock() #创建一个新的Clock对象,可以用来跟踪总共的时间
#乌龟类
class Turtle:
    def __init__(self):
        self.power=100 #体力
        #乌龟坐标
        self.x=random.randint(0,500)
        self.y=random.randint(0,400)
    #乌龟移动的方法:移动方向均随机 第四条
    def move(self,new_x,new_y):
        #判断移动后是否超出边界
        if new_x<0:
            self.x=0-new_x
        elif new_x>640:
            self.x=640-(new_x-640)
        else:
            #不越界则移动乌龟的位置
            self.x=new_x                
        if new_y<0:
            self.y=0-new_y
        elif new_y>480:
            self.y=480-(new_y-480)
        else:
            #不越界则移动乌龟的位置
            self.y=new_y
        self.power-=1 #乌龟每移动一次,体力消耗1           
    def eat(self):
        self.power+=20 #乌龟吃掉鱼,乌龟体力增加20
        if self.power>100:
            self.power=100 #乌龟体力100(上限)
#鱼类
class Fish:
    def __init__(self):
        #鱼坐标
        self.x=random.randint(0,500)
        self.y=random.randint(0,400)             
    def move(self):
        new_x=self.x+random.choice([-10])
        if new_x<0:
            self.x=650
        else:
            self.x=new_x                

#开始测试数据
tur=Turtle() #生成1只乌龟
fish=[] #生成10条鱼
for item in range(10):
    newfish=Fish()
    fish.append(newfish) #把生成的鱼放到鱼缸里

#pygame有一个事件循环,不断检查用户在做什么。事件循环中,如何让循环中断下来(pygame形成的窗口中右边的插号在未定义前是不起作用的)
while True:
    for event in pygame.event.get():
        if event.type==pygame.QUIT:
            sys.exit()
        if event.type == KEYDOWN:   
            #通过上下左右方向键控制乌龟的动向   
            if event.key==pygame.K_LEFT:
                tur.move(tur.x-10,tur.y)
            if event.key==pygame.K_RIGHT:
                tur.move(tur.x+10,tur.y)
            if event.key==pygame.K_UP:
                tur.move(tur.x,tur.y-10)
            if event.key==pygame.K_DOWN:
                tur.move(tur.x,tur.y+10)

    screen.blit(background, (0, 0)) #绘制背景图片
    screen.blit(score,(500,20))#绘制分数
    #绘制鱼
    for item in fish:
        screen.blit(fishImg, (item.x, item.y))
        # pygame.time.delay(100)
        item.move() #鱼移动
    screen.blit(wuguiImg, (tur.x, tur.y)) #绘制乌龟
    #判断游戏是否结束:当乌龟体力值为0(挂掉)或者鱼儿的数量为0游戏结束
    if tur.power<0 or len(fish)==0:
        print("Game Over ~")
        sys.exit()
    for item in fish:
        # print("鱼",item.x,item.y,y_width,y_height)
        # print("乌龟",tur.x,tur.y,w_width,w_height)
        if ((tur.x < item.x + y_width) and (tur.x + w_width > item.x) and (tur.y < item.y + y_height) and (w_height + tur.y > item.y)) :
            tur.eat() #乌龟吃鱼的方法
            fish.remove(item) #鱼死掉
            #吃鱼音乐
            eatsound.play()
            count=count+1 #累加
            score = font.render("score %d"%count, True, (255, 255, 255))
            print("死了一只鱼")
            print("乌龟最新体力值为 %d"%tur.power)

    pygame.display.update() #更新到游戏窗口
    fpsClock.tick(10) #通过每帧调用一次fpsClock.tick(10),这个程序就永远不会以超过每秒10帧的速度运行

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/41206.html

相关文章

  • Python面向对象练习-乌龟吃鱼

    摘要:题目要求首先放上题目要求游戏编程按以下要求定义一个乌龟类和鱼类并尝试编写游戏假设游戏场景为范围为游戏生成只乌龟和条鱼它们的移动方向均随机乌龟的最大移动能力为它可以随机选择还是移动,鱼儿的最大移动能力是当移动到场景边缘,自动向反方向移动乌龟初 题目要求 首先放上题目要求: 游戏编程:按以下要求定义一个乌龟类和鱼类并尝试编写游戏 假设游戏场景为范围(x,y)为0

    刘福 评论0 收藏0
  • python大佬养成计划--面向对象

    摘要:的名字并不是规定死的因为是形参,也可以使用,但是最好还是按照约定是用。类的私有方法两个下划线开头,声明该方法为私有方法,只能在类的内部调用,不能在类地外部调用。。 类 面向对象编程具有三大特性:多态、继承、封装定义:是一个抽象的模板对象:类实例化属性:这个类实例化后的对象具有的特征方法:类对象可以执行的函数 类的定义 class 类名 class People(object): ...

    hzc 评论0 收藏0
  • 不用看网课就能学到python的文章(第五天)

    摘要:类其实就是由属性和方法组成的一个抽象概念。类和对象的关系类是模板,对象是根据类这个模板创建出来的,应该先有类,再有对象。使用同一个类,能够创建出很多对象。不同对象对应的属性值也会不同。 目录 类 对象(实例) 类中的成员 面向对象 变量 类 类是对一群具有相同 特征 或者 行为 的...

    wenzi 评论0 收藏0
  • 你的游戏开发第0课

    摘要:我发现网上的游戏开发教程大多是从某种语言或引擎的开发细节入手,而没有一个提纲挈领式的整体介绍。碰撞检测,以及碰撞后的事件响应。网络请求数据更新同步等,判定游戏得分及胜负。这是游戏开发不可或缺的三个部分。 电子游戏是许多人喜爱甚至沉迷的事情。尤其对于程序员来说,开发游戏是不少人最初学习编程的动力。在之前,我发过一些游戏开发的教程和案例: 爆款游戏《贪吃蛇大作战》的 Python 实现 ...

    williamwen1986 评论0 收藏0
  • Java编程基础10——面向对象_多态&抽象类&接口

    摘要:案例演示抽象类的成员特点抽象类的成员方法特性抽象方法强制要求子类做的事情。抽象类中定义的是该继承体系的共性功能。 1.多态的概述及其成员访问特点代码体现 A:多态(polymorphic)概述 事物存在的多种形态 B:多态前提- 1.要有继承关系 2.要有方法重写 3.要有父类引用指向子类对象。 C:多态中的成员访问特点之 成员变量:编译和运行都看父类。 成员方法:编...

    dunizb 评论0 收藏0

发表评论

0条评论

jk_v1

|高级讲师

TA的文章

阅读更多
最新活动
阅读需要支付1元查看
<