【新星计划python赛道】pygame让你一步步实现翻牌游戏(金币旋转、大头贴等),打造更有趣的新星之旅
最近参加了新星计划,玩一下,然后我们的导师@梦想橡皮擦就提到,看能不能把我们赛道的博主的头像整成一个消消乐的翻牌游戏,我觉得挺好玩的,所以也就借这个机会试一把。
效果演示一把:
嘻嘻,有兴趣的朋友欢迎往下看。附上源码的哦。
码字不易,且行且珍惜,感谢支持!
文章目录
- 一、先实现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让你一步步实现翻牌游戏(金币旋转、大头贴等),打造更有趣的新星之旅相关推荐
- [新星计划] Python环境搭建 | 万丈高楼平地起
[新星计划] Python环境搭建 | 万丈高楼平地起 ● Python解释器 安装 ○ Windows平台 ○ Linux平台 ● pip工具 设置 ○ 方法 1 ○ 方法 2 ○ Windows平 ...
- Linux乒乓球游戏,python使用pygame实现笑脸乒乓球弹珠球游戏
今天我们用python和pygame实现一个乒乓球的小游戏,或者叫弹珠球游戏. 笑脸乒乓球游戏功能介绍 乒乓球游戏功能如下: 乒乓球从屏幕上方落下,用鼠标来移动球拍,使其反弹回去,并获得得分,如果没有 ...
- [新星计划] Python smtplib模块 | 轻松学会收发E-mail(电子邮件)
文章目录 ● 理论知识 ■ smtplib模块作用 ■ 邮件协议 ● 实操步骤 ■ QQ邮箱获取授权码 ■ 代码部分 □ 示例1 □ 示例2 □ 示例3 ■ Foxmail登录 □ 使用POP3协议登 ...
- 【Python游戏】基于Python的pygame模块实现的天天酷跑游戏 | 附带源码
前言 我相信很多小伙伴都玩过的第一个腾讯游戏,那就是天天酷跑,还记得之前为了凑齐钻石买小单车.人物.坐骑,小编可是花费了老长时间去弄这个的!!不过现在的天天酷跑随便冲个钱都能上大几百万分,没有了以前的 ...
- 新星计划第一期:如何写作快速涨粉变现
前言: Hello大家好,我是Dream .作为2023年新星计划Python学习方向导师,今天想和大家一起聊一下关于创作方面的问题. 经常会有朋友问我在CSDN怎样去创作呢,感觉自己总是没有思路,并 ...
- 他,连续 3 年担任新星计划导师,这次的内容有点特别
一.新星计划 新星计划是一个发掘潜力新人.培养优质博主为目标的创作活动,通过为期两周的时间,明白为什么要写博客,写作的意义是什么?制定学习计划,完善Java知识体系. 二.学习计划 创作打卡阶段第1周 ...
- 【新星计划回顾】第一篇学习计划-通过变量定义简单批量模拟数据
最近这段时间非常忙,虽然导师首次参与新星计划活动已经在4月16日圆满结束,早想腾出时间来好好整理活动期间分享的知识点. 非常感谢大家的支持和活动期间的文章输出,导师也是忙里抽空给大家准备分享的内容,也 ...
- 新星计划最后一周榜单揭秘
从5月25日新星计划开赛以来,最终来到了决赛周,按照周榜数据统计了一下上榜的新星参赛选手数据 期待这官方最终榜单的发布,即将有10位新星出道,成为闪耀的明显啦.
- python中的pygame弹球游戏代码_使用python和pygame制作挡板弹球游戏
python是个很有趣的语言,可以在cmd命令窗口运行,还有很多的功能强大的模块. 学了一天pygame,用python和pygame写一个简单的挡板弹球游戏. 2018年6月21日 00:15:21 ...
最新文章
- 使用VC++ 显示一首诗歌
- PHP下用正则表达式分割preg_split、替换reg_replace、匹配preg_match_all等出现乱码的解决方法...
- (二)马尔可夫决策过程
- 7005.ADS-B建设和规划情况介绍
- 修改了模板文件tpl如何立即生效_Python3操作Office之Word模板技术
- PCL——2.kd-tree
- RHCE 学习笔记(5)- 本地用户和组的管理
- luajit官方性能优化指南和注解
- 计算机网络管理员基础知识,计算机网络管理员(基础知识)
- 2020最新教师资格证《中学综合素质》必考知识点大全
- 动态规划之背包问题——背包三讲(01背包,完全背包,多重背包)
- Source Insight4.0的在整个工程中查找内容
- js中如何获取font标签中的内容
- C51单片机烧录器使用(USB转TTL)
- 怎么把桌面计算机放到快速启动栏,快速启动栏,教您电脑快速启动栏不见了
- 【Qt学习笔记】包含头文件确报错 does not name a type
- 第12章实验1:学生成绩管理系统V5.0(c语言)
- 量化指标公式源码_量化指标副图指标 源码 通达信 贴图 无未来
- iOS第三方支付——银联支付
- VUE项目中CSS设置动态宽度的方法