pygame可視化幸運大轉(zhuǎn)盤實現(xiàn)
繼續(xù)分享pygame有趣的技術(shù)知識,歡迎往下看。
一、先搭個架子
(一)黏貼背景圖:
實現(xiàn)代碼如下:
import pygame pygame.init() # 初始化pygame類 screen = pygame.display.set_mode((600, 600)) # 設(shè)置窗口大小 pygame.display.set_caption('幸運大轉(zhuǎn)盤') # 設(shè)置窗口標(biāo)題 tick = pygame.time.Clock() fps = 10 # 設(shè)置刷新率,數(shù)字越大刷新率越高 # 方法一 # bg = pygame.image.load("./幸運大轉(zhuǎn)盤.png").convert() # 方法二 picture = pygame.transform.scale(pygame.image.load("./幸運大轉(zhuǎn)盤.png"), (600, 600)) bg=picture.convert() while True: for event in pygame.event.get(): if event.type == pygame.QUIT: sys.exit() # screen.fill((255, 255, 0)) # 設(shè)置背景為白色 screen.blit(bg, (0, 0)) tick.tick(fps) pygame.display.flip() # 刷新窗口
(二)增加中間的圈圈
核心代碼:
pygame.draw.circle(screen,(255,255,0),(300,300),50)
代碼解釋:
繪制圓形方法:pygame.draw.circle(Surface, color, pos , raduis, width)
其中:
- Surfuce參數(shù): 傳入需要在該Surface對象上繪制圓形的Surface對象
- color參數(shù): 需要繪制圓形的線的顏色,傳入一個rgb三原色元組
- pos參數(shù):圓心的坐標(biāo)
- raduis 表示圓的半徑
- width參數(shù):表示繪制圓的線的寬度,當(dāng)為0時,圓內(nèi)全部被填充
效果圖:
相關(guān)代碼如下:
import pygame pygame.init() # 初始化pygame類 screen = pygame.display.set_mode((600, 600)) # 設(shè)置窗口大小 pygame.display.set_caption('幸運大轉(zhuǎn)盤') # 設(shè)置窗口標(biāo)題 tick = pygame.time.Clock() fps = 10 # 設(shè)置刷新率,數(shù)字越大刷新率越高 # 方法一 # bg = pygame.image.load("./幸運大轉(zhuǎn)盤.png").convert() # 方法二 picture = pygame.transform.scale(pygame.image.load("./幸運大轉(zhuǎn)盤.png"), (600, 600)) bg=picture.convert() while True: for event in pygame.event.get(): if event.type == pygame.QUIT: sys.exit() # screen.fill((255, 255, 0)) # 設(shè)置背景為白色 screen.blit(bg, (0, 0)) pygame.draw.circle(screen,(255,255,0),(300,300),50) tick.tick(fps) pygame.display.flip() # 刷新窗口
(三)讓大轉(zhuǎn)盤自己動起來
核心代碼:
newbg = pygame.transform.rotate(bg, angle) newRect = newbg.get_rect(center=(300,300)) angle -= 1 screen.blit(newbg, newRect)
運行效果:
相關(guān)代碼如下:
import pygame pygame.init() # 初始化pygame類 screen = pygame.display.set_mode((600, 600)) # 設(shè)置窗口大小 pygame.display.set_caption('幸運大轉(zhuǎn)盤') # 設(shè)置窗口標(biāo)題 tick = pygame.time.Clock() fps = 10 # 設(shè)置刷新率,數(shù)字越大刷新率越高 # 方法一 # bg = pygame.image.load("./幸運大轉(zhuǎn)盤.png").convert() # 方法二 picture = pygame.transform.scale(pygame.image.load("./幸運大轉(zhuǎn)盤.png"), (600, 600)) bg=picture.convert() angle = 0 while True: for event in pygame.event.get(): if event.type == pygame.QUIT: sys.exit() # screen.fill((255, 255, 0)) # 設(shè)置背景為白色 newbg = pygame.transform.rotate(bg, angle) newRect = newbg.get_rect(center=(300,300)) angle -= 1 screen.blit(newbg, newRect) # screen.blit(bg, (0, 0)) pygame.draw.circle(screen,(255,255,0),(300,300),50) tick.tick(fps) pygame.display.flip() # 刷新窗口
二、再加個指針,幸運的小指針
(一)小指針不動,轉(zhuǎn)盤動
運行效果:
相關(guān)代碼如下:
import pygame pygame.init() # 初始化pygame類 screen = pygame.display.set_mode((600, 600)) # 設(shè)置窗口大小 pygame.display.set_caption('幸運大轉(zhuǎn)盤') # 設(shè)置窗口標(biāo)題 tick = pygame.time.Clock() fps = 10 # 設(shè)置刷新率,數(shù)字越大刷新率越高 picture = pygame.transform.scale(pygame.image.load("./幸運大轉(zhuǎn)盤.png"), (600, 600)) bg=picture.convert() picture = pygame.transform.scale(pygame.image.load("./hand.png"), (30, 230)) hand = picture.convert_alpha() angle = 0 while True: for event in pygame.event.get(): if event.type == pygame.QUIT: sys.exit() newbg = pygame.transform.rotate(bg, angle) newRect = newbg.get_rect(center=(300,300)) angle -= 1 screen.blit(newbg, newRect) newRect = hand.get_rect(center=(300,150)) screen.blit(hand,newRect) pygame.draw.circle(screen,(255,255,0),(300,300),50) tick.tick(fps) pygame.display.flip() # 刷新窗口
(二)轉(zhuǎn)盤不動,小指針動
思路:轉(zhuǎn)盤指針的框的中心點按照圓的軌跡進(jìn)行移動,然后在移動的過程中同步旋轉(zhuǎn)對應(yīng)的角度,這樣就整個指針一方面移動,一方面轉(zhuǎn)動。實現(xiàn)了自然的按照中心旋轉(zhuǎn)的效果了。
1、先自己畫指針矩形框的中心點移動
代碼如下:
import pygame,sys import math pygame.init() # 初始化pygame類 screen = pygame.display.set_mode((600, 600)) # 設(shè)置窗口大小 pygame.display.set_caption('幸運大轉(zhuǎn)盤') # 設(shè)置窗口標(biāo)題 tick = pygame.time.Clock() fps = 100 # 設(shè)置刷新率,數(shù)字越大刷新率越高 picture = pygame.transform.scale(pygame.image.load("./幸運大轉(zhuǎn)盤.png"), (600, 600)) bg=picture.convert() picture = pygame.transform.scale(pygame.image.load("./hand.png"), (30, 230)) hand = picture.convert_alpha() angle = 0 pos_list = [] while True: posx = 300+int(150*math.sin(135+angle/360)) posy = 300+int(150*math.cos(135+angle/360)) for event in pygame.event.get(): if event.type == pygame.QUIT: sys.exit() screen.blit(bg,(0,0)) pos_list.append((posx,posy)) for pos in pos_list: pygame.draw.circle(screen, (0, 0, 0), pos, 1) angle -= 2 pygame.draw.circle(screen,(255,255,0),(300,300),80) tick.tick(fps) pygame.display.flip() # 刷新窗口
效果如下:
2、增加指針轉(zhuǎn)動(不完善的版本)
代碼如下:
import pygame,sys import math pygame.init() # 初始化pygame類 screen = pygame.display.set_mode((600, 600)) # 設(shè)置窗口大小 pygame.display.set_caption('幸運大轉(zhuǎn)盤') # 設(shè)置窗口標(biāo)題 tick = pygame.time.Clock() fps = 100 # 設(shè)置刷新率,數(shù)字越大刷新率越高 picture = pygame.transform.scale(pygame.image.load("./幸運大轉(zhuǎn)盤.png"), (600, 600)) bg=picture.convert() picture = pygame.transform.scale(pygame.image.load("./hand.png"), (30, 230)) hand = picture.convert_alpha() angle = 0 pos_list = [] while True: posx = 300+int(150*math.sin(135+angle/360)) posy = 300+int(150*math.cos(135+angle/360)) for event in pygame.event.get(): if event.type == pygame.QUIT: sys.exit() screen.blit(bg,(0,0)) pos_list.append((posx,posy)) for pos in pos_list: pygame.draw.circle(screen, (0, 0, 0), pos, 1) newhand = pygame.transform.rotate(hand, angle/6) # old_center = rect.center newRect = newhand.get_rect(center=(posx,posy)) screen.blit(newhand,newRect) pygame.draw.rect(screen, (255,0,0), newRect, 1) # if angle>-10: angle -= 2 print(angle) if angle < -2250: angle = 0 pygame.draw.circle(screen,(255,255,0),(300,300),80) tick.tick(fps) pygame.display.flip() # 刷新窗口
效果如下:
3、增加指針轉(zhuǎn)動(修正版)
發(fā)現(xiàn)原來是math類庫中的sin和cos函數(shù)傳遞的參數(shù)問題。
Math.Sin()里面的是弧度制。 如果是sin(30),就用Math.Sin(Math.PI*30.0/180.0);
因此主要修改的代碼如下:
posx = 300 + int(150 * math.sin(angle * math.pi / 180)) posy = 300 - int(150 * math.cos(angle * math.pi / 180))
對應(yīng)的運行效果如下:
想運行快點的話,就把angle的參數(shù)變大就好。
完整代碼如下:
import pygame import math pygame.init() # 初始化pygame類 screen = pygame.display.set_mode((600, 600)) # 設(shè)置窗口大小 pygame.display.set_caption('幸運大轉(zhuǎn)盤') # 設(shè)置窗口標(biāo)題 tick = pygame.time.Clock() fps = 10 # 設(shè)置刷新率,數(shù)字越大刷新率越高 picture = pygame.transform.scale(pygame.image.load("./幸運大轉(zhuǎn)盤.png"), (600, 600)) bg=picture.convert() picture = pygame.transform.scale(pygame.image.load("./hand.png"), (30, 230)) hand = picture.convert_alpha() angle = 0 while True: posx = 300 + int(150 * math.sin(angle * math.pi / 180)) posy = 300 - int(150 * math.cos(angle * math.pi / 180)) print(posx, posy, math.sin(angle * math.pi / 180)) for event in pygame.event.get(): if event.type == pygame.QUIT: sys.exit() screen.blit(bg,(0,0)) newhand = pygame.transform.rotate(hand, -angle) newRect = newhand.get_rect(center=(posx,posy)) screen.blit(newhand,newRect) angle += 10 pygame.draw.circle(screen,(255,255,0),(300,300),50) tick.tick(fps) pygame.display.flip() # 刷新窗口
三、增加隨時數(shù)算法,實現(xiàn)隨機事件
直接借用了這個算法:
輪盤分為三部分: 一等獎, 二等獎和三等獎;
輪盤轉(zhuǎn)的時候是隨機的,
如果范圍在[0,0.08)之間,代表一等獎,
如果范圍在[0.08,0.3)之間,代表2等獎,
如果范圍在[0.3, 1.0)之間,代表3等獎,
把該算法封裝成函數(shù),相關(guān)代碼如下:
rewardDict = { '一等獎': (0, 0.03), '二等獎': (0.03, 0.2), '三等獎': (0.2, 1) } def rewardFun(): """用戶的得獎等級""" # 生成一個0~1之間的隨機數(shù) number = random.random() # 判斷隨機轉(zhuǎn)盤是幾等獎 for k, v in rewardDict.items(): if v[0] <= number < v[1]: return k
四、增加開始函數(shù)
def start(): while True: for event in pygame.event.get(): # 處理退出事件 if event.type == pygame.QUIT: pygame.quit() sys.exit() elif event.type == pygame.KEYDOWN: if (event.key == pygame.K_ESCAPE): pygame.quit() sys.exit() else: return screen.blit(bg,(0,0)) newRect = hand.get_rect(center=(300,150)) screen.blit(hand,newRect) pygame.draw.circle(screen,(255,255,0),(300,300),50) textFont = pygame.font.Font("./font/font.ttf", 80) textSurface = textFont.render("go", True, (110, 55, 155)) screen.blit(textSurface, (270, 230)) pygame.display.update()
五、增加結(jié)束函數(shù)
def end(k): textFont = pygame.font.Font("./font/font.ttf", 50) textSurface = textFont.render("your awards is :%s" % k, True, (110, 55, 155)) screen.fill((155, 155, 0)) screen.blit(textSurface, (30, 230))
六、最終完整效果及代碼
import pygame,sys import math import random pygame.init() # 初始化pygame類 screen = pygame.display.set_mode((600, 600)) # 設(shè)置窗口大小 pygame.display.set_caption('幸運大轉(zhuǎn)盤') # 設(shè)置窗口標(biāo)題 tick = pygame.time.Clock() fps = 10 # 設(shè)置刷新率,數(shù)字越大刷新率越高 picture = pygame.transform.scale(pygame.image.load("./幸運大轉(zhuǎn)盤.png"), (600, 600)) bg=picture.convert() picture = pygame.transform.scale(pygame.image.load("./hand.png"), (30, 230)) hand = picture.convert_alpha() rewardDict = { 'first level': (0, 0.03), 'second level': (0.03, 0.2), 'third level': (0.2, 1) } def rewardFun(): """用戶的得獎等級""" # 生成一個0~1之間的隨機數(shù) number = random.random() # 判斷隨機轉(zhuǎn)盤是幾等獎 for k, v in rewardDict.items(): if v[0] <= number < v[1]: return k def start(): while True: for event in pygame.event.get(): # 處理退出事件 if event.type == pygame.QUIT: pygame.quit() sys.exit() elif event.type == pygame.KEYDOWN: if (event.key == pygame.K_ESCAPE): pygame.quit() sys.exit() else: return screen.blit(bg,(0,0)) newRect = hand.get_rect(center=(300,150)) screen.blit(hand,newRect) pygame.draw.circle(screen,(255,255,0),(300,300),50) textFont = pygame.font.Font("./font/font.ttf", 80) textSurface = textFont.render("go", True, (110, 55, 155)) screen.blit(textSurface, (270, 230)) pygame.display.update() def middle(): angle = 0 while True: posx = 300 + int(150 * math.sin(angle * math.pi / 180)) posy = 300 - int(150 * math.cos(angle * math.pi / 180)) print(posx, posy, math.sin(angle * math.pi / 180)) for event in pygame.event.get(): if event.type == pygame.QUIT: sys.exit() screen.blit(bg,(0,0)) newhand = pygame.transform.rotate(hand, -angle) newRect = newhand.get_rect(center=(posx,posy)) screen.blit(newhand,newRect) pygame.draw.circle(screen,(255,255,0),(300,300),50) angle += 10 if angle > 500: k = rewardFun() end(k) tick.tick(fps) pygame.display.flip() # 刷新窗口 def end(k): textFont = pygame.font.Font("./font/font.ttf", 50) textSurface = textFont.render("your awards is :%s" % k, True, (110, 55, 155)) screen.fill((155, 155, 0)) screen.blit(textSurface, (30, 230)) if __name__ == '__main__': start() middle()
運行效果如下:
七、尾聲
總算完整寫完了整個案例,發(fā)現(xiàn)通過在上班過程中抽空寫這些博客,真的很難,碼字不易、輸出不易,且行且珍惜。
里面有很多細(xì)節(jié)么有優(yōu)化、自己都發(fā)現(xiàn)很多bug,沒有很多的時間去完善和改進(jìn),歡迎各位多多提出寶貴意見。
到此這篇關(guān)于pygame可視化幸運大轉(zhuǎn)盤實現(xiàn)的文章就介紹到這了,更多相關(guān)pygame 幸運大轉(zhuǎn)盤內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Keras: model實現(xiàn)固定部分layer,訓(xùn)練部分layer操作
這篇文章主要介紹了Keras: model實現(xiàn)固定部分layer,訓(xùn)練部分layer操作,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2020-06-06Python中免驗證跳轉(zhuǎn)到內(nèi)容頁的實例代碼
在本篇文章里小編給大家整理的是一篇關(guān)于Python中免驗證跳轉(zhuǎn)到內(nèi)容頁的實例代碼,有興趣的朋友們可以學(xué)習(xí)分享下。2020-10-10對python中xlsx,csv以及json文件的相互轉(zhuǎn)化方法詳解
今天小編就為大家分享一篇對python中xlsx,csv以及json文件的相互轉(zhuǎn)化方法詳解,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2018-12-12Python雙向循環(huán)鏈表實現(xiàn)方法分析
這篇文章主要介紹了Python雙向循環(huán)鏈表,結(jié)合實例形式分析了Python雙向鏈表的定義、遍歷、添加、刪除、搜索等相關(guān)操作技巧,需要的朋友可以參考下2018-07-07python實現(xiàn)在每個獨立進(jìn)程中運行一個函數(shù)的方法
這篇文章主要介紹了python實現(xiàn)在每個獨立進(jìn)程中運行一個函數(shù)的方法,涉及Python操作進(jìn)程的相關(guān)技巧,需要的朋友可以參考下2015-04-04opencv函數(shù)threshold、adaptiveThreshold、Otsu二值化的實現(xiàn)
這篇文章主要介紹了opencv函數(shù)threshold、adaptiveThreshold、Otsu二值化的實現(xiàn),文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2021-03-03