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

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

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

文章目录

  • 一、先实现m*n的游戏框框
    • (一)核心函数
    • (二)完整代码
    • (三)运行效果
  • 二、相关资源准备
    • (一)初始化first_image的头像资源
    • (二)初始化金币的图片资源
  • 三、实现豆腐块part类
    • (一)初始化豆腐块的变量
    • (二)金币旋转函数实现
    • (三)重置函数reset实现
    • (四)金币移动到得分函数实现
    • (五)主体run函数实现
    • (六)完整的part类代码
  • 四、主体流程实现
    • (一)初始化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=0j=0while i<m:while j<n:bglist.append((start[0]+i*width,start[1]+j*height,width-1,height-1))j += 1i += 1j = 0return bglist

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

(二)完整代码

import pygame,sysdef 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=0j=0while i<m:while j<n:bglist.append((start[0]+i*width,start[1]+j*height,width-1,height-1))j += 1i += 1j = 0return bglistif __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 = screen1self.font1 = pygame.font.Font(r'C:\Windows\Fonts\simsun.ttc', 32)self.resx = x+20self.resy = y+10self.initx = self.posx = self.rect[0]+self.rect[2]/2self.inity = self.posy = self.rect[1]+self.rect[3]/2self.r = 15self.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 += 1if self.run_flag==7:self.run_flag=0self.times -= 1else: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]/2self.inity = self.posy = self.rect[1]+self.rect[3]/2self.r = 15self.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 = screen1self.font1 = pygame.font.Font(r'C:\Windows\Fonts\simsun.ttc', 32)self.resx = x+20self.resy = y+10self.initx = self.posx = self.rect[0]+self.rect[2]/2self.inity = self.posy = self.rect[1]+self.rect[3]/2self.r = 15self.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 = 4def 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 += 1if self.run_flag==7:self.run_flag=0self.times -= 1else:self.flag = 3def 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]/2self.inity = self.posy = self.rect[1]+self.rect[3]/2self.r = 15self.angle = math.atan2(self.resy-self.posy,self.resx-self.posx)self.fangle = math.degrees(self.angle)

四、主体流程实现

(一)初始化pygame窗口

    pygame.init()screen = pygame.display.set_mode((700,600))# 显示金币皮肤screen1 = pygame.Surface((700,600))pygame.display.set_caption("豆腐块也有春天V1.0")

(二)初始化资源信息

    # 初始化矩形框的信息rectlist = divide((100,50),(600,550),10,10)# 初始化图像信息bglist = init_image()# 初始化金币信息score_list = init_score()# 初始化得分位置信息及得分初始化为0分dirx=400diry=20total = 0

(三)初始化豆腐块

    # 存储豆腐块列表partlist = []for bg in rectlist:partlist.append(Part(bglist,score_list,bg,screen,dirx,diry,screen1))

(四)循环主体函数

    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()  # 获取鼠标位置,鼠标就是需要打击的目标for p1 in partlist:if p1.getrect().collidepoint(pos):if p1.flag == 1:p1.flag = 2breakscreen.fill((0,0,0))screen1.fill((128, 128, 128))screen1.set_colorkey((128, 128, 128))for p1 in partlist:p1.run()if p1.flag==4:total += p1.scorep1.flag = 5display(screen,total,dirx,diry)screen.blit(screen1,(0,0))# for bg in rectlist:#     pygame.draw.rect(screen,(255,0,0),bg)clock.tick(30)pygame.display.flip()

五、完整代码

代码不易,但是还是分享给大家,请大家多多支持!!!

import pygame,sys
import random
import os
import mathclass 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 = screen1self.font1 = pygame.font.Font(r'C:\Windows\Fonts\simsun.ttc', 32)self.resx = x+20self.resy = y+10self.initx = self.posx = self.rect[0]+self.rect[2]/2self.inity = self.posy = self.rect[1]+self.rect[3]/2self.r = 15self.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 = 4def 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 += 1if self.run_flag==7:self.run_flag=0self.times -= 1else:self.flag = 3def 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]/2self.inity = self.posy = self.rect[1]+self.rect[3]/2self.r = 15self.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 bglistdef 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 bglistdef 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))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=0j=0while i<m:while j<n:bglist.append((start[0]+i*width,start[1]+j*height,width-1,height-1))j += 1i += 1j = 0return bglistif __name__ == '__main__':pygame.init()screen = pygame.display.set_mode((700,600))# 显示金币皮肤screen1 = pygame.Surface((700,600))pygame.display.set_caption("豆腐块也有春天V1.0")clock = pygame.time.Clock()# 初始化矩形框的信息rectlist = divide((100,50),(600,550),10,10)# 初始化图像信息bglist = init_image()# 初始化金币信息score_list = init_score()# 初始化得分位置信息及得分初始化为0分dirx=400diry=20total = 0# 存储豆腐块列表partlist = []for bg in rectlist:partlist.append(Part(bglist,score_list,bg,screen,dirx,diry,screen1))# pygame.draw.rect(screen, (255, 0, 0), bg)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()  # 获取鼠标位置,鼠标就是需要打击的目标for p1 in partlist:if p1.getrect().collidepoint(pos):if p1.flag == 1:p1.flag = 2breakscreen.fill((0,0,0))screen1.fill((128, 128, 128))screen1.set_colorkey((128, 128, 128))for p1 in partlist:p1.run()if p1.flag==4:total += p1.scorep1.flag = 5display(screen,total,dirx,diry)screen.blit(screen1,(0,0))clock.tick(30)pygame.display.flip()

六、运行效果

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

  1. [新星计划] Python环境搭建 | 万丈高楼平地起

    [新星计划] Python环境搭建 | 万丈高楼平地起 ● Python解释器 安装 ○ Windows平台 ○ Linux平台 ● pip工具 设置 ○ 方法 1 ○ 方法 2 ○ Windows平 ...

  2. Linux乒乓球游戏,python使用pygame实现笑脸乒乓球弹珠球游戏

    今天我们用python和pygame实现一个乒乓球的小游戏,或者叫弹珠球游戏. 笑脸乒乓球游戏功能介绍 乒乓球游戏功能如下: 乒乓球从屏幕上方落下,用鼠标来移动球拍,使其反弹回去,并获得得分,如果没有 ...

  3. [新星计划] Python smtplib模块 | 轻松学会收发E-mail(电子邮件)

    文章目录 ● 理论知识 ■ smtplib模块作用 ■ 邮件协议 ● 实操步骤 ■ QQ邮箱获取授权码 ■ 代码部分 □ 示例1 □ 示例2 □ 示例3 ■ Foxmail登录 □ 使用POP3协议登 ...

  4. 【Python游戏】基于Python的pygame模块实现的天天酷跑游戏 | 附带源码

    前言 我相信很多小伙伴都玩过的第一个腾讯游戏,那就是天天酷跑,还记得之前为了凑齐钻石买小单车.人物.坐骑,小编可是花费了老长时间去弄这个的!!不过现在的天天酷跑随便冲个钱都能上大几百万分,没有了以前的 ...

  5. 新星计划第一期:如何写作快速涨粉变现

    前言: Hello大家好,我是Dream .作为2023年新星计划Python学习方向导师,今天想和大家一起聊一下关于创作方面的问题. 经常会有朋友问我在CSDN怎样去创作呢,感觉自己总是没有思路,并 ...

  6. 他,连续 3 年担任新星计划导师,这次的内容有点特别

    一.新星计划 新星计划是一个发掘潜力新人.培养优质博主为目标的创作活动,通过为期两周的时间,明白为什么要写博客,写作的意义是什么?制定学习计划,完善Java知识体系. 二.学习计划 创作打卡阶段第1周 ...

  7. 【新星计划回顾】第一篇学习计划-通过变量定义简单批量模拟数据

    最近这段时间非常忙,虽然导师首次参与新星计划活动已经在4月16日圆满结束,早想腾出时间来好好整理活动期间分享的知识点. 非常感谢大家的支持和活动期间的文章输出,导师也是忙里抽空给大家准备分享的内容,也 ...

  8. 新星计划最后一周榜单揭秘

    从5月25日新星计划开赛以来,最终来到了决赛周,按照周榜数据统计了一下上榜的新星参赛选手数据 期待这官方最终榜单的发布,即将有10位新星出道,成为闪耀的明显啦.

  9. python中的pygame弹球游戏代码_使用python和pygame制作挡板弹球游戏

    python是个很有趣的语言,可以在cmd命令窗口运行,还有很多的功能强大的模块. 学了一天pygame,用python和pygame写一个简单的挡板弹球游戏. 2018年6月21日 00:15:21 ...

最新文章

  1. 使用VC++ 显示一首诗歌
  2. PHP下用正则表达式分割preg_split、替换reg_replace、匹配preg_match_all等出现乱码的解决方法...
  3. (二)马尔可夫决策过程
  4. 7005.ADS-B建设和规划情况介绍
  5. 修改了模板文件tpl如何立即生效_Python3操作Office之Word模板技术
  6. PCL——2.kd-tree
  7. RHCE 学习笔记(5)- 本地用户和组的管理
  8. luajit官方性能优化指南和注解
  9. 计算机网络管理员基础知识,计算机网络管理员(基础知识)
  10. 2020最新教师资格证《中学综合素质》必考知识点大全
  11. 动态规划之背包问题——背包三讲(01背包,完全背包,多重背包)
  12. Source Insight4.0的在整个工程中查找内容
  13. js中如何获取font标签中的内容
  14. C51单片机烧录器使用(USB转TTL)
  15. 怎么把桌面计算机放到快速启动栏,快速启动栏,教您电脑快速启动栏不见了
  16. 【Qt学习笔记】包含头文件确报错 does not name a type
  17. 第12章实验1:学生成绩管理系统V5.0(c语言)
  18. 量化指标公式源码_量化指标副图指标 源码 通达信 贴图 无未来
  19. iOS第三方支付——银联支付
  20. VUE项目中CSS设置动态宽度的方法

热门文章

  1. 各浏览器cloneNode方法的部分实现差异
  2. 《三个白痴》经典语录_值得深思。
  3. 实战Quartz的Scheduler
  4. 使用Scratch 3.0制作弹球游戏之弹球
  5. sql语句大全(详细)
  6. 炒股大赛项目中遇到的跨域情况
  7. Autojs4.1.0实战教程---快手极速版领取专属
  8. 杭电acm第2304题答案c语言,【转】杭电ACM试题分类
  9. Kivy Android开发教程之 开始构建 Kivy 跨平台应用程序(环境搭建含程序源码)
  10. 了解“感应雷”危害,针对性防护