Pygame是一個利用SDL庫的寫就的游戲庫,SDL呢,全名Simple DirectMedia Layer,是一位叫做Sam Lantinga的大牛寫的,據(jù)說他為了讓Loki(致力于向Linux上移植Windows的游戲的一家大好人公司,可惜已經(jīng)倒閉,唉好人不長命啊……)更有效的工作,創(chuàng)造了這個東東。
SDL是用C寫的,不過它也可以使用C++進行開發(fā),當然還有很多其它的語言,Pygame就是Python中使用它的一個庫。Pygame已經(jīng)存在很多時間了,許多優(yōu)秀的程序員加入其中,把Pygame做得越來越好。
Python版本:3.6.4
相關(guān)模塊:
pygame模塊;
以及一些Python自帶的模塊。
安裝Python并添加到環(huán)境變量,
pip安裝需要的相關(guān)模塊即可。
玩家通過↑↓←→鍵控制游戲的主角吃豆人吃掉藏在迷宮內(nèi)的所有豆子,并且不能被鬼魂抓到。
若能順利吃完迷宮內(nèi)的所有豆子并且不被鬼魂抓到,則游戲勝利,否則游戲失敗。
① 墻類:
② 食物類:
③ 角色類:
角色類包括吃豆人和鬼魂,鬼魂由電腦控制其運動軌跡,吃豆人由玩家控制其運動軌跡。
顯然,其均需具備更新角色位置和改變角色運動方向的能力,其源代碼如下:
① 創(chuàng)建墻:
② 創(chuàng)建門:
③ 創(chuàng)建角色:
④ 創(chuàng)建食物:
接下來開始設(shè)計游戲主循環(huán)。首先是初始化:
然后定義主函數(shù):
其中startLevelGame函數(shù)用于開始某一關(guān)游戲,其源代碼如下:
showText函數(shù)用于在游戲結(jié)束或關(guān)卡切換時在游戲界面中顯示提示性文字,其源代碼如下:
#吃豆子 import os,sys import sys import pygame import random BLACK = (0, 0, 0) WHITE = (255, 255, 255) BLUE = (0, 0, 255) GREEN = (0, 255, 0) RED = (255, 0, 0) YELLOW = (255, 255, 0) PURPLE = (255, 0, 255) SKYBLUE = (0, 191, 255) if getattr(sys, 'frozen', False): cur_path = sys._MEIPASS else: cur_path = os.path.dirname(__file__) BGMPATH = os.path.join(cur_path, 'resources/sounds/bg.mp3') ICONPATH = os.path.join(cur_path,'resources/images/icon.png') FONTPATH = os.path.join(cur_path,'resources/font/ALGER.TTF') HEROPATH = os.path.join(cur_path,'resources/images/pacman.png') BlinkyPATH = os.path.join(cur_path,'resources/images/Blinky.png') ClydePATH = os.path.join(cur_path,'resources/images/Clyde.png') InkyPATH = os.path.join(cur_path,'resources/images/Inky.png') PinkyPATH = os.path.join(cur_path,'resources/images/Pinky.png') NUMLEVELS = 1 class Wall(pygame.sprite.Sprite): def __init__(self, x, y, width, height, color, **kwargs): pygame.sprite.Sprite.__init__(self) self.image = pygame.Surface([width, height]) self.image.fill(color) self.rect = self.image.get_rect() self.rect.left = x self.rect.top = y class Food(pygame.sprite.Sprite): def __init__(self, x, y, width, height, color, bg_color, **kwargs): pygame.sprite.Sprite.__init__(self) self.image = pygame.Surface([width, height]) self.image.fill(bg_color) self.image.set_colorkey(bg_color) pygame.draw.ellipse(self.image, color, [0, 0, width, height]) self.rect = self.image.get_rect() self.rect.left = x self.rect.top = y class Player(pygame.sprite.Sprite): def __init__(self, x, y, role_image_path): pygame.sprite.Sprite.__init__(self) self.role_name = role_image_path.split('/')[-1].split('.')[0] self.base_image = pygame.image.load(role_image_path).convert() self.image = self.base_image.copy() self.rect = self.image.get_rect() self.rect.left = x self.rect.top = y self.prev_x = x self.prev_y = y self.base_speed = [30, 30] self.speed = [0, 0] self.is_move = False self.tracks = [] self.tracks_loc = [0, 0] def changeSpeed(self, direction): if direction[0] 0: self.image = pygame.transform.flip(self.base_image, True, False) elif direction[0] > 0: self.image = self.base_image.copy() elif direction[1] 0: self.image = pygame.transform.rotate(self.base_image, 90) elif direction[1] > 0: self.image = pygame.transform.rotate(self.base_image, -90) self.speed = [direction[0] * self.base_speed[0], direction[1] * self.base_speed[1]] return self.speed def update(self, wall_sprites, gate_sprites): if not self.is_move: return False x_prev = self.rect.left y_prev = self.rect.top self.rect.left += self.speed[0] self.rect.top += self.speed[1] is_collide = pygame.sprite.spritecollide(self, wall_sprites, False) if gate_sprites is not None: if not is_collide: is_collide = pygame.sprite.spritecollide(self, gate_sprites, False) if is_collide: self.rect.left = x_prev self.rect.top = y_prev return False return True def randomDirection(self): return random.choice([[-0.5, 0], [0.5, 0], [0, 0.5], [0, -0.5]]) class Level1(): def __init__(self): self.info = 'level1' def setupWalls(self, wall_color): self.wall_sprites = pygame.sprite.Group() wall_positions = [[0, 0, 6, 600], [0, 0, 600, 6], [0, 600, 606, 6], [600, 0, 6, 606], [300, 0, 6, 66], [60, 60, 186, 6], [360, 60, 186, 6], [60, 120, 66, 6], [60, 120, 6, 126], [180, 120, 246, 6], [300, 120, 6, 66], [480, 120, 66, 6], [540, 120, 6, 126], [120, 180, 126, 6], [120, 180, 6, 126], [360, 180, 126, 6], [480, 180, 6, 126], [180, 240, 6, 126], [180, 360, 246, 6], [420, 240, 6, 126], [240, 240, 42, 6], [324, 240, 42, 6], [240, 240, 6, 66], [240, 300, 126, 6], [360, 240, 6, 66], [0, 300, 66, 6], [540, 300, 66, 6], [60, 360, 66, 6], [60, 360, 6, 186], [480, 360, 66, 6], [540, 360, 6, 186], [120, 420, 366, 6], [120, 420, 6, 66], [480, 420, 6, 66], [180, 480, 246, 6], [300, 480, 6, 66], [120, 540, 126, 6], [360, 540, 126, 6]] for wall_position in wall_positions: wall = Wall(*wall_position, wall_color) self.wall_sprites.add(wall) return self.wall_sprites def setupGate(self, gate_color): self.gate_sprites = pygame.sprite.Group() self.gate_sprites.add(Wall(282, 242, 42, 2, gate_color)) return self.gate_sprites def setupPlayers(self, hero_image_path, ghost_images_path): self.hero_sprites = pygame.sprite.Group() self.ghost_sprites = pygame.sprite.Group() self.hero_sprites.add(Player(287, 439, hero_image_path)) for each in ghost_images_path: role_name = each.split('/')[-1].split('.')[0] if role_name == 'Blinky': player = Player(287, 199, each) player.is_move = True player.tracks = [[0, -0.5, 4], [0.5, 0, 9], [0, 0.5, 11], [0.5, 0, 3], [0, 0.5, 7], [-0.5, 0, 11], [0, 0.5, 3], [0.5, 0, 15], [0, -0.5, 15], [0.5, 0, 3], [0, -0.5, 11], [-0.5, 0, 3], [0, -0.5, 11], [-0.5, 0, 3], [0, -0.5, 3], [-0.5, 0, 7], [0, -0.5, 3], [0.5, 0, 15], [0, 0.5, 15], [-0.5, 0, 3], [0, 0.5, 3], [-0.5, 0, 3], [0, -0.5, 7], [-0.5, 0, 3], [0, 0.5, 7], [-0.5, 0, 11], [0, -0.5, 7], [0.5, 0, 5]] self.ghost_sprites.add(player) elif role_name == 'Clyde': player = Player(319, 259, each) player.is_move = True player.tracks = [[-1, 0, 2], [0, -0.5, 4], [0.5, 0, 5], [0, 0.5, 7], [-0.5, 0, 11], [0, -0.5, 7], [-0.5, 0, 3], [0, 0.5, 7], [-0.5, 0, 7], [0, 0.5, 15], [0.5, 0, 15], [0, -0.5, 3], [-0.5, 0, 11], [0, -0.5, 7], [0.5, 0, 3], [0, -0.5, 11], [0.5, 0, 9]] self.ghost_sprites.add(player) elif role_name == 'Inky': player = Player(255, 259, each) player.is_move = True player.tracks = [[1, 0, 2], [0, -0.5, 4], [0.5, 0, 10], [0, 0.5, 7], [0.5, 0, 3], [0, -0.5, 3], [0.5, 0, 3], [0, -0.5, 15], [-0.5, 0, 15], [0, 0.5, 3], [0.5, 0, 15], [0, 0.5, 11], [-0.5, 0, 3], [0, -0.5, 7], [-0.5, 0, 11], [0, 0.5, 3], [-0.5, 0, 11], [0, 0.5, 7], [-0.5, 0, 3], [0, -0.5, 3], [-0.5, 0, 3], [0, -0.5, 15], [0.5, 0, 15], [0, 0.5, 3], [-0.5, 0, 15], [0, 0.5, 11], [0.5, 0, 3], [0, -0.5, 11], [0.5, 0, 11], [0, 0.5, 3], [0.5, 0, 1]] self.ghost_sprites.add(player) elif role_name == 'Pinky': player = Player(287, 259, each) player.is_move = True player.tracks = [[0, -1, 4], [0.5, 0, 9], [0, 0.5, 11], [-0.5, 0, 23], [0, 0.5, 7], [0.5, 0, 3], [0, -0.5, 3], [0.5, 0, 19], [0, 0.5, 3], [0.5, 0, 3], [0, 0.5, 3], [0.5, 0, 3], [0, -0.5, 15], [-0.5, 0, 7], [0, 0.5, 3], [-0.5, 0, 19], [0, -0.5, 11], [0.5, 0, 9]] self.ghost_sprites.add(player) return self.hero_sprites, self.ghost_sprites def setupFood(self, food_color, bg_color): self.food_sprites = pygame.sprite.Group() for row in range(19): for col in range(19): if (row == 7 or row == 8) and (col == 8 or col == 9 or col == 10): continue else: food = Food(30*col+32, 30*row+32, 4, 4, food_color, bg_color) is_collide = pygame.sprite.spritecollide(food, self.wall_sprites, False) if is_collide: continue is_collide = pygame.sprite.spritecollide(food, self.hero_sprites, False) if is_collide: continue self.food_sprites.add(food) return self.food_sprites def startLevelGame(level, screen, font): clock = pygame.time.Clock() SCORE = 0 wall_sprites = level.setupWalls(SKYBLUE) gate_sprites = level.setupGate(WHITE) hero_sprites, ghost_sprites = level.setupPlayers(HEROPATH, [BlinkyPATH, ClydePATH, InkyPATH, PinkyPATH]) food_sprites = level.setupFood(YELLOW, WHITE) is_clearance = False while True: for event in pygame.event.get(): if event.type == pygame.QUIT: pygame.quit() sys.exit(-1) if event.type == pygame.KEYDOWN: if event.key == pygame.K_LEFT: for hero in hero_sprites: hero.changeSpeed([-1, 0]) hero.is_move = True elif event.key == pygame.K_RIGHT: for hero in hero_sprites: hero.changeSpeed([1, 0]) hero.is_move = True elif event.key == pygame.K_UP: for hero in hero_sprites: hero.changeSpeed([0, -1]) hero.is_move = True elif event.key == pygame.K_DOWN: for hero in hero_sprites: hero.changeSpeed([0, 1]) hero.is_move = True if event.type == pygame.KEYUP: if (event.key == pygame.K_LEFT) or (event.key == pygame.K_RIGHT) or (event.key == pygame.K_UP) or (event.key == pygame.K_DOWN): hero.is_move = False screen.fill(BLACK) for hero in hero_sprites: hero.update(wall_sprites, gate_sprites) hero_sprites.draw(screen) for hero in hero_sprites: food_eaten = pygame.sprite.spritecollide(hero, food_sprites, True) SCORE += len(food_eaten) wall_sprites.draw(screen) gate_sprites.draw(screen) food_sprites.draw(screen) for ghost in ghost_sprites: if ghost.tracks_loc[1] ghost.tracks[ghost.tracks_loc[0]][2]: ghost.changeSpeed(ghost.tracks[ghost.tracks_loc[0]][0: 2]) ghost.tracks_loc[1] += 1 else: if ghost.tracks_loc[0] len(ghost.tracks) - 1: ghost.tracks_loc[0] += 1 elif ghost.role_name == 'Clyde': ghost.tracks_loc[0] = 2 else: ghost.tracks_loc[0] = 0 ghost.changeSpeed(ghost.tracks[ghost.tracks_loc[0]][0: 2]) ghost.tracks_loc[1] = 0 if ghost.tracks_loc[1] ghost.tracks[ghost.tracks_loc[0]][2]: ghost.changeSpeed(ghost.tracks[ghost.tracks_loc[0]][0: 2]) else: if ghost.tracks_loc[0] len(ghost.tracks) - 1: loc0 = ghost.tracks_loc[0] + 1 elif ghost.role_name == 'Clyde': loc0 = 2 else: loc0 = 0 ghost.changeSpeed(ghost.tracks[loc0][0: 2]) ghost.update(wall_sprites, None) ghost_sprites.draw(screen) score_text = font.render("Score: %s" % SCORE, True, RED) screen.blit(score_text, [10, 10]) if len(food_sprites) == 0: is_clearance = True break if pygame.sprite.groupcollide(hero_sprites, ghost_sprites, False, False): is_clearance = False break pygame.display.flip() clock.tick(10) return is_clearance def showText(screen, font, is_clearance, flag=False): clock = pygame.time.Clock() msg = 'Game Over!' if not is_clearance else 'Congratulations, you won!' positions = [[235, 233], [65, 303], [170, 333]] if not is_clearance else [[145, 233], [65, 303], [170, 333]] surface = pygame.Surface((400, 200)) surface.set_alpha(10) surface.fill((128, 128, 128)) screen.blit(surface, (100, 200)) texts = [font.render(msg, True, WHITE), font.render('Press ENTER to continue or play again.', True, WHITE), font.render('Press ESCAPE to quit.', True, WHITE)] while True: for event in pygame.event.get(): if event.type == pygame.QUIT: pygame.quit() sys.exit(-1) if event.type == pygame.KEYDOWN: if event.key == pygame.K_RETURN: if is_clearance: if not flag: return else: main(initialize()) else: main(initialize()) elif event.key == pygame.K_ESCAPE: pygame.quit() sys.exit(-1) for idx, (text, position) in enumerate(zip(texts, positions)): screen.blit(text, position) pygame.display.flip() clock.tick(10) def initialize(): pygame.init() icon_image = pygame.image.load(ICONPATH) pygame.display.set_icon(icon_image) screen = pygame.display.set_mode([606, 606]) pygame.display.set_caption('吃豆子') return screen def main(screen): try: pygame.mixer.init() pygame.mixer.music.load(BGMPATH) pygame.mixer.music.play(-1, 0.0) except: pass pygame.font.init() font_small = pygame.font.Font(FONTPATH, 18) font_big = pygame.font.Font(FONTPATH, 24) for num_level in range(1, NUMLEVELS+1): if num_level == 1: level = Level1() is_clearance = startLevelGame(level, screen, font_small) if num_level == NUMLEVELS: showText(screen, font_big, is_clearance, True) else: showText(screen, font_big, is_clearance) if __name__ == "__main__": main(initialize())
到此這篇關(guān)于Pygame做一期吃豆子游戲的示例代碼的文章就介紹到這了,更多相關(guān)Pygame 吃豆子內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
標簽:亳州 廊坊 內(nèi)江 黔東 興安盟 綿陽 渭南 拉薩
巨人網(wǎng)絡(luò)通訊聲明:本文標題《Pygame做一期吃豆子游戲的示例代碼》,本文關(guān)鍵詞 Pygame,做,一期,吃,豆子,游,;如發(fā)現(xiàn)本文內(nèi)容存在版權(quán)問題,煩請?zhí)峁┫嚓P(guān)信息告之我們,我們將及時溝通與處理。本站內(nèi)容系統(tǒng)采集于網(wǎng)絡(luò),涉及言論、版權(quán)與本站無關(guān)。