这是一个滑雪者的游戏。
skier从上向下滑,途中会遇到树和旗子,捡起一个旗子得10分,碰到一颗树扣100分,可以用左右箭头控制skier方向。
准备素材
一 准备python环境:我下载的python2.6 IDLE
二 pygame安装下载:http://www.pygame.org/download.shtml,双击安装即可
注意1 安装时需要选择对应的python路径
注意2 安装的位数要与python一致,64对32位无法成功使用
校验是否成功:在python里import pygame无异常,即可正确使用
三 图片资料,需要一个skier_down.png,一个skier_crash.png,skier_left1.png和skier_left2.png,skier_right1.png和skier_right2.png,还有一颗树skier_tree.png和一个旗子skier_flag.png。
四 好啦,开始写代码再运行就OK啦:注释再加吧。
#-*- coding:utf-8 -*- import pygame,sys,random
#定义图片元素列表 skier_images=["skier_down.png","skier_right1.png","skier_right2.png","skier_left2.png","skier_left1.png"] class SkierClasspygame.sprite.Sprite): def __init__self): pygame.sprite.Sprite.__init__self) self.image=pygame.image.load"skier_down.png") self.rect=self.image.get_rect) self.rect.center=[320,100] self.angle=0 def turnself,direction): self.angle=self.angle+direction if self.angle<-2: self.angle=-2 if self.angle>2: self.angle=2 center=self.rect.center self.image=pygame.image.loadskier_images[self.angle]) self.rect=self.image.get_rect) self.rect.center=center speed=[self.angle,6-absself.angle)*2] return speed #滑雪者左右移动 def moveself,speed): self.rect.centerx=self.rect.centerx+speed[0] if self.rect.centerx<20: self.rect.centerx=20 if self.rect.centerx>620: self.rect.centerx=620 #创建树和小旗 class ObstacleClasspygame.sprite.Sprite): def __init__self,image_file,location,type): pygame.sprite.Sprite.__init__self) self.image_file=image_file self.image=pygame.image.loadimage_file) self.location=location self.rect=self.image.get_rect) self.rect.center=location self.type=type self.passed=False #让场景向上滚动 def scrollself,t_ptr): self.rect.centery=self.location[1]-t_ptr #创建一个窗口,包含随机的树和小旗 def create_mapstart,end): obstacles=pygame.sprite.Group) gates=pygame.sprite.Group) locations=[] for i in range10): row=random.randintstart,end) col=random.randint0,9) location=[col*64+20,row*64+20] if not location in locations): locations.appendlocation) type=random.choice["tree","flag"]) if type=="tree": img="skier_tree.png" elif type=="flag": img="skier_flag.png" obstacle=ObstacleClassimg,location,type) obstacles.addobstacle) return obstacles #有移动时重辉屏幕 def animate): screen.fill[255,255,255]) pygame.display.updateobstacles.drawscreen)) screen.blitskier.image,skier.rect) screen.blitscore_text,[10,10]) pygame.display.flip) #切换到场景的下一屏 def updateObstacleGroupmap0,map1): obstacles=pygame.sprite.Group) for ob in map0: obstacles.addob) for ob in map1: obstacles.addob) return obstacles #做好准备 pygame.init) screen=pygame.display.set_mode[640,640]) clock=pygame.time.Clock) skier=SkierClass) speed=[0,6] map_position=0 points=0 map0=create_map20,29) map1=create_map10,19) activeMap=0 obstacles=updateObstacleGroupmap0,map1) font=pygame.font.FontNone,50) #开始主循环,每秒更新30次图形 while True: clock.tick30) for event in pygame.event.get): if event.type==pygame.QUIT:
pygame.quit) sys.exit) if event.type==pygame.KEYDOWN: if event.key==pygame.K_LEFT: speed=skier.turn-1) elif event.key==pygame.K_RIGHT: speed=skier.turn1) skier.movespeed) map_position+=speed[1] if map_position>=640 and activeMap==0: activeMap=1 map0=create_map20,29) obstacles=updateObstacleGroupmap0,map1) if map_position>=1280 and activeMap==1: activeMap=0 for ob in map0: ob.location[1]=ob.location[1]-1280 map_position=map_position-1280 map1=create_map10,19) obstacles=updateObstacleGroupmap0,map1) for obstacle in obstacles: obstacle.scrollmap_position) hit=pygame.sprite.spritecollideskier,obstacles,False) if hit: if hit[0].type=="tree" and not hit[0].passed: points=points-100 skier.image=pygame.image.load"skier_crash.png") animate) pygame.time.delay1000) skier.image=pygame.image.load"skier_down.png") skier.angle=0 speed=[0,6] hit[0].passed=True elif hit[0].type=="flag" and not hit[0].passed: points+=10 obstacles.removehit[0]) score_text=font.render"Score:"+strpoints),1,0,0,0)) animate)
5 我遇到的问题
问题1 self.image=pygame.image.load”skier_down.png”) error: Couldn’t open skier_down.png
解决:需要将png文件与py代码放到同一个路径下
问题2 python代码中的注释 关键字 字符串等不能高亮显示
解决:是因为python代码未保存成*.py后缀文件
问题3 TypeError: ‘NoneType’ object is not iterable
解决:对应调用的class为写return。
问题4 关闭游戏框可以退出游戏但是并不能关闭游戏框
解决: 在sys.exit)前加一个pygame.quit)