ALAN的实验室 发表于 2013-1-1 22:34:22

自制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]
查看完整版本: 自制python+pygame小游戏两枚