上一期拧晕,我們開發(fā)了貪吃蛇小游戲,但是細心的小伙伴們可以發(fā)現户敬,游戲還存在幾個問題:
- 我們的小蛇會跑到屏幕外面去,這導致我們很難將其找回來溅漾,而我們的小蛇還可以穿越自己的身體山叮!
- 我們的小蛇是無敵的,不會死亡添履,而我們的游戲會一直運行屁倔。
- 游戲沒有一點背景音樂,好尷尬啊~~
- 隨機產生的食物居然會出現在我們小蛇的身體上
- 小蛇的樣子都是方塊暮胧,不好看锐借。
本期,我們就解決這幾個問題~
一往衷、限制小蛇的活動范圍為屏幕內钞翔,而且是的小蛇不能穿越自己的身體,否則死亡席舍。
這個很簡單布轿,只要每次移動的時候我們判斷蛇頭的位置是否超出屏幕之外就好了。
# 限制小蛇的活動范圍
if snake_body[0][0] < 0 or snake_body[0][0] >= WIDTH or\
snake_body[0][1] < 0 or snake_body[0][1] >= HEIGHT:
# 超出屏幕之外游戲結束
running = False
# 限制小蛇不能碰到自己的身體
for sb in snake_body[1:]:
# 身體的其他部位如果和蛇頭(snake_body[0])重合就死亡
if sb == snake_body[0]:
running = False
我們運行游戲之后會發(fā)現,只要運行到屏幕之外或撞到了自己的身體汰扭,就會退出稠肘!
二、來點背景音樂吧~~
背景音樂大家可以隨便到網上下載萝毛,向小蛇吃東西的音效的話项阴,網上也是有許多資源的,我就在這個網站上下的一些音效笆包。
要加入聲音效果环揽,首先要初始化pygame的mixer,然后我們載入音樂庵佣,最后播放就可以了歉胶,是不是很簡單呢~
# 要想載入音樂,必須要初始化 mixer
pygame.mixer.init()
# 設置游戲的根目錄為當前文件夾
base_folder = os.path.dirname(__file__)
# 這里需要在當前目錄下創(chuàng)建一個名為music的目錄巴粪,并且在里面存放名為back.mp3的背景音樂
music_folder = os.path.join(base_folder, 'music')
# 背景音樂跨扮,大家可以到網上去下自己喜歡的背景音樂
back_music = pygame.mixer.music.load(os.path.join(music_folder, 'back.mp3'))
# 小蛇吃食物的音樂,armor-light.wav 是我在網絡上下的免費音效資源
bite_dound = pygame.mixer.Sound(os.path.join(music_folder, 'armor-light.wav'))
# 設置一下音量大小验毡,防止過大
pygame.mixer.music.set_volume(0.4)
# 設置音樂循環(huán)次數 -1 表示無限循環(huán)
pygame.mixer.music.play(loops=-1)
到這里衡创,我們的背景音樂就加好了,但是小蛇吃食物的食物的音效雖然載入了晶通,我們還沒有播放璃氢,必須在遲到食物的時候播放,只需要一行代碼就可以咯狮辽! 我們在之前一也,我們grow()函數里面添加一行代碼:bite_dound.play()
# 判斷貪吃蛇是否吃到了事物,如果吃到了我們就加長小蛇的身體
def grow():
if snake_body[0][0] == food_pos[0] * CUBE_WIDTH and\
snake_body[0][1] == food_pos[1] * CUBE_WIDTH:
# 每次吃到食物喉脖,就播放音效
bite_dound.play()
return True
return False
OKR丁!運行一下游戲树叽,就可以聽到音樂和音效咯舆蝴!
三、解決一下题诵,食物會出現在小蛇身體上的問題
我們在產生食物的函數里洁仗,加上判斷,如果我們產生的一個事物在小蛇的身體上性锭,我們就再隨機產生下一個赠潦,一直到不再小蛇身體上為止,這里有一點點效率問題草冈,感興趣的同學可以自己優(yōu)化哦~
我們在產生食物的函數里加一個循環(huán)判斷一下:
# 隨機產生一個事物
def generate_food():
while True:
pos = (random.randint(0, GRID_WIDTH_NUM - 1),
random.randint(0, GRID_HEIGHT_NUM - 1))
# 如果當前位置沒有小蛇的身體她奥,我們就跳出循環(huán)瓮增,返回食物的位置
if not (pos[0] * CUBE_WIDTH, pos[1] * CUBE_WIDTH) in snake_body:
return pos
四、修改一下我們游戲的外觀A蟆钉赁!
(一)修改背景圖片
- 加載圖片
# 加載圖片
# 我們將背景圖片放到 images 文件夾中
img_folder = os.path.join(base_folder, 'images')
# 加載圖片
back_img = pygame.image.load(os.path.join(img_folder, 'back.png'))
blit 函數的作用其實就是將像素點直接復制到指定位置。
# 調整圖片的大小携茂,和屏幕一樣大
background = pygame.transform.scale(back_img, (WIDTH, HEIGHT))
- 將圖片縮放到我們屏幕的大小
# 調整圖片的大小,和屏幕一樣大
background = pygame.transform.scale(back_img, (WIDTH, HEIGHT))
- 最后每次更新屏幕的時候诅岩,我們不再是把屏幕直接用背景色填充讳苦,而是用圖片填充。
# 在更新圖片的位置
# 用圖片填充屏幕吩谦,第二個參數是屏幕的位置鸳谜,也就是屏幕左上角的位置(0, 0)
screen.blit(background, (0, 0))
此時我們的游戲的背景就變成了我們制定的圖片了
(二)利用同樣的方法我們可以改變一下我們貪吃蛇和食物的形狀
五式廷、最后看一下具體效果
snake-full.png
就問你咐扭,酷不酷~~~~
完整的代碼可以去我的 github 看,點擊這里進入GitHub滑废。
如果你喜歡我的文章蝗肪,就打賞一下我吧~~~
您的支持是我繼續(xù)創(chuàng)作的動力~~~