python的一个小游戏

最近

  • 前言
  • 游戏规则
  • 素材
  • 代码
  • 最后

前言

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

游戏规则

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

素材

如果有想去看看代码的实现可以用此素材
python的一个小游戏_第1张图片
贴合本代码的3.png
在这里插入图片描述
贴合本代码的5.png
在这里插入图片描述
贴合本代码的4.png
在这里插入图片描述
贴合本代码的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的一个小游戏_第2张图片
偷偷得意(我只用了一分钟)嘿嘿嘿…

你可能感兴趣的:(python,游戏,pygame,游戏,pygame,经验分享,其他,程序人生)