这是一个滑雪者的游戏。

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

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

  1. 转【Python】Python-skier游戏[摘自.与孩子一起学编程]

    http://www.cnblogs.com/zhaoxd07/p/4914818.html 我遇到的问题 问题1 self.image=pygame.image.load("skier_d ...

  2. 【和孩子一起学编程】 python笔记--第二天

    第六章 GUI:用户图形界面(graphical user interface) 安装easygui:打开cmd命令窗口,输入:pip install easygui 利用msgbox()函数创建一个 ...

  3. 【和孩子一起学编程】 python笔记--第一天

    [该随笔记录本人在阅读过程写的笔记和一些问题,格式比较随意,不定时更新] 由于该书使用的python版本为2.5,本人使用的为3.6. 第一章: 遇到的第一个问题: 1.3节 输出指令: print ...

  4. 【和孩子一起学编程】 python笔记--第四天

    第十一章: 可变循环 newStars = int(input("how many stars do you want?")) for i in range(newStars): ...

  5. 【和孩子一起学编程】 python笔记--第三天

    第十章 游戏时间:Skier 首先安装pygame,直接在cmd命令控制框里键入pip install pygame就可以了 代码: import pygame, sys, random skier_ ...

  6. 【和孩子一起学编程】 python笔记--第五天

    关于python2在python3中的改动: https://mp.weixin.qq.com/mp/appmsg/show?__biz=MjM5MDEyMDk4Mw==&appmsgid=1 ...

  7. 12岁的少年教你用Python做小游戏

    首页 资讯 文章 频道 资源 小组 相亲 登录 注册       首页 最新文章 经典回顾 开发 设计 IT技术 职场 业界 极客 创业 访谈 在国外 - 导航条 - 首页 最新文章 经典回顾 开发 ...

  8. 教孩子学编程 Python

    教孩子学编程   Python 目录 第1 章 Python 基础:认识环境 111 认识Python 312 用Python 编写程序 513 运行Python 程序 514 本章小结 615 编程 ...

  9. 教孩子学编程 python语言版PDF高清完整版免费下载|百度云盘|Python入门

    百度云盘:教孩子学编程 python语言版PDF高清完整版免费下载 提取码:mnma 内容简介 本书属于no starch的经典系列之一,英文版在美国受到读者欢迎.本书全彩印刷,寓教于乐,易于学习:读 ...

随机推荐

  1. UUID为36位

    package util; import java.util.UUID; public class UUIDUtil { public static UUID getId(){ return UUID ...

  2. WdatePicker 设置开始时间和结束时间

    开始时间: <input type="text" placeholder=" -请选择- " readonly="readonly" ...

  3. linux复制多个文件到文件夹

    linux复制多个文件到文件夹 cp file1 file2 file3 directory即将文件file1 file2 file3复制到directory

  4. js实现网页图片延时加载的原理和代码 提高网站打开速度

    有时我们看到一些大型网站,页面如果有很多图片的时候,当你滚动到相应的行时,当前行的图片才即时加载的,这样子的话页面在打开只加可视区域的图片,而其它隐藏的图片则不加载,一定程序上加快了页面加载的速度,对 ...

  5. 汇编之FS段寄存器

    FS寄存器指向当前活动线程的TEB结构(线程结构) 偏移  说明 000  指向SEH链指针 004  线程堆栈顶部 008  线程堆栈底部 00C  SubSystemTib 010  FiberD ...

  6. PHP中CURL方法curl_setopt()函数的一些参数 (转)

    bool curl_setopt (int ch, string option, mixed value) curl_setopt()函数将为一个CURL会话设置选项.option参数是你想要的设置, ...

  7. 安装ADT Cannot complete the install because one or more required items could not be found.

    点击进行安装,将会弹出 错误提示是: Cannot complete the install because one or more required items could not be found ...

  8. hdu 4664 Triangulation 博弈论

    看到这题时,当时还不会做,也没搞懂sg函数,于是狠狠的钻研了下博弈论,渐渐的知道了sg函数…… 现在在来做这题就很容易了,1A 打表容易发现在80左右的时候就出现循环节了 代码如下: #include ...

  9. SSH配置log4j的方法

    SSH使用log4j的方便之处 1. 动态的改变记录级别和策略,即修改log4j.properties,不需要重启Web应用,这需要在web.xml中设置一下.2. 把log文件定在 /WEB-INF ...

  10. js 中map的几种实现方式

    简单使用 1, 通过对象方式: var myHash = {}; myHash["deviceID"] = "HY_000001"; myHash[" ...