【新星计划python赛道】pygame实现翻牌游戏的豆腐块,豆腐块也有春天

pygame实现翻牌游戏的豆腐块,豆腐块也有春天。
大家好,稍微标题党一下下。
其实还是蛮好玩的,这个是个前奏,最近参加了新星计划,玩一下,然后我们的导师@梦想橡皮擦就提到,看能不能把我们赛道的博主的头像整成一个消消乐的翻牌游戏,我觉得挺好玩的,所以也就借这个机会试一把。
嗯,确实挺好玩的。
这个是前奏,先实现一个小小的豆腐块的功能吧

一、先看效果

在这里插入图片描述

二、实现逻辑

每次随机生成一个豆腐块,然后响应鼠标点击动作,然后金币旋转,旋转完之后显示该豆腐块的金钱,然后增加一个金币移动的动图效果,最后计入总得分。如此循环下去。

三、实现过程

(一)初始化first_image的头像资源

def init_image():
    path = './user1/'
    files = []
    dirs = os.listdir(path)
    for diretion in dirs:
        files.append(path + diretion)

    bglist = []
    for file in files:
        picture = pygame.transform.scale(pygame.image.load(file), (50, 50))
        dSurface = picture.convert()
        # dSurface = pygame.image.load(file).convert()
        bglist.append(dSurface)
        # bglist.append(pygame.image.load(file).convert_alpha())

    return bglist

(二)初始化金币的图片资源

def init_score():
    path = './score/'
    files = []
    dirs = os.listdir(path)
    for diretion in dirs:
        files.append(path + diretion)
    bglist = []
    for file in files:
        bglist.append(pygame.image.load(file).convert_alpha())
    return bglist

(三)实现主函数

if __name__ == '__main__':
    pygame.init()
    screen = pygame.display.set_mode((500,500))
    pygame.display.set_caption("豆腐块也有春天V1.0")
    clock = pygame.time.Clock()

    bglist = init_image()
    score_list = init_score()

    p1 = Part(bglist,score_list,(100,100,50,50),screen)

    while True:
        for event in pygame.event.get():
            if event.type == pygame.QUIT or event.type == pygame.K_F1:
                pygame.quit()
                sys.exit()
            if event.type == pygame.MOUSEBUTTONDOWN:
                pos = x, y = pygame.mouse.get_pos()  # 获取鼠标位置,鼠标就是需要打击的目标
                if p1.getrect().collidepoint(pos):
                    if p1.flag==1:
                        p1.flag=2
        screen.fill((0,0,0))
        p1.run()
        clock.tick(30)
        pygame.display.flip()

然后在主函数中增加豆腐块类的对象实现及相关方法的调用。

(四)初始化豆腐块对象

p1 = Part(bglist,score_list,(100,100,50,50),screen)

(五)在循环中调用

p1.run()

四、实现豆腐块part类

(一)初始化豆腐块的变量

        def __init__(self,bglist,scorelist,rect,screen,x,y):
        self.rect = rect  # 用于记录豆腐块的矩形框大小及显示位置(posx,posy,width、height)
        self.flag = 1     # 1、显示初始的头像图;2、显示金币的旋转图;3、显示最终的数字图,并将金币移到结果区
        self.score = random.randint(1, 10)  # 金钱
        self.times = 1   # 金币旋转的循环次数
        self.run_flag = 0   # 记录显示金币的当前页面
        # self.pos = None  # 金币需要移动的位置
        self.scale = 20  # 金币需要移动的位置时显示的大小
        self.firstimage_list = bglist     # 1、显示初始的头像图
        self.firstimage = random.choice(bglist)
        self.scorelist = scorelist # 2、显示金币的旋转图
        self.screen = screen   # 显示屏幕
        self.font1 = pygame.font.Font(r'C:\Windows\Fonts\simsun.ttc', 32)

        self.resx = x+20
        self.resy = y+10
        self.initx = self.posx = self.rect[0]+self.rect[2]/2
        self.inity = self.posy = self.rect[1]+self.rect[3]/2
        self.r = random.randint(5,10)
        self.angle = math.atan2(self.resy-self.posy,self.resx-self.posx)
        self.fangle = math.degrees(self.angle)

(二)金币旋转函数实现

    def score_run(self):
        if self.times>0:
            screen.blit(self.scorelist[self.run_flag], self.rect)
            self.run_flag += 1
            if self.run_flag==7:
                self.run_flag=0
                self.times -= 1
        else:
            self.flag = 3

(三)重置函数reset实现

    def reset(self):
        self.rect = (random.randint(100,400),random.randint(100,400),50,50)  # 用于记录豆腐块的矩形框大小及显示位置(posx,posy,width、height)
        self.flag = 1  # 1、显示初始的头像图;2、显示金币的旋转图;3、显示最终的数字图,并将金币移到结果区
        self.score = random.randint(1, 10)  # 金钱
        self.times = 2  # 金币旋转的循环次数
        self.run_flag = 0  # 记录显示金币的当前页面
        self.pos = None  # 金币需要移动的位置
        self.scale = 20  # 金币需要移动的位置时显示的大小
        self.firstimage = random.choice(bglist)
        self.initx = self.posx = self.rect[0]+self.rect[2]/2
        self.inity = self.posy = self.rect[1]+self.rect[3]/2
        self.r = random.randint(5,10)
        self.angle = math.atan2(self.resy-self.posy,self.resx-self.posx)
        self.fangle = math.degrees(self.angle)

(四)金币移动到得分函数实现

    def move(self):
        if abs(self.posx-self.resx)>=10 or abs(self.posx-self.resx)>=10:
            self.posx += self.r * math.cos(self.angle)
            self.posy +=  self.r * math.sin(self.angle)
            # self.xpos, self.ypos = (self.xpos + section * cosa, self.ypos - section * sina)
            self.newRect = self.scorelist[5].get_rect(center=(self.posx, self.posy))
            self.screen.blit(self.scorelist[5], self.newRect)
        else:
            self.flag = 4

(五)主体run函数实现

    def run(self):
        if self.flag==1:
            self.screen.blit(self.firstimage,self.rect)
        elif self.flag==2:
            self.score_run()
        elif self.flag==3:
            text1 = self.font1.render('%s' % self.score, True, (251,174,63))
            screen.blit(text1, (self.rect[0]+self.rect[2]/2-10,self.rect[1]+self.rect[3]/2-10))
            self.move()
        elif self.flag==4:
            self.reset()

五、完整代码

import pygame,sys
import random
import os
import math

class Part:
    def __init__(self,bglist,scorelist,rect,screen,x,y):
        self.rect = rect  # 用于记录豆腐块的矩形框大小及显示位置(posx,posy,width、height)
        self.flag = 1     # 1、显示初始的头像图;2、显示金币的旋转图;3、显示最终的数字图,并将金币移到结果区
        self.score = random.randint(1, 10)  # 金钱
        self.times = 1   # 金币旋转的循环次数
        self.run_flag = 0   # 记录显示金币的当前页面
        # self.pos = None  # 金币需要移动的位置
        self.scale = 20  # 金币需要移动的位置时显示的大小
        self.firstimage_list = bglist     # 1、显示初始的头像图
        self.firstimage = random.choice(bglist)
        self.scorelist = scorelist # 2、显示金币的旋转图
        self.screen = screen   # 显示屏幕
        self.font1 = pygame.font.Font(r'C:\Windows\Fonts\simsun.ttc', 32)

        self.resx = x+20
        self.resy = y+10
        self.initx = self.posx = self.rect[0]+self.rect[2]/2
        self.inity = self.posy = self.rect[1]+self.rect[3]/2
        self.r = random.randint(5,10)
        self.angle = math.atan2(self.resy-self.posy,self.resx-self.posx)
        self.fangle = math.degrees(self.angle)

    def move(self):
        if abs(self.posx-self.resx)>=10 or abs(self.posx-self.resx)>=10:
            self.posx += self.r * math.cos(self.angle)
            self.posy +=  self.r * math.sin(self.angle)
            # self.xpos, self.ypos = (self.xpos + section * cosa, self.ypos - section * sina)
            self.newRect = self.scorelist[5].get_rect(center=(self.posx, self.posy))
            self.screen.blit(self.scorelist[5], self.newRect)
        else:
            self.flag = 4


    def run(self):
        if self.flag==1:
            self.screen.blit(self.firstimage,self.rect)
        elif self.flag==2:
            self.score_run()
        elif self.flag==3:
            text1 = self.font1.render('%s' % self.score, True, (251,174,63))
            screen.blit(text1, (self.rect[0]+self.rect[2]/2-10,self.rect[1]+self.rect[3]/2-10))
            self.move()
        elif self.flag==4:
            self.reset()
            # if random.randint(0,10)==1:
            #     self.reset()


    def score_run(self):
        if self.times>0:
            screen.blit(self.scorelist[self.run_flag], self.rect)
            self.run_flag += 1
            if self.run_flag==7:
                self.run_flag=0
                self.times -= 1
        else:
            self.flag = 3

    def getrect(self):
        return pygame.Rect(self.rect)

    def reset(self):
        self.rect = (random.randint(100,400),random.randint(100,400),50,50)  # 用于记录豆腐块的矩形框大小及显示位置(posx,posy,width、height)
        self.flag = 1  # 1、显示初始的头像图;2、显示金币的旋转图;3、显示最终的数字图,并将金币移到结果区
        self.score = random.randint(1, 10)  # 金钱
        self.times = 2  # 金币旋转的循环次数
        self.run_flag = 0  # 记录显示金币的当前页面
        self.pos = None  # 金币需要移动的位置
        self.scale = 20  # 金币需要移动的位置时显示的大小
        self.firstimage = random.choice(bglist)
        self.initx = self.posx = self.rect[0]+self.rect[2]/2
        self.inity = self.posy = self.rect[1]+self.rect[3]/2
        self.r = random.randint(5,10)
        self.angle = math.atan2(self.resy-self.posy,self.resx-self.posx)
        self.fangle = math.degrees(self.angle)


def init_image():
    path = './user1/'
    files = []
    dirs = os.listdir(path)
    for diretion in dirs:
        files.append(path + diretion)

    bglist = []
    for file in files:
        picture = pygame.transform.scale(pygame.image.load(file), (50, 50))
        dSurface = picture.convert()
        # dSurface = pygame.image.load(file).convert()
        bglist.append(dSurface)
        # bglist.append(pygame.image.load(file).convert_alpha())

    return bglist

def init_score():
    path = './score/'
    files = []
    dirs = os.listdir(path)
    for diretion in dirs:
        files.append(path + diretion)
    bglist = []
    for file in files:
        picture = pygame.transform.scale(pygame.image.load(file), (50, 50))
        dSurface = picture.convert_alpha()
        bglist.append(dSurface)

    return bglist

def display(screen,total,x,y):
    font1 = pygame.font.Font(r'C:\Windows\Fonts\simsun.ttc', 22)
    text1 = font1.render('得分:%s' % total, True, (255,0,0))
    screen.blit(text1, (x,y))

if __name__ == '__main__':
    pygame.init()
    screen = pygame.display.set_mode((500,500))
    pygame.display.set_caption("豆腐块也有春天V1.0")
    clock = pygame.time.Clock()

    bglist = init_image()
    score_list = init_score()
    dirx=400
    diry=20

    p1 = Part(bglist,score_list,(100,100,50,50),screen,dirx,diry)
    total = 0
    while True:
        for event in pygame.event.get():
            if event.type == pygame.QUIT or event.type == pygame.K_F1:
                pygame.quit()
                sys.exit()
            if event.type == pygame.MOUSEBUTTONDOWN:
                pos = x, y = pygame.mouse.get_pos()  # 获取鼠标位置,鼠标就是需要打击的目标
                if p1.getrect().collidepoint(pos):
                    if p1.flag==1:
                        p1.flag=2
        screen.fill((0,0,0))
        p1.run()
        if p1.flag==4:
            total += p1.score
        display(screen,total,dirx,diry)
        clock.tick(30)
        pygame.display.flip()

六、运行效果

在这里插入图片描述

OK,完成了,挺好玩的,大家有兴趣自己试试吗?

评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值