欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

python的一个小游戏

程序员文章站 2022-03-26 21:19:10
最近前言游戏规则素材代码最后前言因为python没学完的我在爬虫领域停了蛮久,所以最近都在学小甲鱼的python啦,所以在学习过程中,和小污龟一起敲出了一个小游戏,小球碰撞!游戏规则1.开始先使劲摩擦(建议摩擦下面部分),让小球变为可控的绿色小球2.在获取可移动的绿色小球时,可以开始移动他3.在指定的位置按下空格,如果对齐,就播放对齐的声音4.当全部对齐游戏胜利,播放音效注意.游戏在发生碰撞的时候是会变回黑色小球的,音效代表时间,我的游戏背景音效是2分钟,难道适中素材如果有想去看看代码的...

前言

因为python没学完的我在爬虫领域停了蛮久,所以最近都在学小甲鱼的python啦,所以在学习过程中,和小污龟一起敲出了一个小游戏,小球碰撞!

游戏规则

1.开始先使劲摩擦(建议摩擦下面部分),让小球变为可控的绿色小球
2.在获取可移动的绿色小球时,可以开始移动他
3.在指定的位置按下空格,如果对齐,就播放对齐的声音
4.当全部对齐游戏胜利,播放音效
注意.游戏在发生碰撞的时候是会变回黑色小球的,音效代表时间,我的游戏背景音效是2分钟,难道适中

素材

如果有想去看看代码的实现可以用此素材
python的一个小游戏
贴合本代码的3.png
python的一个小游戏
贴合本代码的5.png
python的一个小游戏
贴合本代码的4.png
python的一个小游戏
贴合本代码的1.png

推荐(主题音乐方面我喜欢听,个人建议):MELANCHOLY

其他的素材可以根据喜好定制

代码

代码注释很多,不懂的可以多看注释,最好去看小甲鱼的python视频,一步一步的跟着学,我在这里推荐小甲鱼的python视频链接:https://www.bilibili.com/video/BV1Fs411A7HZ

import pygame
import sys
from pygame.locals import *
from random import *

#创建类
class Ball(pygame.sprite.Sprite):
    def __init__(self,image_1,image_5,position,speed,bg_size,target):
        pygame.sprite.Sprite.__init__(self)
        #加速,2个小球,因为尺寸一样所以只用一个尺寸就ok了
        self.image_1 = pygame.image.load(image_1).convert_alpha()
        self.image_5 = pygame.image.load(image_5).convert_alpha()
        #定义球的尺寸
        self.rect =self.image_1.get_rect()
        #尺寸传给这个position
        self.rect.left,self.rect.top = position
        self.speed = speed
        self.width,self.height = bg_size[0],bg_size[1]
        #水平和垂直方向,随机为1或-1
        self.side =[choice([-1,1]),choice([-1,1])]
        #判断是否发生碰撞才修改
        self.collide = False
        # 移动
        self.target = target
        #True表示玩家控制状态,False表示没有控制
        self.control =False

    def move(self):
        #判断是否为玩家控制
        if self.control:
            self.rect = self.rect.move(self.speed)
        else:
            self.rect=self.rect.move((self.side[0]*self.speed[0],\
                                      self.side[1]*self.speed[1]))

        if self.rect.right <= 0:
            #当图片的右边超出界面的左边的时候,就以他之前的宽度的距离移动,回到那个位置
            self.rect.left = self.width
            #当图片的左边超出界面的右边
        elif self.rect.left >= self.width:
            self.rect.right = 0

        #从下往上坠

        elif self.rect.bottom <= 0:
            self.rect.top = self.height

        #从上往下坠

        elif self.rect.top >= self.height:
            self.rect.bottom = 0

    def check(self,motion):
        #target到target+5之间
        if self.target <motion <self.target+5:
            return True
        else:
            return False

class Glass(pygame.sprite.Sprite):
    def __init__(self,glass_image,mouse_image,bg_size):
        #初始化动画精灵
        pygame.sprite.Sprite.__init__(self)
        #传入图片
        self.glass_image = pygame.image.load(glass_image)
        #获得矩形位置
        self.glass_rect = self.glass_image.get_rect()
        self.glass_rect.left,self.glass_rect.top = (bg_size[0]-self.glass_rect.width)//2,\
                                                    bg_size[1]-self.glass_rect.height
        #框
        self.mouse_image = pygame.image.load(mouse_image)
        #在当前位置矩形
        self.mouse_rect = self.mouse_image.get_rect()
        self.mouse_rect.left,self.mouse_rect.top = \
                            self.glass_rect.left,self.glass_rect.top

        # 鼠标不可见
        pygame.mouse.set_visible(False)

#主函数
def main():
    pygame.init()
    pygame.mixer.init()
    mouse_image="E:\\python题\\4.png"
    glass_image="E:\\python题\\2.png"
    #打开
    pygame.mixer.music.load("E:\\python题\\网易云音乐\\1297742167.mp3")
    #音量
    pygame.mixer.music.set_volume(1)
    pygame.mixer.music.play()
    #添加音效
    loser_sound=pygame.mixer.Sound("E:\\123.wav")
    winner_sound= pygame.mixer.Sound("E:\\python题\\7.wav")
    laugh_sound = pygame.mixer.Sound("E:\\python题\\9.wav")
    hole_soind= pygame.mixer.Sound("E:\\python题\\6.wav")
    #当背景音乐播放完时,游戏结束,失败了
    GAMEOVER=USEREVENT
    pygame.mixer.music.set_endevent(GAMEOVER)

    #传入素材
    bg_image="E:\\python题\\3.png"
    ball_image_1="E:\\python题\\1.png"
    ball_image_5="E:\\python题\\5.png"

    running=True
    #画布大小,宽和长
    bg_size=width,height=1024,681
    screen=pygame.display.set_mode(bg_size)
    #标题
    pygame.display.set_caption("第一个小游戏")
    #背景写入
    background=pygame.image.load(bg_image).convert_alpha()
    #小球进入位置
    hole=[(117,119,199,201),(225,227,390,392),(503,505,320,322),(698,700,192,194),(906,908,419,421)]
    #后面打印的列表
    msgs=[]
    #保存位置
    balls=[]
    #碰撞函数
    group=pygame.sprite.Group()
    #创建五个球
    for i in range(5):
        #球的尺寸
        position = randint(0,width-100),randint(0,height-100)
        #速度x轴到y
        speed=[randint(1,10),randint(1,10)]
        #图片,尺寸,速度
        ball = Ball(ball_image_1,ball_image_5,position,speed,bg_size,5*(i+1))
        #判断是否有小球碰撞
        while pygame.sprite.spritecollide(ball,group,False):
            ball.rect.left,ball.rect.top = randint(0,width-100),randint(0,height-100)
        balls.append(ball)
        group.add(ball)

    #调用鼠标函数
    glass=Glass(glass_image,mouse_image,bg_size)

    #记录鼠标
    motion = 0

    #计时器
    MYTIMER=USEREVENT +1
    pygame.time.set_timer(MYTIMER,1*1000)

    pygame.key.set_repeat(100,100)

    clock=pygame.time.Clock()

    while running:
        for event in pygame.event.get():
            #退出
            if event.type ==QUIT:
                pygame.quit()
                sys.exit()

            elif event.type == GAMEOVER and  hole:
                #播放失败的声音
                loser_sound.play()
                running=False
            #如果产生了事件
            elif event.type == MYTIMER:
                if motion:
                    for each in group:
                        #判断事件产生是否相同,相同就让他停止下来
                        if each.check(motion):
                            each.speed = [0,0]
                            each.control=True
                    motion = 0

            elif event.type ==MOUSEMOTION:
                #只要鼠标移动就加1
                motion+=1

            elif event.type == KEYDOWN:
                #向上的时候
                if event.key == K_w:
                    for each in group:
                        #是否变绿色了
                        if each.control:
                            each.speed[1]-=1
                if event.key == K_s:
                    for each in group:
                        # 是否变绿色了
                        if each.control:
                            each.speed[1] += 1
                if event.key == K_a:
                    for each in group:
                        # 是否变绿色了
                        if each.control:
                            each.speed[0] -= 1
                if event.key == K_d:
                    for each in group:
                        # 是否变绿色了
                        if each.control:
                            each.speed[0] += 1
                #判断小球是否在指定位置按下空格
                if event.key == K_SPACE:
                    for each in group:
                        #判断小球有没有被控制
                        if each.control:
                            #判断是否在位置之间
                            for i in hole:
                                if i[0] <= each.rect.left <= i[1]and\
                                   i[2] <= each.rect.top <=i[3]:
                                    #打开音乐
                                    hole_soind.play()
                                    #让他停止
                                    each.speed=[0,0]
                                    #移除小球
                                    group.remove(each)
                                    #显示在最低边
                                    temp = balls.pop(balls.index(each))
                                    balls.insert(0,temp)
                                    #去掉黑洞
                                    hole.remove(i)
                            #所有的黑洞都没了
                            if not hole:
                                #所有的音乐停止
                                pygame.mixer.music.stop()
                                #胜利的音乐
                                winner_sound.play()
                                pygame.time.delay(3000)
                                #导入图片
                                msg = pygame.image.load("E:\\python题\\8.png").convert_alpha()
                                #打印位置
                                msg_pos =(width-msg.get_width())//2,\
                                         (height-msg.get_height())//2
                                msgs.append((msg,msg_pos))
                                laugh_sound.play()



        #载入背景
        screen.blit(background,(0,0))
        #载入框
        screen.blit(glass.glass_image,glass.glass_rect)
        pygame.mouse.get_pos()
        #跟着鼠标移动
        glass.mouse_rect.left,glass.mouse_rect.top = pygame.mouse.get_pos()


        #当鼠标的光标移动到框的左边界时
        if glass.mouse_rect.left < glass.glass_rect.left:
            glass.mouse_rect.left=glass.glass_rect.left
        #当鼠标的光标移动到右边界时,刚好是等于,大于就要矫正
        if glass.mouse_rect.right > glass.glass_rect.right:
            glass.mouse_rect.right = glass.glass_rect.right
        #当鼠标上面小于画布就矫正
        if glass.mouse_rect.top <glass.glass_rect.top:
            glass.mouse_rect.top = glass.glass_rect.top
        if glass.mouse_rect.top >glass.glass_rect.bottom - glass.mouse_rect.height:
            glass.mouse_rect.top = glass.glass_rect.bottom - glass.mouse_rect.height

        screen.blit(glass.mouse_image,glass.mouse_rect)



        for each in balls:
            each.move()
            if each.collide:
                #如果发生碰撞,就随机反弹
               each.speed = [randint(1, 10), randint(1, 10)]
               each.collide = False
            #如果为真,即换绿色
            if each.control:
            #图片和位置
                screen.blit(each.image_5,each.rect)
            else:
                screen.blit(each.image_1,each.rect)
        for each in group:
            #检测
            group.remove(each)
            #如果发生碰撞
            if pygame.sprite.spritecollide(each,group,False):
                #随机速度
                each.side[0]=-each.side[0]
                each.side[1]=-each.side[1]
                #检测到碰撞
                each.collide = True
                #这时是玩家控制的,所以要判断方向
                if each.control:
                    #此时这2个数是碰撞相反方向移动
                    each.side[0]=-1
                    each.side[1]=-1
                   #当小球发生碰撞变回黑色小球
                    each.control = False
            #放回去元素
            group.add(each)

        for msg in msgs:
            screen.blit(msg[0],msg[1])

        pygame.display.flip()
        #速度
        clock.tick(30)


#测试
if __name__ == "__main__":
    main()

最后

有些地方是需要很好的理解的,如果不太好理解可以试着画图(一步一步来),坚持就是胜利,我相信看到这里的朋友一定能成功!

完成游戏的截图
python的一个小游戏
偷偷得意(我只用了一分钟)嘿嘿嘿…

本文地址:https://blog.csdn.net/weixin_45859193/article/details/107606220