新星计划python赛道pygame让你一步步实现翻牌游戏(金币旋转大头贴等),打造更有趣的新星之旅

Posted dhjabc_1

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了新星计划python赛道pygame让你一步步实现翻牌游戏(金币旋转大头贴等),打造更有趣的新星之旅相关的知识,希望对你有一定的参考价值。

最近参加了新星计划,玩一下,然后我们的导师@梦想橡皮擦就提到,看能不能把我们赛道的博主的头像整成一个消消乐的翻牌游戏,我觉得挺好玩的,所以也就借这个机会试一把。
效果演示一把:
在这里插入图片描述

嘻嘻,有兴趣的朋友欢迎往下看。附上源码的哦。

码字不易,且行且珍惜,感谢支持!

一、先实现m*n的游戏框框

(一)核心函数

def divide(start,end,m,n):
    bglist = []
    y = end[1]-start[1]
    x = end[0]-start[0]
    width = int(x/m)
    height = int(y/n)
    i=0
    j=0
    while i<m:
        while j<n:
            bglist.append((start[0]+i*width,start[1]+j*height,width-1,height-1))
            j += 1
        i += 1
        j = 0
    return bglist

start:开始坐标
end:结束坐标
m,n:表示m行n列

(二)完整代码

import pygame,sys

def divide(start,end,m,n):
    bglist = []
    y = end[1]-start[1]
    x = end[0]-start[0]
    width = int(x/m)
    height = int(y/n)
    i=0
    j=0
    while i<m:
        while j<n:
            bglist.append((start[0]+i*width,start[1]+j*height,width-1,height-1))
            j += 1
        i += 1
        j = 0

    return bglist


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

    bglist = divide((0,0),(800,500),10,10)

    while True:
        for event in pygame.event.get():
            if event.type == pygame.QUIT or event.type == pygame.K_F1:
                pygame.quit()
                sys.exit()
        screen.fill((0,0,0))
        for bg in bglist:
            pygame.draw.rect(screen,(255,0,0),bg)
        clock.tick(30)
        pygame.display.flip()

(三)运行效果

初始化一个800X600的窗口,然后分成10X10的格子。
起点(0,0),终点(800,600)
在这里插入图片描述
初始化一个500X500的窗口,然后分成10X10的格子。
起点(0,0),终点(800,600)
在这里插入图片描述
初始化一个800X600的窗口,然后分成10X10的格子。
起点(100,100),终点(700,500)
在这里插入图片描述

二、相关资源准备

(一)初始化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

三、实现豆腐块part类

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

    def __init__(self,bglist,scorelist,rect,screen,x,y,screen1):
        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.screen1 = screen1
        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 = 15
        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

在这里插入图片描述

完整的实现过程可以参看我的另一篇文章《pygame实现简单的金币旋转效果,不到50行代码哦!》

(三)重置函数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 = 15
        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.screen1.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==5:
            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))

在这里插入图片描述

完整的实现过程可以参看我的另一篇文章《【新星计划python赛道】pygame实现翻牌游戏的豆腐块,豆腐块也有春天!》

(六)完整的part类代码

class Part:
    def __init__(self,bglist,scorelist,rect,screen,x,y,screen1):
        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.screen1 = screen1
        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 = 15
        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.screen1.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==5:
            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))
        # 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 = 以上是关于新星计划python赛道pygame让你一步步实现翻牌游戏(金币旋转大头贴等),打造更有趣的新星之旅的主要内容,如果未能解决你的问题,请参考以下文章

新星计划python赛道pygame让你一步步实现翻牌游戏(金币旋转大头贴等),打造更有趣的新星之旅

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

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

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

新星计划·2023-第1期 - Python赛道报名入口 -〖你就是下一个新星〗

〖2023·新星计划·第四季〗开启,Python赛道火爆预热中~ 欢迎小伙伴们报名~