辽宁快乐12任3最大遗漏:the5fire的技术博客

彩票开奖查询 www.8a72.cn 关注Python、Django、Vim、Linux、Web开发、团队管理和互联网--Life is short, we need Python.


python项目练习十:DIY街机游戏

作者:the5fire | 标签:     | 发布:2012-02-09 10:21 p.m. | 阅读量: 64028, 62725

终于来到了最后一个项目,看看前面的那些练习,也算是熟悉了python的基本操作,也知道python能干哪些事情,最后一个项目相比于以前的稍微复杂些,但是任何一个程序只要他是可以正常执行的,花点时间总会搞明白的。

这个练习是一个小游戏程序,如果要是给它起个名字的话,应该叫:快躲,香蕉。主要的游戏内容就是,游戏开始会从屏幕上方不断随便的掉一些铁块,在屏幕下方有一个小香蕉是受你控制的,你需要不断的左右移动来躲避铁块。在你躲避完一定数量的铁块之后,就会进入下一关。下一关依然是让你躲铁块,不过铁块下降的速度就快了很多。在游戏中你可以按下任意键暂停,再次按则继续,按下ESC键退出。这就是全部的功能了,下面我们来看游戏的实现。

无论是在实现功能时还是在代码分析的时候,分类归纳总是一个好习惯,这里自然也不例外。

首先对所有代码分类, 1、整体上代码有一个配置???,来对游戏的速度、屏幕的宽度、香蕉移动速度、字体大小、各个物体的图片等进行配置。 2、然后是有一个元素???,即游戏中的两个元素落下来的铁块以及被砸的香蕉,其中还要包含他们具有的行为。 3、然后还有游戏中的各种状态???,状态??橹械睦嗉坛泄叵瞪晕⒍嘁恍?,处于家谱最上方的就是state类,由它来衍生其他的所有状态,它的直接子类是Level和Pause,其中Pause有衍生出子类Info、levelCleared、GameOver、StartUp。 4、最后就是游戏的主???,用来让其他??樾鞴ぷ鞯?。

然后再来看一个整体图:

//www.8a72.cn/wp-content/uploads/2012/02/Screenshot-at-2012-02-09-211954.png

有了上面整体的认识,下面就要细揪一下了。我自己看代码的方法是这样的,首先整体分析,然后在从程序的入口点开始分析。我估计大多数人也是这么做的。

首先是squish.py文件中的game类:

classGame:def__init__(self,*args):path=os.path.abspath(args[0])dir=os.path.split(path)[0]os.chdir(dir)self.state=Noneself.nextState=StartUp()defrun(self):pygame.init()flag=0ifconfig.full_screen:flag=FULLSCREENscreen_size=config.screen_sizescreen=pygame.display.set_mode(screen_size,flag)pygame.display.set_caption('Fruit Self Defense')pygame.mouse.set_visible(False)whileTrue:ifself.state!=self.nextState:self.state=self.nextStateself.state.firstDisplay(screen)foreventinpygame.event.get():self.state.handle(event)self.state.update(self)self.state.display(screen)if__name__=='__main__':game=Game(*sys.argv)game.run()

忽略掉init中的设置代码,在run中,该管理类首先调用pygame初始化并启动游戏界面,然后在一个while True的死循环中不断的进行状态判断,事件处理,然后根据事件更新当前状态,并且绘制界面。

让我们把焦点放在那个死循环中,因为他就是整个程序的流程所在。 其中状态和事件的关系就是,当发生某一事件之后,状态就会发生变化,比如点击事件、过关事件、死亡事件。这些事件的来源分别是:用户操作、系统判断、系统判断。要继续深入分析就需要再拿一部分代码出来。

依然是来自squish.py文件中剩余的所有代码:

importos,sys,pygamefrompygame.localsimport*importobjects,configclassState:defhandle(self,event):ifevent.type==QUIT:sys.exit()ifevent.type==KEYDOWNandevent.key==K_ESCAPE:sys.exit()deffirstDisplay(self,screen):screen.fill(config.background_color)pygame.display.flip()defdisplay(self,screen):passclassLevel(State):def__init__(self,number=1):self.number=numberself.remaining=config.weights_per_levelspeed=config.drop_speedspeed+=(self.number-1)*config.speed_increaseself.weight=objects.Weight(speed)self.banana=objects.Banana()both=self.weight,self.bananaself.sprites=pygame.sprite.RenderUpdates(both)defupdate(self,game):self.sprites.update()ifself.banana.touches(self.weight):game.nextState=GameOver()elifself.weight.landed:self.weight.reset()self.remaining-=1ifself.remaining==0:game.nextState=LevelCleared(self.number)defdisplay(self,screen):screen.fill(config.background_color)updates=self.sprites.draw(screen)pygame.display.update(updates)classPaused(State):finished=0image=Nonetext=''defhandle(self,event):State.handle(self,event)ifevent.typein[MOUSEBUTTONDOWN,KEYDOWN]:self.finished=1defupdate(self,game):ifself.finished:game.nextState=self.nextState()deffirstDisplay(self,screen):screen.fill(config.background_color)font=pygame.font.Font(None,config.font_size)lines=self.text.strip().splitlines()height=len(lines)*font.get_linesize()center,top=screen.get_rect().centertop-=height//2ifself.image:image=pygame.image.load(self.image).convert()r=image.get_rect()top+=r.height//2r.midbottom=center,top-20screen.blit(image,r)antialias=1black=0,0,0forlineinlines:text=font.render(line.strip(),antialias,black)r=text.get_rect()r.midtop=center,topscreen.blit(text,r)top+=font.get_linesize()pygame.display.flip()classInfo(Paused):nextState=Leveltext='''
    In this game you are a banana,
    trying to survive a course in
    self-defense against fruit,where the
    participants will 'defend' themselves
    against you with a 16 ton weight.'''classStartUp(Paused):nextState=Infoimage=config.splash_imagetext='''
    Welcome to Squish.
    the game of Fruit Self-Defense'''classLevelCleared(Paused):def__init__(self,number):self.number=numberself.text='''Level %i cleared
            Click to start next level'''%self.numberdefnextState(self):returnLevel(self.number+1)classGameOver(Paused):nextState=Leveltext='''
    Game Over
    Click to Restart, Esc to Quit'''

其中用户判断部分就是Paused类中的update方法和handle方法,而系统判断就是Level类中的update方法?;褂幸桓鲆⒁獾牡胤骄褪荓evel类中update方法中的第一行代码:self.sprites.update(),这是让铁块不断下落的关键代码。用户判断部分的代码已经有了,下面需要贴上系统判断时用到的代码.

objects.py中的代码:

importpygame,config,osfromrandomimportrandrangeclassSquishSprite(pygame.sprite.Sprite):def__init__(self,image):pygame.sprite.Sprite.__init__(self)self.image=pygame.image.load(image).convert()self.rect=self.image.get_rect()screen=pygame.display.get_surface()shrink=-config.margin*2self.area=screen.get_rect().inflate(shrink,shrink)classWeight(SquishSprite):def__init__(self,speed):SquishSprite.__init__(self,config.weight_image)self.speed=speedself.reset()defreset(self):x=randrange(self.area.left,self.area.right)self.rect.midbottom=x,0defupdate(self):self.rect.top+=self.speedself.landed=self.rect.top>=self.area.bottomclassBanana(SquishSprite):def__init__(self):SquishSprite.__init__(self,config.banana_image)self.rect.bottom=self.area.bottomself.pad_top=config.banana_pad_topself.pad_side=config.banana_pad_sidedefupdate(self):self.rect.centerx=pygame.mouse.get_pos()[0]self.rect=self.rect.clamp(self.area)deftouches(self,other):bounds=self.rect.inflate(-self.pad_side,-self.pad_top)bounds.bottom=self.rect.bottomreturnbounds.colliderect(other.rect)

在类Banana和Weight中的update和touches方法,用于进行系统判断。

好了,到这主要的东西都分析完了,剩下的只需要稍看一下就能够懂得了。

最后还有一个配置??榈拇隿onfig.py:

banana_image='banana.png'weight_image='weight.png'splash_image='weight.png'screen_size=800,600background_color=255,255,255margin=30full_screen=1font_size=48drop_speed=1banana_speed=10speed_increase=1weights_per_level=10banana_pad_top=40banana_pad_side=20

到此为止,《python基础教程》中的十个项目都已经分析了一遍,下一步要做的就是做几个实用软件出来,然后把python再好好深入研究下。

应晓勇要求,上几个运行图:

//www.8a72.cn/wp-content/uploads/2012/02/Screenshot-at-2012-02-11-223321.png//www.8a72.cn/wp-content/uploads/2012/02/Screenshot-at-2012-02-11-223330.png

2017-05-15更新:

//the5fireblog.b0.upaiyun.com/staticfile/django-tech-end-article.png
- from www.8a72.cn
----EOF-----

微信公众号:Python程序员杂谈

预售优惠价截止到7月8日23点59分。


其他分类:
  • 女子谎称刷单提成骗贫困大学生16万 用于买化妆品 2018-12-01
  • 西安体育学院体育传媒系与西部网签约校媒合作 2018-12-01
  • 网络投票刷礼物能不能帮孩子“争上游”? 2018-11-28
  • 中共山西省委组织部公示 2018-11-28
  • 【北京天气】最新北京今天天气,实时提供北京气温、空气质量、24小时天气预报、生活指数查询 2018-11-24
  • 格局生变 内容产业未来何去何从 2018-08-18
  • 土地不是劳动成果,而是一种自然资源,就像空气、阳光不是劳动成果而是自然资源一样,所以土地不具有价值,买房只应支付房屋费,不应该支付土地费。 2018-08-14
  • 安全生产月:铁路安全宣传走进车站 2018-08-02
  • 带动乡亲干 各自有实招——三位农村社区党组织书记的故事 2018-08-02
  • 长江中下游正式“入梅”!中东部高温降雨齐上阵 湖北中北部有大到暴雨 2018-07-31
  • 2018年4月27日划拨国家社科基金项目鉴定费名单(2) 2018-07-31
  • [微笑]未来的社会,必然是按需(基本需求)分配+按劳(劳动价值或劳动能力)分配相联合的混合分配方式。 2018-07-30
  • “一带一路”建设工作座谈会 2018-07-30
  • 只要等一等就能多“等”出8600万美元! 2018-07-29
  • 2017年秋季学期学员第十三支部风采 2018-07-18
  • 422| 506| 624| 330| 822| 462| 895| 203| 312| 890|