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_down1.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_down1.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()

时间: 2024-10-05 18:34:23

Python-skier游戏[摘自.与孩子一起学编程]的相关文章

0502《与孩子一起学编程》读书笔记3

1.主要有两种循环,计数循环和条件循环.前者一般叫做for循环,后者一般叫做while循环.要停止一个失控循环的Python程序,只需要按下Ctrl C. 2.跳出循环语句有两种,break和continue.前者完全终止该次循环,后者是提前跳转到循环的下一次迭代. 3.附带目前查询的资料: ----python函数库:http://www.lfd.uci.edu/~gohlke/pythonlibs/ ----<与孩子一起学编程>网址:http://www.manning.com/sande

0430《与孩子一起学编程》读书笔记2

1.python编码惯例(convention),总是将代码块(block)缩进4个空格. 2.今天扩展了一个小作业的代码,原作业只是在交互编程中猜密码,自己写的作业增加的功能有:用GUI窗口实现+循环+倒数提醒(这个其实可以加声音,记在这里,想起试试).写的时候也碰到了许多问题,这次的问题由室友B助攻解决(室友A在哪里,嗯,ta就在我身后陪一群同学打牌),问题有: ----如何在窗口输入字符?查书得知EasyGui里面有enterbox函数支持该功能: ----如何确定循环次数?直接跑,根本不

0503《与孩子一起学编程》读书笔记4

1.程序越写越大,越来越复杂怎么办?得把它们分解为小的部分进行组织,这样容易编写,也容易让人明白.那么,把程序分解为小的部分有哪些方法?主要有3中,其一函数(function),就像代码的积木,可以反复使用,是用来完成某个工作的代码块(block):其二对象(object),可以把程序中的各部分描述为自包含的单元:其三模块(module),就是包含程序各部分的单独的文件. ps:以上书里对三者的解释并不清楚,期待后面学习过程中逐渐明白差异. 2.Q:用循环可以让代码多次运行,那还需要多次调用函数

入门:《教孩子学编程 Python语言版》中英文PDF+代码

工作需要看过这本书,书中以turtle绘图展开,吸引学生兴趣,引入点非常好,安利也比较有意思好理解,但是有部分案例不太符合中国情况,还需要再改一改,总之是一本学习编程的好书 Python是一种解释型.面向对象.动态数据类型的高级程序设计语言.这门强大的语言如今在大学和Google.IBM等大型技术公司广泛使用.<教孩子学编程 Python语言版>是一本父母和老师教孩子使用Python进行基础程序设计和解决问题的入门图书.书通过科学合理的结构.通俗易懂的文字.活泼有趣的图示,帮助孩子学习计算机的

Python入门《父与子的编程之旅第2版》+《教孩子学编程Python语言版》

无论有无编程基础,无论大人小孩,学习编程语言,建议首选Python.初次接触Python,或者想快速应用Python完成一些任务,建议学习<父与子的编程之旅第2版>电子书和<教孩子学编程Python语言版>电子书. 对于孩子们来说,纯粹的数学计算并不是那么的有趣:而能够做出一个看得到的东西,则是一件很有成就感的事情.<父与子的编程之旅第2版>电子书在七分之一的篇幅处即引入了GUI的概念和实际例子,在四分之一的篇幅处即告知孩子们“游戏时间到了”,让孩子们可以自己敲击代码来

Python资料学习《疯狂Python讲义》+《教孩子学编程Python语言版》+《Python编程导论第2版》

适合初学者入门,适合Python就业,包含网络编程.数据分析.网络爬虫等大量企业实用的知识.建议学习<疯狂Python讲义>电子书和<教孩子学编程Python语言版>电子书,并进行配套的代码测试. <疯狂Python讲义>电子书适合初学者入门,适合Python就业,包含网络编程.数据分析.网络爬虫等大量企业实用的知识. <疯狂Python讲义>电子书第一部分系统讲解了Python的基本语法结构.Python的函数编程.Python的类和对象.模块和包.异常处

VM中python2.7运行skier游戏,shell重启问题!!!!!!

在虚拟机win7系统python2.7,在该python中运行了 父与子中的skier游戏(代码手写), 出现如下问题: ================ RESTART: C:\Python27\Scripts\skier\skier.py ================ =============================== RESTART: Shell ===============================>>> 游戏窗口闪退,并且没办法加载出任何画面或组件!请教

最大的幻术-游戏开发-到底是先学游戏引擎还是先学游戏编程

学习游戏的目的 我们学习游戏制作,游戏开发,游戏编程,游戏XX,我们的目的只有一个,打造一个非常牛逼,非常屌,非常让人开心的虚拟体验.我们用自己的学识让玩家在虚拟世界征战,生活,一步一步的让玩家幸福!那么我们的目的只有一个,让玩家知道自己的幸福在哪里,并且学会追求自己的幸福.当然,每个人对幸福的定义不一样.那么,我们只好让玩家来体验我们所来表达的最通俗的,最普遍的幸福体验,然后慢慢引导玩家去寻找自己的幸福体验.可能,在最后玩家都会离开游戏,离开虚拟世界,(对,这是真的,玩家需要一步一步达到定点,

python小游戏之课堂提问器

今天,接着前边的python小游戏,又写了个课堂提问器小程序.供大家一乐! #coding:utf-8 from random import randint print '\033[1;32;40m', print '你好,请选择需要几位作答者?\n' print '请输入作答者的人数:', t=1 i=input() data=[] while t<=i:     r=randint(0,32)    # print m[r],     data.append(m[r])     t+=1 p