【Python】Python-skier游戲[摘自.與孩子一起學編程]


這是一個滑雪者的游戲。

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 SkierClass(pygame.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 turn(self,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.load(skier_images[self.angle]) self.rect=self.image.get_rect() self.rect.center=center speed=[self.angle,6-abs(self.angle)*2] return speed #滑雪者左右移動 def move(self,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 ObstacleClass(pygame.sprite.Sprite): def __init__(self,image_file,location,type): pygame.sprite.Sprite.__init__(self) self.image_file=image_file self.image=pygame.image.load(image_file) self.location=location self.rect=self.image.get_rect() self.rect.center=location self.type=type self.passed=False #讓場景向上滾動 def scroll(self,t_ptr): self.rect.centery=self.location[1]-t_ptr #創建一個窗口,包含隨機的樹和小旗 def create_map(start,end): obstacles=pygame.sprite.Group() gates=pygame.sprite.Group() locations=[] for i in range(10): row=random.randint(start,end) col=random.randint(0,9) location=[col*64+20,row*64+20] if not (location in locations): locations.append(location) type=random.choice(["tree","flag"]) if type=="tree": img="skier_tree.png" elif type=="flag": img="skier_flag.png" obstacle=ObstacleClass(img,location,type) obstacles.add(obstacle) return obstacles #有移動時重輝屏幕 def animate(): screen.fill([255,255,255]) pygame.display.update(obstacles.draw(screen)) screen.blit(skier.image,skier.rect) screen.blit(score_text,[10,10]) pygame.display.flip() #切換到場景的下一屏 def updateObstacleGroup(map0,map1): obstacles=pygame.sprite.Group() for ob in map0: obstacles.add(ob) for ob in map1: obstacles.add(ob) 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_map(20,29) map1=create_map(10,19) activeMap=0 obstacles=updateObstacleGroup(map0,map1) font=pygame.font.Font(None,50) #開始主循環,每秒更新30次圖形 while True: clock.tick(30) 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.turn(1) skier.move(speed) map_position+=speed[1] if map_position>=640 and activeMap==0: activeMap=1 map0=create_map(20,29) obstacles=updateObstacleGroup(map0,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_map(10,19) obstacles=updateObstacleGroup(map0,map1) for obstacle in obstacles: obstacle.scroll(map_position) hit=pygame.sprite.spritecollide(skier,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.delay(1000) 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.remove(hit[0]) score_text=font.render("Score:"+str(points),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()


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM