兔年幸运转转盘,看看你今年过年能赚到啥

目录

效果展示:

功能展示与设计思路:

完整代码:


效果展示:

        这几天在看短视频获取营养的时候,刷到了一个转盘游戏视频。于是心血来潮想自己使用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)

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值