前言:
本期我們將制作一個簡單的滑雪游戲。
廢話不多說,讓我們愉快地開始吧~
結果
老規矩還是我們先看看效果圖
開發工具
Python版本:3.6.4
相關模塊:
pygame模塊;
以及一些Python自帶的模塊。
環境搭建
安裝Python並添加到環境變量,pip安裝需要的相關模塊即可。
原理介紹
游戲規則:
玩家通過“AD”鍵或者“←→”操控前進中的滑雪者,努力避開路上的樹,盡量撿到路上的小旗。
如果碰到樹,則得分減50,如果撿到小旗子,則得分加10。
逐步實現:
Step1:定義精靈類
由於游戲涉及到碰撞檢測(滑雪者與樹和小旗之間的碰撞),因此我們定義兩個精靈類,分別用於代表滑雪者和障礙物(即樹和小旗):
'''滑雪者類'''
class SkierClass(pygame.sprite.Sprite):
def __init__(self):
pygame.sprite.Sprite.__init__(self)
# 滑雪者的朝向(-2到2)
self.direction = 0
self.imagepaths = cfg.SKIER_IMAGE_PATHS[:-1]
self.image = pygame.image.load(self.imagepaths[self.direction])
self.rect = self.image.get_rect()
self.rect.center = [320, 100]
self.speed = [self.direction, 6-abs(self.direction)*2]
'''改變滑雪者的朝向. 負數為向左,正數為向右,0為向前'''
def turn(self, num):
self.direction += num
self.direction = max(-2, self.direction)
self.direction = min(2, self.direction)
center = self.rect.center
self.image = pygame.image.load(self.imagepaths[self.direction])
self.rect = self.image.get_rect()
self.rect.center = center
self.speed = [self.direction, 6-abs(self.direction)*2]
return self.speed
'''移動滑雪者'''
def move(self):
self.rect.centerx += self.speed[0]
self.rect.centerx = max(20, self.rect.centerx)
self.rect.centerx = min(620, self.rect.centerx)
'''障礙物類'''
class ObstacleClass(pygame.sprite.Sprite):
def __init__(self, img_path, location, attribute):
pygame.sprite.Sprite.__init__(self)
self.img_path = img_path
self.image = pygame.image.load(self.img_path)
self.location = location
self.rect = self.image.get_rect()
self.rect.center = self.location
self.attribute = attribute
self.passed = False
'''移動'''
def move(self, num):
self.rect.centery = self.location[1] - num
其中,滑雪者在前進過程中應當擁有向左,向右偏移的能力,並且在偏移時滑雪者向前的速度應當減慢才更加合乎常理,這樣才能供玩家操作。同時,滑雪者應當擁有不同的姿態來表現自己滑行時的狀態:
直線:
左偏一點:
左偏很多:
右偏一點:
右偏很多:
另外,盡管滑雪者的左右移動通過移動滑雪者本身實現,但是滑雪者的向前移動是通過移動障礙物實現的。
Step2:隨機創建障礙物
現在我們需要定義一個隨機創建障礙物的函數,以便在游戲主循環中調用:
其中障礙物創建兩次的目的是便於畫面銜接。
然后我們就可以定義主循環了:
'''游戲主循環'''
while True:
# --事件捕獲
for event in pygame.event.get():
if event.type == pygame.QUIT:
pygame.quit()
sys.exit()
if event.type == pygame.KEYDOWN:
if event.key == pygame.K_LEFT or event.key == pygame.K_a:
speed = skier.turn(-1)
elif event.key == pygame.K_RIGHT or event.key == pygame.K_d:
speed = skier.turn(1)
'''--更新當前游戲幀的數據'''
skier.move()
distance += speed[1]
if distance >= 640 and obstaclesflag == 0:
obstaclesflag = 1
obstacles0 = createObstacles(20, 29)
obstacles = AddObstacles(obstacles0, obstacles1)
if distance >= 1280 and obstaclesflag == 1:
obstaclesflag = 0
distance -= 1280
for obstacle in obstacles0:
obstacle.location[1] = obstacle.location[1] - 1280
obstacles1 = createObstacles(10, 19)
obstacles = AddObstacles(obstacles0, obstacles1)
for obstacle in obstacles:
obstacle.move(distance)
'''--碰撞檢測'''
hitted_obstacles = pygame.sprite.spritecollide(skier, obstacles, False)
if hitted_obstacles:
if hitted_obstacles[0].attribute == "tree" and not hitted_obstacles[0].passed:
score -= 50
skier.setFall()
updateFrame(screen, obstacles, skier, score)
pygame.time.delay(1000)
skier.setForward()
speed = [0, 6]
hitted_obstacles[0].passed = True
elif hitted_obstacles[0].attribute == "flag" and not hitted_obstacles[0].passed:
score += 10
obstacles.remove(hitted_obstacles[0])
'''--更新屏幕'''
updateFrame(screen, obstacles, skier, score)
clock.tick(cfg.FPS)
主循環的內容包括:
事件監聽、障礙物的更新、碰撞檢測以及分數的展示等內容,總之還是很容易實現的。
Step4:其他
開始、結束界面這些,就靠大家自己發揮了,我就寫了一個簡單的開始界面:
'''顯示游戲開始界面'''
def ShowStartInterface(screen, screensize):
screen.fill((255, 255, 255))
tfont = pygame.font.Font(cfg.FONTPATH, screensize[0]//5)
cfont = pygame.font.Font(cfg.FONTPATH, screensize[0]//20)
title = tfont.render(u'滑雪游戲', True, (255, 0, 0))
content = cfont.render(u'按任意鍵開始游戲', True, (0, 0, 255))
trect = title.get_rect()
trect.midtop = (screensize[0]/2, screensize[1]/5)
crect = content.get_rect()
crect.midtop = (screensize[0]/2, screensize[1]/2)
screen.blit(title, trect)
screen.blit(content, crect)
while True:
for event in pygame.event.get():
if event.type == pygame.QUIT:
pygame.quit()
sys.exit()
elif event.type == pygame.KEYDOWN:
return
pygame.display.update()
文章到這里就結束了,感謝你的觀看,Python24個小游戲系列,下篇文章分享經典90坦克大戰
為了感謝讀者們,我想把我最近收藏的一些編程干貨分享給大家,回饋每一個讀者,希望能幫到你們。
干貨主要有:
① 2000多本Python電子書(主流和經典的書籍應該都有了)
② Python標准庫資料(最全中文版)
③ 項目源碼(四五十個有趣且經典的練手項目及源碼)
④ Python基礎入門、爬蟲、web開發、大數據分析方面的視頻(適合小白學習)
⑤ Python學習路線圖(告別不入流的學習)
All done~詳見個人簡介或者私信獲取完整源代碼。。