python老鼠過街小遊戲_作者:李興球
"""這是一個多人小遊戲,通過按方向箭頭操作小老鼠闖過街道,作者:李興球,2018/10/1日."""
from turtle import * from random import randint,choice
class Bus(Turtle): """小汽車類,引數說明: images:圖形列表,每輛小汽車例項的造型是隨機選擇的一張圖片 ycor:初始y座標,它的x座標是隨機的一個值 mouses:老鼠列表,每輛小汽車會檢測有沒有碰到每隻老鼠 """ def __init__(self,images,ycor,mouses): Turtle.__init__(self,visible=False) self.up() #擡筆 self.images = images #造型列表 self.shape(choice(images)) #隨機選擇一個,做為初始造型 self.sety(ycor) #初始y座標 self.setx(-self.screen.window_width()//2 - randint(100,300)) self.mouses= mouses self.st() #顯示 self.move() #不斷地移動 def move(self): """本方法讓小汽車不斷地從左到右移動""" self.setx(self.xcor() + 5) x = self.xcor() y = self.ycor() self.left = x - 35 #小汽車的寬度和高度約為70 60 self.right = x + 35 self.top = y + 30 self.bottom = y - 30 if self.left > self.screen.window_width()//2: self.ht() #隱藏 self.shape(choice(self.images)) #換個造型,好像另一輛車一樣 x = -self.screen.window_width()//2 - randint(100,300) self.setx(x) self.st() #顯示 self.pressmouse() #是否壓到了老鼠 self.screen.ontimer(self.move,10) def pressmouse(self): """壓到老鼠了判斷,判斷汽車和老鼠的兩個矩形是否重疊,使用的是逆向思維法""" for mouse in self.mouses: if mouse.dead: continue #老鼠死了,繼續(下一個老鼠) x = mouse.xcor() #老鼠的寬度和高度約為20x40 y = mouse.ycor() xLeft = x - 10 #老鼠左邊的x座標 xRight = x + 10 #老鼠右邊的x座標 yTop = y + 20 #老鼠上邊的y座標 yBottom = y - 20 #老鼠下邊的y座標 notoverlap = xRight <self.left or xLeft>self.right or yBottom > self.top or yTop<self.bottom if not notoverlap : mouse.dead = True mouse.cancle_keys() class Mouse(Turtle): """老鼠類,引數說明: images: 造型列表 keys:按鍵列表,上鍵和下鍵 laugh:笑聲 bell:鐘聲 """ def __init__(self,images,keys,laugh=None,bell=None): Turtle.__init__(self,shape='blank',visible=False) self.up() #擡筆 self.dead = False #描述老鼠是否死亡的邏輯變數 self.index= 0 #造型索引號 self.images = images #造型列表 self.upkey = keys[0] #向上按鍵 self.downkey = keys[1] #向下按鍵 self.laugh = laugh #大笑聲 self.bell =bell #過關後的聲 self.alt_image() #換造型 self.register_keys() #註冊按鍵 self.st() #顯示出來 self.wait_success() #等待過關 def register_keys(self): """註冊按鍵""" self.screen.onkeypress(lambda :self.sety(self.ycor() + 10),self.upkey) #註冊上按鍵 self.screen.onkeypress(lambda :self.sety(self.ycor() - 10),self.downkey) #註冊下按鍵 def cancle_keys(self): """取消註冊的按鍵""" self.screen.onkeypress(None,self.upkey) #取消註冊上按鍵 self.screen.onkeypress(None,self.downkey) #取消註冊下按鍵 def alt_image(self): """在0到1之間切換造型""" self.shape(self.images[self.index]) self.index = 1 - self.index if not self.dead : self.screen.ontimer(self.alt_image,300) else: self.shape(self.images[2]) #切換到死亡的造型(帶'血'的) try:self.laugh.play() except:pass def wait_success(self): """每隔0.1秒判斷是否成功穿越""" if self.ycor() > self.screen.window_height()//2-80 and self.isvisible(): try:self.bell.play() #播放鐘聲,表示成功過街 except:pass self.stamp() #蓋圖章 self.cancle_keys() #取消按鍵繫結 self.ht() #隱藏 else: self.screen.ontimer(self.wait_success,100) def init_screen(width,height,title,bgimage): """初始化螢幕""" screen = Screen() screen.setup(width,height ) screen.title(title) screen.bgpic(bgimage) screen.delay(0) return screen
def register_gif(): """註冊汽車與老鼠gif圖案到形狀列表""" busimages = ["小汽車" + str(i) + ".gif" for i in range(4)] [screen.addshape(image) for image in busimages] #註冊所有小汽車gif圖到形狀列表 mouseimages = ["mouse0.gif","mouse1.gif","mouse2.gif"] [screen.addshape(image) for image in mouseimages] #註冊所有老鼠gif圖到形狀列表 return busimages,mouseimages
def init_audio(): """播放背景音樂,新建音訊例項物件""" pygame_normal = False #描述pygame是否正常的邏輯變數 try: import pygame pygame.mixer.init() pygame_normal = True except: pass if pygame_normal: pygame.mixer.music.load("歡快女唱電音歌曲超嗨.wav") pygame.mixer.music.play(-1,0) haha = pygame.mixer.Sound("Laugh-male1.wav") #哈哈聲 bell = pygame.mixer.Sound("BellToll.wav") #鐘聲 cricket = pygame.mixer.Sound("Cricket.wav") #吱聲 else: haha = None ; bell=None ; cricket=None return haha,bell,cricket
def make_mouses(): """例項化老鼠""" mouse_a = Mouse(mouseimages,("w","s"),haha,bell) #例項化左邊老鼠,用w,s鍵移動老鼠 mouse_a.setx(-50) mouse_a.sety(-height//2 + 50) mouse_b = Mouse(mouseimages,("Up","Down"),haha,bell) #例項化右邊老鼠,用上,下方向箭頭移動老鼠 mouse_b.setx(+50) mouse_b.sety(-height//2 + 50) ms = [mouse_a,mouse_b] return ms
if __name__=="__main__":
width,height = 800,600 #螢幕寬高定義 screen = init_screen(width,height,"老鼠過街_作者:李興球","街道800x600.gif") busimages,mouseimages = register_gif() #註冊汽車與老鼠gif圖形 haha,bell,cricket = init_audio() #初始化音訊 ms = make_mouses() #生成兩隻老鼠 [ Bus(busimages,ycor,ms) for ycor in (170,70,-80,-170)] #生成4輛在不同y座標的小車
cricket.play() #播放下老鼠的吱吱聲 screen.listen() #監聽按鍵 screen.mainloop() #主迴圈 """需要本作品的素材請聯絡李興球先生"""