目錄
- 一、先搭個架子
- (一)黏貼背景圖:
- (二)增加中間的圈圈
- (三)讓大轉盤自己動起來
- 二、再加個指針,幸運的小指針
- 三、增加隨時數(shù)算法,實現(xiàn)隨機事件
- 四、增加開始函數(shù)
- 五、增加結束函數(shù)
- 六、最終完整效果及代碼
- 七、尾聲
繼續(xù)分享pygame有趣的技術知識,歡迎往下看。
一、先搭個架子
(一)黏貼背景圖:
實現(xiàn)代碼如下:
import pygame
pygame.init() # 初始化pygame類
screen = pygame.display.set_mode((600, 600)) # 設置窗口大小
pygame.display.set_caption('幸運大轉盤') # 設置窗口標題
tick = pygame.time.Clock()
fps = 10 # 設置刷新率,數(shù)字越大刷新率越高
# 方法一
# bg = pygame.image.load("./幸運大轉盤.png").convert()
# 方法二
picture = pygame.transform.scale(pygame.image.load("./幸運大轉盤.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)) # 設置背景為白色
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ù):圓心的坐標
- raduis 表示圓的半徑
- width參數(shù):表示繪制圓的線的寬度,當為0時,圓內(nèi)全部被填充
效果圖:
相關代碼如下:
import pygame
pygame.init() # 初始化pygame類
screen = pygame.display.set_mode((600, 600)) # 設置窗口大小
pygame.display.set_caption('幸運大轉盤') # 設置窗口標題
tick = pygame.time.Clock()
fps = 10 # 設置刷新率,數(shù)字越大刷新率越高
# 方法一
# bg = pygame.image.load("./幸運大轉盤.png").convert()
# 方法二
picture = pygame.transform.scale(pygame.image.load("./幸運大轉盤.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)) # 設置背景為白色
screen.blit(bg, (0, 0))
pygame.draw.circle(screen,(255,255,0),(300,300),50)
tick.tick(fps)
pygame.display.flip() # 刷新窗口
(三)讓大轉盤自己動起來
核心代碼:
newbg = pygame.transform.rotate(bg, angle)
newRect = newbg.get_rect(center=(300,300))
angle -= 1
screen.blit(newbg, newRect)
運行效果:
相關代碼如下:
import pygame
pygame.init() # 初始化pygame類
screen = pygame.display.set_mode((600, 600)) # 設置窗口大小
pygame.display.set_caption('幸運大轉盤') # 設置窗口標題
tick = pygame.time.Clock()
fps = 10 # 設置刷新率,數(shù)字越大刷新率越高
# 方法一
# bg = pygame.image.load("./幸運大轉盤.png").convert()
# 方法二
picture = pygame.transform.scale(pygame.image.load("./幸運大轉盤.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)) # 設置背景為白色
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() # 刷新窗口
二、再加個指針,幸運的小指針
(一)小指針不動,轉盤動
運行效果:
相關代碼如下:
import pygame
pygame.init() # 初始化pygame類
screen = pygame.display.set_mode((600, 600)) # 設置窗口大小
pygame.display.set_caption('幸運大轉盤') # 設置窗口標題
tick = pygame.time.Clock()
fps = 10 # 設置刷新率,數(shù)字越大刷新率越高
picture = pygame.transform.scale(pygame.image.load("./幸運大轉盤.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() # 刷新窗口
(二)轉盤不動,小指針動
思路:轉盤指針的框的中心點按照圓的軌跡進行移動,然后在移動的過程中同步旋轉對應的角度,這樣就整個指針一方面移動,一方面轉動。實現(xiàn)了自然的按照中心旋轉的效果了。
1、先自己畫指針矩形框的中心點移動
代碼如下:
import pygame,sys
import math
pygame.init() # 初始化pygame類
screen = pygame.display.set_mode((600, 600)) # 設置窗口大小
pygame.display.set_caption('幸運大轉盤') # 設置窗口標題
tick = pygame.time.Clock()
fps = 100 # 設置刷新率,數(shù)字越大刷新率越高
picture = pygame.transform.scale(pygame.image.load("./幸運大轉盤.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、增加指針轉動(不完善的版本)
代碼如下:
import pygame,sys
import math
pygame.init() # 初始化pygame類
screen = pygame.display.set_mode((600, 600)) # 設置窗口大小
pygame.display.set_caption('幸運大轉盤') # 設置窗口標題
tick = pygame.time.Clock()
fps = 100 # 設置刷新率,數(shù)字越大刷新率越高
picture = pygame.transform.scale(pygame.image.load("./幸運大轉盤.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、增加指針轉動(修正版)
發(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))
對應的運行效果如下:
想運行快點的話,就把angle的參數(shù)變大就好。
完整代碼如下:
import pygame
import math
pygame.init() # 初始化pygame類
screen = pygame.display.set_mode((600, 600)) # 設置窗口大小
pygame.display.set_caption('幸運大轉盤') # 設置窗口標題
tick = pygame.time.Clock()
fps = 10 # 設置刷新率,數(shù)字越大刷新率越高
picture = pygame.transform.scale(pygame.image.load("./幸運大轉盤.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)隨機事件
直接借用了這個算法:
輪盤分為三部分: 一等獎, 二等獎和三等獎;
輪盤轉的時候是隨機的,
如果范圍在[0,0.08)之間,代表一等獎,
如果范圍在[0.08,0.3)之間,代表2等獎,
如果范圍在[0.3, 1.0)之間,代表3等獎,
把該算法封裝成函數(shù),相關代碼如下:
rewardDict = {
'一等獎': (0, 0.03),
'二等獎': (0.03, 0.2),
'三等獎': (0.2, 1)
}
def rewardFun():
"""用戶的得獎等級"""
# 生成一個0~1之間的隨機數(shù)
number = random.random()
# 判斷隨機轉盤是幾等獎
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()
五、增加結束函數(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)) # 設置窗口大小
pygame.display.set_caption('幸運大轉盤') # 設置窗口標題
tick = pygame.time.Clock()
fps = 10 # 設置刷新率,數(shù)字越大刷新率越高
picture = pygame.transform.scale(pygame.image.load("./幸運大轉盤.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()
# 判斷隨機轉盤是幾等獎
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)通過在上班過程中抽空寫這些博客,真的很難,碼字不易、輸出不易,且行且珍惜。
里面有很多細節(jié)么有優(yōu)化、自己都發(fā)現(xiàn)很多bug,沒有很多的時間去完善和改進,歡迎各位多多提出寶貴意見。
到此這篇關于pygame可視化幸運大轉盤實現(xiàn)的文章就介紹到這了,更多相關pygame 幸運大轉盤內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!
您可能感興趣的文章:- pygame實現(xiàn)井字棋之第二步邏輯實現(xiàn)
- pygame實現(xiàn)井字棋之第一步繪制九宮格
- pygame多種方式實現(xiàn)屏保操作(自動切換、鼠標切換、鍵盤切換)
- 詳解pygame捕獲鍵盤事件的兩種方式
- python+pygame實現(xiàn)代碼雨(黑客帝國既視感)
- Pygame做一期吃豆子游戲的示例代碼
- Python3+Pygame實現(xiàn)射擊游戲完整代碼
- pygame實現(xiàn)井字棋之第三步邏輯優(yōu)化