【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()
【Python】Python-skier游戏[摘自.与孩子一起学编程]的更多相关文章
- 转【Python】Python-skier游戏[摘自.与孩子一起学编程]
http://www.cnblogs.com/zhaoxd07/p/4914818.html 我遇到的问题 问题1 self.image=pygame.image.load("skier_d ...
- 【和孩子一起学编程】 python笔记--第二天
第六章 GUI:用户图形界面(graphical user interface) 安装easygui:打开cmd命令窗口,输入:pip install easygui 利用msgbox()函数创建一个 ...
- 【和孩子一起学编程】 python笔记--第一天
[该随笔记录本人在阅读过程写的笔记和一些问题,格式比较随意,不定时更新] 由于该书使用的python版本为2.5,本人使用的为3.6. 第一章: 遇到的第一个问题: 1.3节 输出指令: print ...
- 【和孩子一起学编程】 python笔记--第四天
第十一章: 可变循环 newStars = int(input("how many stars do you want?")) for i in range(newStars): ...
- 【和孩子一起学编程】 python笔记--第三天
第十章 游戏时间:Skier 首先安装pygame,直接在cmd命令控制框里键入pip install pygame就可以了 代码: import pygame, sys, random skier_ ...
- 【和孩子一起学编程】 python笔记--第五天
关于python2在python3中的改动: https://mp.weixin.qq.com/mp/appmsg/show?__biz=MjM5MDEyMDk4Mw==&appmsgid=1 ...
- 12岁的少年教你用Python做小游戏
首页 资讯 文章 频道 资源 小组 相亲 登录 注册 首页 最新文章 经典回顾 开发 设计 IT技术 职场 业界 极客 创业 访谈 在国外 - 导航条 - 首页 最新文章 经典回顾 开发 ...
- 教孩子学编程 Python
教孩子学编程 Python 目录 第1 章 Python 基础:认识环境 111 认识Python 312 用Python 编写程序 513 运行Python 程序 514 本章小结 615 编程 ...
- 教孩子学编程 python语言版PDF高清完整版免费下载|百度云盘|Python入门
百度云盘:教孩子学编程 python语言版PDF高清完整版免费下载 提取码:mnma 内容简介 本书属于no starch的经典系列之一,英文版在美国受到读者欢迎.本书全彩印刷,寓教于乐,易于学习:读 ...
随机推荐
- 【学习总结】【多线程】 多线程概要 & GDC & NSOperation
基本需要知道的 : 进程 : 简单点来说就是,操作系统中正在运行的一个应用程序,每个进程之间是独立的,每个进程均运行在受保护的内存空间内 线程 : 一个进程(进程)想执行任务,必须有线程(所以, ...
- 学习javascript总结下来的性能优化的小知识(一)
http://www.cnblogs.com/ctriphire/p/4115525.html http://www.cnblogs.com/xjchenhao/archive/2012/10/22/ ...
- java基本对象Integer,String比较相等及equal案例说明
Integer i = new Integer(100); Integer i2 = new Integer(100); if(i == i2){ System.out.println("A ...
- SaaS 公司如何应对 On-Call 挑战?
Cloud Insight 集监控.管理.计算.协作.可视化于一身,帮助所有 IT 公司,减少在系统监控上的人力和时间成本投入,让运维工作更加高效.简单.本文系国内 ITOM 行业领军企业 OneAP ...
- pythn BeautifulSoup
http://rsj217.diandian.com/post/2012-11-01/40041235132 Beautiful Soup 是用 Python 写的一个 HTML/XML 的解析器,它 ...
- printf在终端输出时改变颜色
在调试程序时,有时候要输出大量数据,如果让printf/fprintf改变输出数据的颜色,那观察数据就方便多了. 终端的字符颜色是用转义序列控制的,是文本模式下的系统显示功能,和具体的语言无关.转义序 ...
- C++ 嵌套类使用(三)
如果嵌套类型和其外部类型之间的关系需要成员可访问性语义,需要使用C++嵌套类,嵌套类型不应针对其声明类型以外的类型执行任务,而C++局部类允许类.结构和接口被分成多个小块儿并存储在不同的源文件中,这样 ...
- 修改MYSQL数据库表的字符集
MySQL 乱码的根源是的 MySQL 字符集设置不当的问题,本文汇总了有关查看 MySQL 字符集的命令.包括查看 MySQL 数据库服务器字符集.查看 MySQL 数据库字符集,以及数据表和字段的 ...
- VS2013与MySql建立连接;您的项目引用了最新实体框架;但是,找不到数据链接所需的与版本兼容的实体框架数据库 EF6使用Mysql的技巧
因为之前都是看别人的项目,而没有自己从头到尾建立一个项目,所以这次尝试搭建时就出现了问题,主要是ASP.Net MVC项目中VS2013和MySql的连接. 第一个问题: 数据库表已建好,相应的数据库 ...
- 选择Android还是选择JavaEE?
很多同学咨询过同样的一个问题,该问题也是最备受争议的问题,那就是到底是选择Android还是选择JavaEE.下面发表一些本人的看法. Android属于一个特有的Java技术应用,专注于 ...