博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
【Python】Python-skier游戏[摘自.与孩子一起学编程]
阅读量:5072 次
发布时间:2019-06-12

本文共 4952 字,大约阅读时间需要 16 分钟。

这是一个滑雪者的游戏。

skier从上向下滑,途中会遇到树和旗子,捡起一个旗子得10分,碰到一颗树扣100分,可以用左右箭头控制skier方向。

准备素材

一 准备python环境:我下载的python2.6 IDLE

二 pygame安装下载:,双击安装即可

注意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=0points=0map0=create_map(20,29)map1=create_map(10,19)activeMap=0obstacles=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()

转载于:https://www.cnblogs.com/zhaoxd07/p/4914818.html

你可能感兴趣的文章
线程同步机制初识 【转载】
查看>>
SQL语句在查询分析器中可以执行,代码中不能执行
查看>>
yii 1.x 添加 rules 验证url数组
查看>>
html+css 布局篇
查看>>
SQL优化
查看>>
用C语言操纵Mysql
查看>>
轻松学MVC4.0–6 MVC的执行流程
查看>>
redis集群如何清理前缀相同的key
查看>>
Python 集合(Set)、字典(Dictionary)
查看>>
获取元素
查看>>
proxy写监听方法,实现响应式
查看>>
第一阶段冲刺06
查看>>
十个免费的 Web 压力测试工具
查看>>
EOS生产区块:解析插件producer_plugin
查看>>
lintcode-easy-Remove Element
查看>>
mysql重置密码
查看>>
jQuery轮 播的封装
查看>>
一天一道算法题--5.30---递归
查看>>
Java基础03 构造器与方法重载
查看>>
这些老外的开源技术养活了很多国产软件
查看>>