luoxuepiao 发表于 2015-11-29 16:11:26

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 > width:
16             self.speed = -self.speed
17         if self.rect.top < 0:
18             self.speed = -self.speed
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 > width:
32             self.speed = -self.speed
33         if self.rect.top < 0 or self.rect.bottom > height:
34             self.speed = -self.speed
35 def animate(players):
36   screen.fill()
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 = -player.speed
43             player.speed = -player.speed
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()
54 pygame.display.set_caption("MiaoWa Game")
55 def play():
56   img_player = "C:\Users\dswu\Desktop\player.png"
57   players = pygame.sprite.Group()
58   for row in range(0,1):
59         for column in range(0,1):
60             playerLocation =
61             playerSpeed = ), choice([-2,2])]
62             player = MyPlayer(img_player, playerLocation, playerSpeed)
63             players.add(player)
64   img_ref_path = "C:\Users\dswu\Desktop\Reflector.png"
65   ref_pos =
66   ref_speed =
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 = -2
78               elif event.key == K_RIGHT:
79                     ref_speed = +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, )
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, )
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:\Users\dswu\Desktop\player.png"
img_ref_path = "C:\Users\dswu\Desktop\Reflector.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 > width:
self.speed = -self.speed
if self.rect.top < 0:
self.speed = -self.speed
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 > width:
self.speed = -self.speed
if self.rect.top < 0 or self.rect.bottom > height:
self.speed = -self.speed
def animate(players):
screen.fill()
for player in players:
player.move()
for player in players:   
players.remove(player)
if pygame.sprite.spritecollide(player,players,False):
player.speed = -player.speed
player.speed = -player.speed
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, )
#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, )
#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, )
pygame.display.flip()
pygame.init()
size = width,height = 1000,500
screen = pygame.display.set_mode(size)
screen.fill()
pygame.display.set_caption("MiaoWa Game")
score = 0
score_pos =
score_font = pygame.font.Font(None, 50)
score_surf = score_font.render(str(score),1,(0,0,0))
img_player = "C:\Users\dswu\Desktop\player.png"
playerSpeed = ), choice([-2,2])]
player = MyPlayer(img_player, , playerSpeed)
players = pygame.sprite.Group()
players.add(player)
img_ref_path = "C:\Users\dswu\Desktop\Reflector.png"
ref_pos =
ref_speed =
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 = -2
elif event.key == K_RIGHT:
ref_speed = +2
if player.status == False:
if event.type == pygame.QUIT:
pygame.quit()
if event.type == KEYDOWN:
player.rect.topleft =
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
页: [1]
查看完整版本: Python中写一个乒乓球类的游戏