因为python没学完的我在爬虫领域停了蛮久,所以最近都在学小甲鱼的python啦,所以在学习过程中,和小污龟一起敲出了一个小游戏,小球碰撞!
1.开始先使劲摩擦(建议摩擦下面部分),让小球变为可控的绿色小球
2.在获取可移动的绿色小球时,可以开始移动他
3.在指定的位置按下空格,如果对齐,就播放对齐的声音
4.当全部对齐游戏胜利,播放音效
注意.游戏在发生碰撞的时候是会变回黑色小球的,音效代表时间,我的游戏背景音效是2分钟,难道适中
如果有想去看看代码的实现可以用此素材
贴合本代码的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()
有些地方是需要很好的理解的,如果不太好理解可以试着画图(一步一步来),坚持就是胜利,我相信看到这里的朋友一定能成功!