设为首页 收藏本站
查看: 1415|回复: 0

[经验分享] Python中写一个乒乓球类的游戏

[复制链接]
累计签到:8 天
连续签到:1 天
发表于 2015-11-29 16:11:26 | 显示全部楼层 |阅读模式
  最近开始学Python,感觉挺好玩的,既有脚本语言的灵活性,又有丰富的类库与面向对象的特点,开发起来很方便。
DSC0000.png
  游戏的规则和乒乓球一样,如果妙蛙种子掉地上了就算输,你可以用蓝色的跷跷板弹它,使他不落到地面上。
  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[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 > width:
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:\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 = [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:\Users\dswu\Desktop\Reflector.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:\Users\dswu\Desktop\player.png"
img_ref_path = "C:\Users\dswu\Desktop\Reflector.png"
  由于比较简单,看看代码运行一下应该就差不多明白了,如果有不明白的地方请给我留言,方便一起学习与进步。
  平时都在线,欢迎交流。
  Version2,增加score计分功能,结构有改动:


DSC0001.gif DSC0002.gif


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[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 > width:
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:\Users\dswu\Desktop\player.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:\Users\dswu\Desktop\Reflector.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 DSC0003.png

运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-145045-1-1.html 上篇帖子: Python学习笔记之逻辑回归 下篇帖子: 对比java和python对比
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

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