Python实现滑雪小游戏
程序员文章站
2022-06-24 08:04:00
本文实例为大家分享了python实现滑雪小游戏的具体代码,供大家参考,具体内容如下源码分享:import sysimport cfgimport pygameimport random '''滑雪者...
本文实例为大家分享了python实现滑雪小游戏的具体代码,供大家参考,具体内容如下
源码分享:
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] '''改变滑雪者的朝向. 负数为向左,正数为向右,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) '''设置为摔倒状态''' def setfall(self): self.image = pygame.image.load(cfg.skier_image_paths[-1]) '''设置为站立状态''' 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 '''移动''' def move(self, num): self.rect.centery = self.location[1] - num '''创建障碍物''' 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 '''显示游戏开始界面''' 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() '''显示分数''' 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) '''更新当前帧的游戏画面''' 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) # 设置屏幕 screen = pygame.display.set_mode(cfg.screensize) pygame.display.set_caption('滑雪游戏 —— 九歌') # 游戏开始界面 showstartinterface(screen, cfg.screensize) # 实例化游戏精灵 # --滑雪者 skier = skierclass() # --创建障碍物 obstacles0 = createobstacles(20, 29) obstacles1 = createobstacles(10, 19) obstaclesflag = 0 obstacles = addobstacles(obstacles0, obstacles1) # 游戏clock clock = pygame.time.clock() # 记录滑雪的距离 distance = 0 # 记录当前的分数 score = 0 # 记录当前的速度 speed = [0, 6] # 游戏主循环 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) '''run''' if __name__ == '__main__': main();
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持。