六狼论坛

 找回密码
 立即注册

QQ登录

只需一步,快速开始

新浪微博账号登陆

只需一步,快速开始

搜索
查看: 264|回复: 0

自制python+pygame小游戏两枚

[复制链接]

升级  8%

16

主题

16

主题

16

主题

秀才

Rank: 2

积分
62
 楼主| 发表于 2013-1-1 22:34:27 | 显示全部楼层 |阅读模式
<div id="cnblogs_post_body">前几天在家没事干,花了点心思折腾了两个小东西。第一个射击游戏是跟着pygame官网上下载的一个游戏边学习源码边抄的,抄了个开头就变成自己乱搞加参考了。。虽然有心想装下蒜,但不知道那些协议什么的怎么搞。只能在这提一下了。。
第二个是以前小时候玩过的,不知道该怎么叫,是看cs50公开课时课上的作业,他们叫the game of fifteen...。话说我们这边的学习能力真心普遍弱爆了。人家才上到3周课就干这个了,我们学校到了期末了有些人老师手把手教都还不会。。
第一个:


如图,白色方块是自己的飞机,白色小点是自己子弹,三条命。撞子弹就扣一条,撞敌人没做。。。
代码:
<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[pygame.K_SPACE] 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 = [0, 0, 0]        self.hcolor = [0, 0, 0]        self.height = len(options)*self.font.get_height()        for o in options:            text = o[0]            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[0]            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[self.option][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[0]            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()
您需要登录后才可以回帖 登录 | 立即注册 新浪微博账号登陆

本版积分规则

快速回复 返回顶部 返回列表