目录
效果展示:
这几天在看短视频获取营养的时候,刷到了一个转盘游戏视频。于是心血来潮想自己使用pygame来实现一个转盘(这下只全部尽在我手,你们可别说我开挂了哈)。
效果展示:
转盘转啊转
功能展示与设计思路:
我们主要是会有两个展示的页面,一个是我们进去之后有一只可爱的小兔兔,这个时候我们没有展示出来我们的转盘。如下:
要做出这个样子,学过pygame的使用的都知道这个很容易就能做到。下面我简单的说说settings.py文件中的参数设置:
#settings.py文件下
class settings:
"""参数设置"""
def __init__(self):
self.screen_size=(610,610) #屏幕大小
self.screen_color=(186, 145, 151) #背景色
self.line_color=(0,0,0) #线条颜色
self.line_width=2 #线条粗细
self.begin_time=0.03 #开始转动停留时间
self.end_time=0.5 #减速后最后的速度大小
self.turn_color='orange' #转盘转动是跳动的方块的颜色
self.turn_number=2 #至少转动2圈
self.gameState=False #游戏刚开始进行的状态,刚进入,默认不转动
#转盘框架
self.begin_line = [ [5, 5], [5, 5],[605,5], [5,605], [5,205], [105,205], [5, 305], [505, 205],[5, 505],[5, 405], [505,405], [205,205], [305,205], [405,205], [205,505], [305,505], [405,505] ] #画线条的起点
self.end_line = [ [5,605], [605,5],[605,605], [605,605], [605,205], [105,605], [605, 305], [505,605], [605,505], [105,405], [605,405], [205, 305],[305,305],[405,305], [205, 605],[305,605],[405,605] ] #终点
self.words_position=[ [55, 252], [155, 252], [255, 252], [355, 252], [455, 252], [555, 252], [555, 352], [555, 452], [555, 552], [455, 552], [355, 552], [255, 552], [155, 552], [55, 552], [55, 452], [55, 352]] #渲染奖品文字的位置
self.msgs=['大米', 'ipadmini', '米桶', '羊毛毯', '食用油', 'IPHONE6', '纸巾一条', '电饭煲', '保温杯', '养生枕头', '豆浆机', '毛绒被', '四件套', '50元话费', '20元', '水杯'] #所有奖品,保证只有16个
#颜色填充顶点
self.peak_position=[ [5, 205],[105, 205],[205, 205],[305, 205],[405, 205],[505, 205], [505, 305], [505, 405],[505, 505], [405, 505], [305, 505], [205, 505], [105, 505], [5, 505], [5, 405], [5, 305] ] #跳动的方块的绘制的位置
#mander_select.py文件里
class Random_select:
"""随机选取"""
def __init__(self):
pygame.init()
pygame.mixer.init()
self.settings = settings()
self.screen=pygame.display.set_mode(self.settings.screen_size) #创建屏幕
pygame.display.set_caption('HELP SELECT')
通过set_mode即可得到一个独立的窗口, 接着就只要我们的图片渲染到屏幕上就好了。
#mander_select.py文件里
self.homePageImage=pygame.image.load('figure/TheFirstFigure.png').convert()
self.homePageImage_rect=self.homePageImage.get_rect()
self.homePageImage_rect.x=0
self.homePageImage_rect.y=0
接着就是我们点击空格键后转到其它页面去, 这里呢,我们设置一个记录游戏状态的变量
self.gameState = self.settings.gameState # 游戏活动状态
通过这个参数,当gameState=False,时我们展示开始界面, 当gameState=True时,我们展示转盘界面。当转盘停下后,将gameState赋值为False,界面就会跳转到开始界面,达到界面的跳转。
#游戏是没有开始的状态
if self.gameState==False:
self.screen.blit(self.homePageImage, self.homePageImage_rect)
pygame.display.update()
continue
通过continue来跳过展示转盘的代码。实现不展示。
当我们点击空格键后,就会启动我们的幸运转转盘,即会出现下面的界面。
通过randint(a,b)我们可以得到一个让橙色方块跳动的次数,这样我们就可以得到一个随机的奖品。设置好开始和结束的速度(settings.py里)。这里建议一开始每个位置方块停留的时间一样,后面我们再设置变速。通过for循环,我们方块每跳动一次就让他停留0.5秒(sleep函数实现),跳到我们规定的步数后结束跳动。
def update_screen(self, curtime):
self.turns[curtime].display() #展示颜色
for word in self.words:
word.display()
pygame.display.update()
self.curTime += 1 #每跳动一次后,跳动次数+1
self.sleeptime +=self.increment #实现变速,跳动一次后,停留的时间增加一定量
sleep(self.sleeptime)
if self.curTime>=self.sumTime: #超过规定步数,结束跳动
print(self.settings.msgs[(self.curTime - 1) % 16])
self.gameover.display()
gameOver = Word(self.screen, self.settings.msgs[(self.curTime-1) % 16], 50, (60, 0, 0), (305, 405), 0) #绘制奖品到中间区域
gameOver.display()
pygame.display.update()
sleep(3)
self.initialize() #重新初始化一些参数,为下次转动做好准备
我们在设计每个黄色方块的展示的时候,每个每个位置的停留时间都是不一样的,速度由快到慢,作出自然停下的感觉。 最后停下后,会在中间展示出本次抽到的奖品,停留几秒后,回到我们的第一张图片,按空格键后会继续再循环。奖品展示如图:
做到这个就比较简单了,只需要在中间区域内重新绘制一下需要的东西就好了。
(下面有完整代码,也可以评论或者私信小编获取源代码实现人身气运自由哟)
以上两只卡哇伊兔兔的图片素材均来自通过百度得到,如有侵权,请联系删除。
完整代码:
class settings:
"""参数设置"""
def __init__(self):
self.screen_size=(610,610) #屏幕大小
self.screen_color=(186, 145, 151) #屏幕背景色
self.line_color=(0,0,0) #线条的颜色
self.line_width=2 #线条的粗细
self.begin_time=0.03 #开始转动停留时间
self.end_time=0.5 #停止跳动时的速度
self.turn_color='orange' #跳动的方块的颜色
self.turn_number=2 #至少转动一圈
self.gameState=False #游戏刚开始进行的状态
#绘制转盘框架时,线条的终点和起点
self.begin_line = [ [5, 5], [5, 5],[605,5], [5,605], [5,205], [105,205], [5, 305], [505, 205],[5, 505],[5, 405], [505,405], [205,205], [305,205], [405,205], [205,505], [305,505], [405,505] ]
self.end_line = [ [5,605], [605,5],[605,605], [605,605], [605,205], [105,605], [605, 305], [505,605], [605,505], [105,405], [605,405], [205, 305],[305,305],[405,305], [205, 605],[305,605],[405,605] ]
#转盘框架中那些文字的位置
self.words_position=[ [55, 252], [155, 252], [255, 252], [355, 252], [455, 252], [555, 252], [555, 352], [555, 452], [555, 552], [455, 552], [355, 552], [255, 552], [155, 552], [55, 552], [55, 452], [55, 352]]
self.msgs=['大米', 'ipadmini', '米桶', '羊毛毯', '食用油', 'IPHONE6', '纸巾一条', '电饭煲', '保温杯', '养生枕头', '豆浆机', '毛绒被', '四件套', '50元话费', '20元', '水杯']
#跳动的方块顶点,拿来填充颜色
self.peak_position=[ [5, 205],[105, 205],[205, 205],[305, 205],[405, 205],[505, 205], [505, 305], [505, 405],[505, 505], [405, 505], [305, 505], [205, 505], [105, 505], [5, 505], [5, 405], [5, 305] ]
import pygame
from time import sleep
from settings import settings
import sys
from word import Word
from turn import Turn
from random import randint
from gameOver import GameOver
class Random_select:
"""随机选取"""
def __init__(self):
pygame.init()
pygame.mixer.init() #播放音乐必须的
self.settings = settings() # 设置好的参数
self.screen=pygame.display.set_mode(self.settings.screen_size) #创建屏幕
pygame.display.set_caption('HELP SELECT') #标题
self.screen_rect = self.screen.get_rect() #获取屏幕参数
self.clock=pygame.time.Clock() #大时钟
self.initialize() #初始化一些参数,具体见下面的
#导入钱兔无量图片
self.image = pygame.image.load('figure/QianTu.png').convert()
self.image_rect = self.image.get_rect() #获取图片外接矩形
# 确定放置的位置
self.image_rect.x=0
self.image_rect.y=0
#导入首页图片
self.homePageImage=pygame.image.load('figure/TheFirstFigure.png').convert()
self.homePageImage_rect=self.homePageImage.get_rect()
self.homePageImage_rect.x=0
self.homePageImage_rect.y=0
# 背景音乐
pygame.mixer.music.load('figure/music.mp3')
pygame.mixer.music.play()
pygame.mixer.music.fadeout(2) #结尾最后2秒声音淡出
self.words=[] #记录所有需要渲染到界面的文字
new_word=Word(self.screen, '幸运转转盘', 80, (60, 0, 0), (305, 102), 1) #渲染屏幕, 文字内容, 字号大小, 字体颜色, 放置位置, 背景是否需要透明化
self.words.append(new_word)
#文案部分
#TheSecondWord=Word(self.screen, '转啊转 转啊转', 48, (60, 0, 0), (305, 405), 1)
#self.words.append(TheSecondWord)
#将我们所有需要渲染到屏幕的文字都记录下,这里是16个奖品的文字
for index in range(1,17):
msg=self.settings.msgs[index-1]
new_word= Word(self.screen, msg, 20, (60, 0, 0), self.settings.words_position[index-1], 1)
self.words.append(new_word)
# 滚动颜色填充
self.turns = [] #记录每个奖品文字位置的橙色方块,在需要的时候选择性调用展示
for pos in self.settings.peak_position: #提前在settings里面存储的计算好的位置
new_turn = Turn(self.screen, pos)
self.turns.append(new_turn)
#游戏结束,展示结果
self.gameover=GameOver(self.screen)
def initialize(self): #初始化参数
self.gameState = self.settings.gameState # 游戏活动状态
self.sumTime = randint(0, 15) + self.settings.turn_number * 16 # *16可以设置至少方块要转self.settings.turn_number圈
self.increment = (self.settings.end_time - self.settings.begin_time) / (self.sumTime + 1) #方块每跳动一次,需要停留的时间会增加,达到慢慢停下来的效果, 这个参数是每次的增量
self.curTime = 0 # 当前该显示的方块
self.sleeptime = self.settings.begin_time #初始第一次的停留时间
def run(self):
while True: #游戏主循环
self.clock.tick(60) #60帧的刷新率
if not pygame.mixer.music.get_busy(): #歌曲结束后再接着循环下去
pygame.mixer.music.play()
for event in pygame.event.get(): #监测时间
if event.type==pygame.QUIT: #关闭
print(self.settings.msgs[self.curTime%16])
sys.exit() #退出软件
#转盘没转的时候,按下空格键或者q键,转盘启动
elif self.gameState==False and event.type==pygame.KEYUP and (event.key==pygame.K_SPACE or event.key == pygame.K_q): #按下空格开始
self.gameState = True
#游戏是没有开始的状态
if self.gameState==False:
self.screen.blit(self.homePageImage, self.homePageImage_rect) #绘制图片
pygame.display.update() #展示图片
continue #跳过下面的,只展示没开始时的样子
if self.curTime>=self.sumTime: #方块跳过的步数大于了总步数,应该停下来了
print(self.settings.msgs[(self.curTime - 1) % 16])
self.gameover.display() #展示结束时抽到的奖励
gameOver = Word(self.screen, self.settings.msgs[(self.curTime-1) % 16], 50, (60, 0, 0), (305, 405), 0)
gameOver.display()
pygame.display.update()
sleep(3) #睡眠3秒后回到主界面
self.initialize()
self.check_event() #对时间作出反映
self.update_screen(self.curTime%16) #更新屏幕
def check_event(self):
#self.screen.fill(self.settings.screen_color) #背景色
self.screen.blit(self.image, self.image_rect) #绘制背景图片
for index in range(0,len(self.settings.begin_line)): #划线, 画出框架
pygame.draw.line(self.screen, self.settings.line_color, self.settings.begin_line[index],self.settings.end_line[index],self.settings.line_width)
def update_screen(self, curtime):
self.turns[curtime].display() #展示颜色
for word in self.words: #渲染文字
word.display()
pygame.display.update()
self.curTime += 1 #当前步数+1
self.sleeptime +=self.increment #停留时间增加
sleep(self.sleeptime)
if __name__=='__main__':
Myselect=Random_select()
Myselect.run()
import pygame
from settings import settings
class Word:
"""渲染文字的"""
def __init__(self, screen, word, size, word_color, position, state): #屏幕,文字, 字号, 颜色, 位置,背景是否透明化
self.screen=screen
self.settings=settings()
self.msg = word
# 渲染文字到游戏主界面上
self.font = pygame.font.SysFont('SimSun', size)
if state==1: #透明
self.image = self.font.render(self.msg, True, word_color, None)
else: #不透明
self.image = self.font.render(self.msg, True, word_color,self.settings.screen_color)
self.rect = self.image.get_rect() #获取外界矩形
self.rect.center=position #确定绘制的位置
def display(self):
self.screen.blit(self.image, self.rect) #渲染文字到屏幕上
import pygame
from settings import settings
class GameOver:
"""完一局, 绘制中间的背景"""
def __init__(self, screen): #屏幕,文字, 字号, 颜色, 位置
self.screen=screen
self.settings=settings()
self.bg_rect=pygame.Rect(107, 307, 396, 196) #
def display(self):
pygame.draw.rect(self.screen,self.settings.screen_color, self.bg_rect)
import pygame
from time import sleep
from settings import settings
class Turn:
"""转盘转动"""
def __init__(self, screen, position):
self.settings=settings()
self.screen=screen
self.color=self.settings.turn_color
self.rect=pygame.Rect(position[0]+1, position[1]+1, 98, 98)
def display(self):
pygame.draw.rect(self.screen, self.color, self.rect,0)