自制python+pygame小游戏两枚
<div id="cnblogs_post_body">前几天在家没事干,花了点心思折腾了两个小东西。第一个射击游戏是跟着pygame官网上下载的一个游戏边学习源码边抄的,抄了个开头就变成自己乱搞加参考了。。虽然有心想装下蒜,但不知道那些协议什么的怎么搞。只能在这提一下了。。第二个是以前小时候玩过的,不知道该怎么叫,是看cs50公开课时课上的作业,他们叫the game of fifteen...。话说我们这边的学习能力真心普遍弱爆了。人家才上到3周课就干这个了,我们学校到了期末了有些人老师手把手教都还不会。。
第一个:
http://pic002.cnblogs.com/images/2012/428598/2012081511213348.png
http://pic002.cnblogs.com/images/2012/428598/2012081511222127.png
如图,白色方块是自己的飞机,白色小点是自己子弹,三条命。撞子弹就扣一条,撞敌人没做。。。
代码:
<div class="cnblogs_code">#! /usr/bin/env python#My Space Shooter#qq:289976627 gmail:gagazcfan@gmail.com.#Importimport os, sys, pygame, randomfrom pygame.locals import *pygame.init()pygame.display.set_caption("My Space Shooter")screen = pygame.display.set_mode((800, 600))pygame.mouse.set_visible(0)#Backgroundbackground = pygame.Surface(screen.get_size())background = background.convert()background.fill((100, 100, 255))#Music# TODO:Add music#Plane imagedef get_plane(rect, color = (0, 0, 0)): surface = pygame.Surface(rect).convert() surface.fill(color) rect = surface.get_rect() return surface, rect#Playerclass Player(pygame.sprite.Sprite): def __init__(self): pygame.sprite.Sprite.__init__(self) self.image, self.rect = get_plane((20,20), (255,255,255)) self.rect.center = (400, 500) self.dx = 0 self.dy = 0 self.bullettimer = 0 self.firespeed = 25 self.life = 3 def update(self): self.rect.move_ip((self.dx, self.dy)) #Fire the bullet if self.bullettimer < self.firespeed: self.bullettimer += 1 key = pygame.key.get_pressed() if key and self.bullettimer == self.firespeed: bulletSprites.add(Bullet(self.rect.midtop)) self.bullettimer = 0 #Player Boundaries if self.rect.left < 0: self.rect.left = 0 elif self.rect.right > 800: self.rect.right = 800 if self.rect.top <= 260: self.rect.top = 260 elif self.rect.bottom >= 600: self.rect.bottom = 600 #Check if enemy bullets hit player if pygame.sprite.groupcollide(playerSprite, enemyBulletSprites, 0, 1): self.life -= 1 if self.life <= 0: self.kill() def reset(self): self.rect.bottom = 600 self.firespeed = 25 def firespeed_up(self): self.firespeed -= 5 if self.firespeed <= 5: self.firespeed == 5#Enemy classclass Enemy(pygame.sprite.Sprite): def __init__(self,centerx): pygame.sprite.Sprite.__init__(self) self.image, self.rect = get_plane((20,20),(150,150,255)) self.reset() def update(self): self.rect.centerx += self.dx self.rect.centery += self.dy if self.rect.top > screen.get_height(): self.reset() self.counter += 1 if self.counter >= 60: enemyBulletSprites.add(EnemyBullet(self.rect.midbottom)) self.counter = 0 #Check if enemy plane touch player bullets if pygame.sprite.groupcollide(enemySprites, bulletSprites, 1, 1): #play explode movie and music pass def reset(self): self.counter = random.randint(0, 60) self.rect.bottom = 0 self.rect.centerx = random.randrange(0, screen.get_width()) self.dy = random.randrange(1, 4) self.dx = random.randrange(-2, 2)#Bullet classclass Bullet(pygame.sprite.Sprite): def __init__(self, pos): pygame.sprite.Sprite.__init__(self) self.image, self.rect = get_plane((5, 5),(255,255,255)) self.rect.center = pos def update(self): if self.rect.top < 0: self.kill() else: self.rect.move_ip(0, -5)#Enemy bullet classclass EnemyBullet(pygame.sprite.Sprite): def __init__(self, pos): pygame.sprite.Sprite.__init__(self) self.image, self.rect = get_plane((5, 5),(150,150,255)) self.rect.center = pos def update(self): if self.rect.top < 0: self.kill() else: self.rect.move_ip(0, 5)#Class Moduleclass SpaceMenu: #Define the initalize self options def __init__(self, *options): self.options = options self.x = 0 self.y = 0 self.font = pygame.font.Font(None, 32) self.option = 0 self.width = 1 self.color = self.hcolor = self.height = len(options)*self.font.get_height() for o in options: text = o ren = self.font.render(text, 1, (0, 0, 0)) if ren.get_width() > self.width: self.width = ren.get_width() #Draw the menu def draw(self, surface): i = 0 for o in self.options: if i == self.option: clr = self.hcolor else: clr = self.color text = o ren = self.font.render(text, 1, clr) if ren.get_width() > self.width: self.width = ren.get_width() surface.blit(ren, (self.x, self.y + i * self.font.get_height())) i += 1 #Handle events def update(self, events): for e in events: if e.type == pygame.KEYDOWN: if e.key == pygame.K_UP: self.option -= 1 elif e.key == pygame.K_DOWN: self.option += 1 elif e.key == pygame.K_RETURN: self.options[1]() if self.option > len(self.options) - 1: self.option = 0 elif self.option < 0: self.option = len(self.options) - 1 #Position of menu def set_pos(self, x, y): self.x = x self.y = y #Font Style def set_font(self, font): self.font = font for o in self.options: text = o ren = self.font.render(text, 1, (0, 0, 0)) if ren.get_width() > self.width: self.width = ren.get_width() #Highlight Color def set_highlight_color(self, color): self.hcolor = color #Font Color def set_normal_color(self, color): self.color = color #Font position def center_at(self, x, y): self.x = x-(self.width/2) self.y = y-(self.height/2)def game(): #Game Object #global player player = Player() font = pygame.font.Font(None,32) #Player/enemy global playerSprite playerSprite = pygame.sprite.RenderPlain((player)) global enemySprites enemySprites = pygame.sprite.RenderPlain(()) enemySprites.add(Enemy(200)) enemySprites.add(Enemy(300)) enemySprites.add(Enemy(400)) #Projectiles global bulletSprites bulletSprites = pygame.sprite.RenderPlain(()) global enemyBulletSprites enemyBulletSprites = pygame.sprite.RenderPlain(()) clock = pygame.time.Clock() counter = 0 keepGoing = True while keepGoing: clock.tick(30) #Handle input for event in pygame.event.get(): if event.type == pygame.QUIT: keepGoing = False elif event.type == pygame.KEYDOWN: if event.key == pygame.K_ESCAPE: keepGoing = False elif event.key == pygame.K_UP: player.dy = -10 elif event.key == pygame.K_DOWN: player.dy = 10 elif event.key == pygame.K_LEFT: player.dx = -10 elif event.key == pygame.K_RIGHT: player.dx = 10 elif event.type == pygame.KEYUP: if event.key == pygame.K_UP: player.dy = 0 elif event.key == pygame.K_DOWN: player.dy = 0 elif event.key == pygame.K_LEFT: player.dx = 0 elif event.key == pygame.K_RIGHT: player.dx = 0 #Update screen.blit(background, (0,0)) playerSprite.update() enemySprites.update() bulletSprites.update() enemyBulletSprites.update() text = "LIFE:" + str(player.life) life = font.render(text, True, (255,255,255)) #Draw playerSprite.draw(screen) enemySprites.draw(screen) bulletSprites.draw(screen) enemyBulletSprites.draw(screen) screen.blit(life,(0,0)) pygame.display.flip() #Create new enemies counter += 1 if counter >= 20 and len(enemySprites) < 20: enemySprites.add(Enemy(300)) counter = 0 #if game over if len(playerSprite) == 0: gameOver() keepGoing = Falsedef gameOver(): #Game over screen menuTitle = SpaceMenu( ["GAME OVER"]) menuTitle.set_font(pygame.font.Font(None, 80)) menuTitle.center_at(400,230) menuTitle.set_highlight_color((255,255,255)) info = SpaceMenu( ["Press ESC back to menu"]) info.set_font(pygame.font.Font(None, 40)) info.center_at(400,350) info.set_highlight_color((255,255,255)) keepGoing = True while keepGoing: for event in pygame.event.get(): if event.type == pygame.KEYDOWN: if event.key == pygame.K_ESCAPE: keepGoing = False elif event.type == pygame.QUIT: keepGoing = False menuTitle.draw(screen) info.draw(screen) pygame.display.flip()def aboutMenu(): #About Menu Text #Title for Option Menu menuTitle = SpaceMenu( ["Space Shooter"]) info = SpaceMenu( [""], ["My Space Shooter"], [""], ["Use arrow key to move your plane."], [""], ["Contact me"], [""], ["qq:289976627"], ["gmail:gagazcfan@gmail.com"], [""], [" PRESS ESC TO RETURN "]) #About Title Font color, aligment, and font type menuTitle.set_font(pygame.font.Font(None, 60)) menuTitle.center_at(400, 150) menuTitle.set_highlight_color((255, 255, 255)) #About info Font color, aligment, and font type info.center_at(400, 320) info.set_highlight_color((255, 255, 255)) info.set_normal_color((200, 200, 255)) clock = pygame.time.Clock() keepGoing = True while keepGoing: clock.tick(30) #Handle input for event in pygame.event.get(): if event.type == pygame.KEYDOWN: if event.key == pygame.K_ESCAPE: keepGoing = False elif event.type == QUIT: keepGoing = False #Draw screen.blit(background, (0,0)) menuTitle.draw(screen) info.draw(screen) pygame.display.flip()#Functionsdef option1(): game()def option2(): aboutMenu()def option3(): pygame.quit() sys.exit()#Maindef main(): menuTitle = SpaceMenu( ["My Space Shooter"]) menu = SpaceMenu( ["Start", option1], ["About", option2], ["Exit", option3]) #Title menuTitle.set_font(pygame.font.Font(None, 60)) menuTitle.center_at(400, 150) menuTitle.set_highlight_color((255, 255, 255)) #Menu settings menu.center_at(400, 320) menu.set_highlight_color((255, 255, 255)) menu.set_normal_color((200, 200, 255)) clock = pygame.time.Clock() keepGoing = True while True: clock.tick(30) #Events events = pygame.event.get() #Update Menu menu.update(events) #Handle quit event for e in events: if e.type == pygame.QUIT: pygame.quit() return #Draw screen.blit(background, (0, 0)) menu.draw(screen) menuTitle.draw(screen) pygame.display.flip()if __name__ == "__main__": main()
页:
[1]