• Python中写一个乒乓球类的游戏


    最近开始学Python,感觉挺好玩的,既有脚本语言的灵活性,又有丰富的类库与面向对象的特点,开发起来很方便。

    游戏的规则和乒乓球一样,如果妙蛙种子掉地上了就算输,你可以用蓝色的跷跷板弹它,使他不落到地面上。

    Game Over后可按任意键继续游戏或选择退出。

    代码如下:

      1 import sys, pygame
      2 from random import *
      3 from pygame.locals import *
      4 from pygame.font import *
      5 class MyPlayer(pygame.sprite.Sprite):
      6     def __init__(self, image_file, location, speed):
      7         pygame.sprite.Sprite.__init__(self)
      8         self.image = pygame.image.load(image_file)
      9         self.rect = self.image.get_rect()
     10         self.rect.left, self.rect.top = location
     11         self.speed = speed
     12         self.status = True
     13     def move(self):
     14         self.rect = self.rect.move(self.speed)
     15         if self.rect.left < 0 or self.rect.right > 
     16             self.speed[0] = -self.speed[0]
     17         if self.rect.top < 0: 
     18             self.speed[1] = -self.speed[1]
     19         if self.rect.bottom > height:
     20             #Game over
     21             self.status = False
     22 class Reflector(pygame.sprite.Sprite):
     23     def __init__(self, image_file, location, speed):
     24         pygame.sprite.Sprite.__init__(self)
     25         self.image = pygame.image.load(image_file)
     26         self.rect = self.image.get_rect()
     27         self.rect.left, self.rect.top = location
     28         self.speed = speed
     29     def move(self):
     30         self.rect = self.rect.move(self.speed)
     31         if self.rect.left < 0 or self.rect.right > 
     32             self.speed[0] = -self.speed[0]
     33         if self.rect.top < 0 or self.rect.bottom > height:
     34             self.speed[1] = -self.speed[1]
     35 def animate(players):
     36     screen.fill([255,255,255])
     37     for player in players:
     38         player.move()
     39     for player in players:    
     40         players.remove(player)
     41         if pygame.sprite.spritecollide(player,players,False):
     42             player.speed[0] = -player.speed[0]
     43             player.speed[1] = -player.speed[1]
     44         players.add(player)
     45         player.move()
     46         screen.blit(player.image,player.rect)
     47     pygame.display.flip()
     48     pygame.time.delay(10)
     49 
     50 pygame.init()
     51 size = width,height = 640,480
     52 screen = pygame.display.set_mode(size)
     53 screen.fill([255,255,255])
     54 pygame.display.set_caption("MiaoWa Game")
     55 def play():
     56     img_player = "C:UsersdswuDesktopplayer.png"
     57     players = pygame.sprite.Group()
     58     for row in range(0,1):
     59         for column in range(0,1):
     60             playerLocation = [column*250+10,row*250+10]
     61             playerSpeed = [choice([-2,2]), choice([-2,2])]
     62             player = MyPlayer(img_player, playerLocation, playerSpeed)
     63             players.add(player)
     64     img_ref_path = "C:UsersdswuDesktopReflector.png"
     65     ref_pos = [0,464]
     66     ref_speed = [0,0]
     67     reflector = Reflector(img_ref_path, ref_pos, ref_speed)
     68     players.add(reflector)
     69     running = True
     70     while running:
     71         key_pressed = pygame.key.get_pressed()
     72         for event in pygame.event.get():
     73             if event.type == pygame.QUIT:
     74                 game.quit()
     75             if event.type == KEYDOWN:
     76                 if event.key == K_LEFT:  
     77                     ref_speed[0] = -2
     78                 elif event.key == K_RIGHT:
     79                     ref_speed[0] = +2
     80         animate(players)
     81         if player.status == False:
     82             running = False
     83     final_text = "Game Over!"
     84     ft_font = pygame.font.Font(None, 100)
     85     ft_surf = ft_font.render(final_text, 1, (0,0,0))
     86     screen.blit(ft_surf, [screen.get_width()/2 - ft_surf.get_width()/2, 100])
     87     tip_text = "Type any key to continue"
     88     tip_font = pygame.font.Font(None, 50)
     89     tip_surf = tip_font.render(tip_text, 1, (0,0,0))
     90     screen.blit(tip_surf, [screen.get_width()/2 - tip_surf.get_width()/2, 200])
     91     pygame.display.flip()
     92     keepOn = True
     93     while keepOn:
     94         key_pressed = pygame.key.get_pressed()
     95         for event in pygame.event.get():
     96             if event.type == pygame.QUIT:
     97                 pygame.quit()
     98             if event.type == KEYDOWN:
     99                 play()
    100 play()

    主要是通过pygame.sprite.Sprite类实现碰撞的监控,通过事件的捕捉及判断实现这种弹力球类的游戏,其中涉及到文字在界面上的显示,游戏中的循环控制,以及重新开始游戏等。

    把上面这段代码贴到你的IDLE中,找到下面这两行替换成你机器中的图片路径,按F5就可以运行了。

    img_player = "C:UsersdswuDesktopplayer.png"
    img_ref_path = "C:UsersdswuDesktopReflector.png"

    由于比较简单,看看代码运行一下应该就差不多明白了,如果有不明白的地方请给我留言,方便一起学习与进步。

    平时都在线,欢迎交流。

    Version2,增加score计分功能,结构有改动:

    import sys, pygame
    from random import *
    from pygame.locals import *
    from pygame.font import *
    class MyPlayer(pygame.sprite.Sprite):
        def __init__(self, image_file, location, speed):
            pygame.sprite.Sprite.__init__(self)
            self.image = pygame.image.load(image_file)
            self.rect = self.image.get_rect()
            self.rect.left, self.rect.top = location
            self.speed = speed
            self.status = True
        def move(self):
            global score, score_font, score_surf
            self.rect = self.rect.move(self.speed)
            if self.rect.left < 0 or self.rect.right > 
                self.speed[0] = -self.speed[0]
            if self.rect.top < 0: 
                self.speed[1] = -self.speed[1]
                score = score + 1
                score_surf = score_font.render(str(score),1,(0,0,0))
            if self.rect.bottom > height:
                #Game over
                self.status = False           
    class Reflector(pygame.sprite.Sprite):
        def __init__(self, image_file, location, speed):
            pygame.sprite.Sprite.__init__(self)
            self.image = pygame.image.load(image_file)
            self.rect = self.image.get_rect()
            self.rect.left, self.rect.top = location
            self.speed = speed
        def move(self):
            self.rect = self.rect.move(self.speed)
            if self.rect.left < 0 or self.rect.right > 
                self.speed[0] = -self.speed[0]
            if self.rect.top < 0 or self.rect.bottom > height:
                self.speed[1] = -self.speed[1]
    def animate(players):
        screen.fill([255,255,255])
        for player in players:
            player.move()
        for player in players:    
            players.remove(player)
            if pygame.sprite.spritecollide(player,players,False):
                player.speed[0] = -player.speed[0]
                player.speed[1] = -player.speed[1]
            players.add(player)
            player.move()
            screen.blit(player.image,player.rect)
        pygame.display.flip()
        pygame.time.delay(10)
    def end():
        #1
        final_text = "Game Over!"
        ft_font = pygame.font.Font(None, 100)
        ft_surf = ft_font.render(final_text, 1, (0,0,0))
        screen.blit(ft_surf, [screen.get_width()/2 - ft_surf.get_width()/2, 100])
        #2
        tip_text = "Type any key to continue"
        tip_font = pygame.font.Font(None, 50)
        tip_surf = tip_font.render(tip_text, 1, (0,0,0))
        screen.blit(tip_surf, [screen.get_width()/2 - tip_surf.get_width()/2, 200])
        #3
        sc_text = "Your score is "+ str(score)
        sc_font = pygame.font.Font(None, 50)
        sc_surf = sc_font.render(sc_text, 1, (0,0,0))
        screen.blit(sc_surf, [screen.get_width()/2 - sc_surf.get_width()/2, 300])
        pygame.display.flip()
    pygame.init()
    size = width,height = 1000,500
    screen = pygame.display.set_mode(size)
    screen.fill([255,255,255])
    pygame.display.set_caption("MiaoWa Game")
    score = 0
    score_pos = [10, 10]
    score_font = pygame.font.Font(None, 50)
    score_surf = score_font.render(str(score),1,(0,0,0))
    img_player = "C:UsersdswuDesktopplayer.png"
    playerSpeed = [choice([-2,2]), choice([-2,2])]
    player = MyPlayer(img_player, [10,10], playerSpeed)
    players = pygame.sprite.Group()  
    players.add(player)
    img_ref_path = "C:UsersdswuDesktopReflector.png"
    ref_pos = [0,464]
    ref_speed = [0,0]
    reflector = Reflector(img_ref_path, ref_pos, ref_speed)
    players.add(reflector)
    running = True
    while running:
        key_pressed = pygame.key.get_pressed()
        for event in pygame.event.get():
            if player.status == True:
                if event.type == pygame.QUIT:
                    game.quit()
                if event.type == KEYDOWN:
                    if event.key == K_LEFT:  
                        ref_speed[0] = -2
                    elif event.key == K_RIGHT:
                        ref_speed[0] = +2
            if player.status == False:
                if event.type == pygame.QUIT:
                    pygame.quit()
                if event.type == KEYDOWN:
                    player.rect.topleft = [50,50]
                    player.status = True
                    score = 0
                    score_surf = score_font.render(str(score),1,(0,0,0))
        if player.status == True:
            animate(players)
            screen.blit(score_surf, score_pos)
            pygame.display.flip()
        if player.status == False:
            end()
    View Code

     

  • 相关阅读:
    VS中修改工程名的解决方案
    C++内存管理(转)http://www.cnblogs.com/qiubole/archive/2008/03/07/1094770.html
    OGR中空间叠加函数Union
    如何迅速掌握并提高linux运维技能(收藏文)
    Win10系统应用图标显示感叹号无法打开(详细版)
    IBM带库故障处理(驱动器down,磁带卡带,重配置)Netbackup
    2.2 Netbackup磁带库管理
    重复,空
    Oracle数据库几种启动方式及查询当前状态
    鸡汤自勉
  • 原文地址:https://www.cnblogs.com/LanTianYou/p/4544614.html
Copyright © 2020-2023  润新知