Python實(shí)現(xiàn)滑雪小游戲
本文實(shí)例為大家分享了Python實(shí)現(xiàn)滑雪小游戲的具體代碼,供大家參考,具體內(nèi)容如下
源碼分享:
import sys import cfg import pygame import random '''滑雪者類''' 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] '''改變滑雪者的朝向. 負(fù)數(shù)為向左,正數(shù)為向右,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 '''移動(dòng)滑雪者''' 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) '''設(shè)置為摔倒?fàn)顟B(tài)''' def setFall(self): self.image = pygame.image.load(cfg.SKIER_IMAGE_PATHS[-1]) '''設(shè)置為站立狀態(tài)''' def setForward(self): self.direction = 0 self.image = pygame.image.load(self.imagepaths[self.direction]) ''' Function: 障礙物類 Input: img_path: 障礙物圖片路徑 location: 障礙物位置 attribute: 障礙物類別屬性 ''' 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 '''移動(dòng)''' def move(self, num): self.rect.centery = self.location[1] - num '''創(chuàng)建障礙物''' def createObstacles(s, e, num=10): obstacles = pygame.sprite.Group() locations = [] for i in range(num): row = random.randint(s, e) col = random.randint(0, 9) location = [col*64+20, row*64+20] if location not in locations: locations.append(location) attribute = random.choice(list(cfg.OBSTACLE_PATHS.keys())) img_path = cfg.OBSTACLE_PATHS[attribute] obstacle = ObstacleClass(img_path, location, attribute) obstacles.add(obstacle) return obstacles '''合并障礙物''' def AddObstacles(obstacles0, obstacles1): obstacles = pygame.sprite.Group() for obstacle in obstacles0: obstacles.add(obstacle) for obstacle in obstacles1: obstacles.add(obstacle) return obstacles '''顯示游戲開(kāi)始界面''' 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'按任意鍵開(kāi)始游戲', 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() '''顯示分?jǐn)?shù)''' def showScore(screen, score, pos=(10, 10)): font = pygame.font.Font(cfg.FONTPATH, 30) score_text = font.render("Score: %s" % score, True, (0, 0, 0)) screen.blit(score_text, pos) '''更新當(dāng)前幀的游戲畫面''' def updateFrame(screen, obstacles, skier, score): screen.fill((255, 255, 255)) obstacles.draw(screen) screen.blit(skier.image, skier.rect) showScore(screen, score) pygame.display.update() '''主程序''' def main(): # 游戲初始化 pygame.init() pygame.mixer.init() pygame.mixer.music.load(cfg.BGMPATH) pygame.mixer.music.set_volume(0.4) pygame.mixer.music.play(-1) # 設(shè)置屏幕 screen = pygame.display.set_mode(cfg.SCREENSIZE) pygame.display.set_caption('滑雪游戲 —— 九歌') # 游戲開(kāi)始界面 ShowStartInterface(screen, cfg.SCREENSIZE) # 實(shí)例化游戲精靈 # --滑雪者 skier = SkierClass() # --創(chuàng)建障礙物 obstacles0 = createObstacles(20, 29) obstacles1 = createObstacles(10, 19) obstaclesflag = 0 obstacles = AddObstacles(obstacles0, obstacles1) # 游戲clock clock = pygame.time.Clock() # 記錄滑雪的距離 distance = 0 # 記錄當(dāng)前的分?jǐn)?shù) score = 0 # 記錄當(dāng)前的速度 speed = [0, 6] # 游戲主循環(huán) 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) # --更新當(dāng)前游戲幀的數(shù)據(jù) 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) # --碰撞檢測(cè) 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) '''run''' if __name__ == '__main__': main();
以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
相關(guān)文章
matplotlib畫圖之修改坐標(biāo)軸刻度問(wèn)題
這篇文章主要介紹了matplotlib畫圖之修改坐標(biāo)軸刻度問(wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2022-11-11python opencv 圖像處理之圖像算數(shù)運(yùn)算及修改顏色空間
這篇文章主要介紹了python opencv 圖像處理之圖像算數(shù)運(yùn)算及修改顏色空間,文章圍繞主題展開(kāi)詳細(xì)的內(nèi)容介紹,具有一定的參考價(jià)值,需要的朋友可以參考一下2022-08-08Python容器類型轉(zhuǎn)換的3種方法實(shí)例
使用Python我們可以輕松地將數(shù)據(jù)轉(zhuǎn)換成不同的類型,下面這篇文章主要給大家介紹了關(guān)于Python容器類型轉(zhuǎn)換的3種方法,文中通過(guò)實(shí)例代碼介紹的非常詳細(xì),需要的朋友可以參考下2022-05-05python實(shí)現(xiàn)的守護(hù)進(jìn)程(Daemon)用法實(shí)例
這篇文章主要介紹了python實(shí)現(xiàn)的守護(hù)進(jìn)程(Daemon)用法,實(shí)例分析了Python進(jìn)程操作的相關(guān)技巧,需要的朋友可以參考下2015-06-06樹(shù)莓派3 搭建 django 服務(wù)器的實(shí)例
今天小編就為大家分享一篇樹(shù)莓派3 搭建 django 服務(wù)器的實(shí)例,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2019-08-08python將ip地址轉(zhuǎn)換成整數(shù)的方法
這篇文章主要介紹了python將ip地址轉(zhuǎn)換成整數(shù)的方法,涉及Python針對(duì)IP地址的轉(zhuǎn)換技巧,需要的朋友可以參考下2015-03-03Numpy中np.vstack()?和?np.hstack()?的實(shí)現(xiàn)
本文主要介紹了Numpy中np.vstack()和np.hstack()的實(shí)現(xiàn),文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2024-04-04